1  #include <stdint.h>
       2  
       3  #define PRAGMA(X) _Pragma (#X)
       4  #define UNROLL(COUNT) PRAGMA (GCC unroll (COUNT))
       5  
       6  #define CONST_FN(COUNT, TYPE, VAL)		\
       7    void						\
       8    const_##COUNT##_##TYPE##_##VAL (TYPE *x)	\
       9    {						\
      10      UNROLL (COUNT)				\
      11      for (int i = 0; i < COUNT; ++i)		\
      12        x[i] = VAL;				\
      13    }
      14  
      15  #define DUP_FN(COUNT, TYPE)			\
      16    void						\
      17    dup_##COUNT##_##TYPE (TYPE *x, TYPE val)	\
      18    {						\
      19      UNROLL (COUNT)				\
      20      for (int i = 0; i < COUNT; ++i)		\
      21        x[i] = val;				\
      22    }
      23  
      24  #define CONS2_FN(COUNT, TYPE)					\
      25    void								\
      26    cons2_##COUNT##_##TYPE (TYPE *x, TYPE val0, TYPE val1)	\
      27    {								\
      28      UNROLL (COUNT)						\
      29      for (int i = 0; i < COUNT * 2; i += 2)			\
      30        {								\
      31  	x[i + 0] = val0;					\
      32  	x[i + 1] = val1;					\
      33        }								\
      34    }
      35  
      36  #define CONS4_FN(COUNT, TYPE)					\
      37    void								\
      38    cons4_##COUNT##_##TYPE (TYPE *x, TYPE val0, TYPE val1,	\
      39  			  TYPE val2, TYPE val3)			\
      40    {								\
      41      UNROLL (COUNT)						\
      42      for (int i = 0; i < COUNT * 4; i += 4)			\
      43        {								\
      44  	x[i + 0] = val0;					\
      45  	x[i + 1] = val1;					\
      46  	x[i + 2] = val2;					\
      47  	x[i + 3] = val3;					\
      48        }								\
      49    }
      50