diff --git a/libclc/clc/include/clc/integer/clc_abs.h b/libclc/clc/include/clc/integer/clc_abs.h new file mode 100644 index 0000000000000..31c62d311a006 --- /dev/null +++ b/libclc/clc/include/clc/integer/clc_abs.h @@ -0,0 +1,14 @@ +#ifndef __CLC_INTEGER_CLC_ABS_H__ +#define __CLC_INTEGER_CLC_ABS_H__ + +#if defined(CLC_CLSPV) || defined(CLC_SPIRV) +// clspv and spir-v targets provide their own OpenCL-compatible abs +#define __clc_abs abs +#else + +#define __CLC_BODY +#include + +#endif + +#endif // __CLC_INTEGER_CLC_ABS_H__ diff --git a/libclc/clc/include/clc/integer/clc_abs.inc b/libclc/clc/include/clc/integer/clc_abs.inc new file mode 100644 index 0000000000000..3b9901f6cb5dc --- /dev/null +++ b/libclc/clc/include/clc/integer/clc_abs.inc @@ -0,0 +1 @@ +_CLC_OVERLOAD _CLC_DECL __CLC_U_GENTYPE __clc_abs(__CLC_GENTYPE x); diff --git a/libclc/clc/include/clc/integer/clc_abs_diff.h b/libclc/clc/include/clc/integer/clc_abs_diff.h new file mode 100644 index 0000000000000..9c33fcff23b79 --- /dev/null +++ b/libclc/clc/include/clc/integer/clc_abs_diff.h @@ -0,0 +1,14 @@ +#ifndef __CLC_INTEGER_CLC_ABS_DIFF_H__ +#define __CLC_INTEGER_CLC_ABS_DIFF_H__ + +#if defined(CLC_CLSPV) || defined(CLC_SPIRV) +// clspv and spir-v targets provide their own OpenCL-compatible abs_diff +#define __clc_abs_diff abs_diff +#else + +#define __CLC_BODY +#include + +#endif + +#endif // __CLC_INTEGER_CLC_ABS_DIFF_H__ diff --git a/libclc/clc/include/clc/integer/clc_abs_diff.inc b/libclc/clc/include/clc/integer/clc_abs_diff.inc new file mode 100644 index 0000000000000..b0ec98aaeabe9 --- /dev/null +++ b/libclc/clc/include/clc/integer/clc_abs_diff.inc @@ -0,0 +1,2 @@ +_CLC_OVERLOAD _CLC_DECL __CLC_U_GENTYPE __clc_abs_diff(__CLC_GENTYPE x, + __CLC_GENTYPE y); diff --git a/libclc/clc/lib/generic/SOURCES b/libclc/clc/lib/generic/SOURCES index db523adb63836..d7ffaaf6dc3f4 100644 --- a/libclc/clc/lib/generic/SOURCES +++ b/libclc/clc/lib/generic/SOURCES @@ -1,4 +1,24 @@ geometric/clc_dot.cl +integer/clc_abs.cl +integer/clc_abs_diff.cl +relational/clc_all.cl +relational/clc_any.cl +relational/clc_bitselect.cl +relational/clc_isequal.cl +relational/clc_isfinite.cl +relational/clc_isgreater.cl +relational/clc_isgreaterequal.cl +relational/clc_isinf.cl +relational/clc_isless.cl +relational/clc_islessequal.cl +relational/clc_islessgreater.cl +relational/clc_isnan.cl +relational/clc_isnormal.cl +relational/clc_isnotequal.cl +relational/clc_isordered.cl +relational/clc_isunordered.cl +relational/clc_select.cl +relational/clc_signbit.cl shared/clc_clamp.cl shared/clc_max.cl shared/clc_min.cl diff --git a/libclc/clc/lib/generic/integer/clc_abs.cl b/libclc/clc/lib/generic/integer/clc_abs.cl new file mode 100644 index 0000000000000..31d004cbb38da --- /dev/null +++ b/libclc/clc/lib/generic/integer/clc_abs.cl @@ -0,0 +1,4 @@ +#include + +#define __CLC_BODY +#include diff --git a/libclc/clc/lib/generic/integer/clc_abs.inc b/libclc/clc/lib/generic/integer/clc_abs.inc new file mode 100644 index 0000000000000..dcdd77fd71730 --- /dev/null +++ b/libclc/clc/lib/generic/integer/clc_abs.inc @@ -0,0 +1,4 @@ +_CLC_OVERLOAD _CLC_DEF __CLC_U_GENTYPE __clc_abs(__CLC_GENTYPE x) { + return __builtin_astype((__CLC_GENTYPE)(x > (__CLC_GENTYPE)(0) ? x : -x), + __CLC_U_GENTYPE); +} diff --git a/libclc/clc/lib/generic/integer/clc_abs_diff.cl b/libclc/clc/lib/generic/integer/clc_abs_diff.cl new file mode 100644 index 0000000000000..db2fc502aadce --- /dev/null +++ b/libclc/clc/lib/generic/integer/clc_abs_diff.cl @@ -0,0 +1,4 @@ +#include + +#define __CLC_BODY +#include diff --git a/libclc/clc/lib/generic/integer/clc_abs_diff.inc b/libclc/clc/lib/generic/integer/clc_abs_diff.inc new file mode 100644 index 0000000000000..c0fe0fcdd0123 --- /dev/null +++ b/libclc/clc/lib/generic/integer/clc_abs_diff.inc @@ -0,0 +1,6 @@ +_CLC_OVERLOAD _CLC_DEF __CLC_U_GENTYPE __clc_abs_diff(__CLC_GENTYPE x, + __CLC_GENTYPE y) { + __CLC_U_GENTYPE ux = __builtin_astype(x, __CLC_U_GENTYPE); + __CLC_U_GENTYPE uy = __builtin_astype(y, __CLC_U_GENTYPE); + return x > y ? ux - uy : uy - ux; +} diff --git a/libclc/generic/lib/integer/abs.cl b/libclc/generic/lib/integer/abs.cl index ce092b56b4cf9..fda23c86d0869 100644 --- a/libclc/generic/lib/integer/abs.cl +++ b/libclc/generic/lib/integer/abs.cl @@ -1,6 +1,5 @@ #include -#include -#include +#include #define __CLC_BODY #include diff --git a/libclc/generic/lib/integer/abs.inc b/libclc/generic/lib/integer/abs.inc index cfe7bfecd294f..443d0dcb736d3 100644 --- a/libclc/generic/lib/integer/abs.inc +++ b/libclc/generic/lib/integer/abs.inc @@ -1,3 +1,3 @@ _CLC_OVERLOAD _CLC_DEF __CLC_U_GENTYPE abs(__CLC_GENTYPE x) { - return __builtin_astype((__CLC_GENTYPE)(x > (__CLC_GENTYPE)(0) ? x : -x), __CLC_U_GENTYPE); + return __clc_abs(x); } diff --git a/libclc/generic/lib/integer/abs_diff.cl b/libclc/generic/lib/integer/abs_diff.cl index 692f4a8fbca27..6cd9efca422d1 100644 --- a/libclc/generic/lib/integer/abs_diff.cl +++ b/libclc/generic/lib/integer/abs_diff.cl @@ -1,6 +1,5 @@ #include -#include -#include +#include #define __CLC_BODY #include diff --git a/libclc/generic/lib/integer/abs_diff.inc b/libclc/generic/lib/integer/abs_diff.inc index 2d3c492cae0e6..da87bb1f89875 100644 --- a/libclc/generic/lib/integer/abs_diff.inc +++ b/libclc/generic/lib/integer/abs_diff.inc @@ -1,5 +1,3 @@ _CLC_OVERLOAD _CLC_DEF __CLC_U_GENTYPE abs_diff(__CLC_GENTYPE x, __CLC_GENTYPE y) { - __CLC_U_GENTYPE ux = __builtin_astype(x, __CLC_U_GENTYPE); - __CLC_U_GENTYPE uy = __builtin_astype(y, __CLC_U_GENTYPE); - return x > y ? ux - uy : uy - ux; + return __clc_abs_diff(x, y); } diff --git a/libclc/generic/lib/math/clc_ldexp.cl b/libclc/generic/lib/math/clc_ldexp.cl index 470de0c8fcff6..6d3721588df81 100644 --- a/libclc/generic/lib/math/clc_ldexp.cl +++ b/libclc/generic/lib/math/clc_ldexp.cl @@ -20,10 +20,12 @@ * THE SOFTWARE. */ -#include "../clcmacro.h" #include "config.h" #include "math.h" #include +#include +#include +#include #include _CLC_DEF _CLC_OVERLOAD float __clc_ldexp(float x, int n) { diff --git a/libclc/generic/lib/relational/isinf.cl b/libclc/generic/lib/relational/isinf.cl index 3c85ccefad5f4..f6816659c6e84 100644 --- a/libclc/generic/lib/relational/isinf.cl +++ b/libclc/generic/lib/relational/isinf.cl @@ -1,31 +1,7 @@ #include -#include -#include "relational.h" +#include -_CLC_DEFINE_RELATIONAL_UNARY(int, isinf, __spirv_IsInf, float) +#define FUNCTION isinf +#define __CLC_BODY "unary_def.inc" -#ifdef cl_khr_fp64 - -#pragma OPENCL EXTENSION cl_khr_fp64 : enable - -// The scalar version of isinf(double) returns an int, but the vector versions -// return long. -_CLC_DEF _CLC_OVERLOAD int isinf(double x) { - return __spirv_IsInf(x); -} - -_CLC_DEFINE_RELATIONAL_UNARY_VEC_ALL(long, isinf, double) -#endif - -#ifdef cl_khr_fp16 - -#pragma OPENCL EXTENSION cl_khr_fp16 : enable - -// The scalar version of isinf(half) returns an int, but the vector versions -// return short. -_CLC_DEF _CLC_OVERLOAD int isinf(half x) { - return __spirv_IsInf(x); -} - -_CLC_DEFINE_RELATIONAL_UNARY_VEC_ALL(short, isinf, half) -#endif +#include diff --git a/libclc/generic/lib/relational/isnan.cl b/libclc/generic/lib/relational/isnan.cl index 2e9c05464fd2a..c61343722f9c8 100644 --- a/libclc/generic/lib/relational/isnan.cl +++ b/libclc/generic/lib/relational/isnan.cl @@ -1,33 +1,7 @@ #include -#include -#include "relational.h" +#include -_CLC_DEFINE_RELATIONAL_UNARY(int, isnan, __spirv_IsNan, float) +#define FUNCTION isnan +#define __CLC_BODY "unary_def.inc" -#ifdef cl_khr_fp64 - -#pragma OPENCL EXTENSION cl_khr_fp64 : enable - -// The scalar version of isnan(double) returns an int, but the vector versions -// return long. -_CLC_DEF _CLC_OVERLOAD int isnan(double x) { - return __spirv_IsNan(x); -} - -_CLC_DEFINE_RELATIONAL_UNARY_VEC_ALL(long, isnan, double) - -#endif - -#ifdef cl_khr_fp16 - -#pragma OPENCL EXTENSION cl_khr_fp16 : enable - -// The scalar version of isnan(half) returns an int, but the vector versions -// return short. -_CLC_DEF _CLC_OVERLOAD int isnan(half x) { - return __spirv_IsNan(x); -} - -_CLC_DEFINE_RELATIONAL_UNARY_VEC_ALL(short, isnan, half) - -#endif +#include diff --git a/libclc/generic/libspirv/SOURCES b/libclc/generic/libspirv/SOURCES index 10d86bd5a67f8..4f2455cc6b3ac 100644 --- a/libclc/generic/libspirv/SOURCES +++ b/libclc/generic/libspirv/SOURCES @@ -27,8 +27,6 @@ common/radians.cl common/sign.cl common/smoothstep.cl common/step.cl -core/integer/clc_abs.cl -core/integer/clc_abs_diff.cl core/integer/clc_add_sat.cl core/integer/clc_hadd.cl core/integer/clc_mad24.cl diff --git a/libclc/generic/libspirv/core/integer/clc_abs.cl b/libclc/generic/libspirv/core/integer/clc_abs.cl deleted file mode 100644 index bd8e097183a09..0000000000000 --- a/libclc/generic/libspirv/core/integer/clc_abs.cl +++ /dev/null @@ -1,12 +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 -// -//===----------------------------------------------------------------------===// - -#include - -#define __CLC_BODY -#include diff --git a/libclc/generic/libspirv/core/integer/clc_abs.inc b/libclc/generic/libspirv/core/integer/clc_abs.inc deleted file mode 100644 index 26ec0b24ffb96..0000000000000 --- a/libclc/generic/libspirv/core/integer/clc_abs.inc +++ /dev/null @@ -1,12 +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_OVERLOAD _CLC_DEF __CLC_U_GENTYPE __clc_abs(__CLC_GENTYPE x) { - return __builtin_astype((__CLC_GENTYPE)(x > (__CLC_GENTYPE)(0) ? x : -x), - __CLC_U_GENTYPE); -} diff --git a/libclc/generic/libspirv/core/integer/clc_abs_diff.cl b/libclc/generic/libspirv/core/integer/clc_abs_diff.cl deleted file mode 100644 index bfcc21232817c..0000000000000 --- a/libclc/generic/libspirv/core/integer/clc_abs_diff.cl +++ /dev/null @@ -1,12 +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 -// -//===----------------------------------------------------------------------===// - -#include - -#define __CLC_BODY -#include diff --git a/libclc/generic/libspirv/core/integer/clc_abs_diff.inc b/libclc/generic/libspirv/core/integer/clc_abs_diff.inc deleted file mode 100644 index 5d78982faaa28..0000000000000 --- a/libclc/generic/libspirv/core/integer/clc_abs_diff.inc +++ /dev/null @@ -1,14 +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_OVERLOAD _CLC_DEF __CLC_U_GENTYPE __clc_abs_diff(__CLC_GENTYPE x, - __CLC_GENTYPE y) { - __CLC_U_GENTYPE ux = __builtin_astype(x, __CLC_U_GENTYPE); - __CLC_U_GENTYPE uy = __builtin_astype(y, __CLC_U_GENTYPE); - return x > y ? ux - uy : uy - ux; -} diff --git a/libclc/generic/libspirv/integer/abs.cl b/libclc/generic/libspirv/integer/abs.cl index 763be61a9bac0..168cce064b3a0 100644 --- a/libclc/generic/libspirv/integer/abs.cl +++ b/libclc/generic/libspirv/integer/abs.cl @@ -6,7 +6,8 @@ // //===----------------------------------------------------------------------===// -#include +#include +#include #include #define __CLC_BODY diff --git a/libclc/generic/libspirv/integer/abs_diff.cl b/libclc/generic/libspirv/integer/abs_diff.cl index a01dfadd13234..c8958f2b65c1a 100644 --- a/libclc/generic/libspirv/integer/abs_diff.cl +++ b/libclc/generic/libspirv/integer/abs_diff.cl @@ -6,7 +6,8 @@ // //===----------------------------------------------------------------------===// -#include +#include +#include #include #define __CLC_BODY diff --git a/libclc/generic/libspirv/math/clc_exp10.cl b/libclc/generic/libspirv/math/clc_exp10.cl index 4493655bed590..58e347729ee0b 100644 --- a/libclc/generic/libspirv/math/clc_exp10.cl +++ b/libclc/generic/libspirv/math/clc_exp10.cl @@ -64,7 +64,7 @@ _CLC_DEF _CLC_OVERLOAD float __clc_exp10(float x) const float R_LOG10_2_BY_64_TL = 0x1.04d426p-18f; // log2/(64 * log10) tail : 0.00000388665057 const float R_LN10 = 0x1.26bb1cp+1f; - int return_nan = __spirv_IsNan(x); + int return_nan = __clc_isnan(x); int return_inf = x > X_MAX; int return_zero = x < X_MIN; @@ -143,7 +143,7 @@ _CLC_DEF _CLC_OVERLOAD double __clc_exp10(double x) z2 = __spirv_ocl_ldexp(z2, m); z2 = small_value ? z3: z2; - z2 = __spirv_IsNan(x) ? x : z2; + z2 = __clc_isnan(x) ? x : z2; z2 = x > X_MAX ? as_double(PINFBITPATT_DP64) : z2; z2 = x < X_MIN ? 0.0 : z2; diff --git a/libclc/generic/libspirv/math/clc_fma.cl b/libclc/generic/libspirv/math/clc_fma.cl index 2f3ffe8708a25..bc4453b480b49 100644 --- a/libclc/generic/libspirv/math/clc_fma.cl +++ b/libclc/generic/libspirv/math/clc_fma.cl @@ -21,6 +21,10 @@ */ #include +#include +#include +#include +#include #include #include #include @@ -34,12 +38,12 @@ struct fp { _CLC_DEF _CLC_OVERLOAD float __clc_sw_fma(float a, float b, float c) { /* special cases */ - if (__spirv_IsNan(a) || __spirv_IsNan(b) || __spirv_IsNan(c) || - __spirv_IsInf(a) || __spirv_IsInf(b)) + if (__clc_isnan(a) || __clc_isnan(b) || __clc_isnan(c) || __clc_isinf(a) || + __clc_isinf(b)) return __spirv_ocl_mad(a, b, c); /* If only c is inf, and both a,b are regular numbers, the result is c*/ - if (__spirv_IsInf(c)) + if (__clc_isinf(c)) return c; a = __clc_flush_denormal_if_not_supported(a); diff --git a/libclc/generic/libspirv/math/clc_hypot.cl b/libclc/generic/libspirv/math/clc_hypot.cl index 5ed03af73c168..74d9c0855c55b 100644 --- a/libclc/generic/libspirv/math/clc_hypot.cl +++ b/libclc/generic/libspirv/math/clc_hypot.cl @@ -9,8 +9,10 @@ #include #include -#include #include +#include +#include +#include #include #include #include @@ -69,12 +71,12 @@ _CLC_DEF _CLC_OVERLOAD double __clc_hypot(double x, double y) { // If the difference in exponents between x and y is large double s = x + y; - c = __spirv_ocl_s_abs(xexp - yexp) > MANTLENGTH_DP64 + 1; + c = __clc_abs(xexp - yexp) > MANTLENGTH_DP64 + 1; r = c ? s : r; // Check for NaN // c = x != x | y != y; - c = __spirv_IsNan(x) | __spirv_IsNan(y); + c = __clc_isnan(x) | __clc_isnan(y); r = c ? as_double(QNANBITPATT_DP64) : r; // If either is Inf, we must return Inf diff --git a/libclc/generic/libspirv/math/clc_ldexp.cl b/libclc/generic/libspirv/math/clc_ldexp.cl index 8b0e2d03ff4f3..86f8831228f47 100644 --- a/libclc/generic/libspirv/math/clc_ldexp.cl +++ b/libclc/generic/libspirv/math/clc_ldexp.cl @@ -25,6 +25,8 @@ #include "tables.h" #include +#include +#include #include #include @@ -92,7 +94,7 @@ _CLC_DEF _CLC_OVERLOAD float __clc_ldexp(float x, int n) { val_ui = dexp == 0 ? dval_ui : val_ui; val_f = as_float(val_ui); - val_f = __spirv_IsNan(x) || __spirv_IsInf(x) || val_x == 0 ? x : val_f; + val_f = __clc_isnan(x) || __clc_isinf(x) || val_x == 0 ? x : val_f; return val_f; } @@ -125,7 +127,7 @@ _CLC_DEF _CLC_OVERLOAD double __clc_ldexp(double x, int n) { mr = v == 0x7ff ? as_double(s | PINFBITPATT_DP64) : mr; mr = v < -53 ? as_double(s) : mr; - mr = ((n == 0) | __spirv_IsInf(x) | (x == 0)) ? x : mr; + mr = ((n == 0) | __clc_isinf(x) | (x == 0)) ? x : mr; return mr; } diff --git a/libclc/generic/libspirv/math/clc_tan.cl b/libclc/generic/libspirv/math/clc_tan.cl index c2c5a74388887..9522aee398923 100644 --- a/libclc/generic/libspirv/math/clc_tan.cl +++ b/libclc/generic/libspirv/math/clc_tan.cl @@ -22,7 +22,8 @@ #include #include #include -#include +#include +#include #include "sincos_helpers.h" #include "tables.h" @@ -49,9 +50,8 @@ _CLC_UNARY_VECTORIZE(_CLC_DEF _CLC_OVERLOAD, float, __clc_tan, float); #ifdef cl_khr_fp64 #include "sincosD_piby4.h" -_CLC_DEF _CLC_OVERLOAD double __clc_tan(double x) -{ - double y = __spirv_ocl_fabs(x); +_CLC_DEF _CLC_OVERLOAD double __clc_tan(double x) { + double y = __clc_fabs(x); double r, rr; int regn; @@ -66,7 +66,8 @@ _CLC_DEF _CLC_OVERLOAD double __clc_tan(double x) int2 t = as_int2(regn & 1 ? tt.y : tt.x); t.hi ^= (x < 0.0) << 31; - return __spirv_IsNan(x) || __spirv_IsInf(x) ? as_double(QNANBITPATT_DP64) : as_double(t); + return __clc_isnan(x) || __clc_isinf(x) ? as_double(QNANBITPATT_DP64) + : as_double(t); } _CLC_UNARY_VECTORIZE(_CLC_DEF _CLC_OVERLOAD, double, __clc_tan, double);