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