#include #define PRAGMA(X) _Pragma (#X) #define UNROLL(COUNT) PRAGMA (GCC unroll (COUNT)) #define CONST_FN(COUNT, TYPE, VAL) \ void \ const_##COUNT##_##TYPE##_##VAL (TYPE *x) \ { \ UNROLL (COUNT) \ for (int i = 0; i < COUNT; ++i) \ x[i] = VAL; \ } #define DUP_FN(COUNT, TYPE) \ void \ dup_##COUNT##_##TYPE (TYPE *x, TYPE val) \ { \ UNROLL (COUNT) \ for (int i = 0; i < COUNT; ++i) \ x[i] = val; \ } #define CONS2_FN(COUNT, TYPE) \ void \ cons2_##COUNT##_##TYPE (TYPE *x, TYPE val0, TYPE val1) \ { \ UNROLL (COUNT) \ for (int i = 0; i < COUNT * 2; i += 2) \ { \ x[i + 0] = val0; \ x[i + 1] = val1; \ } \ } #define CONS4_FN(COUNT, TYPE) \ void \ cons4_##COUNT##_##TYPE (TYPE *x, TYPE val0, TYPE val1, \ TYPE val2, TYPE val3) \ { \ UNROLL (COUNT) \ for (int i = 0; i < COUNT * 4; i += 4) \ { \ x[i + 0] = val0; \ x[i + 1] = val1; \ x[i + 2] = val2; \ x[i + 3] = val3; \ } \ }