(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
pr98167.c
       1  /* PR target/98167 */
       2  /* { dg-do compile } */
       3  /* { dg-options "-O2 -mavx2" } */
       4  
       5  /* { dg-final { scan-assembler-times "vpshufd\t" 8 } } */
       6  /* { dg-final { scan-assembler-times "vpermilps\t" 3 } } */
       7  
       8  #define VEC_PERM_4 \
       9    2, 3, 1, 0
      10  #define VEC_PERM_8 \
      11    4, 5, 6, 7, 3, 2, 1, 0
      12  #define VEC_PERM_16 \
      13    8, 9, 10, 11, 12, 13, 14, 15, 7, 6, 5, 4, 3, 2, 1, 0
      14  
      15  #define TYPE_PERM_OP(type, size, op, name) \
      16    typedef type v##size##s##type __attribute__ ((vector_size(4*size))); \
      17    v##size##s##type type##foo##size##i_##name (v##size##s##type a, \
      18  					      v##size##s##type b) \
      19    { \
      20      v##size##s##type a1 = __builtin_shufflevector (a, a, \
      21  						   VEC_PERM_##size); \
      22      v##size##s##type b1 = __builtin_shufflevector (b, b, \
      23  						   VEC_PERM_##size); \
      24      return a1 op b1; \
      25    }
      26  
      27  #define INT_PERMS(op, name) \
      28    TYPE_PERM_OP (int, 4, op, name) \
      29  
      30  #define FP_PERMS(op, name) \
      31    TYPE_PERM_OP (float, 4, op, name) \
      32  
      33  INT_PERMS (+, add)
      34  INT_PERMS (-, sub)
      35  INT_PERMS (*, mul)
      36  INT_PERMS (|, ior)
      37  INT_PERMS (^, xor)
      38  INT_PERMS (&, and)
      39  INT_PERMS (<<, shl)
      40  INT_PERMS (>>, shr)
      41  FP_PERMS (+, add)
      42  FP_PERMS (-, sub)
      43  FP_PERMS (*, mul)
      44