llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-x86

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

Reply via email to