| /* { dg-do run } */ |
| /* { dg-options "-O2 -msse2" } */ |
| /* { dg-require-effective-target sse2_runtime } */ |
| |
| extern void abort (void); |
| typedef unsigned long long uint64_t; |
| |
| #define vector(elcount, type) \ |
| __attribute__((vector_size((elcount)*sizeof(type)))) type |
| |
| #define FN(elcount, type, idx) \ |
| __attribute__((noinline, noclone)) \ |
| type f##type##elcount##_##idx (vector (elcount, type) x) { return x[idx] + 1; } |
| #define T2(elcount, type) \ |
| H (elcount, type) \ |
| F (elcount, type, 0) \ |
| F (elcount, type, 1) |
| #define T4(elcount, type) \ |
| T2 (elcount, type) \ |
| F (elcount, type, 2) \ |
| F (elcount, type, 3) |
| #define T8(elcount, type) \ |
| T4 (elcount, type) \ |
| F (elcount, type, 4) \ |
| F (elcount, type, 5) \ |
| F (elcount, type, 6) \ |
| F (elcount, type, 7) |
| #define T16(elcount, type) \ |
| T8 (elcount, type) \ |
| F (elcount, type, 8) \ |
| F (elcount, type, 9) \ |
| F (elcount, type, 10) \ |
| F (elcount, type, 11) \ |
| F (elcount, type, 12) \ |
| F (elcount, type, 13) \ |
| F (elcount, type, 14) \ |
| F (elcount, type, 15) |
| #define T32(elcount, type) \ |
| T16 (elcount, type) \ |
| F (elcount, type, 16) \ |
| F (elcount, type, 17) \ |
| F (elcount, type, 18) \ |
| F (elcount, type, 19) \ |
| F (elcount, type, 20) \ |
| F (elcount, type, 21) \ |
| F (elcount, type, 22) \ |
| F (elcount, type, 23) \ |
| F (elcount, type, 24) \ |
| F (elcount, type, 25) \ |
| F (elcount, type, 26) \ |
| F (elcount, type, 27) \ |
| F (elcount, type, 28) \ |
| F (elcount, type, 29) \ |
| F (elcount, type, 30) \ |
| F (elcount, type, 31) |
| #define TESTS_SSE2 \ |
| T2 (2, double) E \ |
| T2 (2, uint64_t) E \ |
| T4 (4, float) E \ |
| T4 (4, int) E \ |
| T8 (8, short) E \ |
| T16 (16, char) E |
| #define TESTS_AVX \ |
| T4 (4, double) E \ |
| T4 (4, uint64_t) E \ |
| T8 (8, float) E \ |
| T8 (8, int) E \ |
| T16 (16, short) E \ |
| T32 (32, char) E |
| #ifdef __AVX__ |
| #define TESTS TESTS_SSE2 TESTS_AVX |
| #else |
| #define TESTS TESTS_SSE2 |
| #endif |
| |
| #define F FN |
| #define H(elcount, type) |
| #define E |
| TESTS |
| |
| int |
| main () |
| { |
| #undef F |
| #undef H |
| #undef E |
| #define H(elcount, type) \ |
| vector (elcount, type) v##type##elcount = { |
| #define E }; |
| #define F(elcount, type, idx) idx + 1, |
| TESTS |
| #undef F |
| #undef H |
| #undef E |
| #define H(elcount, type) |
| #define E |
| #define F(elcount, type, idx) \ |
| if (f##type##elcount##_##idx (v##type##elcount) != idx + 2) \ |
| abort (); |
| TESTS |
| return 0; |
| } |