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