diff --git a/libclc/amdgpu/lib/SOURCES b/libclc/amdgpu/lib/SOURCES index b11cbdecf27b9..24f099d049cd3 100644 --- a/libclc/amdgpu/lib/SOURCES +++ b/libclc/amdgpu/lib/SOURCES @@ -10,5 +10,4 @@ math/half_log2.cl math/half_recip.cl math/half_rsqrt.cl math/half_sqrt.cl -math/nextafter.cl math/sqrt.cl diff --git a/libclc/amdgpu/lib/math/nextafter.cl b/libclc/amdgpu/lib/math/nextafter.cl deleted file mode 100644 index 6dc117b8cdd64..0000000000000 --- a/libclc/amdgpu/lib/math/nextafter.cl +++ /dev/null @@ -1,15 +0,0 @@ -#include -#include -#include - -_CLC_DEFINE_BINARY_BUILTIN(float, nextafter, __clc_nextafter, float, float) - -#ifdef cl_khr_fp64 -#pragma OPENCL EXTENSION cl_khr_fp64 : enable -_CLC_DEFINE_BINARY_BUILTIN(double, nextafter, __clc_nextafter, double, double) -#endif - -#ifdef cl_khr_fp16 -#pragma OPENCL EXTENSION cl_khr_fp16 : enable -_CLC_DEFINE_BINARY_BUILTIN(half, nextafter, __clc_nextafter, half, half) -#endif diff --git a/libclc/clc/include/clc/clcmacro.h b/libclc/clc/include/clc/clcmacro.h index 676560e9efcb4..14399811bad93 100644 --- a/libclc/clc/include/clc/clcmacro.h +++ b/libclc/clc/include/clc/clcmacro.h @@ -159,6 +159,34 @@ _CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, RET_TYPE, FUNCTION, ARG1_TYPE, \ ARG2_TYPE) +// FIXME: Make _CLC_DEFINE_BINARY_BUILTIN avoid scalarization by default, and +// introduce an explicit scalarizing version. +#define _CLC_DEFINE_BINARY_BUILTIN_NO_SCALARIZE(RET_TYPE, FUNCTION, BUILTIN, \ + ARG1_TYPE, ARG2_TYPE) \ + _CLC_DEF _CLC_OVERLOAD RET_TYPE FUNCTION(ARG1_TYPE x, ARG2_TYPE y) { \ + return BUILTIN(x, y); \ + } \ + _CLC_DEF _CLC_OVERLOAD RET_TYPE##2 FUNCTION(ARG1_TYPE##2 x, \ + ARG2_TYPE##2 y) { \ + return BUILTIN(x, y); \ + } \ + _CLC_DEF _CLC_OVERLOAD RET_TYPE##3 FUNCTION(ARG1_TYPE##3 x, \ + ARG2_TYPE##3 y) { \ + return BUILTIN(x, y); \ + } \ + _CLC_DEF _CLC_OVERLOAD RET_TYPE##4 FUNCTION(ARG1_TYPE##4 x, \ + ARG2_TYPE##4 y) { \ + return BUILTIN(x, y); \ + } \ + _CLC_DEF _CLC_OVERLOAD RET_TYPE##8 FUNCTION(ARG1_TYPE##8 x, \ + ARG2_TYPE##8 y) { \ + return BUILTIN(x, y); \ + } \ + _CLC_DEF _CLC_OVERLOAD RET_TYPE##16 FUNCTION(ARG1_TYPE##16 x, \ + ARG2_TYPE##16 y) { \ + return BUILTIN(x, y); \ + } + #define _CLC_DEFINE_BINARY_BUILTIN_WITH_SCALAR_SECOND_ARG( \ RET_TYPE, FUNCTION, BUILTIN, ARG1_TYPE, ARG2_TYPE) \ _CLC_DEFINE_BINARY_BUILTIN(RET_TYPE, FUNCTION, BUILTIN, ARG1_TYPE, \ diff --git a/libclc/clc/include/clc/math/binary_decl_with_scalar_second_arg.inc b/libclc/clc/include/clc/math/binary_decl_with_scalar_second_arg.inc new file mode 100644 index 0000000000000..92b7b287f64bb --- /dev/null +++ b/libclc/clc/include/clc/math/binary_decl_with_scalar_second_arg.inc @@ -0,0 +1,4 @@ +_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE __CLC_FUNCTION(__CLC_GENTYPE a, + __CLC_GENTYPE b); +_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE __CLC_FUNCTION(__CLC_GENTYPE a, + __CLC_SCALAR_GENTYPE b); diff --git a/libclc/clc/include/clc/math/clc_nextafter.h b/libclc/clc/include/clc/math/clc_nextafter.h new file mode 100644 index 0000000000000..599c022c6682b --- /dev/null +++ b/libclc/clc/include/clc/math/clc_nextafter.h @@ -0,0 +1,12 @@ +#ifndef __CLC_MATH_CLC_NEXTAFTER_H__ +#define __CLC_MATH_CLC_NEXTAFTER_H__ + +#define __CLC_BODY +#define __CLC_FUNCTION __clc_nextafter + +#include + +#undef __CLC_BODY +#undef __CLC_FUNCTION + +#endif // __CLC_MATH_CLC_NEXTAFTER_H__ diff --git a/libclc/clc/include/clc/relational/clc_isnan.h b/libclc/clc/include/clc/relational/clc_isnan.h index 3200e593c5cff..2483a1ab25578 100644 --- a/libclc/clc/include/clc/relational/clc_isnan.h +++ b/libclc/clc/include/clc/relational/clc_isnan.h @@ -1,11 +1,6 @@ #ifndef __CLC_RELATIONAL_CLC_ISNAN_H__ #define __CLC_RELATIONAL_CLC_ISNAN_H__ -#if defined(CLC_CLSPV) || defined(CLC_SPIRV) -// clspv and spir-v targets provide their own OpenCL-compatible isnan -#define __clc_isnan isnan -#else - #include #include @@ -37,6 +32,4 @@ _CLC_VECTOR_ISNAN_DECL(short, half) #undef _CLC_ISNAN_DECL #undef _CLC_VECTOR_ISNAN_DECL -#endif - #endif // __CLC_RELATIONAL_CLC_ISNAN_H__ diff --git a/libclc/clc/include/clc/shared/binary_decl.inc b/libclc/clc/include/clc/shared/binary_decl.inc new file mode 100644 index 0000000000000..50fd1df34fd24 --- /dev/null +++ b/libclc/clc/include/clc/shared/binary_decl.inc @@ -0,0 +1,2 @@ +_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE __CLC_FUNCTION(__CLC_GENTYPE x, + __CLC_GENTYPE y); diff --git a/libclc/clc/lib/clspv/SOURCES b/libclc/clc/lib/clspv/SOURCES index c3fc03c0b3dd5..81f90a24d00d6 100644 --- a/libclc/clc/lib/clspv/SOURCES +++ b/libclc/clc/lib/clspv/SOURCES @@ -2,6 +2,7 @@ ../generic/math/clc_fabs.cl ../generic/math/clc_floor.cl ../generic/math/clc_mad.cl +../generic/math/clc_nextafter.cl ../generic/math/clc_rint.cl ../generic/math/clc_trunc.cl ../generic/relational/clc_select.cl diff --git a/libclc/clc/lib/generic/SOURCES b/libclc/clc/lib/generic/SOURCES index 877a0a390a745..59dad8e860689 100644 --- a/libclc/clc/lib/generic/SOURCES +++ b/libclc/clc/lib/generic/SOURCES @@ -8,6 +8,7 @@ math/clc_ceil.cl math/clc_fabs.cl math/clc_floor.cl math/clc_mad.cl +math/clc_nextafter.cl math/clc_rint.cl math/clc_trunc.cl relational/clc_all.cl diff --git a/libclc/clc/lib/generic/math/clc_nextafter.cl b/libclc/clc/lib/generic/math/clc_nextafter.cl new file mode 100644 index 0000000000000..58125485bf684 --- /dev/null +++ b/libclc/clc/lib/generic/math/clc_nextafter.cl @@ -0,0 +1,62 @@ +#include +#include +#include + +// This file provides OpenCL C implementations of __clc_nextafter for +// targets that don't support the clang builtin. + +#define CLC_AS_TYPE(x) __clc_as_##x + +#define NEXTAFTER(FLOAT_TYPE, UINT_TYPE, INT_TYPE, INT_TYPE_SCALAR) \ + _CLC_OVERLOAD _CLC_DEF FLOAT_TYPE __clc_nextafter(FLOAT_TYPE x, \ + FLOAT_TYPE y) { \ + const UINT_TYPE sign_bit = (UINT_TYPE)1 \ + << (sizeof(INT_TYPE_SCALAR) * 8 - 1); \ + const UINT_TYPE sign_bit_mask = sign_bit - (UINT_TYPE)1; \ + INT_TYPE ix = CLC_AS_TYPE(INT_TYPE)(x); \ + UINT_TYPE ax = CLC_AS_TYPE(UINT_TYPE)(ix) & sign_bit_mask; \ + INT_TYPE mx = CLC_AS_TYPE(INT_TYPE)(sign_bit) - ix; \ + mx = CLC_AS_TYPE(INT_TYPE)(ix) < (INT_TYPE)0 ? mx : ix; \ + INT_TYPE iy = CLC_AS_TYPE(INT_TYPE)(y); \ + UINT_TYPE ay = CLC_AS_TYPE(UINT_TYPE)(iy) & sign_bit_mask; \ + INT_TYPE my = CLC_AS_TYPE(INT_TYPE)(sign_bit) - iy; \ + my = iy < (INT_TYPE)0 ? my : iy; \ + INT_TYPE t = mx + (mx < my ? (INT_TYPE)1 : (INT_TYPE)-1); \ + INT_TYPE r = CLC_AS_TYPE(INT_TYPE)(sign_bit) - t; \ + r = t < (INT_TYPE)0 ? r : t; \ + r = __clc_isnan(x) ? ix : r; \ + r = __clc_isnan(y) ? CLC_AS_TYPE(INT_TYPE)(iy) : r; \ + r = ((ax | ay) == (UINT_TYPE)0 || ix == iy) ? iy : r; \ + return CLC_AS_TYPE(FLOAT_TYPE)(r); \ + } + +NEXTAFTER(float, uint, int, int) +NEXTAFTER(float2, uint2, int2, int) +NEXTAFTER(float3, uint3, int3, int) +NEXTAFTER(float4, uint4, int4, int) +NEXTAFTER(float8, uint8, int8, int) +NEXTAFTER(float16, uint16, int16, int) + +#ifdef cl_khr_fp64 +#pragma OPENCL EXTENSION cl_khr_fp64 : enable + +NEXTAFTER(double, ulong, long, long) +NEXTAFTER(double2, ulong2, long2, long) +NEXTAFTER(double3, ulong3, long3, long) +NEXTAFTER(double4, ulong4, long4, long) +NEXTAFTER(double8, ulong8, long8, long) +NEXTAFTER(double16, ulong16, long16, long) + +#endif + +#ifdef cl_khr_fp16 +#pragma OPENCL EXTENSION cl_khr_fp16 : enable + +NEXTAFTER(half, ushort, short, short) +NEXTAFTER(half2, ushort2, short2, short) +NEXTAFTER(half3, ushort3, short3, short) +NEXTAFTER(half4, ushort4, short4, short) +NEXTAFTER(half8, ushort8, short8, short) +NEXTAFTER(half16, ushort16, short16, short) + +#endif diff --git a/libclc/clc/lib/spirv/SOURCES b/libclc/clc/lib/spirv/SOURCES index 55d109478faac..813b1e3d69937 100644 --- a/libclc/clc/lib/spirv/SOURCES +++ b/libclc/clc/lib/spirv/SOURCES @@ -6,6 +6,7 @@ ../generic/math/clc_fabs.cl ../generic/math/clc_floor.cl ../generic/math/clc_mad.cl +../generic/math/clc_nextafter.cl ../generic/math/clc_rint.cl ../generic/math/clc_trunc.cl ../generic/relational/clc_select.cl diff --git a/libclc/clc/lib/spirv64/SOURCES b/libclc/clc/lib/spirv64/SOURCES index 55d109478faac..813b1e3d69937 100644 --- a/libclc/clc/lib/spirv64/SOURCES +++ b/libclc/clc/lib/spirv64/SOURCES @@ -6,6 +6,7 @@ ../generic/math/clc_fabs.cl ../generic/math/clc_floor.cl ../generic/math/clc_mad.cl +../generic/math/clc_nextafter.cl ../generic/math/clc_rint.cl ../generic/math/clc_trunc.cl ../generic/relational/clc_select.cl diff --git a/libclc/clspv/lib/SOURCES b/libclc/clspv/lib/SOURCES index 7c369aa379e98..0d6091ce20e44 100644 --- a/libclc/clspv/lib/SOURCES +++ b/libclc/clspv/lib/SOURCES @@ -1,5 +1,4 @@ math/fma.cl -math/nextafter.cl shared/vstore_half.cl subnormal_config.cl ../../generic/lib/geometric/distance.cl @@ -21,7 +20,6 @@ subnormal_config.cl ../../generic/lib/math/clc_fmod.cl ../../generic/lib/math/clc_hypot.cl ../../generic/lib/math/clc_ldexp.cl -../../generic/lib/math/clc_nextafter.cl ../../generic/lib/math/clc_pow.cl ../../generic/lib/math/clc_pown.cl ../../generic/lib/math/clc_powr.cl @@ -71,6 +69,7 @@ subnormal_config.cl ../../generic/lib/math/minmag.cl ../../generic/lib/math/modf.cl ../../generic/lib/math/nan.cl +../../generic/lib/math/nextafter.cl ../../generic/lib/math/pow.cl ../../generic/lib/math/pown.cl ../../generic/lib/math/powr.cl diff --git a/libclc/clspv/lib/math/nextafter.cl b/libclc/clspv/lib/math/nextafter.cl deleted file mode 100644 index f05e748213620..0000000000000 --- a/libclc/clspv/lib/math/nextafter.cl +++ /dev/null @@ -1,5 +0,0 @@ -#include -#include - -#define __CLC_BODY -#include diff --git a/libclc/clspv/lib/math/nextafter.inc b/libclc/clspv/lib/math/nextafter.inc deleted file mode 100644 index ee39be53b1e17..0000000000000 --- a/libclc/clspv/lib/math/nextafter.inc +++ /dev/null @@ -1,3 +0,0 @@ -_CLC_DEF _CLC_OVERLOAD __CLC_GENTYPE nextafter(__CLC_GENTYPE x, __CLC_GENTYPE y) { - return __clc_nextafter(x, y); -} diff --git a/libclc/generic/include/clc/math/binary_decl.inc b/libclc/generic/include/clc/math/binary_decl.inc deleted file mode 100644 index 41f07c3b014b7..0000000000000 --- a/libclc/generic/include/clc/math/binary_decl.inc +++ /dev/null @@ -1,2 +0,0 @@ -_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE __CLC_FUNCTION(__CLC_GENTYPE a, __CLC_GENTYPE b); -_CLC_OVERLOAD _CLC_DECL __CLC_GENTYPE __CLC_FUNCTION(__CLC_GENTYPE a, __CLC_SCALAR_GENTYPE b); diff --git a/libclc/generic/include/clc/math/fmax.h b/libclc/generic/include/clc/math/fmax.h index 71ee859be4f94..2bb475851bae9 100644 --- a/libclc/generic/include/clc/math/fmax.h +++ b/libclc/generic/include/clc/math/fmax.h @@ -1,4 +1,4 @@ -#define __CLC_BODY +#define __CLC_BODY #define __CLC_FUNCTION fmax #include diff --git a/libclc/generic/include/clc/math/fmin.h b/libclc/generic/include/clc/math/fmin.h index d45f572e08b02..71154cc67b99b 100644 --- a/libclc/generic/include/clc/math/fmin.h +++ b/libclc/generic/include/clc/math/fmin.h @@ -1,4 +1,4 @@ -#define __CLC_BODY +#define __CLC_BODY #define __CLC_FUNCTION fmin #include diff --git a/libclc/generic/include/math/clc_nextafter.h b/libclc/generic/include/math/clc_nextafter.h deleted file mode 100644 index 2b674b7079568..0000000000000 --- a/libclc/generic/include/math/clc_nextafter.h +++ /dev/null @@ -1,7 +0,0 @@ -#define __CLC_BODY -#define __CLC_FUNCTION __clc_nextafter - -#include - -#undef __CLC_BODY -#undef __CLC_FUNCTION diff --git a/libclc/generic/lib/SOURCES b/libclc/generic/lib/SOURCES index 579e909e53d46..217e3bca48b7a 100644 --- a/libclc/generic/lib/SOURCES +++ b/libclc/generic/lib/SOURCES @@ -159,7 +159,6 @@ math/native_sin.cl math/native_sqrt.cl math/native_tan.cl math/tables.cl -math/clc_nextafter.cl math/nextafter.cl math/clc_pow.cl math/pow.cl diff --git a/libclc/generic/lib/math/clc_nextafter.cl b/libclc/generic/lib/math/clc_nextafter.cl deleted file mode 100644 index 623eb11c18c3b..0000000000000 --- a/libclc/generic/lib/math/clc_nextafter.cl +++ /dev/null @@ -1,49 +0,0 @@ -#include -#include -#include - -// This file provides OpenCL C implementations of nextafter for -// targets that don't support the clang builtin. - -#define AS_TYPE(x) as_##x - -#define NEXTAFTER(FLOAT_TYPE, UINT_TYPE, INT_TYPE) \ - _CLC_OVERLOAD _CLC_DEF FLOAT_TYPE __clc_nextafter(FLOAT_TYPE x, \ - FLOAT_TYPE y) { \ - const UINT_TYPE sign_bit = (UINT_TYPE)1 << (sizeof(INT_TYPE) * 8 - 1); \ - const UINT_TYPE sign_bit_mask = sign_bit - 1; \ - INT_TYPE ix = AS_TYPE(INT_TYPE)(x); \ - INT_TYPE ax = ix & sign_bit_mask; \ - INT_TYPE mx = sign_bit - ix; \ - mx = ix < 0 ? mx : ix; \ - INT_TYPE iy = AS_TYPE(INT_TYPE)(y); \ - INT_TYPE ay = iy & sign_bit_mask; \ - INT_TYPE my = sign_bit - iy; \ - my = iy < 0 ? my : iy; \ - INT_TYPE t = mx + (mx < my ? 1 : -1); \ - INT_TYPE r = sign_bit - t; \ - r = t < 0 ? r : t; \ - r = __clc_isnan(x) ? ix : r; \ - r = __clc_isnan(y) ? iy : r; \ - r = ((ax | ay) == 0 | ix == iy) ? iy : r; \ - return AS_TYPE(FLOAT_TYPE)(r); \ - } - -NEXTAFTER(float, uint, int) -_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, float, __clc_nextafter, float, - float) - -#ifdef cl_khr_fp64 -#pragma OPENCL EXTENSION cl_khr_fp64 : enable - -NEXTAFTER(double, ulong, long) -_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, __clc_nextafter, double, - double) -#endif - -#ifdef cl_khr_fp16 -#pragma OPENCL EXTENSION cl_khr_fp16 : enable - -NEXTAFTER(half, ushort, short) -_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, half, __clc_nextafter, half, half) -#endif diff --git a/libclc/generic/lib/math/nextafter.cl b/libclc/generic/lib/math/nextafter.cl index cbe54cd4e2662..e0a7b4e457dc0 100644 --- a/libclc/generic/lib/math/nextafter.cl +++ b/libclc/generic/lib/math/nextafter.cl @@ -1,12 +1,24 @@ #include -#include "../clcmacro.h" +#include +#include -_CLC_DEFINE_BINARY_BUILTIN(float, nextafter, __builtin_nextafterf, float, float) +_CLC_DEFINE_BINARY_BUILTIN_NO_SCALARIZE(float, nextafter, __clc_nextafter, + float, float) #ifdef cl_khr_fp64 #pragma OPENCL EXTENSION cl_khr_fp64 : enable -_CLC_DEFINE_BINARY_BUILTIN(double, nextafter, __builtin_nextafter, double, double) +_CLC_DEFINE_BINARY_BUILTIN_NO_SCALARIZE(double, nextafter, __clc_nextafter, + double, double) + +#endif + +#ifdef cl_khr_fp16 + +#pragma OPENCL EXTENSION cl_khr_fp16 : enable + +_CLC_DEFINE_BINARY_BUILTIN_NO_SCALARIZE(half, nextafter, __clc_nextafter, half, + half) #endif diff --git a/libclc/ptx/lib/SOURCES b/libclc/ptx/lib/SOURCES deleted file mode 100644 index ff5bff2cea544..0000000000000 --- a/libclc/ptx/lib/SOURCES +++ /dev/null @@ -1 +0,0 @@ -math/nextafter.cl diff --git a/libclc/ptx/lib/math/nextafter.cl b/libclc/ptx/lib/math/nextafter.cl deleted file mode 100644 index 809eecac53d8c..0000000000000 --- a/libclc/ptx/lib/math/nextafter.cl +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include -#include - -_CLC_DEFINE_BINARY_BUILTIN(float, nextafter, __clc_nextafter, float, float) - -#ifdef cl_khr_fp64 -#pragma OPENCL EXTENSION cl_khr_fp64 : enable -_CLC_DEFINE_BINARY_BUILTIN(double, nextafter, __clc_nextafter, double, double) -#endif