From dbf031c44c4c2c75af29aa5226da04f4b8373634 Mon Sep 17 00:00:00 2001 From: Wenju He Date: Tue, 26 May 2026 13:22:50 +0200 Subject: [PATCH] [libspirv] Use clc and vectorize binary relational built-ins FOrdEqual, FUnordEqual, FOrdGreaterThan, FUnordGreaterThan, FUnordGreaterThanEqual, FUnordLessThan, FUnordLessThanEqual, LessOrGreater, FOrdNotEqual, Ordered and Unordered are now vectorized. --- .../generic/relational/genbinrelational.inc | 31 ------------------- .../lib/generic/relational/isequal.cl | 26 ++++++++++------ .../lib/generic/relational/isgreater.cl | 26 ++++++++++------ .../lib/generic/relational/isgreaterequal.cl | 26 ++++++++++------ .../libspirv/lib/generic/relational/isless.cl | 26 ++++++++++------ .../lib/generic/relational/islessequal.cl | 26 ++++++++++------ .../lib/generic/relational/islessgreater.cl | 12 ++++--- .../lib/generic/relational/isnotequal.cl | 26 ++++++++++------ .../lib/generic/relational/isordered.cl | 11 ++++--- .../lib/generic/relational/isunordered.cl | 11 ++++--- .../relational/relational_binary_def.inc | 22 +++++++++++++ 11 files changed, 137 insertions(+), 106 deletions(-) delete mode 100644 libclc/libspirv/lib/generic/relational/genbinrelational.inc create mode 100644 libclc/libspirv/lib/generic/relational/relational_binary_def.inc diff --git a/libclc/libspirv/lib/generic/relational/genbinrelational.inc b/libclc/libspirv/lib/generic/relational/genbinrelational.inc deleted file mode 100644 index 364b781a89c04..0000000000000 --- a/libclc/libspirv/lib/generic/relational/genbinrelational.inc +++ /dev/null @@ -1,31 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -_CLC_DEFINE_RELATIONAL_BINARY_SCALAR(bool, _CLC_SPIRV_BUILTIN, - _CLC_BUILTIN_IMPL, float, float) -_CLC_DEFINE_RELATIONAL_BINARY_VEC_ALL(char, _CLC_SPIRV_BUILTIN, float, float) - -#ifdef cl_khr_fp64 - -#pragma OPENCL EXTENSION cl_khr_fp64 : enable - -_CLC_DEFINE_RELATIONAL_BINARY_SCALAR(bool, _CLC_SPIRV_BUILTIN, - _CLC_BUILTIN_IMPL, double, double) -_CLC_DEFINE_RELATIONAL_BINARY_VEC_ALL(char, _CLC_SPIRV_BUILTIN, double, double) - -#endif - -#ifdef cl_khr_fp16 - -#pragma OPENCL EXTENSION cl_khr_fp16 : enable - -_CLC_DEFINE_RELATIONAL_BINARY_SCALAR(bool, _CLC_SPIRV_BUILTIN, - _CLC_BUILTIN_IMPL, half, half) -_CLC_DEFINE_RELATIONAL_BINARY_VEC_ALL(char, _CLC_SPIRV_BUILTIN, half, half) - -#endif diff --git a/libclc/libspirv/lib/generic/relational/isequal.cl b/libclc/libspirv/lib/generic/relational/isequal.cl index a0b78f4ef8117..1341513bfd59f 100644 --- a/libclc/libspirv/lib/generic/relational/isequal.cl +++ b/libclc/libspirv/lib/generic/relational/isequal.cl @@ -6,15 +6,21 @@ // //===----------------------------------------------------------------------===// -#include -#include +#include "clc/clc_convert.h" +#include "clc/relational/clc_isequal.h" +#include "clc/relational/clc_isunordered.h" -#define _CLC_SPIRV_BUILTIN __spirv_FUnordEqual -#define _CLC_BUILTIN_IMPL(X, Y) ((__spirv_Unordered(X, Y)) || (X == Y)) -#include "genbinrelational.inc" -#undef _CLC_SPIRV_BUILTIN -#undef _CLC_BUILTIN_IMPL +#define __CLC_FUNCTION __spirv_FOrdEqual +#define __CLC_IMPL_FUNCTION(x) __clc_isequal +#define __CLC_BODY "relational_binary_def.inc" +#include "clc/math/gentype.inc" -#define _CLC_SPIRV_BUILTIN __spirv_FOrdEqual -#define _CLC_BUILTIN_IMPL(X, Y) ((__spirv_Ordered(X, Y)) && (X == Y)) -#include "genbinrelational.inc" +#undef __CLC_FUNCTION +#undef __CLC_IMPL_FUNCTION + +#define __CLC_FUNCTION __spirv_FUnordEqual +#define __CLC_IMPL_FUNCTION(x) __CLC_REL_OP_BODY +#define __CLC_REL_OP_BODY(x, y) \ + ((__clc_isunordered(x, y)) || (__clc_isequal(x, y))) +#define __CLC_BODY "relational_binary_def.inc" +#include "clc/math/gentype.inc" diff --git a/libclc/libspirv/lib/generic/relational/isgreater.cl b/libclc/libspirv/lib/generic/relational/isgreater.cl index a341605f3d332..3ba5931f3eb86 100644 --- a/libclc/libspirv/lib/generic/relational/isgreater.cl +++ b/libclc/libspirv/lib/generic/relational/isgreater.cl @@ -6,15 +6,21 @@ // //===----------------------------------------------------------------------===// -#include -#include +#include "clc/clc_convert.h" +#include "clc/relational/clc_isgreater.h" +#include "clc/relational/clc_isunordered.h" -#define _CLC_SPIRV_BUILTIN __spirv_FOrdGreaterThan -#define _CLC_BUILTIN_IMPL __builtin_isgreater -#include "genbinrelational.inc" -#undef _CLC_SPIRV_BUILTIN -#undef _CLC_BUILTIN_IMPL +#define __CLC_FUNCTION __spirv_FOrdGreaterThan +#define __CLC_IMPL_FUNCTION(x) __clc_isgreater +#define __CLC_BODY "relational_binary_def.inc" +#include "clc/math/gentype.inc" -#define _CLC_SPIRV_BUILTIN __spirv_FUnordGreaterThan -#define _CLC_BUILTIN_IMPL(X, Y) ((__spirv_Unordered(X, Y)) || (X > Y)) -#include "genbinrelational.inc" +#undef __CLC_FUNCTION +#undef __CLC_IMPL_FUNCTION + +#define __CLC_FUNCTION __spirv_FUnordGreaterThan +#define __CLC_IMPL_FUNCTION(x) __CLC_REL_OP_BODY +#define __CLC_REL_OP_BODY(x, y) \ + ((__clc_isunordered(x, y)) || (__clc_isgreater(x, y))) +#define __CLC_BODY "relational_binary_def.inc" +#include "clc/math/gentype.inc" diff --git a/libclc/libspirv/lib/generic/relational/isgreaterequal.cl b/libclc/libspirv/lib/generic/relational/isgreaterequal.cl index 3412c448e3934..546d4312b2385 100644 --- a/libclc/libspirv/lib/generic/relational/isgreaterequal.cl +++ b/libclc/libspirv/lib/generic/relational/isgreaterequal.cl @@ -6,15 +6,21 @@ // //===----------------------------------------------------------------------===// -#include -#include +#include "clc/clc_convert.h" +#include "clc/relational/clc_isgreaterequal.h" +#include "clc/relational/clc_isunordered.h" -#define _CLC_SPIRV_BUILTIN __spirv_FOrdGreaterThanEqual -#define _CLC_BUILTIN_IMPL __builtin_isgreaterequal -#include "genbinrelational.inc" -#undef _CLC_SPIRV_BUILTIN -#undef _CLC_BUILTIN_IMPL +#define __CLC_FUNCTION __spirv_FOrdGreaterThanEqual +#define __CLC_IMPL_FUNCTION(x) __clc_isgreaterequal +#define __CLC_BODY "relational_binary_def.inc" +#include "clc/math/gentype.inc" -#define _CLC_SPIRV_BUILTIN __spirv_FUnordGreaterThanEqual -#define _CLC_BUILTIN_IMPL(X, Y) ((__spirv_Unordered(X, Y)) || (X >= Y)) -#include "genbinrelational.inc" +#undef __CLC_FUNCTION +#undef __CLC_IMPL_FUNCTION + +#define __CLC_FUNCTION __spirv_FUnordGreaterThanEqual +#define __CLC_IMPL_FUNCTION(x) __CLC_REL_OP_BODY +#define __CLC_REL_OP_BODY(x, y) \ + ((__clc_isunordered(x, y)) || (__clc_isgreaterequal(x, y))) +#define __CLC_BODY "relational_binary_def.inc" +#include "clc/math/gentype.inc" diff --git a/libclc/libspirv/lib/generic/relational/isless.cl b/libclc/libspirv/lib/generic/relational/isless.cl index eb5524e534370..514a95658e79a 100644 --- a/libclc/libspirv/lib/generic/relational/isless.cl +++ b/libclc/libspirv/lib/generic/relational/isless.cl @@ -6,15 +6,21 @@ // //===----------------------------------------------------------------------===// -#include -#include +#include "clc/clc_convert.h" +#include "clc/relational/clc_isless.h" +#include "clc/relational/clc_isunordered.h" -#define _CLC_SPIRV_BUILTIN __spirv_FOrdLessThan -#define _CLC_BUILTIN_IMPL __builtin_isless -#include "genbinrelational.inc" -#undef _CLC_SPIRV_BUILTIN -#undef _CLC_BUILTIN_IMPL +#define __CLC_FUNCTION __spirv_FOrdLessThan +#define __CLC_IMPL_FUNCTION(x) __clc_isless +#define __CLC_BODY "relational_binary_def.inc" +#include "clc/math/gentype.inc" -#define _CLC_SPIRV_BUILTIN __spirv_FUnordLessThan -#define _CLC_BUILTIN_IMPL(X, Y) ((__spirv_Unordered(X, Y)) || (X < Y)) -#include "genbinrelational.inc" +#undef __CLC_FUNCTION +#undef __CLC_IMPL_FUNCTION + +#define __CLC_FUNCTION __spirv_FUnordLessThan +#define __CLC_IMPL_FUNCTION(x) __CLC_REL_OP_BODY +#define __CLC_REL_OP_BODY(x, y) \ + ((__clc_isunordered(x, y)) || (__clc_isless(x, y))) +#define __CLC_BODY "relational_binary_def.inc" +#include "clc/math/gentype.inc" diff --git a/libclc/libspirv/lib/generic/relational/islessequal.cl b/libclc/libspirv/lib/generic/relational/islessequal.cl index 4a4224c64c734..11998431836c8 100644 --- a/libclc/libspirv/lib/generic/relational/islessequal.cl +++ b/libclc/libspirv/lib/generic/relational/islessequal.cl @@ -6,15 +6,21 @@ // //===----------------------------------------------------------------------===// -#include -#include +#include "clc/clc_convert.h" +#include "clc/relational/clc_islessequal.h" +#include "clc/relational/clc_isunordered.h" -#define _CLC_SPIRV_BUILTIN __spirv_FOrdLessThanEqual -#define _CLC_BUILTIN_IMPL __builtin_islessequal -#include "genbinrelational.inc" -#undef _CLC_SPIRV_BUILTIN -#undef _CLC_BUILTIN_IMPL +#define __CLC_FUNCTION __spirv_FOrdLessThanEqual +#define __CLC_IMPL_FUNCTION(x) __clc_islessequal +#define __CLC_BODY "relational_binary_def.inc" +#include "clc/math/gentype.inc" -#define _CLC_SPIRV_BUILTIN __spirv_FUnordLessThanEqual -#define _CLC_BUILTIN_IMPL(X, Y) ((__spirv_Unordered(X, Y)) || (X <= Y)) -#include "genbinrelational.inc" +#undef __CLC_FUNCTION +#undef __CLC_IMPL_FUNCTION + +#define __CLC_FUNCTION __spirv_FUnordLessThanEqual +#define __CLC_IMPL_FUNCTION(x) __CLC_REL_OP_BODY +#define __CLC_REL_OP_BODY(x, y) \ + ((__clc_isunordered(x, y)) || (__clc_islessequal(x, y))) +#define __CLC_BODY "relational_binary_def.inc" +#include "clc/math/gentype.inc" diff --git a/libclc/libspirv/lib/generic/relational/islessgreater.cl b/libclc/libspirv/lib/generic/relational/islessgreater.cl index 419f513bed414..6a313e4e83d9d 100644 --- a/libclc/libspirv/lib/generic/relational/islessgreater.cl +++ b/libclc/libspirv/lib/generic/relational/islessgreater.cl @@ -6,9 +6,11 @@ // //===----------------------------------------------------------------------===// -#include -#include +#include "clc/clc_convert.h" +#include "clc/relational/clc_islessgreater.h" +#include "libspirv/spirv.h" -#define _CLC_SPIRV_BUILTIN __spirv_LessOrGreater -#define _CLC_BUILTIN_IMPL __spirv_FOrdNotEqual -#include "genbinrelational.inc" +#define __CLC_FUNCTION __spirv_LessOrGreater +#define __CLC_IMPL_FUNCTION(x) __clc_islessgreater +#define __CLC_BODY "relational_binary_def.inc" +#include "clc/math/gentype.inc" diff --git a/libclc/libspirv/lib/generic/relational/isnotequal.cl b/libclc/libspirv/lib/generic/relational/isnotequal.cl index 9634aeb83b034..4d1147f325a5f 100644 --- a/libclc/libspirv/lib/generic/relational/isnotequal.cl +++ b/libclc/libspirv/lib/generic/relational/isnotequal.cl @@ -6,15 +6,21 @@ // //===----------------------------------------------------------------------===// -#include -#include +#include "clc/clc_convert.h" +#include "clc/relational/clc_isnotequal.h" +#include "clc/relational/clc_isordered.h" -#define _CLC_SPIRV_BUILTIN __spirv_FUnordNotEqual -#define _CLC_BUILTIN_IMPL(X, Y) ((__spirv_Unordered(X, Y)) || (X != Y)) -#include "genbinrelational.inc" -#undef _CLC_SPIRV_BUILTIN -#undef _CLC_BUILTIN_IMPL +#define __CLC_FUNCTION __spirv_FUnordNotEqual +#define __CLC_IMPL_FUNCTION(x) __clc_isnotequal +#define __CLC_BODY "relational_binary_def.inc" +#include "clc/math/gentype.inc" -#define _CLC_SPIRV_BUILTIN __spirv_FOrdNotEqual -#define _CLC_BUILTIN_IMPL(X, Y) ((__spirv_Ordered(X, Y)) && (X != Y)) -#include "genbinrelational.inc" +#undef __CLC_FUNCTION +#undef __CLC_IMPL_FUNCTION + +#define __CLC_FUNCTION __spirv_FOrdNotEqual +#define __CLC_IMPL_FUNCTION(x) __CLC_REL_OP_BODY +#define __CLC_REL_OP_BODY(x, y) \ + ((__clc_isordered(x, y)) && (__clc_isnotequal(x, y))) +#define __CLC_BODY "relational_binary_def.inc" +#include "clc/math/gentype.inc" diff --git a/libclc/libspirv/lib/generic/relational/isordered.cl b/libclc/libspirv/lib/generic/relational/isordered.cl index f50a29cf62a0b..66aa62f6d9620 100644 --- a/libclc/libspirv/lib/generic/relational/isordered.cl +++ b/libclc/libspirv/lib/generic/relational/isordered.cl @@ -6,9 +6,10 @@ // //===----------------------------------------------------------------------===// -#include -#include +#include "clc/clc_convert.h" +#include "clc/relational/clc_isordered.h" -#define _CLC_SPIRV_BUILTIN __spirv_Ordered -#define _CLC_BUILTIN_IMPL(X, Y) !__spirv_Unordered(x, y) -#include "genbinrelational.inc" +#define __CLC_FUNCTION __spirv_Ordered +#define __CLC_IMPL_FUNCTION(x) __clc_isordered +#define __CLC_BODY "relational_binary_def.inc" +#include "clc/math/gentype.inc" diff --git a/libclc/libspirv/lib/generic/relational/isunordered.cl b/libclc/libspirv/lib/generic/relational/isunordered.cl index 138dae6bf54d8..5ee70e4f0dacc 100644 --- a/libclc/libspirv/lib/generic/relational/isunordered.cl +++ b/libclc/libspirv/lib/generic/relational/isunordered.cl @@ -6,9 +6,10 @@ // //===----------------------------------------------------------------------===// -#include -#include +#include "clc/clc_convert.h" +#include "clc/relational/clc_isunordered.h" -#define _CLC_SPIRV_BUILTIN __spirv_Unordered -#define _CLC_BUILTIN_IMPL __builtin_isunordered -#include "genbinrelational.inc" +#define __CLC_FUNCTION __spirv_Unordered +#define __CLC_IMPL_FUNCTION(x) __clc_isunordered +#define __CLC_BODY "relational_binary_def.inc" +#include "clc/math/gentype.inc" diff --git a/libclc/libspirv/lib/generic/relational/relational_binary_def.inc b/libclc/libspirv/lib/generic/relational/relational_binary_def.inc new file mode 100644 index 0000000000000..10fe6c5ebc058 --- /dev/null +++ b/libclc/libspirv/lib/generic/relational/relational_binary_def.inc @@ -0,0 +1,22 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "clc/utils.h" + +#if __CLC_VECSIZE_OR_1 == 1 +#define __CLC_RETTYPE bool +#else +#define __CLC_RETTYPE __CLC_CHARN +#endif + +_CLC_OVERLOAD _CLC_DEF __CLC_RETTYPE __CLC_FUNCTION(__CLC_GENTYPE x, + __CLC_GENTYPE y) { + return __CLC_CONVERT_CHARN(__CLC_IMPL_FUNCTION(__CLC_FUNCTION)(x, y)); +} + +#undef __CLC_RETTYPE