1  /* This file is used to reduce a number of runtime tests for AVX512F
       2     and AVX512VL instructions.  Idea is to create one file per instruction -
       3     avx512f-insn-2.c - using defines from this file instead of intrinsic
       4     name, vector length etc.  Then dg-options are set with appropriate
       5     -Dwhatever options in that .c file producing tests for specific
       6     length.  */
       7  
       8  #ifndef AVX512F_HELPER_INCLUDED
       9  #define AVX512F_HELPER_INCLUDED
      10  
      11  #include "avx512-check.h"
      12  
      13  /* Macros expansion.  */
      14  #define CONCAT(a,b,c) a ## b ## c
      15  #define EVAL(a,b,c) CONCAT(a,b,c)
      16  
      17  /* Value to be written into destination.
      18     We have one value for all types so it must be small enough
      19     to fit into signed char.  */
      20  #ifndef DEFAULT_VALUE
      21  #define DEFAULT_VALUE 117
      22  #endif
      23  
      24  #define MAKE_MASK_MERGE(NAME, TYPE)				      \
      25  static void							      \
      26  __attribute__((noinline, unused))				      \
      27  merge_masking_##NAME (TYPE *arr, unsigned long long mask, int size)   \
      28  {								      \
      29    int i;							      \
      30    for (i = 0; i < size; i++)					      \
      31      {								      \
      32        arr[i] = (mask & (1LL << i)) ? arr[i] : DEFAULT_VALUE;	      \
      33      }								      \
      34  }
      35  
      36  MAKE_MASK_MERGE(i_b, char)
      37  MAKE_MASK_MERGE(i_w, short)
      38  MAKE_MASK_MERGE(i_d, int)
      39  MAKE_MASK_MERGE(i_q, long long)
      40  MAKE_MASK_MERGE(, float)
      41  MAKE_MASK_MERGE(d, double)
      42  MAKE_MASK_MERGE(i_ub, unsigned char)
      43  MAKE_MASK_MERGE(i_uw, unsigned short)
      44  MAKE_MASK_MERGE(i_ud, unsigned int)
      45  MAKE_MASK_MERGE(i_uq, unsigned long long)
      46  
      47  #define MASK_MERGE(TYPE) merge_masking_##TYPE
      48  
      49  #define MAKE_MASK_ZERO(NAME, TYPE)				      \
      50  static void							      \
      51  __attribute__((noinline, unused))				      \
      52  zero_masking_##NAME (TYPE *arr, unsigned long long mask, int size)    \
      53  {								      \
      54    int i;							      \
      55    for (i = 0; i < size; i++)					      \
      56      {								      \
      57        arr[i] = (mask & (1LL << i)) ? arr[i] : 0;		      \
      58      }								      \
      59  }
      60  
      61  MAKE_MASK_ZERO(i_b, char)
      62  MAKE_MASK_ZERO(i_w, short)
      63  MAKE_MASK_ZERO(i_d, int)
      64  MAKE_MASK_ZERO(i_q, long long)
      65  MAKE_MASK_ZERO(, float)
      66  MAKE_MASK_ZERO(d, double)
      67  MAKE_MASK_ZERO(i_ub, unsigned char)
      68  MAKE_MASK_ZERO(i_uw, unsigned short)
      69  MAKE_MASK_ZERO(i_ud, unsigned int)
      70  MAKE_MASK_ZERO(i_uq, unsigned long long)
      71  
      72  
      73  #define MASK_ZERO(TYPE) zero_masking_##TYPE
      74  
      75  
      76  /* Unions used for testing (for example union512d, union256d etc.).  */
      77  #define UNION_TYPE(SIZE, NAME) EVAL(union, SIZE, NAME)
      78  /* Corresponding union check.  */
      79  #define UNION_CHECK(SIZE, NAME) EVAL(check_union, SIZE, NAME)
      80  /* Corresponding fp union check.  */
      81  #define UNION_FP_CHECK(SIZE, NAME) EVAL(check_fp_union, SIZE, NAME)
      82  /* Corresponding rough union check.  */
      83  #define UNION_ROUGH_CHECK(SIZE, NAME) \
      84    EVAL(check_rough_union, SIZE, NAME)
      85  /* Function which tests intrinsic for given length.  */
      86  #define TEST EVAL(test_, AVX512F_LEN,)
      87  /* Function which calculates result.  */
      88  #define CALC EVAL(calc_, AVX512F_LEN,)
      89  
      90  #ifndef AVX512VL
      91  #define AVX512F_LEN 512
      92  #define AVX512F_LEN_HALF 256
      93  #endif
      94  
      95  #endif /* AVX512F_HELPER_INCLUDED */
      96  
      97  /* Intrinsic being tested. It has different deffinitions,
      98     depending on AVX512F_LEN, so it's outside include guards
      99     and in undefed away to silence warnings.  */
     100  #if defined INTRINSIC
     101  #undef INTRINSIC
     102  #endif
     103  
     104  #if AVX512F_LEN != 128
     105  #define INTRINSIC(NAME) EVAL(_mm, AVX512F_LEN, NAME)
     106  #else
     107  #define INTRINSIC(NAME) _mm ## NAME
     108  #endif