llvm-project/libclc/generic/lib/math/clc_nextafter.cl

44 lines
1.4 KiB
Common Lisp

#include <clc/clc.h>
#include "../clcmacro.h"
// 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 NEXTAFTER(FLOAT_TYPE, UINT_TYPE, NAN, ZERO, NEXTAFTER_ZERO) \
_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; \
}
NEXTAFTER(float, uint, FLT_NAN, 0.0f, 0x80000001)
_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)
_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, double, __clc_nextafter, double, double)
#endif