llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: None (fineg74) <details> <summary>Changes</summary> The purpose of this PR is to introduce libdevice functions declarations for SPIRV for future use for math wrappers in order to reduce the PR size --- Full diff: https://github.com/llvm/llvm-project/pull/182215.diff 3 Files Affected: - (modified) clang/lib/Headers/CMakeLists.txt (+1) - (added) clang/lib/Headers/__clang_spirv_libdevice_declares.h (+137) - (modified) clang/lib/Headers/openmp_wrappers/__clang_openmp_device_functions.h (+14) ``````````diff diff --git a/clang/lib/Headers/CMakeLists.txt b/clang/lib/Headers/CMakeLists.txt index 95d20bbca79ac..52c8bd5470d50 100644 --- a/clang/lib/Headers/CMakeLists.txt +++ b/clang/lib/Headers/CMakeLists.txt @@ -141,6 +141,7 @@ set(riscv_files set(spirv_files __clang_spirv_builtins.h + __clang_spirv_libdevice_declares.h ) set(systemz_files diff --git a/clang/lib/Headers/__clang_spirv_libdevice_declares.h b/clang/lib/Headers/__clang_spirv_libdevice_declares.h new file mode 100644 index 0000000000000..950403896281b --- /dev/null +++ b/clang/lib/Headers/__clang_spirv_libdevice_declares.h @@ -0,0 +1,137 @@ +/*===-- __clang_spirv_libdevice_declares.h - decls for libdevice functions --=== + * + * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. + * See https://llvm.org/LICENSE.txt for license information. + * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception + * + *===-----------------------------------------------------------------------=== + */ + +#ifndef __CLANG_SPIRV_LIBDEVICE_DECLARES_H__ +#define __CLANG_SPIRV_LIBDEVICE_DECLARES_H__ + +#if defined(__cplusplus) +extern "C" { +#endif + +#define _CLC_OVERLOAD [[clang::overloadable]] +#define _CLC_CONSTFN [[gnu::const]] +_CLC_OVERLOAD _CLC_CONSTFN uint32_t __spirv_ocl_s_abs(int); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_acos(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_acos(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_acosh(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_acosh(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_asin(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_asin(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_asinh(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_asinh(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_atan(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_atan(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_atan2(float, float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_atan2(double, double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_atanh(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_atanh(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_cbrt(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_cbrt(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_ceil(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_ceil(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_cos(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_cos(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_cosh(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_cosh(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_cospi(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_cospi(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_erf(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_erf(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_erfc(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_erfc(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_exp(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_exp(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_exp2(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_exp2(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_exp10(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_exp10(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_expm1(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_expm1(double); +_CLC_OVERLOAD _CLC_CONSTFN bool __spirv_IsNan(float); +_CLC_OVERLOAD _CLC_CONSTFN bool __spirv_IsNan(double); +_CLC_OVERLOAD _CLC_CONSTFN bool __spirv_IsInf(float); +_CLC_OVERLOAD _CLC_CONSTFN bool __spirv_IsInf(double); +_CLC_OVERLOAD _CLC_CONSTFN bool __spirv_IsFinite(float); +_CLC_OVERLOAD _CLC_CONSTFN bool __spirv_IsFinite(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_copysign(float, float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_copysign(double, double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_ldexp(float, int); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_ldexp(double, int); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_fabs(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_fabs(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_logb(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_logb(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_fmax(float, float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_fmax(double, double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_fmin(float, float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_fmin(double, double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_fdim(float, float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_fdim(double, double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_floor(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_floor(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_fma(float, float, float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_fma(double, double, double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_fmod(float, float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_fmod(double, double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_frexp(float, int *); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_frexp(double, int *); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_hypot(float, float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_hypot(double, double); +_CLC_OVERLOAD _CLC_CONSTFN int __spirv_ocl_ilogb(float); +_CLC_OVERLOAD _CLC_CONSTFN int __spirv_ocl_ilogb(double); +_CLC_OVERLOAD _CLC_CONSTFN _uint64_t __spirv_ocl_s_abs(long); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_lgamma(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_lgamma(flodoubleat); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_round(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_round(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_log(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_log(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_log10(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_log10(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_log1p(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_log1p(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_log2(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_log2(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_modf(float, float *); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_modf(double, double *); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_nextafter(float, float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_nextafter(double, double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_sqrt(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_sqrt(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_rsqrt(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_rsqrt(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_pow(float, float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_pow(double, double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_pown(float, int); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_pown(double, int); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_remainder(float, float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_remainder(double, double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_remquo(float, float, int *); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_remquo(double, double, int *); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_sin(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_sin(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_sincos(float, float *); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_sincos(double, double *); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_sinh(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_sinh(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_sinpi(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_sinpi(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_tan(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_tan(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_tanh(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_tanh(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_tgamma(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_tgamma(double); +_CLC_OVERLOAD _CLC_CONSTFN float __spirv_ocl_trunc(float); +_CLC_OVERLOAD _CLC_CONSTFN double __spirv_ocl_trunc(double); + +#if defined(__cplusplus) +} // extern "C" +#endif +#endif // __CLANG_SPIRV_LIBDEVICE_DECLARES_H__ diff --git a/clang/lib/Headers/openmp_wrappers/__clang_openmp_device_functions.h b/clang/lib/Headers/openmp_wrappers/__clang_openmp_device_functions.h index 3e354c63efc66..2e99992500620 100644 --- a/clang/lib/Headers/openmp_wrappers/__clang_openmp_device_functions.h +++ b/clang/lib/Headers/openmp_wrappers/__clang_openmp_device_functions.h @@ -55,6 +55,20 @@ extern "C" { #pragma omp end declare variant #endif +#ifdef __SPIRV__ +#pragma omp begin declare variant match( \ + device = {arch(spirv64)}, implementation = {extension(match_any)}) + +#define __OPENMP_SPIRV__ + +/// Include declarations for libdevice functions. +#include <__clang_spirv_libdevice_declares.h> + +#undef __OPENMP_SPIRV__ + +#pragma omp end declare variant +#endif + #ifdef __cplusplus } // extern "C" #endif `````````` </details> https://github.com/llvm/llvm-project/pull/182215 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
