Skip to content

Commit 2e9d33c

Browse files
authored
[SYCL] Add support stdlib function div, ldiv, lldiv in device library (#3262)
Signed-off-by: gejin <ge.jin@intel.com>
1 parent a323be4 commit 2e9d33c

File tree

5 files changed

+40
-1
lines changed

5 files changed

+40
-1
lines changed

libdevice/cmath_wrapper.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,16 @@
99
#include "device_math.h"
1010

1111
#ifdef __SPIR__
12+
DEVICE_EXTERN_C
13+
div_t div(int x, int y) { return __devicelib_div(x, y); }
14+
15+
DEVICE_EXTERN_C
16+
ldiv_t ldiv(long int x, long int y) { return __devicelib_ldiv(x, y); }
17+
18+
DEVICE_EXTERN_C
19+
lldiv_t lldiv(long long int x, long long int y) {
20+
return __devicelib_lldiv(x, y);
21+
}
1222

1323
DEVICE_EXTERN_C
1424
float scalbnf(float x, int n) { return __devicelib_scalbnf(x, n); }

libdevice/device_math.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,17 @@
1010
#define __LIBDEVICE_DEVICE_MATH_H__
1111

1212
#include "device.h"
13-
1413
#ifdef __SPIR__
14+
#include <cstdlib>
15+
16+
DEVICE_EXTERN_C
17+
div_t __devicelib_div(int x, int y);
18+
19+
DEVICE_EXTERN_C
20+
ldiv_t __devicelib_ldiv(long int x, long int y);
21+
22+
DEVICE_EXTERN_C
23+
lldiv_t __devicelib_lldiv(long long int x, long long int y);
1524

1625
DEVICE_EXTERN_C
1726
double __devicelib_log(double x);

libdevice/fallback-cmath.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,18 @@
1515
// or remove any item in this file.
1616
// TODO: generate the DeviceLibFuncMap in sycl-post-link.cpp automatically
1717
// during the build based on libdevice to avoid manually sync.
18+
19+
DEVICE_EXTERN_C
20+
div_t __devicelib_div(int x, int y) { return {x / y, x % y}; }
21+
22+
DEVICE_EXTERN_C
23+
ldiv_t __devicelib_ldiv(long int x, long int y) { return {x / y, x % y}; }
24+
25+
DEVICE_EXTERN_C
26+
lldiv_t __devicelib_lldiv(long long int x, long long int y) {
27+
return {x / y, x % y};
28+
}
29+
1830
DEVICE_EXTERN_C
1931
float __devicelib_scalbnf(float x, int n) { return __spirv_ocl_ldexp(x, n); }
2032

llvm/tools/sycl-post-link/SYCLDeviceLibReqMask.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ SYCLDeviceLibFuncMap SDLMap = {
3434
{"__devicelib_cbrtf", DeviceLibExt::cl_intel_devicelib_math},
3535
{"__devicelib_cosf", DeviceLibExt::cl_intel_devicelib_math},
3636
{"__devicelib_coshf", DeviceLibExt::cl_intel_devicelib_math},
37+
{"__devicelib_div", DeviceLibExt::cl_intel_devicelib_math},
3738
{"__devicelib_erfcf", DeviceLibExt::cl_intel_devicelib_math},
3839
{"__devicelib_erff", DeviceLibExt::cl_intel_devicelib_math},
3940
{"__devicelib_exp2f", DeviceLibExt::cl_intel_devicelib_math},
@@ -45,8 +46,10 @@ SYCLDeviceLibFuncMap SDLMap = {
4546
{"__devicelib_frexpf", DeviceLibExt::cl_intel_devicelib_math},
4647
{"__devicelib_hypotf", DeviceLibExt::cl_intel_devicelib_math},
4748
{"__devicelib_ilogbf", DeviceLibExt::cl_intel_devicelib_math},
49+
{"__devicelib_ldiv", DeviceLibExt::cl_intel_devicelib_math},
4850
{"__devicelib_ldexpf", DeviceLibExt::cl_intel_devicelib_math},
4951
{"__devicelib_lgammaf", DeviceLibExt::cl_intel_devicelib_math},
52+
{"__devicelib_lldiv", DeviceLibExt::cl_intel_devicelib_math},
5053
{"__devicelib_log10f", DeviceLibExt::cl_intel_devicelib_math},
5154
{"__devicelib_log1pf", DeviceLibExt::cl_intel_devicelib_math},
5255
{"__devicelib_log2f", DeviceLibExt::cl_intel_devicelib_math},

sycl/include/CL/sycl/builtins.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1544,6 +1544,11 @@ detail::enable_if_t<detail::is_genfloatf<T>::value, T> tan(T x) __NOEXC {
15441544
} // __SYCL_INLINE_NAMESPACE(cl)
15451545

15461546
#ifdef __SYCL_DEVICE_ONLY__
1547+
extern "C" {
1548+
extern SYCL_EXTERNAL div_t div(int x, int y);
1549+
extern SYCL_EXTERNAL ldiv_t ldiv(long int x, long int y);
1550+
extern SYCL_EXTERNAL lldiv_t lldiv(long long int x, long long int y);
1551+
}
15471552
#ifdef __GLIBC__
15481553
extern "C" {
15491554
extern SYCL_EXTERNAL void __assert_fail(const char *expr, const char *file,

0 commit comments

Comments
 (0)