| /* 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) |
| |