1/* { dg-do run } */ 2/* { dg-options "-O2 -msse2" } */ 3/* { dg-require-effective-target sse2_runtime } */ 4 5extern void abort (void); 6typedef unsigned long long uint64_t; 7 8#define vector(elcount, type) \ 9__attribute__((vector_size((elcount)*sizeof(type)))) type 10 11#define FN(elcount, type, idx) \ 12__attribute__((noinline, noclone)) \ 13type f##type##elcount##_##idx (vector (elcount, type) x) { return x[idx] + 1; } 14#define T2(elcount, type) \ 15 H (elcount, type) \ 16 F (elcount, type, 0) \ 17 F (elcount, type, 1) 18#define T4(elcount, type) \ 19 T2 (elcount, type) \ 20 F (elcount, type, 2) \ 21 F (elcount, type, 3) 22#define T8(elcount, type) \ 23 T4 (elcount, type) \ 24 F (elcount, type, 4) \ 25 F (elcount, type, 5) \ 26 F (elcount, type, 6) \ 27 F (elcount, type, 7) 28#define T16(elcount, type) \ 29 T8 (elcount, type) \ 30 F (elcount, type, 8) \ 31 F (elcount, type, 9) \ 32 F (elcount, type, 10) \ 33 F (elcount, type, 11) \ 34 F (elcount, type, 12) \ 35 F (elcount, type, 13) \ 36 F (elcount, type, 14) \ 37 F (elcount, type, 15) 38#define T32(elcount, type) \ 39 T16 (elcount, type) \ 40 F (elcount, type, 16) \ 41 F (elcount, type, 17) \ 42 F (elcount, type, 18) \ 43 F (elcount, type, 19) \ 44 F (elcount, type, 20) \ 45 F (elcount, type, 21) \ 46 F (elcount, type, 22) \ 47 F (elcount, type, 23) \ 48 F (elcount, type, 24) \ 49 F (elcount, type, 25) \ 50 F (elcount, type, 26) \ 51 F (elcount, type, 27) \ 52 F (elcount, type, 28) \ 53 F (elcount, type, 29) \ 54 F (elcount, type, 30) \ 55 F (elcount, type, 31) 56#define TESTS_SSE2 \ 57T2 (2, double) E \ 58T2 (2, uint64_t) E \ 59T4 (4, float) E \ 60T4 (4, int) E \ 61T8 (8, short) E \ 62T16 (16, char) E 63#define TESTS_AVX \ 64T4 (4, double) E \ 65T4 (4, uint64_t) E \ 66T8 (8, float) E \ 67T8 (8, int) E \ 68T16 (16, short) E \ 69T32 (32, char) E 70#ifdef __AVX__ 71#define TESTS TESTS_SSE2 TESTS_AVX 72#else 73#define TESTS TESTS_SSE2 74#endif 75 76#define F FN 77#define H(elcount, type) 78#define E 79TESTS 80 81int 82main () 83{ 84#undef F 85#undef H 86#undef E 87#define H(elcount, type) \ 88 vector (elcount, type) v##type##elcount = { 89#define E }; 90#define F(elcount, type, idx) idx + 1, 91 TESTS 92#undef F 93#undef H 94#undef E 95#define H(elcount, type) 96#define E 97#define F(elcount, type, idx) \ 98 if (f##type##elcount##_##idx (v##type##elcount) != idx + 2) \ 99 abort (); 100 TESTS 101 return 0; 102} 103