blob: 40e0ac113329f9e33dc4c6591785adf4397382c8 [file] [log] [blame]
/* PR target/98167 */
/* { dg-do compile } */
/* { dg-options "-O2 -mavx2" } */
/* { dg-final { scan-assembler-times "vpshufd\t" 8 } } */
/* { dg-final { scan-assembler-times "vpermilps\t" 3 } } */
#define VEC_PERM_4 \
2, 3, 1, 0
#define VEC_PERM_8 \
4, 5, 6, 7, 3, 2, 1, 0
#define VEC_PERM_16 \
8, 9, 10, 11, 12, 13, 14, 15, 7, 6, 5, 4, 3, 2, 1, 0
#define TYPE_PERM_OP(type, size, op, name) \
typedef type v##size##s##type __attribute__ ((vector_size(4*size))); \
v##size##s##type type##foo##size##i_##name (v##size##s##type a, \
v##size##s##type b) \
{ \
v##size##s##type a1 = __builtin_shufflevector (a, a, \
VEC_PERM_##size); \
v##size##s##type b1 = __builtin_shufflevector (b, b, \
VEC_PERM_##size); \
return a1 op b1; \
}
#define INT_PERMS(op, name) \
TYPE_PERM_OP (int, 4, op, name) \
#define FP_PERMS(op, name) \
TYPE_PERM_OP (float, 4, op, name) \
INT_PERMS (+, add)
INT_PERMS (-, sub)
INT_PERMS (*, mul)
INT_PERMS (|, ior)
INT_PERMS (^, xor)
INT_PERMS (&, and)
INT_PERMS (<<, shl)
INT_PERMS (>>, shr)
FP_PERMS (+, add)
FP_PERMS (-, sub)
FP_PERMS (*, mul)