|
6 | 6 | * when the result is true. |
7 | 7 | */ |
8 | 8 |
|
9 | | -#define _CLC_DEFINE_RELATIONAL_UNARY_SCALAR(RET_TYPE, FUNCTION, BUILTIN_NAME, \ |
10 | | - ARG_TYPE) \ |
11 | | - _CLC_DEF _CLC_OVERLOAD RET_TYPE FUNCTION(ARG_TYPE x) { \ |
12 | | - return BUILTIN_NAME(x); \ |
13 | | - } |
14 | | - |
15 | | -#define _CLC_DEFINE_RELATIONAL_UNARY_VEC2(RET_TYPE, FUNCTION, ARG_TYPE) \ |
16 | | - _CLC_DEF _CLC_OVERLOAD RET_TYPE FUNCTION(ARG_TYPE x) { \ |
17 | | - return (RET_TYPE)((RET_TYPE){FUNCTION(x.lo), FUNCTION(x.hi)} != \ |
18 | | - (RET_TYPE)0); \ |
19 | | - } |
20 | | - |
21 | | -#define _CLC_DEFINE_RELATIONAL_UNARY_VEC3(RET_TYPE, FUNCTION, ARG_TYPE) \ |
22 | | - _CLC_DEF _CLC_OVERLOAD RET_TYPE FUNCTION(ARG_TYPE x) { \ |
23 | | - return (RET_TYPE)((RET_TYPE){FUNCTION(x.s0), FUNCTION(x.s1), \ |
24 | | - FUNCTION(x.s2)} != (RET_TYPE)0); \ |
25 | | - } |
26 | | - |
27 | | -#define _CLC_DEFINE_RELATIONAL_UNARY_VEC4(RET_TYPE, FUNCTION, ARG_TYPE) \ |
28 | | - _CLC_DEF _CLC_OVERLOAD RET_TYPE FUNCTION(ARG_TYPE x) { \ |
29 | | - return (RET_TYPE)((RET_TYPE){FUNCTION(x.s0), FUNCTION(x.s1), \ |
30 | | - FUNCTION(x.s2), \ |
31 | | - FUNCTION(x.s3)} != (RET_TYPE)0); \ |
32 | | - } |
33 | | - |
34 | | -#define _CLC_DEFINE_RELATIONAL_UNARY_VEC8(RET_TYPE, FUNCTION, ARG_TYPE) \ |
35 | | - _CLC_DEF _CLC_OVERLOAD RET_TYPE FUNCTION(ARG_TYPE x) { \ |
36 | | - return ( \ |
37 | | - RET_TYPE)((RET_TYPE){FUNCTION(x.s0), FUNCTION(x.s1), FUNCTION(x.s2), \ |
38 | | - FUNCTION(x.s3), FUNCTION(x.s4), FUNCTION(x.s5), \ |
39 | | - FUNCTION(x.s6), FUNCTION(x.s7)} != (RET_TYPE)0); \ |
40 | | - } |
41 | | - |
42 | | -#define _CLC_DEFINE_RELATIONAL_UNARY_VEC16(RET_TYPE, FUNCTION, ARG_TYPE) \ |
43 | | - _CLC_DEF _CLC_OVERLOAD RET_TYPE FUNCTION(ARG_TYPE x) { \ |
44 | | - return ( \ |
45 | | - RET_TYPE)((RET_TYPE){FUNCTION(x.s0), FUNCTION(x.s1), FUNCTION(x.s2), \ |
46 | | - FUNCTION(x.s3), FUNCTION(x.s4), FUNCTION(x.s5), \ |
47 | | - FUNCTION(x.s6), FUNCTION(x.s7), FUNCTION(x.s8), \ |
48 | | - FUNCTION(x.s9), FUNCTION(x.sa), FUNCTION(x.sb), \ |
49 | | - FUNCTION(x.sc), FUNCTION(x.sd), FUNCTION(x.se), \ |
50 | | - FUNCTION(x.sf)} != (RET_TYPE)0); \ |
51 | | - } |
52 | | - |
53 | | -#define _CLC_DEFINE_RELATIONAL_UNARY_VEC_ALL(RET_TYPE, FUNCTION, ARG_TYPE) \ |
54 | | - _CLC_DEFINE_RELATIONAL_UNARY_VEC2(RET_TYPE##2, FUNCTION, ARG_TYPE##2) \ |
55 | | - _CLC_DEFINE_RELATIONAL_UNARY_VEC3(RET_TYPE##3, FUNCTION, ARG_TYPE##3) \ |
56 | | - _CLC_DEFINE_RELATIONAL_UNARY_VEC4(RET_TYPE##4, FUNCTION, ARG_TYPE##4) \ |
57 | | - _CLC_DEFINE_RELATIONAL_UNARY_VEC8(RET_TYPE##8, FUNCTION, ARG_TYPE##8) \ |
58 | | - _CLC_DEFINE_RELATIONAL_UNARY_VEC16(RET_TYPE##16, FUNCTION, ARG_TYPE##16) |
59 | | - |
60 | | -#define _CLC_DEFINE_RELATIONAL_UNARY(RET_TYPE, FUNCTION, BUILTIN_FUNCTION, \ |
61 | | - ARG_TYPE) \ |
62 | | - _CLC_DEFINE_RELATIONAL_UNARY_SCALAR(RET_TYPE, FUNCTION, BUILTIN_FUNCTION, \ |
63 | | - ARG_TYPE) \ |
64 | | - _CLC_DEFINE_RELATIONAL_UNARY_VEC_ALL(RET_TYPE, FUNCTION, ARG_TYPE) |
65 | | - |
66 | 9 | #define _CLC_DEFINE_SIMPLE_RELATIONAL_BINARY(RET_TYPE, RET_TYPE_VEC, FUNCTION, \ |
67 | 10 | ARG1_TYPE, ARG2_TYPE) \ |
68 | 11 | _CLC_DEF _CLC_OVERLOAD RET_TYPE FUNCTION(ARG1_TYPE x, ARG2_TYPE y) { \ |
|
89 | 32 | return _CLC_RELATIONAL_OP(x, y); \ |
90 | 33 | } |
91 | 34 |
|
| 35 | +#define fcNan (__FPCLASS_SNAN | __FPCLASS_QNAN) |
| 36 | +#define fcInf (__FPCLASS_POSINF | __FPCLASS_NEGINF) |
| 37 | +#define fcNormal (__FPCLASS_POSNORMAL | __FPCLASS_NEGNORMAL) |
| 38 | +#define fcPosFinite \ |
| 39 | + (__FPCLASS_POSNORMAL | __FPCLASS_POSSUBNORMAL | __FPCLASS_POSZERO) |
| 40 | +#define fcNegFinite \ |
| 41 | + (__FPCLASS_NEGNORMAL | __FPCLASS_NEGSUBNORMAL | __FPCLASS_NEGZERO) |
| 42 | +#define fcFinite (fcPosFinite | fcNegFinite) |
| 43 | + |
| 44 | +#define _CLC_DEFINE_ISFPCLASS_VEC(RET_TYPE, FUNCTION, MASK, ARG_TYPE) \ |
| 45 | + _CLC_DEF _CLC_OVERLOAD RET_TYPE FUNCTION(ARG_TYPE x) { \ |
| 46 | + return (RET_TYPE)(__builtin_isfpclass(x, (MASK)) != (RET_TYPE)0); \ |
| 47 | + } |
| 48 | + |
| 49 | +#define _CLC_DEFINE_ISFPCLASS(RET_TYPE, VEC_RET_TYPE, FUNCTION, MASK, \ |
| 50 | + ARG_TYPE) \ |
| 51 | + _CLC_DEF _CLC_OVERLOAD RET_TYPE FUNCTION(ARG_TYPE x) { \ |
| 52 | + return __builtin_isfpclass(x, (MASK)); \ |
| 53 | + } \ |
| 54 | + _CLC_DEFINE_ISFPCLASS_VEC(VEC_RET_TYPE##2, FUNCTION, MASK, ARG_TYPE##2) \ |
| 55 | + _CLC_DEFINE_ISFPCLASS_VEC(VEC_RET_TYPE##3, FUNCTION, MASK, ARG_TYPE##3) \ |
| 56 | + _CLC_DEFINE_ISFPCLASS_VEC(VEC_RET_TYPE##4, FUNCTION, MASK, ARG_TYPE##4) \ |
| 57 | + _CLC_DEFINE_ISFPCLASS_VEC(VEC_RET_TYPE##8, FUNCTION, MASK, ARG_TYPE##8) \ |
| 58 | + _CLC_DEFINE_ISFPCLASS_VEC(VEC_RET_TYPE##16, FUNCTION, MASK, ARG_TYPE##16) |
| 59 | + |
92 | 60 | #endif // __CLC_RELATIONAL_RELATIONAL_H__ |
0 commit comments