(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
avx512fp16-builtin_shuffle-1.c
       1  /* { dg-do compile } */
       2  /* { dg-options "-mavx512fp16 -mavx512vl -O2" } */
       3  /* { dg-final { scan-assembler-not "movw" } } */
       4  /* { dg-final { scan-assembler-times "vpermi2w" 3 } } */
       5  /* { dg-final { scan-assembler-times "vpermw" 6 } } */
       6  /* { dg-final { scan-assembler-times "vpshufb" 3 } } */
       7  /* { dg-final { scan-assembler-times "vpermt2w" 6 } } */
       8  
       9  typedef _Float16 v32hf __attribute__((vector_size (64)));
      10  typedef _Float16 v16hf __attribute__((vector_size (32)));
      11  typedef _Float16 v8hf __attribute__((vector_size (16)));
      12  typedef short v32hi __attribute__((vector_size (64)));
      13  typedef short v16hi __attribute__((vector_size (32)));
      14  typedef short v8hi __attribute__((vector_size (16)));
      15  
      16  #define PERM_CONST_RANDOM_v32hi	\
      17  { 0, 21, 15, 9, 43, 25, 37, 48,	\
      18    8, 16, 27, 51, 30, 12, 6, 46,	\
      19    34, 3, 11, 5, 17, 53, 26, 39,	\
      20    2, 18, 40, 61, 19, 4, 50, 29 }
      21  
      22  #define PERM_CONST_RANDOM_RANGE32_v32hi \
      23  { 0, 21, 10, 23, 8, 18, 7, 19, \
      24    4, 25, 3, 31, 5, 22, 11, 17, \
      25    9, 20, 2, 24, 1, 30, 12, 27, \
      26    13, 28, 6, 29, 14, 16, 15, 23 }
      27  
      28  #define PERM_CONST_RANDOM_v16hi \
      29  { 0, 21, 15, 9, 13, 25, 30, 18,	\
      30    8, 16, 17, 11, 4, 22, 6, 7 }
      31  
      32  #define PERM_CONST_RANDOM_RANGE16_v16hi \
      33  { 0, 9, 1, 12, 4, 15, 7, 13,	\
      34    3, 10, 6, 14, 5, 8, 2, 11 }
      35  
      36  #define PERM_CONST_RANDOM_v8hi \
      37  { 0, 14, 15, 9, 13, 2, 3, 5 }
      38  
      39  #define PERM_CONST_RANDOM_RANGE8_v8hi \
      40  { 0, 7, 2, 5, 3, 4, 1, 6 }
      41  
      42  #define PERM_CONST_RANDOM(size)	\
      43    PERM_CONST_RANDOM_v##size##hi
      44  
      45  #define PERM_CONST_RANDOM_RANGE(size) \
      46    PERM_CONST_RANDOM_RANGE##size##_v##size##hi
      47  
      48  #define SHUFFLE_CONST_RANDOM(type, itype, size) \
      49  type foo_##type##shuffle_2param_const_random (type a, type b) \
      50  { \
      51    return __builtin_shuffle (a, b, \
      52  			    (itype) PERM_CONST_RANDOM (size)); \
      53  } \
      54  type foo_##type##shuffle_2param_const_random_range (type a, type b) \
      55  { \
      56    return __builtin_shuffle (a, b, \
      57  			    (itype) PERM_CONST_RANDOM_RANGE (size)); \
      58  } \
      59  type foo_##type##shuffle_1param_const_random (type a) \
      60  { \
      61    return __builtin_shuffle (a, \
      62  			    (itype) PERM_CONST_RANDOM (size)); \
      63  } \
      64  type foo_##type##shuffle_1param_const_random_range (type a) \
      65  { \
      66    return __builtin_shuffle (a, \
      67  			    (itype) PERM_CONST_RANDOM_RANGE (size)); \
      68  }
      69  
      70  #define SHUFFLE_VEC_INDEX(type, itype) \
      71  type foo##type##itype##shuffle_2param_vec (type a, type b, itype c) \
      72  { \
      73    return __builtin_shuffle (a, b, c); \
      74  } \
      75  type foo##type##itype##shuffle_1param_vec (type a, itype c) \
      76  { \
      77    return __builtin_shuffle (a, c); \
      78  }
      79  
      80  SHUFFLE_CONST_RANDOM (v32hf, v32hi, 32)
      81  SHUFFLE_CONST_RANDOM (v16hf, v16hi, 16)
      82  SHUFFLE_CONST_RANDOM (v8hf, v8hi, 8)
      83  
      84  SHUFFLE_VEC_INDEX (v32hf, v32hi)
      85  SHUFFLE_VEC_INDEX (v16hf, v16hi)
      86  SHUFFLE_VEC_INDEX (v8hf, v8hi)