|
| 1 | +#include <clc/clc_convert.h> |
1 | 2 | #include <clc/clcmacro.h> |
2 | 3 | #include <clc/integer/clc_add_sat.h> |
3 | 4 | #include <clc/integer/clc_mad24.h> |
|
8 | 9 | #include <clc/relational/clc_select.h> |
9 | 10 | #include <clc/shared/clc_clamp.h> |
10 | 11 |
|
11 | | -#define __CLC_CONVERT_TY(X, TY) __builtin_convertvector(X, TY) |
12 | | - |
13 | | -// Macro for defining mad_sat variants for char/uchar/short/ushort |
14 | | -// FIXME: Once using __clc_convert_ty, can easily unify scalar and vector defs |
15 | 12 | #define __CLC_DEFINE_SIMPLE_MAD_SAT(TYPE, UP_TYPE, LIT_PREFIX) \ |
16 | 13 | _CLC_OVERLOAD _CLC_DEF TYPE __clc_mad_sat(TYPE x, TYPE y, TYPE z) { \ |
17 | | - return __clc_clamp( \ |
18 | | - (UP_TYPE)__clc_mad24((UP_TYPE)x, (UP_TYPE)y, (UP_TYPE)z), \ |
19 | | - (UP_TYPE)LIT_PREFIX##_MIN, (UP_TYPE)LIT_PREFIX##_MAX); \ |
20 | | - } |
21 | | - |
22 | | -#define __CLC_DEFINE_SIMPLE_MAD_SAT_VEC(TYPE, UP_TYPE, LIT_PREFIX) \ |
23 | | - _CLC_OVERLOAD _CLC_DEF TYPE __clc_mad_sat(TYPE x, TYPE y, TYPE z) { \ |
24 | | - UP_TYPE upscaled_mad = __clc_mad24(__CLC_CONVERT_TY(x, UP_TYPE), \ |
25 | | - __CLC_CONVERT_TY(y, UP_TYPE), \ |
26 | | - __CLC_CONVERT_TY(z, UP_TYPE)); \ |
| 14 | + UP_TYPE upscaled_mad = \ |
| 15 | + __clc_mad24(__clc_convert_##UP_TYPE(x), __clc_convert_##UP_TYPE(y), \ |
| 16 | + __clc_convert_##UP_TYPE(z)); \ |
27 | 17 | UP_TYPE clamped_mad = __clc_clamp(upscaled_mad, (UP_TYPE)LIT_PREFIX##_MIN, \ |
28 | 18 | (UP_TYPE)LIT_PREFIX##_MAX); \ |
29 | | - return __CLC_CONVERT_TY(clamped_mad, TYPE); \ |
| 19 | + return __clc_convert_##TYPE(clamped_mad); \ |
30 | 20 | } |
31 | 21 |
|
32 | 22 | #define __CLC_DEFINE_SIMPLE_MAD_SAT_ALL_TYS(TYPE, UP_TYPE, LIT_PREFIX) \ |
33 | 23 | __CLC_DEFINE_SIMPLE_MAD_SAT(TYPE, UP_TYPE, LIT_PREFIX) \ |
34 | | - __CLC_DEFINE_SIMPLE_MAD_SAT_VEC(TYPE##2, UP_TYPE##2, LIT_PREFIX) \ |
35 | | - __CLC_DEFINE_SIMPLE_MAD_SAT_VEC(TYPE##3, UP_TYPE##3, LIT_PREFIX) \ |
36 | | - __CLC_DEFINE_SIMPLE_MAD_SAT_VEC(TYPE##4, UP_TYPE##4, LIT_PREFIX) \ |
37 | | - __CLC_DEFINE_SIMPLE_MAD_SAT_VEC(TYPE##8, UP_TYPE##8, LIT_PREFIX) \ |
38 | | - __CLC_DEFINE_SIMPLE_MAD_SAT_VEC(TYPE##16, UP_TYPE##16, LIT_PREFIX) |
| 24 | + __CLC_DEFINE_SIMPLE_MAD_SAT(TYPE##2, UP_TYPE##2, LIT_PREFIX) \ |
| 25 | + __CLC_DEFINE_SIMPLE_MAD_SAT(TYPE##3, UP_TYPE##3, LIT_PREFIX) \ |
| 26 | + __CLC_DEFINE_SIMPLE_MAD_SAT(TYPE##4, UP_TYPE##4, LIT_PREFIX) \ |
| 27 | + __CLC_DEFINE_SIMPLE_MAD_SAT(TYPE##8, UP_TYPE##8, LIT_PREFIX) \ |
| 28 | + __CLC_DEFINE_SIMPLE_MAD_SAT(TYPE##16, UP_TYPE##16, LIT_PREFIX) |
39 | 29 |
|
40 | 30 | __CLC_DEFINE_SIMPLE_MAD_SAT_ALL_TYS(char, int, CHAR) |
41 | 31 | __CLC_DEFINE_SIMPLE_MAD_SAT_ALL_TYS(uchar, uint, UCHAR) |
@@ -67,20 +57,13 @@ __CLC_DEFINE_UINTLONG_MAD_SAT_ALL_TYS(ulong, long, ULONG) |
67 | 57 | INTTY mhi = __clc_mul_hi(x, y); \ |
68 | 58 | UINTTY mlo = __clc_as_##UINTTY(x * y); \ |
69 | 59 | SLONGTY m = __clc_upsample(mhi, mlo); \ |
70 | | - m += __CLC_CONVERT_TY(z, SLONGTY); \ |
| 60 | + m += __clc_convert_##SLONGTY(z); \ |
71 | 61 | m = __clc_clamp(m, (SLONGTY)INT_MIN, (SLONGTY)INT_MAX); \ |
72 | | - return __CLC_CONVERT_TY(m, INTTY); \ |
| 62 | + return __clc_convert_##INTTY(m); \ |
73 | 63 | } |
74 | 64 |
|
75 | | -// FIXME: Once using __clc_convert_ty, can easily unify scalar and vector defs |
76 | 65 | #define __CLC_DEFINE_SINT_MAD_SAT_ALL_TYS(INTTY, UINTTY, SLONGTY) \ |
77 | | - _CLC_OVERLOAD _CLC_DEF INTTY __clc_mad_sat(INTTY x, INTTY y, INTTY z) { \ |
78 | | - INTTY mhi = __clc_mul_hi(x, y); \ |
79 | | - UINTTY mlo = __clc_as_##UINTTY(x * y); \ |
80 | | - SLONGTY m = __clc_upsample(mhi, mlo); \ |
81 | | - m += z; \ |
82 | | - return __clc_clamp(m, (SLONGTY)INT_MIN, (SLONGTY)INT_MAX); \ |
83 | | - } \ |
| 66 | + __CLC_DEFINE_SINT_MAD_SAT(INTTY, UINTTY, SLONGTY) \ |
84 | 67 | __CLC_DEFINE_SINT_MAD_SAT(INTTY##2, UINTTY##2, SLONGTY##2) \ |
85 | 68 | __CLC_DEFINE_SINT_MAD_SAT(INTTY##3, UINTTY##3, SLONGTY##3) \ |
86 | 69 | __CLC_DEFINE_SINT_MAD_SAT(INTTY##4, UINTTY##4, SLONGTY##4) \ |
|
0 commit comments