|
| 1 | +#include <clc/clcmacro.h> |
| 2 | +#include <clc/internal/clc.h> |
| 3 | +#include <clc/relational/clc_isnan.h> |
| 4 | + |
| 5 | +// This file provides OpenCL C implementations of __clc_nextafter for |
| 6 | +// targets that don't support the clang builtin. |
| 7 | + |
| 8 | +#define CLC_AS_TYPE(x) __clc_as_##x |
| 9 | + |
| 10 | +#define NEXTAFTER(FLOAT_TYPE, UINT_TYPE, INT_TYPE, INT_TYPE_SCALAR) \ |
| 11 | + _CLC_OVERLOAD _CLC_DEF FLOAT_TYPE __clc_nextafter(FLOAT_TYPE x, \ |
| 12 | + FLOAT_TYPE y) { \ |
| 13 | + const UINT_TYPE sign_bit = (UINT_TYPE)1 \ |
| 14 | + << (sizeof(INT_TYPE_SCALAR) * 8 - 1); \ |
| 15 | + const UINT_TYPE sign_bit_mask = sign_bit - (UINT_TYPE)1; \ |
| 16 | + INT_TYPE ix = CLC_AS_TYPE(INT_TYPE)(x); \ |
| 17 | + UINT_TYPE ax = CLC_AS_TYPE(UINT_TYPE)(ix) & sign_bit_mask; \ |
| 18 | + INT_TYPE mx = CLC_AS_TYPE(INT_TYPE)(sign_bit) - ix; \ |
| 19 | + mx = CLC_AS_TYPE(INT_TYPE)(ix) < (INT_TYPE)0 ? mx : ix; \ |
| 20 | + INT_TYPE iy = CLC_AS_TYPE(INT_TYPE)(y); \ |
| 21 | + UINT_TYPE ay = CLC_AS_TYPE(UINT_TYPE)(iy) & sign_bit_mask; \ |
| 22 | + INT_TYPE my = CLC_AS_TYPE(INT_TYPE)(sign_bit) - iy; \ |
| 23 | + my = iy < (INT_TYPE)0 ? my : iy; \ |
| 24 | + INT_TYPE t = mx + (mx < my ? (INT_TYPE)1 : (INT_TYPE)-1); \ |
| 25 | + INT_TYPE r = CLC_AS_TYPE(INT_TYPE)(sign_bit) - t; \ |
| 26 | + r = t < (INT_TYPE)0 ? r : t; \ |
| 27 | + r = __clc_isnan(x) ? ix : r; \ |
| 28 | + r = __clc_isnan(y) ? CLC_AS_TYPE(INT_TYPE)(iy) : r; \ |
| 29 | + r = ((ax | ay) == (UINT_TYPE)0 || ix == iy) ? iy : r; \ |
| 30 | + return CLC_AS_TYPE(FLOAT_TYPE)(r); \ |
| 31 | + } |
| 32 | + |
| 33 | +NEXTAFTER(float, uint, int, int) |
| 34 | +NEXTAFTER(float2, uint2, int2, int) |
| 35 | +NEXTAFTER(float3, uint3, int3, int) |
| 36 | +NEXTAFTER(float4, uint4, int4, int) |
| 37 | +NEXTAFTER(float8, uint8, int8, int) |
| 38 | +NEXTAFTER(float16, uint16, int16, int) |
| 39 | + |
| 40 | +#ifdef cl_khr_fp64 |
| 41 | +#pragma OPENCL EXTENSION cl_khr_fp64 : enable |
| 42 | + |
| 43 | +NEXTAFTER(double, ulong, long, long) |
| 44 | +NEXTAFTER(double2, ulong2, long2, long) |
| 45 | +NEXTAFTER(double3, ulong3, long3, long) |
| 46 | +NEXTAFTER(double4, ulong4, long4, long) |
| 47 | +NEXTAFTER(double8, ulong8, long8, long) |
| 48 | +NEXTAFTER(double16, ulong16, long16, long) |
| 49 | + |
| 50 | +#endif |
| 51 | + |
| 52 | +#ifdef cl_khr_fp16 |
| 53 | +#pragma OPENCL EXTENSION cl_khr_fp16 : enable |
| 54 | + |
| 55 | +NEXTAFTER(half, ushort, short, short) |
| 56 | +NEXTAFTER(half2, ushort2, short2, short) |
| 57 | +NEXTAFTER(half3, ushort3, short3, short) |
| 58 | +NEXTAFTER(half4, ushort4, short4, short) |
| 59 | +NEXTAFTER(half8, ushort8, short8, short) |
| 60 | +NEXTAFTER(half16, ushort16, short16, short) |
| 61 | + |
| 62 | +#endif |
0 commit comments