Skip to content

[SYCL][libdevice] Add __imf_llmax/min, __imf_ullmax/min, __imf_umax/min #6811

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Sep 26, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions libdevice/device_imf.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,18 @@ static inline TyFP __integral2FP_host(TyINT x, int rdMode) {
}
#endif // __LIBDEVICE_HOST_IMPL__

template <typename Ty> static inline Ty __imax(Ty x, Ty y) {
static_assert(std::is_integral<Ty>::value,
"__imax only accepts integral type.");
return (x > y) ? x : y;
}

template <typename Ty> static inline Ty __imin(Ty x, Ty y) {
static_assert(std::is_integral<Ty>::value,
"__imin only accepts integral type.");
return (x < y) ? x : y;
}

static inline float __fclamp(float x, float y, float z) {
#if defined(__LIBDEVICE_HOST_IMPL__)
return __builtin_fmin(__builtin_fmax(x, y), z);
Expand Down
33 changes: 33 additions & 0 deletions libdevice/imf_utils/integer_misc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -173,4 +173,37 @@ unsigned long long int __devicelib_imf_umul64hi(unsigned long long int x,
static_cast<uint64_t>(y));
#endif
}

DEVICE_EXTERN_C_INLINE
long long int __devicelib_imf_llmax(long long int x, long long int y) {
return __imax(x, y);
;
}

DEVICE_EXTERN_C_INLINE
long long int __devicelib_imf_llmin(long long int x, long long int y) {
return __imin(x, y);
}

DEVICE_EXTERN_C_INLINE
unsigned long long int __devicelib_imf_ullmax(unsigned long long int x,
unsigned long long int y) {
return __imax(x, y);
}

DEVICE_EXTERN_C_INLINE
unsigned long long int __devicelib_imf_ullmin(unsigned long long int x,
unsigned long long int y) {
return __imin(x, y);
}

DEVICE_EXTERN_C_INLINE
unsigned int __devicelib_imf_umax(unsigned int x, unsigned int y) {
return __imax(x, y);
}

DEVICE_EXTERN_C_INLINE
unsigned int __devicelib_imf_umin(unsigned int x, unsigned int y) {
return __imin(x, y);
}
#endif //__LIBDEVICE_IMF_ENABLED__
52 changes: 52 additions & 0 deletions libdevice/imf_wrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -292,6 +292,58 @@ float __imf_half2float(_iml_half_internal x) {
return __devicelib_imf_half2float(x);
}

DEVICE_EXTERN_C_INLINE
long long int __devicelib_imf_llmax(long long int, long long int);

DEVICE_EXTERN_C_INLINE
long long int __devicelib_imf_llmin(long long int, long long int);

DEVICE_EXTERN_C_INLINE
unsigned long long int __devicelib_imf_ullmax(unsigned long long int,
unsigned long long int);

DEVICE_EXTERN_C_INLINE
unsigned long long int __devicelib_imf_ullmin(unsigned long long int,
unsigned long long int);

DEVICE_EXTERN_C_INLINE
unsigned int __devicelib_imf_umax(unsigned int, unsigned int);

DEVICE_EXTERN_C_INLINE
unsigned int __devicelib_imf_umin(unsigned int, unsigned int);

DEVICE_EXTERN_C_INLINE
long long int __imf_llmax(long long int x, long long int y) {
return __devicelib_imf_llmax(x, y);
}

DEVICE_EXTERN_C_INLINE
long long int __imf_llmin(long long int x, long long int y) {
return __devicelib_imf_llmin(x, y);
}

DEVICE_EXTERN_C_INLINE
unsigned long long int __imf_ullmax(unsigned long long int x,
unsigned long long int y) {
return __devicelib_imf_ullmax(x, y);
}

DEVICE_EXTERN_C_INLINE
unsigned long long int __imf_ullmin(unsigned long long int x,
unsigned long long int y) {
return __devicelib_imf_ullmin(x, y);
}

DEVICE_EXTERN_C_INLINE
unsigned int __imf_umax(unsigned int x, unsigned int y) {
return __devicelib_imf_umax(x, y);
}

DEVICE_EXTERN_C_INLINE
unsigned int __imf_umin(unsigned int x, unsigned int y) {
return __devicelib_imf_umin(x, y);
}

DEVICE_EXTERN_C_INLINE
unsigned int __devicelib_imf_brev(unsigned int);

Expand Down
6 changes: 6 additions & 0 deletions llvm/tools/sycl-post-link/SYCLDeviceLibReqMask.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,12 @@ SYCLDeviceLibFuncMap SDLMap = {
{"__devicelib_memcmp", DeviceLibExt::cl_intel_devicelib_cstring},
{"__devicelib_assert_read", DeviceLibExt::cl_intel_devicelib_assert},
{"__devicelib_assert_fail", DeviceLibExt::cl_intel_devicelib_assert},
{"__devicelib_imf_llmax", DeviceLibExt::cl_intel_devicelib_imf},
{"__devicelib_imf_llmin", DeviceLibExt::cl_intel_devicelib_imf},
{"__devicelib_imf_ullmax", DeviceLibExt::cl_intel_devicelib_imf},
{"__devicelib_imf_ullmin", DeviceLibExt::cl_intel_devicelib_imf},
{"__devicelib_imf_umax", DeviceLibExt::cl_intel_devicelib_imf},
{"__devicelib_imf_umin", DeviceLibExt::cl_intel_devicelib_imf},
{"__devicelib_imf_brev", DeviceLibExt::cl_intel_devicelib_imf},
{"__devicelib_imf_brevll", DeviceLibExt::cl_intel_devicelib_imf},
{"__devicelib_imf_byte_perm", DeviceLibExt::cl_intel_devicelib_imf},
Expand Down
10 changes: 10 additions & 0 deletions sycl/include/sycl/builtins.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1738,6 +1738,16 @@ extern SYCL_EXTERNAL double hypot(double x, double y);
extern SYCL_EXTERNAL void *memcpy(void *dest, const void *src, size_t n);
extern SYCL_EXTERNAL void *memset(void *dest, int c, size_t n);
extern SYCL_EXTERNAL int memcmp(const void *s1, const void *s2, size_t n);
extern SYCL_EXTERNAL long long int __imf_llmax(long long int x,
long long int y);
extern SYCL_EXTERNAL long long int __imf_llmin(long long int x,
long long int y);
extern SYCL_EXTERNAL unsigned long long int
__imf_ullmax(unsigned long long int x, unsigned long long int y);
extern SYCL_EXTERNAL unsigned long long int
__imf_ullmin(unsigned long long int x, unsigned long long int y);
extern SYCL_EXTERNAL unsigned int __imf_umax(unsigned int x, unsigned int y);
extern SYCL_EXTERNAL unsigned int __imf_umin(unsigned int x, unsigned int y);
extern SYCL_EXTERNAL unsigned int __imf_brev(unsigned int x);
extern SYCL_EXTERNAL unsigned long long int
__imf_brevll(unsigned long long int x);
Expand Down