1#include <clc/clc.h> 2#include "../clcmacro.h" 3 4// This file provides OpenCL C implementations of nextafter for 5// targets that don't support the clang builtin. 6 7#define AS_TYPE(x) as_##x 8 9#define NEXTAFTER(FLOAT_TYPE, UINT_TYPE, INT_TYPE) \ 10_CLC_OVERLOAD _CLC_DEF FLOAT_TYPE __clc_nextafter(FLOAT_TYPE x, FLOAT_TYPE y) { \ 11 const UINT_TYPE sign_bit \ 12 = (UINT_TYPE)1 << (sizeof(INT_TYPE) * 8 - 1); \ 13 const UINT_TYPE sign_bit_mask = sign_bit - 1; \ 14 INT_TYPE ix = AS_TYPE(INT_TYPE)(x); \ 15 INT_TYPE ax = ix & sign_bit_mask; \ 16 INT_TYPE mx = sign_bit - ix; \ 17 mx = ix < 0 ? mx : ix; \ 18 INT_TYPE iy = AS_TYPE(INT_TYPE)(y); \ 19 INT_TYPE ay = iy & sign_bit_mask; \ 20 INT_TYPE my = sign_bit - iy; \ 21 my = iy < 0 ? my : iy; \ 22 INT_TYPE t = mx + (mx < my ? 1 : -1); \ 23 INT_TYPE r = sign_bit - t; \ 24 r = t < 0 ? r : t; \ 25 r = isnan(x) ? ix : r; \ 26 r = isnan(y) ? iy : r; \ 27 r = ((ax | ay) == 0 | ix == iy) ? iy : r; \ 28 return AS_TYPE(FLOAT_TYPE)(r); \ 29} 30 31NEXTAFTER(float, uint, int) 32_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, float, __clc_nextafter, float, float) 33 34#ifdef cl_khr_fp64 35#pragma OPENCL EXTENSION cl_khr_fp64 : enable 36 37NEXTAFTER(double, ulong, long) 38_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, __clc_nextafter, double, double) 39#endif 40 41#ifdef cl_khr_fp16 42#pragma OPENCL EXTENSION cl_khr_fp16 : enable 43 44NEXTAFTER(half, ushort, short) 45_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, half, __clc_nextafter, half, half) 46#endif 47