PR inline-asm/84742
[official-gcc.git] / gcc / testsuite / gcc.target / i386 / sse2-extract-1.c
blobf701cee8c02f7973fc8d40e323cc3b52e891302b
1 /* { dg-do run } */
2 /* { dg-options "-O2 -msse2" } */
3 /* { dg-require-effective-target sse2_runtime } */
5 extern void abort (void);
6 typedef unsigned long long uint64_t;
8 #define vector(elcount, type) \
9 __attribute__((vector_size((elcount)*sizeof(type)))) type
11 #define FN(elcount, type, idx) \
12 __attribute__((noinline, noclone)) \
13 type 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 \
57 T2 (2, double) E \
58 T2 (2, uint64_t) E \
59 T4 (4, float) E \
60 T4 (4, int) E \
61 T8 (8, short) E \
62 T16 (16, char) E
63 #define TESTS_AVX \
64 T4 (4, double) E \
65 T4 (4, uint64_t) E \
66 T8 (8, float) E \
67 T8 (8, int) E \
68 T16 (16, short) E \
69 T32 (32, char) E
70 #ifdef __AVX__
71 #define TESTS TESTS_SSE2 TESTS_AVX
72 #else
73 #define TESTS TESTS_SSE2
74 #endif
76 #define F FN
77 #define H(elcount, type)
78 #define E
79 TESTS
81 int
82 main ()
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;