From 93fa35235fa7f587efa639b059c59848be58da70 Mon Sep 17 00:00:00 2001 From: Wenju He Date: Thu, 28 May 2026 02:09:58 +0200 Subject: [PATCH] [libspirv] Use clc unary relational functions Also cherry-picks 9cc6c9375faa to avoid SignBitSet regression. IsNormal and SignBitSet are now vectorized. NFC to other built-ins. in function _Z16__spirv_IsNormalDv2_f: > %2 = extractelement <2 x float> %0, i64 0 > %3 = tail call noundef i1 @llvm.is.fpclass.f32(float %2, i32 264) > %4 = zext i1 %3 to i8 > %5 = insertelement <2 x i8> poison, i8 %4, i64 0 > %6 = extractelement <2 x float> %0, i64 1 > %7 = tail call noundef i1 @llvm.is.fpclass.f32(float %6, i32 264) > %8 = zext i1 %7 to i8 > %9 = insertelement <2 x i8> %5, i8 %8, i64 1 > %10 = icmp ne <2 x i8> %9, zeroinitializer > %11 = sext <2 x i1> %10 to <2 x i8> < %2 = tail call <2 x i1> @llvm.is.fpclass.v2f32(<2 x float> %0, i32 264) < %3 = sext <2 x i1> %2 to <2 x i8> in function _Z18__spirv_SignBitSetDv2_Dh: > %3 = extractelement <2 x i16> %2, i64 0 > %4 = lshr i16 %3, 15 > %5 = trunc nuw nsw i16 %4 to i8 > %6 = insertelement <2 x i8> poison, i8 %5, i64 0 > %7 = extractelement <2 x i16> %2, i64 1 > %8 = lshr i16 %7, 15 > %9 = trunc nuw nsw i16 %8 to i8 > %10 = insertelement <2 x i8> %6, i8 %9, i64 1 > %11 = icmp ne <2 x i8> %10, zeroinitializer > %12 = sext <2 x i1> %11 to <2 x i8> < %3 = ashr <2 x i16> %2, splat (i16 15) < %4 = trunc nsw <2 x i16> %3 to <2 x i8> --- .../clc/include/clc/relational/clc_signbit.h | 2 + .../clc/lib/generic/relational/clc_signbit.cl | 88 +------------------ .../lib/generic/relational/clc_signbit.inc | 23 +++++ .../lib/generic/relational/genunary.inc | 30 ------- .../lib/generic/relational/isfinite.cl | 11 +-- .../libspirv/lib/generic/relational/isinf.cl | 11 +-- .../libspirv/lib/generic/relational/isnan.cl | 11 +-- .../lib/generic/relational/isnormal.cl | 11 +-- .../relational/relational_unary_def.inc | 21 +++++ .../libspirv/lib/generic/relational/select.cl | 13 ++- .../lib/generic/relational/signbit.cl | 11 +-- 11 files changed, 85 insertions(+), 147 deletions(-) create mode 100644 libclc/clc/lib/generic/relational/clc_signbit.inc delete mode 100644 libclc/libspirv/lib/generic/relational/genunary.inc create mode 100644 libclc/libspirv/lib/generic/relational/relational_unary_def.inc diff --git a/libclc/clc/include/clc/relational/clc_signbit.h b/libclc/clc/include/clc/relational/clc_signbit.h index 45677fba6cb89..1656ba1bcae76 100644 --- a/libclc/clc/include/clc/relational/clc_signbit.h +++ b/libclc/clc/include/clc/relational/clc_signbit.h @@ -9,6 +9,8 @@ #ifndef __CLC_RELATIONAL_CLC_SIGNBIT_H__ #define __CLC_RELATIONAL_CLC_SIGNBIT_H__ +#include "clc/internal/clc.h" + #define __CLC_FUNCTION __clc_signbit #define __CLC_BODY "clc/relational/unary_decl.inc" diff --git a/libclc/clc/lib/generic/relational/clc_signbit.cl b/libclc/clc/lib/generic/relational/clc_signbit.cl index 05d2e8a0039ad..68faaa1594cbe 100644 --- a/libclc/clc/lib/generic/relational/clc_signbit.cl +++ b/libclc/clc/lib/generic/relational/clc_signbit.cl @@ -6,89 +6,7 @@ // //===----------------------------------------------------------------------===// -#include "clc/internal/clc.h" -#include "clc/relational/relational.h" +#include "clc/relational/clc_signbit.h" -#define _CLC_DEFINE_RELATIONAL_UNARY_VEC2(RET_TYPE, __CLC_FUNCTION, ARG_TYPE) \ - _CLC_DEF _CLC_OVERLOAD RET_TYPE __CLC_FUNCTION(ARG_TYPE x) { \ - return (RET_TYPE)((RET_TYPE){__CLC_FUNCTION(x.lo), \ - __CLC_FUNCTION(x.hi)} != (RET_TYPE)0); \ - } - -#define _CLC_DEFINE_RELATIONAL_UNARY_VEC3(RET_TYPE, __CLC_FUNCTION, ARG_TYPE) \ - _CLC_DEF _CLC_OVERLOAD RET_TYPE __CLC_FUNCTION(ARG_TYPE x) { \ - return (RET_TYPE)((RET_TYPE){__CLC_FUNCTION(x.s0), __CLC_FUNCTION(x.s1), \ - __CLC_FUNCTION(x.s2)} != (RET_TYPE)0); \ - } - -#define _CLC_DEFINE_RELATIONAL_UNARY_VEC4(RET_TYPE, __CLC_FUNCTION, ARG_TYPE) \ - _CLC_DEF _CLC_OVERLOAD RET_TYPE __CLC_FUNCTION(ARG_TYPE x) { \ - return (RET_TYPE)((RET_TYPE){__CLC_FUNCTION(x.s0), __CLC_FUNCTION(x.s1), \ - __CLC_FUNCTION(x.s2), \ - __CLC_FUNCTION(x.s3)} != (RET_TYPE)0); \ - } - -#define _CLC_DEFINE_RELATIONAL_UNARY_VEC8(RET_TYPE, __CLC_FUNCTION, ARG_TYPE) \ - _CLC_DEF _CLC_OVERLOAD RET_TYPE __CLC_FUNCTION(ARG_TYPE x) { \ - return (RET_TYPE)((RET_TYPE){__CLC_FUNCTION(x.s0), __CLC_FUNCTION(x.s1), \ - __CLC_FUNCTION(x.s2), __CLC_FUNCTION(x.s3), \ - __CLC_FUNCTION(x.s4), __CLC_FUNCTION(x.s5), \ - __CLC_FUNCTION(x.s6), \ - __CLC_FUNCTION(x.s7)} != (RET_TYPE)0); \ - } - -#define _CLC_DEFINE_RELATIONAL_UNARY_VEC16(RET_TYPE, __CLC_FUNCTION, ARG_TYPE) \ - _CLC_DEF _CLC_OVERLOAD RET_TYPE __CLC_FUNCTION(ARG_TYPE x) { \ - return (RET_TYPE)((RET_TYPE){__CLC_FUNCTION(x.s0), __CLC_FUNCTION(x.s1), \ - __CLC_FUNCTION(x.s2), __CLC_FUNCTION(x.s3), \ - __CLC_FUNCTION(x.s4), __CLC_FUNCTION(x.s5), \ - __CLC_FUNCTION(x.s6), __CLC_FUNCTION(x.s7), \ - __CLC_FUNCTION(x.s8), __CLC_FUNCTION(x.s9), \ - __CLC_FUNCTION(x.sa), __CLC_FUNCTION(x.sb), \ - __CLC_FUNCTION(x.sc), __CLC_FUNCTION(x.sd), \ - __CLC_FUNCTION(x.se), \ - __CLC_FUNCTION(x.sf)} != (RET_TYPE)0); \ - } - -#define _CLC_DEFINE_RELATIONAL_UNARY_VEC_ALL(RET_TYPE, __CLC_FUNCTION, \ - ARG_TYPE) \ - _CLC_DEFINE_RELATIONAL_UNARY_VEC2(RET_TYPE##2, __CLC_FUNCTION, ARG_TYPE##2) \ - _CLC_DEFINE_RELATIONAL_UNARY_VEC3(RET_TYPE##3, __CLC_FUNCTION, ARG_TYPE##3) \ - _CLC_DEFINE_RELATIONAL_UNARY_VEC4(RET_TYPE##4, __CLC_FUNCTION, ARG_TYPE##4) \ - _CLC_DEFINE_RELATIONAL_UNARY_VEC8(RET_TYPE##8, __CLC_FUNCTION, ARG_TYPE##8) \ - _CLC_DEFINE_RELATIONAL_UNARY_VEC16(RET_TYPE##16, __CLC_FUNCTION, ARG_TYPE##16) - -_CLC_DEF _CLC_OVERLOAD int __clc_signbit(float x) { - return __builtin_signbitf(x); -} - -_CLC_DEFINE_RELATIONAL_UNARY_VEC_ALL(int, __clc_signbit, float) - -#ifdef cl_khr_fp64 - -#pragma OPENCL EXTENSION cl_khr_fp64 : enable - -// The scalar version of __clc_signbit(double) returns an int, but the vector -// versions return long. - -_CLC_DEF _CLC_OVERLOAD int __clc_signbit(double x) { - return __builtin_signbit(x); -} - -_CLC_DEFINE_RELATIONAL_UNARY_VEC_ALL(long, __clc_signbit, double) - -#endif -#ifdef cl_khr_fp16 - -#pragma OPENCL EXTENSION cl_khr_fp16 : enable - -// The scalar version of __clc_signbit(half) returns an int, but the vector -// versions return short. - -_CLC_DEF _CLC_OVERLOAD int __clc_signbit(half x) { - return __builtin_signbit(x); -} - -_CLC_DEFINE_RELATIONAL_UNARY_VEC_ALL(short, __clc_signbit, half) - -#endif +#define __CLC_BODY "clc_signbit.inc" +#include "clc/math/gentype.inc" diff --git a/libclc/clc/lib/generic/relational/clc_signbit.inc b/libclc/clc/lib/generic/relational/clc_signbit.inc new file mode 100644 index 0000000000000..9e3c9c16f41c7 --- /dev/null +++ b/libclc/clc/lib/generic/relational/clc_signbit.inc @@ -0,0 +1,23 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// +//===----------------------------------------------------------------------===// + +#if __CLC_VECSIZE_OR_1 == 1 +#define __CLC_RETTYPE __CLC_INTN +#else +#define __CLC_RETTYPE __CLC_S_GENTYPE +#endif + +_CLC_OVERLOAD _CLC_DEF __CLC_RETTYPE __clc_signbit(__CLC_GENTYPE x) { +#if __CLC_VECSIZE_OR_1 == 1 + return (__CLC_INTN)(__CLC_AS_U_GENTYPE(x) >> (__CLC_FPSIZE - 1)); +#else + return __CLC_AS_S_GENTYPE(x) >> (__CLC_FPSIZE - 1); +#endif +} + +#undef __CLC_RETTYPE diff --git a/libclc/libspirv/lib/generic/relational/genunary.inc b/libclc/libspirv/lib/generic/relational/genunary.inc deleted file mode 100644 index 7f373d0a27618..0000000000000 --- a/libclc/libspirv/lib/generic/relational/genunary.inc +++ /dev/null @@ -1,30 +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_UNARY_SCALAR(bool, _CLC_SPIRV_BUILTIN, _CLC_BUILTIN_IMPL, - float) -_CLC_DEFINE_RELATIONAL_UNARY_VEC_ALL(char, _CLC_SPIRV_BUILTIN, float) - -#ifdef cl_khr_fp64 - -#pragma OPENCL EXTENSION cl_khr_fp64 : enable - -_CLC_DEFINE_RELATIONAL_UNARY_SCALAR(bool, _CLC_SPIRV_BUILTIN, _CLC_BUILTIN_IMPL, - double) -_CLC_DEFINE_RELATIONAL_UNARY_VEC_ALL(char, _CLC_SPIRV_BUILTIN, double) - -#endif -#ifdef cl_khr_fp16 - -#pragma OPENCL EXTENSION cl_khr_fp16 : enable - -_CLC_DEFINE_RELATIONAL_UNARY_SCALAR(bool, _CLC_SPIRV_BUILTIN, _CLC_BUILTIN_IMPL, - half) -_CLC_DEFINE_RELATIONAL_UNARY_VEC_ALL(char, _CLC_SPIRV_BUILTIN, half) - -#endif diff --git a/libclc/libspirv/lib/generic/relational/isfinite.cl b/libclc/libspirv/lib/generic/relational/isfinite.cl index f28ec958cf264..29e1d32ca1968 100644 --- a/libclc/libspirv/lib/generic/relational/isfinite.cl +++ b/libclc/libspirv/lib/generic/relational/isfinite.cl @@ -6,9 +6,10 @@ // //===----------------------------------------------------------------------===// -#include -#include +#include "clc/clc_convert.h" +#include "clc/relational/clc_isfinite.h" -#define _CLC_SPIRV_BUILTIN __spirv_IsFinite -#define _CLC_BUILTIN_IMPL __builtin_isfinite -#include "genunary.inc" +#define __CLC_FUNCTION __spirv_IsFinite +#define __CLC_IMPL_FUNCTION(x) __clc_isfinite +#define __CLC_BODY "relational_unary_def.inc" +#include "clc/math/gentype.inc" diff --git a/libclc/libspirv/lib/generic/relational/isinf.cl b/libclc/libspirv/lib/generic/relational/isinf.cl index 548b9bd6dd976..f9748dade2db9 100644 --- a/libclc/libspirv/lib/generic/relational/isinf.cl +++ b/libclc/libspirv/lib/generic/relational/isinf.cl @@ -6,9 +6,10 @@ // //===----------------------------------------------------------------------===// -#include -#include +#include "clc/clc_convert.h" +#include "clc/relational/clc_isinf.h" -#define _CLC_SPIRV_BUILTIN __spirv_IsInf -#define _CLC_BUILTIN_IMPL __builtin_isinf -#include "genunary.inc" +#define __CLC_FUNCTION __spirv_IsInf +#define __CLC_IMPL_FUNCTION(x) __clc_isinf +#define __CLC_BODY "relational_unary_def.inc" +#include "clc/math/gentype.inc" diff --git a/libclc/libspirv/lib/generic/relational/isnan.cl b/libclc/libspirv/lib/generic/relational/isnan.cl index 5362b744741cd..180d210a596e8 100644 --- a/libclc/libspirv/lib/generic/relational/isnan.cl +++ b/libclc/libspirv/lib/generic/relational/isnan.cl @@ -6,9 +6,10 @@ // //===----------------------------------------------------------------------===// -#include -#include +#include "clc/clc_convert.h" +#include "clc/relational/clc_isnan.h" -#define _CLC_SPIRV_BUILTIN __spirv_IsNan -#define _CLC_BUILTIN_IMPL __builtin_isnan -#include "genunary.inc" +#define __CLC_FUNCTION __spirv_IsNan +#define __CLC_IMPL_FUNCTION(x) __clc_isnan +#define __CLC_BODY "relational_unary_def.inc" +#include "clc/math/gentype.inc" diff --git a/libclc/libspirv/lib/generic/relational/isnormal.cl b/libclc/libspirv/lib/generic/relational/isnormal.cl index cf8db268f5e1d..a9db8bb27e261 100644 --- a/libclc/libspirv/lib/generic/relational/isnormal.cl +++ b/libclc/libspirv/lib/generic/relational/isnormal.cl @@ -6,9 +6,10 @@ // //===----------------------------------------------------------------------===// -#include -#include +#include "clc/clc_convert.h" +#include "clc/relational/clc_isnormal.h" -#define _CLC_SPIRV_BUILTIN __spirv_IsNormal -#define _CLC_BUILTIN_IMPL __builtin_isnormal -#include "genunary.inc" +#define __CLC_FUNCTION __spirv_IsNormal +#define __CLC_IMPL_FUNCTION(x) __clc_isnormal +#define __CLC_BODY "relational_unary_def.inc" +#include "clc/math/gentype.inc" diff --git a/libclc/libspirv/lib/generic/relational/relational_unary_def.inc b/libclc/libspirv/lib/generic/relational/relational_unary_def.inc new file mode 100644 index 0000000000000..e013f30a7273f --- /dev/null +++ b/libclc/libspirv/lib/generic/relational/relational_unary_def.inc @@ -0,0 +1,21 @@ +//===----------------------------------------------------------------------===// +// +// 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) { + return __CLC_CONVERT_CHARN(__CLC_IMPL_FUNCTION(__CLC_FUNCTION)(x)); +} + +#undef __CLC_RETTYPE diff --git a/libclc/libspirv/lib/generic/relational/select.cl b/libclc/libspirv/lib/generic/relational/select.cl index bee780025c829..edfa9c0f381ee 100644 --- a/libclc/libspirv/lib/generic/relational/select.cl +++ b/libclc/libspirv/lib/generic/relational/select.cl @@ -6,14 +6,13 @@ // //===----------------------------------------------------------------------===// -#include -#include -#include +#include "clc/relational/clc_select.h" +#include "clc/utils.h" #define __CLC_SELECT_FN __spirv_ocl_select #define __CLC_SELECT_DEF(x, y, z) return __clc_select(x, y, z) -#define __CLC_BODY -#include -#define __CLC_BODY -#include +#define __CLC_BODY "clc/relational/clc_select_impl.inc" +#include "clc/math/gentype.inc" +#define __CLC_BODY "clc/relational/clc_select_impl.inc" +#include "clc/integer/gentype.inc" diff --git a/libclc/libspirv/lib/generic/relational/signbit.cl b/libclc/libspirv/lib/generic/relational/signbit.cl index c7e2871ffb533..dd5266d03f42d 100644 --- a/libclc/libspirv/lib/generic/relational/signbit.cl +++ b/libclc/libspirv/lib/generic/relational/signbit.cl @@ -6,9 +6,10 @@ // //===----------------------------------------------------------------------===// -#include -#include +#include "clc/clc_convert.h" +#include "clc/relational/clc_signbit.h" -#define _CLC_SPIRV_BUILTIN __spirv_SignBitSet -#define _CLC_BUILTIN_IMPL __builtin_signbitf -#include "genunary.inc" +#define __CLC_FUNCTION __spirv_SignBitSet +#define __CLC_IMPL_FUNCTION(x) __clc_signbit +#define __CLC_BODY "relational_unary_def.inc" +#include "clc/math/gentype.inc"