Skip to content

Commit 0b8df3b

Browse files
authored
[SYCL][SPIRV] Implement islessgreater with FOrdNotEqual instead (#5076)
SPIR-V OpLessOrGreater is deprecated: https://www.khronos.org/registry/SPIR-V/specs/unified1/SPIRV.html#OpLessOrGreater OpFOrdNotEqual has the same semantics as OpLessOrGreater. Signed-off-by: Yilong Guo yilong.guo@intel.com
1 parent 7bcd22c commit 0b8df3b

File tree

6 files changed

+78
-1
lines changed

6 files changed

+78
-1
lines changed

sycl/include/CL/sycl/builtins.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1176,7 +1176,7 @@ template <typename T,
11761176
typename = detail::enable_if_t<detail::is_genfloat<T>::value, T>>
11771177
detail::common_rel_ret_t<T> islessgreater(T x, T y) __NOEXC {
11781178
return detail::RelConverter<T>::apply(
1179-
__sycl_std::__invoke_LessOrGreater<detail::rel_ret_t<T>>(x, y));
1179+
__sycl_std::__invoke_FOrdNotEqual<detail::rel_ret_t<T>>(x, y));
11801180
}
11811181

11821182
// int isfinite (half x)

sycl/include/CL/sycl/detail/builtins.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ __SYCL_MAKE_CALL_ARG2_SAME(FOrdGreaterThanEqual,
265265
__FUNC_PREFIX_CORE) // isgreaterequal
266266
__SYCL_MAKE_CALL_ARG2_SAME(FOrdLessThan, __FUNC_PREFIX_CORE) // isless
267267
__SYCL_MAKE_CALL_ARG2_SAME(FOrdLessThanEqual, __FUNC_PREFIX_CORE) // islessequal
268+
__SYCL_MAKE_CALL_ARG2_SAME(FOrdNotEqual, __FUNC_PREFIX_CORE) // islessgreater
268269
__SYCL_MAKE_CALL_ARG2_SAME(LessOrGreater, __FUNC_PREFIX_CORE) // islessgreater
269270
__SYCL_MAKE_CALL_ARG1(IsFinite, __FUNC_PREFIX_CORE) // isfinite
270271
__SYCL_MAKE_CALL_ARG1(IsInf, __FUNC_PREFIX_CORE) // isinf

sycl/source/detail/builtins_relational.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,14 @@ template <typename T> inline T __vFOrdLessThanEqual(T x, T y) {
4747

4848
template <typename T> inline T __sFOrdLessThanEqual(T x, T y) { return x <= y; }
4949

50+
template <typename T> inline T __vFOrdNotEqual(T x, T y) {
51+
return -((x < y) || (x > y));
52+
}
53+
54+
template <typename T> inline T __sFOrdNotEqual(T x, T y) {
55+
return ((x < y) || (x > y));
56+
}
57+
5058
template <typename T> inline T __vLessOrGreater(T x, T y) {
5159
return -((x < y) || (x > y));
5260
}
@@ -247,6 +255,23 @@ MAKE_1V_2V_FUNC(FOrdLessThanEqual, __vFOrdLessThanEqual, s::cl_long,
247255
MAKE_1V_2V_FUNC(FOrdLessThanEqual, __vFOrdLessThanEqual, s::cl_short,
248256
s::cl_half, s::cl_half)
249257

258+
// (FOrdNotEqual) // islessgreater
259+
__SYCL_EXPORT s::cl_int FOrdNotEqual(s::cl_float x, s::cl_float y) __NOEXC {
260+
return __sFOrdNotEqual(x, y);
261+
}
262+
__SYCL_EXPORT s::cl_int FOrdNotEqual(s::cl_double x, s::cl_double y) __NOEXC {
263+
return __sFOrdNotEqual(x, y);
264+
}
265+
__SYCL_EXPORT s::cl_int FOrdNotEqual(s::cl_half x, s::cl_half y) __NOEXC {
266+
return __sFOrdNotEqual(x, y);
267+
}
268+
MAKE_1V_2V_FUNC(FOrdNotEqual, __vFOrdNotEqual, s::cl_int, s::cl_float,
269+
s::cl_float)
270+
MAKE_1V_2V_FUNC(FOrdNotEqual, __vFOrdNotEqual, s::cl_long, s::cl_double,
271+
s::cl_double)
272+
MAKE_1V_2V_FUNC(FOrdNotEqual, __vFOrdNotEqual, s::cl_short, s::cl_half,
273+
s::cl_half)
274+
250275
// (LessOrGreater) // islessgreater
251276
__SYCL_EXPORT s::cl_int LessOrGreater(s::cl_float x, s::cl_float y) __NOEXC {
252277
return __sLessOrGreater(x, y);

sycl/test/abi/sycl_symbols_linux.dump

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,27 @@ _ZN2cl10__host_std12FOrdLessThanENS_4sycl3vecIfLi8EEES3_
323323
_ZN2cl10__host_std12FOrdLessThanENS_4sycl6detail9half_impl4halfES4_
324324
_ZN2cl10__host_std12FOrdLessThanEdd
325325
_ZN2cl10__host_std12FOrdLessThanEff
326+
_ZN2cl10__host_std12FOrdNotEqualENS_4sycl3vecINS1_6detail9half_impl4halfELi16EEES6_
327+
_ZN2cl10__host_std12FOrdNotEqualENS_4sycl3vecINS1_6detail9half_impl4halfELi1EEES6_
328+
_ZN2cl10__host_std12FOrdNotEqualENS_4sycl3vecINS1_6detail9half_impl4halfELi2EEES6_
329+
_ZN2cl10__host_std12FOrdNotEqualENS_4sycl3vecINS1_6detail9half_impl4halfELi3EEES6_
330+
_ZN2cl10__host_std12FOrdNotEqualENS_4sycl3vecINS1_6detail9half_impl4halfELi4EEES6_
331+
_ZN2cl10__host_std12FOrdNotEqualENS_4sycl3vecINS1_6detail9half_impl4halfELi8EEES6_
332+
_ZN2cl10__host_std12FOrdNotEqualENS_4sycl3vecIdLi16EEES3_
333+
_ZN2cl10__host_std12FOrdNotEqualENS_4sycl3vecIdLi1EEES3_
334+
_ZN2cl10__host_std12FOrdNotEqualENS_4sycl3vecIdLi2EEES3_
335+
_ZN2cl10__host_std12FOrdNotEqualENS_4sycl3vecIdLi3EEES3_
336+
_ZN2cl10__host_std12FOrdNotEqualENS_4sycl3vecIdLi4EEES3_
337+
_ZN2cl10__host_std12FOrdNotEqualENS_4sycl3vecIdLi8EEES3_
338+
_ZN2cl10__host_std12FOrdNotEqualENS_4sycl3vecIfLi16EEES3_
339+
_ZN2cl10__host_std12FOrdNotEqualENS_4sycl3vecIfLi1EEES3_
340+
_ZN2cl10__host_std12FOrdNotEqualENS_4sycl3vecIfLi2EEES3_
341+
_ZN2cl10__host_std12FOrdNotEqualENS_4sycl3vecIfLi3EEES3_
342+
_ZN2cl10__host_std12FOrdNotEqualENS_4sycl3vecIfLi4EEES3_
343+
_ZN2cl10__host_std12FOrdNotEqualENS_4sycl3vecIfLi8EEES3_
344+
_ZN2cl10__host_std12FOrdNotEqualENS_4sycl6detail9half_impl4halfES4_
345+
_ZN2cl10__host_std12FOrdNotEqualEdd
346+
_ZN2cl10__host_std12FOrdNotEqualEff
326347
_ZN2cl10__host_std12native_exp10ENS_4sycl3vecIfLi16EEE
327348
_ZN2cl10__host_std12native_exp10ENS_4sycl3vecIfLi1EEE
328349
_ZN2cl10__host_std12native_exp10ENS_4sycl3vecIfLi2EEE

sycl/test/abi/sycl_symbols_windows.dump

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -744,6 +744,27 @@
744744
?FOrdLessThanEqual@__host_std@cl@@YAHMM@Z
745745
?FOrdLessThanEqual@__host_std@cl@@YAHNN@Z
746746
?FOrdLessThanEqual@__host_std@cl@@YAHVhalf@half_impl@detail@sycl@2@0@Z
747+
?FOrdNotEqual@__host_std@cl@@YA?AV?$vec@F$00@sycl@2@V?$vec@Vhalf@half_impl@detail@sycl@cl@@$00@42@0@Z
748+
?FOrdNotEqual@__host_std@cl@@YA?AV?$vec@F$01@sycl@2@V?$vec@Vhalf@half_impl@detail@sycl@cl@@$01@42@0@Z
749+
?FOrdNotEqual@__host_std@cl@@YA?AV?$vec@F$02@sycl@2@V?$vec@Vhalf@half_impl@detail@sycl@cl@@$02@42@0@Z
750+
?FOrdNotEqual@__host_std@cl@@YA?AV?$vec@F$03@sycl@2@V?$vec@Vhalf@half_impl@detail@sycl@cl@@$03@42@0@Z
751+
?FOrdNotEqual@__host_std@cl@@YA?AV?$vec@F$07@sycl@2@V?$vec@Vhalf@half_impl@detail@sycl@cl@@$07@42@0@Z
752+
?FOrdNotEqual@__host_std@cl@@YA?AV?$vec@F$0BA@@sycl@2@V?$vec@Vhalf@half_impl@detail@sycl@cl@@$0BA@@42@0@Z
753+
?FOrdNotEqual@__host_std@cl@@YA?AV?$vec@H$00@sycl@2@V?$vec@M$00@42@0@Z
754+
?FOrdNotEqual@__host_std@cl@@YA?AV?$vec@H$01@sycl@2@V?$vec@M$01@42@0@Z
755+
?FOrdNotEqual@__host_std@cl@@YA?AV?$vec@H$02@sycl@2@V?$vec@M$02@42@0@Z
756+
?FOrdNotEqual@__host_std@cl@@YA?AV?$vec@H$03@sycl@2@V?$vec@M$03@42@0@Z
757+
?FOrdNotEqual@__host_std@cl@@YA?AV?$vec@H$07@sycl@2@V?$vec@M$07@42@0@Z
758+
?FOrdNotEqual@__host_std@cl@@YA?AV?$vec@H$0BA@@sycl@2@V?$vec@M$0BA@@42@0@Z
759+
?FOrdNotEqual@__host_std@cl@@YA?AV?$vec@_J$00@sycl@2@V?$vec@N$00@42@0@Z
760+
?FOrdNotEqual@__host_std@cl@@YA?AV?$vec@_J$01@sycl@2@V?$vec@N$01@42@0@Z
761+
?FOrdNotEqual@__host_std@cl@@YA?AV?$vec@_J$02@sycl@2@V?$vec@N$02@42@0@Z
762+
?FOrdNotEqual@__host_std@cl@@YA?AV?$vec@_J$03@sycl@2@V?$vec@N$03@42@0@Z
763+
?FOrdNotEqual@__host_std@cl@@YA?AV?$vec@_J$07@sycl@2@V?$vec@N$07@42@0@Z
764+
?FOrdNotEqual@__host_std@cl@@YA?AV?$vec@_J$0BA@@sycl@2@V?$vec@N$0BA@@42@0@Z
765+
?FOrdNotEqual@__host_std@cl@@YAHMM@Z
766+
?FOrdNotEqual@__host_std@cl@@YAHNN@Z
767+
?FOrdNotEqual@__host_std@cl@@YAHVhalf@half_impl@detail@sycl@2@0@Z
747768
?FUnordNotEqual@__host_std@cl@@YA?AV?$vec@F$00@sycl@2@V?$vec@Vhalf@half_impl@detail@sycl@cl@@$00@42@0@Z
748769
?FUnordNotEqual@__host_std@cl@@YA?AV?$vec@F$01@sycl@2@V?$vec@Vhalf@half_impl@detail@sycl@cl@@$01@42@0@Z
749770
?FUnordNotEqual@__host_std@cl@@YA?AV?$vec@F$02@sycl@2@V?$vec@Vhalf@half_impl@detail@sycl@cl@@$02@42@0@Z
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// RUN: %clangxx -I %sycl_include -S -emit-llvm -fsycl-device-only %s -o - -Xclang -disable-llvm-passes | FileCheck %s
2+
3+
#include <CL/sycl.hpp>
4+
5+
SYCL_EXTERNAL void test_islessgreater(float a, float b) {
6+
sycl::islessgreater(a, b);
7+
}
8+
// CHECK-NOT: __spirv_LessOrGreater
9+
// CHECK: {{.*}} = call spir_func zeroext i1 @_Z20__spirv_FOrdNotEqualff(float {{.*}}, float {{.*}})

0 commit comments

Comments
 (0)