diff --git a/libdevice/cmath_wrapper.cpp b/libdevice/cmath_wrapper.cpp index d477e669a1db4..05d1acc35f59b 100644 --- a/libdevice/cmath_wrapper.cpp +++ b/libdevice/cmath_wrapper.cpp @@ -9,6 +9,16 @@ #include "device_math.h" #ifdef __SPIR__ + +DEVICE_EXTERN_C +int abs(int x) { return __devicelib_abs(x); } + +DEVICE_EXTERN_C +long int labs(long int x) { return __devicelib_labs(x); } + +DEVICE_EXTERN_C +long long int llabs(long long int x) { return __devicelib_llabs(x); } + DEVICE_EXTERN_C div_t div(int x, int y) { return __devicelib_div(x, y); } diff --git a/libdevice/device_math.h b/libdevice/device_math.h index ce2765f36f2c0..a4644f6e03f19 100644 --- a/libdevice/device_math.h +++ b/libdevice/device_math.h @@ -13,6 +13,15 @@ #ifdef __SPIR__ #include +DEVICE_EXTERN_C +int __devicelib_abs(int x); + +DEVICE_EXTERN_C +long int __devicelib_labs(long int x); + +DEVICE_EXTERN_C +long long int __devicelib_llabs(long long int x); + DEVICE_EXTERN_C div_t __devicelib_div(int x, int y); diff --git a/libdevice/fallback-cmath.cpp b/libdevice/fallback-cmath.cpp index d1332a21fbf86..63e0097e718fa 100644 --- a/libdevice/fallback-cmath.cpp +++ b/libdevice/fallback-cmath.cpp @@ -16,6 +16,15 @@ // TODO: generate the DeviceLibFuncMap in sycl-post-link.cpp automatically // during the build based on libdevice to avoid manually sync. +DEVICE_EXTERN_C +int __devicelib_abs(int x) { return x < 0 ? -x : x; } + +DEVICE_EXTERN_C +long int __devicelib_labs(long int x) { return x < 0 ? -x : x; } + +DEVICE_EXTERN_C +long long int __devicelib_llabs(long long int x) { return x < 0 ? -x : x; } + DEVICE_EXTERN_C div_t __devicelib_div(int x, int y) { return {x / y, x % y}; } diff --git a/llvm/tools/sycl-post-link/SYCLDeviceLibReqMask.cpp b/llvm/tools/sycl-post-link/SYCLDeviceLibReqMask.cpp index 82f470989795a..ea182b36d6d4b 100644 --- a/llvm/tools/sycl-post-link/SYCLDeviceLibReqMask.cpp +++ b/llvm/tools/sycl-post-link/SYCLDeviceLibReqMask.cpp @@ -24,6 +24,7 @@ namespace { // Please update SDLMap if any item is added to or removed from // fallback device libraries in libdevice. SYCLDeviceLibFuncMap SDLMap = { + {"__devicelib_abs", DeviceLibExt::cl_intel_devicelib_math}, {"__devicelib_acosf", DeviceLibExt::cl_intel_devicelib_math}, {"__devicelib_acoshf", DeviceLibExt::cl_intel_devicelib_math}, {"__devicelib_asinf", DeviceLibExt::cl_intel_devicelib_math}, @@ -46,9 +47,11 @@ SYCLDeviceLibFuncMap SDLMap = { {"__devicelib_frexpf", DeviceLibExt::cl_intel_devicelib_math}, {"__devicelib_hypotf", DeviceLibExt::cl_intel_devicelib_math}, {"__devicelib_ilogbf", DeviceLibExt::cl_intel_devicelib_math}, + {"__devicelib_labs", 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_llabs", 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}, diff --git a/sycl/include/CL/sycl/builtins.hpp b/sycl/include/CL/sycl/builtins.hpp index e57f85587ac71..3ab22fef648e3 100644 --- a/sycl/include/CL/sycl/builtins.hpp +++ b/sycl/include/CL/sycl/builtins.hpp @@ -1545,6 +1545,10 @@ detail::enable_if_t::value, T> tan(T x) __NOEXC { #ifdef __SYCL_DEVICE_ONLY__ extern "C" { +extern SYCL_EXTERNAL int abs(int x); +extern SYCL_EXTERNAL long int labs(long int x); +extern SYCL_EXTERNAL long long int llabs(long long int x); + 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);