diff --git a/libdevice/cmath_wrapper.cpp b/libdevice/cmath_wrapper.cpp index b3f0373db90c7..d477e669a1db4 100644 --- a/libdevice/cmath_wrapper.cpp +++ b/libdevice/cmath_wrapper.cpp @@ -9,6 +9,16 @@ #include "device_math.h" #ifdef __SPIR__ +DEVICE_EXTERN_C +div_t div(int x, int y) { return __devicelib_div(x, y); } + +DEVICE_EXTERN_C +ldiv_t ldiv(long int x, long int y) { return __devicelib_ldiv(x, y); } + +DEVICE_EXTERN_C +lldiv_t lldiv(long long int x, long long int y) { + return __devicelib_lldiv(x, y); +} DEVICE_EXTERN_C float scalbnf(float x, int n) { return __devicelib_scalbnf(x, n); } diff --git a/libdevice/device_math.h b/libdevice/device_math.h index e751bd3ad0278..ce2765f36f2c0 100644 --- a/libdevice/device_math.h +++ b/libdevice/device_math.h @@ -10,8 +10,17 @@ #define __LIBDEVICE_DEVICE_MATH_H__ #include "device.h" - #ifdef __SPIR__ +#include + +DEVICE_EXTERN_C +div_t __devicelib_div(int x, int y); + +DEVICE_EXTERN_C +ldiv_t __devicelib_ldiv(long int x, long int y); + +DEVICE_EXTERN_C +lldiv_t __devicelib_lldiv(long long int x, long long int y); DEVICE_EXTERN_C double __devicelib_log(double x); diff --git a/libdevice/fallback-cmath.cpp b/libdevice/fallback-cmath.cpp index 8ab3c7a0239ba..d1332a21fbf86 100644 --- a/libdevice/fallback-cmath.cpp +++ b/libdevice/fallback-cmath.cpp @@ -15,6 +15,18 @@ // or remove any item in this file. // TODO: generate the DeviceLibFuncMap in sycl-post-link.cpp automatically // during the build based on libdevice to avoid manually sync. + +DEVICE_EXTERN_C +div_t __devicelib_div(int x, int y) { return {x / y, x % y}; } + +DEVICE_EXTERN_C +ldiv_t __devicelib_ldiv(long int x, long int y) { return {x / y, x % y}; } + +DEVICE_EXTERN_C +lldiv_t __devicelib_lldiv(long long int x, long long int y) { + return {x / y, x % y}; +} + DEVICE_EXTERN_C float __devicelib_scalbnf(float x, int n) { return __spirv_ocl_ldexp(x, n); } diff --git a/llvm/tools/sycl-post-link/SYCLDeviceLibReqMask.cpp b/llvm/tools/sycl-post-link/SYCLDeviceLibReqMask.cpp index e53dec1b2b009..82f470989795a 100644 --- a/llvm/tools/sycl-post-link/SYCLDeviceLibReqMask.cpp +++ b/llvm/tools/sycl-post-link/SYCLDeviceLibReqMask.cpp @@ -34,6 +34,7 @@ SYCLDeviceLibFuncMap SDLMap = { {"__devicelib_cbrtf", DeviceLibExt::cl_intel_devicelib_math}, {"__devicelib_cosf", DeviceLibExt::cl_intel_devicelib_math}, {"__devicelib_coshf", DeviceLibExt::cl_intel_devicelib_math}, + {"__devicelib_div", DeviceLibExt::cl_intel_devicelib_math}, {"__devicelib_erfcf", DeviceLibExt::cl_intel_devicelib_math}, {"__devicelib_erff", DeviceLibExt::cl_intel_devicelib_math}, {"__devicelib_exp2f", DeviceLibExt::cl_intel_devicelib_math}, @@ -45,8 +46,10 @@ SYCLDeviceLibFuncMap SDLMap = { {"__devicelib_frexpf", DeviceLibExt::cl_intel_devicelib_math}, {"__devicelib_hypotf", DeviceLibExt::cl_intel_devicelib_math}, {"__devicelib_ilogbf", DeviceLibExt::cl_intel_devicelib_math}, + {"__devicelib_ldiv", DeviceLibExt::cl_intel_devicelib_math}, {"__devicelib_ldexpf", DeviceLibExt::cl_intel_devicelib_math}, {"__devicelib_lgammaf", DeviceLibExt::cl_intel_devicelib_math}, + {"__devicelib_lldiv", DeviceLibExt::cl_intel_devicelib_math}, {"__devicelib_log10f", DeviceLibExt::cl_intel_devicelib_math}, {"__devicelib_log1pf", DeviceLibExt::cl_intel_devicelib_math}, {"__devicelib_log2f", DeviceLibExt::cl_intel_devicelib_math}, diff --git a/sycl/include/CL/sycl/builtins.hpp b/sycl/include/CL/sycl/builtins.hpp index 64d4ef4bfc5a1..e57f85587ac71 100644 --- a/sycl/include/CL/sycl/builtins.hpp +++ b/sycl/include/CL/sycl/builtins.hpp @@ -1544,6 +1544,11 @@ detail::enable_if_t::value, T> tan(T x) __NOEXC { } // __SYCL_INLINE_NAMESPACE(cl) #ifdef __SYCL_DEVICE_ONLY__ +extern "C" { +extern SYCL_EXTERNAL div_t div(int x, int y); +extern SYCL_EXTERNAL ldiv_t ldiv(long int x, long int y); +extern SYCL_EXTERNAL lldiv_t lldiv(long long int x, long long int y); +} #ifdef __GLIBC__ extern "C" { extern SYCL_EXTERNAL void __assert_fail(const char *expr, const char *file,