[RS6000] Tests that use int128_t and -m32
[official-gcc.git] / gcc / testsuite / gcc.target / powerpc / vec-extract-v16qiu-v2.h
blobd1157599ee7c66ef95a920ad68f46e947d159687
1 #include <stdlib.h>
2 #include <stddef.h>
3 #include <altivec.h>
5 #ifndef RTYPE
6 #define RTYPE TYPE
7 #endif
9 #ifdef DO_TRACE
10 #include <stdio.h>
12 #define TRACE(STRING, NUM) \
13 do \
14 { \
15 fprintf (stderr, "%s: %2d\n", STRING, (int) NUM); \
16 fflush (stderr); \
17 } \
18 while (0)
20 #ifndef FAIL_FORMAT
21 #define FAIL_FORMAT "%ld"
22 #define FAIL_CAST(X) ((long)(X))
23 #endif
25 #define FAIL(EXP, GOT) \
26 do \
27 { \
28 fprintf (stderr, "Expected: " FAIL_FORMAT ", got " FAIL_FORMAT "\n", \
29 FAIL_CAST (EXP), FAIL_CAST (GOT)); \
30 fflush (stderr); \
31 abort (); \
32 } \
33 while (0)
35 #else
36 #define TRACE(STRING, NUM)
37 #define FAIL(EXP, GOT) abort ()
38 #endif
40 static void
41 check (RTYPE, RTYPE) __attribute__((__noinline__));
43 static vector TYPE
44 deoptimize (vector TYPE) __attribute__((__noinline__));
46 static vector TYPE
47 *deoptimize_ptr (vector TYPE *) __attribute__((__noinline__));
49 static void
50 check (RTYPE expected, RTYPE got)
52 if (expected != got)
53 FAIL (expected, got);
56 static vector TYPE
57 deoptimize (vector TYPE a)
59 __asm__ (" # %x0" : "+v" (a));
60 return a;
63 static vector TYPE *
64 deoptimize_ptr (vector TYPE *p)
66 __asm__ (" # %0" : "+r" (p));
67 return p;
71 RTYPE
72 get_auto_0 (vector TYPE a)
74 TRACE ("get_auto_", 0);
75 return (RTYPE) vec_extract (a, 0);
78 RTYPE
79 get_auto_1 (vector TYPE a)
81 TRACE ("get_auto_", 1);
82 return (RTYPE) vec_extract (a, 1);
85 #if ELEMENTS >= 4
86 RTYPE
87 get_auto_2 (vector TYPE a)
89 return (RTYPE) vec_extract (a, 2);
92 RTYPE
93 get_auto_3 (vector TYPE a)
95 return (RTYPE) vec_extract (a, 3);
98 #if ELEMENTS >= 8
99 RTYPE
100 get_auto_4 (vector TYPE a)
102 return (RTYPE) vec_extract (a, 4);
105 RTYPE
106 get_auto_5 (vector TYPE a)
108 return (RTYPE) vec_extract (a, 5);
111 RTYPE
112 get_auto_6 (vector TYPE a)
114 return (RTYPE) vec_extract (a, 6);
117 RTYPE
118 get_auto_7 (vector TYPE a)
120 return (RTYPE) vec_extract (a, 7);
123 #if ELEMENTS >= 16
124 RTYPE
125 get_auto_8 (vector TYPE a)
127 return (RTYPE) vec_extract (a, 8);
130 RTYPE
131 get_auto_9 (vector TYPE a)
133 return (RTYPE) vec_extract (a, 9);
136 RTYPE
137 get_auto_10 (vector TYPE a)
139 return (RTYPE) vec_extract (a, 10);
142 RTYPE
143 get_auto_11 (vector TYPE a)
145 return (RTYPE) vec_extract (a, 11);
148 RTYPE
149 get_auto_12 (vector TYPE a)
151 return (RTYPE) vec_extract (a, 12);
154 RTYPE
155 get_auto_13 (vector TYPE a)
157 return (RTYPE) vec_extract (a, 13);
160 RTYPE
161 get_auto_14 (vector TYPE a)
163 return (RTYPE) vec_extract (a, 14);
166 RTYPE
167 get_auto_15 (vector TYPE a)
169 return (RTYPE) vec_extract (a, 15);
172 #endif
173 #endif
174 #endif
177 /* Tests for the normal case of vec_extract where the vector is in a register
178 and returning the result in a register as a return value. */
179 #ifdef DISABLE_INLINE_OF_GET_AUTO_N
180 __attribute__ ((__noinline__))
181 #else
182 /* gcc issues warning: always_inline function might not be inlinable
184 __attribute__ ((__always_inline__))
186 #endif
187 RTYPE
188 get_auto_n (vector TYPE a, ssize_t n)
190 return (RTYPE) vec_extract (a, n);
193 typedef RTYPE (*auto_func_type) (vector TYPE);
195 static auto_func_type get_auto_const[] = {
196 get_auto_0,
197 get_auto_1,
198 #if ELEMENTS >= 4
199 get_auto_2,
200 get_auto_3,
201 #if ELEMENTS >= 8
202 get_auto_4,
203 get_auto_5,
204 get_auto_6,
205 get_auto_7,
206 #if ELEMENTS >= 16
207 get_auto_8,
208 get_auto_9,
209 get_auto_10,
210 get_auto_11,
211 get_auto_12,
212 get_auto_13,
213 get_auto_14,
214 get_auto_15,
215 #endif
216 #endif
217 #endif
220 extern void do_auto (vector TYPE a) __attribute__((__noinline__));
222 void
223 do_auto (vector TYPE a)
225 size_t i;
227 for (i = 1; i < 40; i += 3)
229 TRACE ("do_auto, i: ", i);
230 TRACE (" get_auto_const[i] returns: ",
231 (*get_auto_const [i % ELEMENTS]) (a));
232 TRACE (" get_auto_n returns", get_auto_n (a, i));
233 check (get_auto_n (a, i), (*get_auto_const [i % ELEMENTS]) (a));
239 /* Main program to test all of the possibilities. */
241 main (void)
243 size_t i;
244 vector TYPE x = INITIAL;
245 vector TYPE *p, *p2, a, y;
246 vector TYPE z[2];
248 a = deoptimize (x);
250 do_auto (a);
252 return 0;