There are two implementations of nextafter(): 1. Using clang's __builtin_nextafter. Clang replaces this builtin with a call to nextafter which is part of libm. Therefore, this implementation will only work for targets with an implementation of libm (e.g. most CPU targets). 2. The other implementation is written in OpenCL C. This function is known internally as __clc_nextafter and can be used by targets that don't have access to libm. llvm-svn: 192383
55 lines
2.0 KiB
C
55 lines
2.0 KiB
C
#define _CLC_UNARY_VECTORIZE(DECLSPEC, RET_TYPE, FUNCTION, ARG1_TYPE) \
|
|
DECLSPEC RET_TYPE##2 FUNCTION(ARG1_TYPE##2 x) { \
|
|
return (RET_TYPE##2)(FUNCTION(x.x), FUNCTION(x.y)); \
|
|
} \
|
|
\
|
|
DECLSPEC RET_TYPE##3 FUNCTION(ARG1_TYPE##3 x) { \
|
|
return (RET_TYPE##3)(FUNCTION(x.x), FUNCTION(x.y), FUNCTION(x.z)); \
|
|
} \
|
|
\
|
|
DECLSPEC RET_TYPE##4 FUNCTION(ARG1_TYPE##4 x) { \
|
|
return (RET_TYPE##4)(FUNCTION(x.lo), FUNCTION(x.hi)); \
|
|
} \
|
|
\
|
|
DECLSPEC RET_TYPE##8 FUNCTION(ARG1_TYPE##8 x) { \
|
|
return (RET_TYPE##8)(FUNCTION(x.lo), FUNCTION(x.hi)); \
|
|
} \
|
|
\
|
|
DECLSPEC RET_TYPE##16 FUNCTION(ARG1_TYPE##16 x) { \
|
|
return (RET_TYPE##16)(FUNCTION(x.lo), FUNCTION(x.hi)); \
|
|
}
|
|
|
|
#define _CLC_BINARY_VECTORIZE(DECLSPEC, RET_TYPE, FUNCTION, ARG1_TYPE, ARG2_TYPE) \
|
|
DECLSPEC RET_TYPE##2 FUNCTION(ARG1_TYPE##2 x, ARG2_TYPE##2 y) { \
|
|
return (RET_TYPE##2)(FUNCTION(x.x, y.x), FUNCTION(x.y, y.y)); \
|
|
} \
|
|
\
|
|
DECLSPEC RET_TYPE##3 FUNCTION(ARG1_TYPE##3 x, ARG2_TYPE##3 y) { \
|
|
return (RET_TYPE##3)(FUNCTION(x.x, y.x), FUNCTION(x.y, y.y), \
|
|
FUNCTION(x.z, y.z)); \
|
|
} \
|
|
\
|
|
DECLSPEC RET_TYPE##4 FUNCTION(ARG1_TYPE##4 x, ARG2_TYPE##4 y) { \
|
|
return (RET_TYPE##4)(FUNCTION(x.lo, y.lo), FUNCTION(x.hi, y.hi)); \
|
|
} \
|
|
\
|
|
DECLSPEC RET_TYPE##8 FUNCTION(ARG1_TYPE##8 x, ARG2_TYPE##8 y) { \
|
|
return (RET_TYPE##8)(FUNCTION(x.lo, y.lo), FUNCTION(x.hi, y.hi)); \
|
|
} \
|
|
\
|
|
DECLSPEC RET_TYPE##16 FUNCTION(ARG1_TYPE##16 x, ARG2_TYPE##16 y) { \
|
|
return (RET_TYPE##16)(FUNCTION(x.lo, y.lo), FUNCTION(x.hi, y.hi)); \
|
|
}
|
|
|
|
#define _CLC_DEFINE_BINARY_BUILTIN(RET_TYPE, FUNCTION, BUILTIN, ARG1_TYPE, ARG2_TYPE) \
|
|
_CLC_DEF _CLC_OVERLOAD RET_TYPE FUNCTION(ARG1_TYPE x, ARG2_TYPE y) { \
|
|
return BUILTIN(x, y); \
|
|
} \
|
|
_CLC_BINARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, RET_TYPE, FUNCTION, ARG1_TYPE, ARG2_TYPE)
|
|
|
|
#define _CLC_DEFINE_UNARY_BUILTIN(RET_TYPE, FUNCTION, BUILTIN, ARG1_TYPE) \
|
|
_CLC_DEF _CLC_OVERLOAD RET_TYPE FUNCTION(ARG1_TYPE x) { \
|
|
return BUILTIN(x); \
|
|
} \
|
|
_CLC_UNARY_VECTORIZE(_CLC_OVERLOAD _CLC_DEF, RET_TYPE, FUNCTION, ARG1_TYPE)
|