Author: arsenm Date: Thu Sep 8 11:37:56 2016 New Revision: 280961 URL: http://llvm.org/viewvc/llvm-project?rev=280961&view=rev Log: Replace nextafter implementation
This one passes conformance. Modified: libclc/trunk/amdgpu/lib/math/nextafter.cl libclc/trunk/generic/lib/math/clc_nextafter.cl Modified: libclc/trunk/amdgpu/lib/math/nextafter.cl URL: http://llvm.org/viewvc/llvm-project/libclc/trunk/amdgpu/lib/math/nextafter.cl?rev=280961&r1=280960&r2=280961&view=diff ============================================================================== --- libclc/trunk/amdgpu/lib/math/nextafter.cl (original) +++ libclc/trunk/amdgpu/lib/math/nextafter.cl Thu Sep 8 11:37:56 2016 @@ -2,3 +2,8 @@ #include "../lib/clcmacro.h" _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 Modified: libclc/trunk/generic/lib/math/clc_nextafter.cl URL: http://llvm.org/viewvc/llvm-project/libclc/trunk/generic/lib/math/clc_nextafter.cl?rev=280961&r1=280960&r2=280961&view=diff ============================================================================== --- libclc/trunk/generic/lib/math/clc_nextafter.cl (original) +++ libclc/trunk/generic/lib/math/clc_nextafter.cl Thu Sep 8 11:37:56 2016 @@ -1,43 +1,39 @@ #include <clc/clc.h> #include "../clcmacro.h" -// This file provides OpenCL C implementations of nextafter for targets that -// don't support the clang builtin. +// This file provides OpenCL C implementations of nextafter for +// targets that don't support the clang builtin. -#define FLT_NAN 0.0f/0.0f +#define AS_TYPE(x) as_##x -#define NEXTAFTER(FLOAT_TYPE, UINT_TYPE, NAN, ZERO, NEXTAFTER_ZERO) \ +#define NEXTAFTER(FLOAT_TYPE, UINT_TYPE, INT_TYPE) \ _CLC_OVERLOAD _CLC_DEF FLOAT_TYPE __clc_nextafter(FLOAT_TYPE x, FLOAT_TYPE y) { \ - union { \ - FLOAT_TYPE f; \ - UINT_TYPE i; \ - } next; \ - if (isnan(x) || isnan(y)) { \ - return NAN; \ - } \ - if (x == y) { \ - return y; \ - } \ - next.f = x; \ - if (x < y) { \ - next.i++; \ - } else { \ - if (next.f == ZERO) { \ - next.i = NEXTAFTER_ZERO; \ - } else { \ - next.i--; \ - } \ - } \ - return next.f; \ + 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 = isnan(x) ? ix : r; \ + r = isnan(y) ? iy : r; \ + r = ((ax | ay) == 0 | ix == iy) ? iy : r; \ + return AS_TYPE(FLOAT_TYPE)(r); \ } -NEXTAFTER(float, uint, FLT_NAN, 0.0f, 0x80000001) +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 -#define DBL_NAN 0.0/0.0 -NEXTAFTER(double, ulong, DBL_NAN, 0.0, 0x8000000000000001) +NEXTAFTER(double, ulong, long) _CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, __clc_nextafter, double, double) #endif _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits