[testsuite] require sqrt_insn effective target where needed
[official-gcc.git] / gcc / testsuite / gcc.target / powerpc / savres.c
blobf724f308094c462fd050ada0c30b05676024c0ab
1 /* { dg-do run } */
2 /* { dg-options "-fno-inline -fomit-frame-pointer -fno-rename-registers" } */
3 /* { dg-additional-options "-mdynamic-no-pic" { target *-*-darwin* } } */
5 /* -fno-inline -maltivec -m32/-m64 -mmultiple/no-multiple -Os/-O2. */
6 #ifndef NO_BODY
7 #define abort() __builtin_abort ()
8 #define vec_all_eq(v1,v2) __builtin_vec_vcmpeq_p (2, v1, v2)
9 #define SET(T,R,V) register T R __asm__ (#R) = V
10 #define SET_GPR(R,V) SET (long, R, V)
11 #define SET_FPR(R,V) SET (double, R, V)
12 #define SET_VR(R,V) SET (__attribute__ ((vector_size (16))) int, R, V)
13 /* There doesn't seem to be a way of letting gcc know that cr2, cr3
14 and cr4 are being used, and therefore should not be touched by
15 gcc. Unlike gpr, fpr and vr we can't do something like
16 register __attribute__ ((__mode__ ("__CC__"))) int cr2 __asm__ ("cr2");
17 This makes the test somewhat fragile, dependent on gcc not using
18 any of cr2, cr3 and cr4 in main(), and is why -fno-rename-registers
19 is required. */
20 #define SET_CR(R,V) __asm__ __volatile__ ("mtcrf %0,%1" : : "n" (1<<(7-R)), "r" (V<<(4*(7-R))) : "cr" #R)
21 #define TRASH_GPR(R) SET_GPR (R, 0)
22 #define TRASH_FPR(R) SET_FPR (R, 0)
23 #define TRASH_VR(R) SET_VR (R, val0)
24 #define TRASH_CR(R) SET_CR (R, 0)
25 #define TRASH_SOME_GPR TRASH_GPR (r30); TRASH_GPR (r31)
26 #define TRASH_SOME_FPR TRASH_FPR (fr28); TRASH_FPR (fr31)
27 #define TRASH_SOME_VR TRASH_VR (v26); TRASH_VR (v27); TRASH_VR (v31)
28 #define TRASH_SOME_CR TRASH_CR (2)
29 #define TRASH_ALL_GPR TRASH_GPR (r14); TRASH_GPR (r15); TRASH_GPR (r16); TRASH_GPR (r17); TRASH_GPR (r18); TRASH_GPR (r19); TRASH_GPR (r20); TRASH_GPR (r21); TRASH_GPR (r22); TRASH_GPR (r23); TRASH_GPR (r24); TRASH_GPR (r25); TRASH_GPR (r26); TRASH_GPR (r27); TRASH_GPR (r28); TRASH_GPR (r29); TRASH_GPR (r30); TRASH_GPR (r31)
30 #define TRASH_ALL_FPR TRASH_FPR (fr14); TRASH_FPR (fr15); TRASH_FPR (fr16); TRASH_FPR (fr17); TRASH_FPR (fr18); TRASH_FPR (fr19); TRASH_FPR (fr20); TRASH_FPR (fr21); TRASH_FPR (fr22); TRASH_FPR (fr23); TRASH_FPR (fr24); TRASH_FPR (fr25); TRASH_FPR (fr26); TRASH_FPR (fr27); TRASH_FPR (fr28); TRASH_FPR (fr29); TRASH_FPR (fr30); TRASH_FPR (fr31)
31 #define TRASH_ALL_VR TRASH_VR (v20); TRASH_VR (v21); TRASH_VR (v22); TRASH_VR (v23); TRASH_VR (v24); TRASH_VR (v25); TRASH_VR (v26); TRASH_VR (v27); TRASH_VR (v28); TRASH_VR (v29); TRASH_VR (v30); TRASH_VR (v31)
32 #define TRASH_ALL_CR TRASH_CR (2); TRASH_CR (3); TRASH_CR (4)
33 #define USE_SOME_GPR __asm__ __volatile__ ("#%0 %1" : : "r" (r30), "r" (r31))
34 #define USE_SOME_FPR __asm__ __volatile__ ("#%0 %1" : : "f" (fr28), "f" (fr31))
35 #define USE_SOME_VR __asm__ __volatile__ ("#%0 %1 %2" : : "v" (v26), "v" (v27), "v" (v31))
36 #define USE_SOME_CR
37 #define USE_ALL_GPR __asm__ __volatile__ ("#%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11 %12 %13 %14 %15 %16 %17" : : "r" (r14), "r" (r15), "r" (r16), "r" (r17), "r" (r18), "r" (r19), "r" (r20), "r" (r21), "r" (r22), "r" (r23), "r" (r24), "r" (r25), "r" (r26), "r" (r27), "r" (r28), "r" (r29), "r" (r30), "r" (r31))
38 #define USE_ALL_FPR __asm__ __volatile__ ("#%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11 %12 %13 %14 %15 %16 %17" : : "f" (fr14), "f" (fr15), "f" (fr16), "f" (fr17), "f" (fr18), "f" (fr19), "f" (fr20), "f" (fr21), "f" (fr22), "f" (fr23), "f" (fr24), "f" (fr25), "f" (fr26), "f" (fr27), "f" (fr28), "f" (fr29), "f" (fr30), "f" (fr31))
39 #define USE_ALL_VR __asm__ __volatile__ ("#%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %10 %11" : : "v" (v20), "v" (v21), "v" (v22), "v" (v23), "v" (v24), "v" (v25), "v" (v26), "v" (v27), "v" (v28), "v" (v29), "v" (v30), "v" (v31))
40 #define USE_ALL_CR
42 #define INIT_GPR SET_GPR (r14, 14); SET_GPR (r15, 15); SET_GPR (r16, 16); SET_GPR (r17, 17); SET_GPR (r18, 18); SET_GPR (r19, 19); SET_GPR (r20, 20); SET_GPR (r21, 21); SET_GPR (r22, 22); SET_GPR (r23, 23); SET_GPR (r24, 24); SET_GPR (r25, 25); SET_GPR (r26, 26); SET_GPR (r27, 27); SET_GPR (r28, 28); SET_GPR (r29, 29); SET_GPR (r30, 30); SET_GPR (r31, 31)
43 #define INIT_FPR SET_FPR (fr14, 140.0); SET_FPR (fr15, 150.0); SET_FPR (fr16, 160.0); SET_FPR (fr17, 170.0); SET_FPR (fr18, 180.0); SET_FPR (fr19, 190.0); SET_FPR (fr20, 200.0); SET_FPR (fr21, 210.0); SET_FPR (fr22, 220.0); SET_FPR (fr23, 230.0); SET_FPR (fr24, 240.0); SET_FPR (fr25, 250.0); SET_FPR (fr26, 260.0); SET_FPR (fr27, 270.0); SET_FPR (fr28, 280.0); SET_FPR (fr29, 290.0); SET_FPR (fr30, 300.0); SET_FPR (fr31, 310.0)
44 #define INIT_VR SET_VR (v20, val20); SET_VR (v21, val21); SET_VR (v22, val22); SET_VR (v23, val23); SET_VR (v24, val24); SET_VR (v25, val25); SET_VR (v26, val26); SET_VR (v27, val27); SET_VR (v28, val28); SET_VR (v29, val29); SET_VR (v30, val30); SET_VR (v31, val31)
45 #define INIT_CR SET_CR (2, 6); SET_CR (3, 7); SET_CR (4, 8)
46 #ifdef __ALTIVEC__
47 __attribute__ ((vector_size (16))) int val0 = {0,0,0,0};
48 __attribute__ ((vector_size (16))) int val20 = {-201,-202,-203,-204};
49 __attribute__ ((vector_size (16))) int val21 = {-211,-212,-213,-214};
50 __attribute__ ((vector_size (16))) int val22 = {-221,-222,-223,-224};
51 __attribute__ ((vector_size (16))) int val23 = {-231,-232,-233,-234};
52 __attribute__ ((vector_size (16))) int val24 = {-241,-242,-243,-244};
53 __attribute__ ((vector_size (16))) int val25 = {-251,-252,-253,-254};
54 __attribute__ ((vector_size (16))) int val26 = {-261,-262,-263,-264};
55 __attribute__ ((vector_size (16))) int val27 = {-271,-272,-273,-274};
56 __attribute__ ((vector_size (16))) int val28 = {-281,-282,-283,-284};
57 __attribute__ ((vector_size (16))) int val29 = {-291,-292,-293,-294};
58 __attribute__ ((vector_size (16))) int val30 = {-301,-302,-303,-304};
59 __attribute__ ((vector_size (16))) int val31 = {-311,-312,-313,-314};
60 #define INIT_REGS INIT_VR; INIT_FPR; INIT_GPR; INIT_CR
61 #else
62 #ifndef __NO_FPRS__
63 #define INIT_REGS INIT_FPR; INIT_GPR; INIT_CR
64 #else
65 #define INIT_REGS INIT_GPR; INIT_CR
66 #endif
67 #endif
68 #define VERIFY_GPR if (r14 != 14 || r15 != 15 || r16 != 16 || r17 != 17 || r18 != 18 || r19 != 19 || r20 != 20 || r21 != 21 || r22 != 22 || r23 != 23 || r24 != 24 || r25 != 25 || r26 != 26 || r27 != 27 || r28 != 28 || r29 != 29 || r30 != 30 || r31 != 31) abort ()
69 #define VERIFY_FPR if (fr14 != 140.0 || fr15 != 150.0 || fr16 != 160.0 || fr17 != 170.0 || fr18 != 180.0 || fr19 != 190.0 || fr20 != 200.0 || fr21 != 210.0 || fr22 != 220.0 || fr23 != 230.0 || fr24 != 240.0 || fr25 != 250.0 || fr26 != 260.0 || fr27 != 270.0 || fr28 != 280.0 || fr29 != 290.0 || fr30 != 300.0 || fr31 != 310.0) abort ()
70 #define VERIFY_VR if (!vec_all_eq (v20, val20) || !vec_all_eq (v21, val21) || !vec_all_eq (v22, val22) || !vec_all_eq (v23, val23) || !vec_all_eq (v24, val24) || !vec_all_eq (v25, val25) || !vec_all_eq (v26, val26) || !vec_all_eq (v27, val27) || !vec_all_eq (v28, val28) || !vec_all_eq (v29, val29) || !vec_all_eq (v30, val30) || !vec_all_eq (v31, val31)) abort ()
71 #define VERIFY_CR ({ int tmp; __asm__ __volatile__ ("mfcr %0" : "=r" (tmp)); if ((tmp & ((15 << 20) | (15 << 16) | (15 << 12))) != ((6 << 20) | (7 << 16) | (8 << 12))) abort (); })
72 #ifdef __ALTIVEC__
73 #define VERIFY_REGS VERIFY_VR; VERIFY_FPR; VERIFY_GPR; VERIFY_CR
74 #else
75 #ifndef __NO_FPRS__
76 #define VERIFY_REGS VERIFY_FPR; VERIFY_GPR; VERIFY_CR
77 #else
78 #define VERIFY_REGS VERIFY_GPR; VERIFY_CR
79 #endif
80 #endif
82 #else /* NO_BODY */
83 /* For looking at prologue and epilogue code without distractions. */
84 #define abort()
85 #define TRASH_ALL_CR
86 #define TRASH_ALL_VR
87 #define TRASH_ALL_FPR
88 #define TRASH_ALL_GPR
89 #define USE_ALL_CR
90 #define USE_ALL_VR
91 #define USE_ALL_FPR
92 #define USE_ALL_GPR
93 #define TRASH_SOME_CR
94 #define TRASH_SOME_VR
95 #define TRASH_SOME_FPR
96 #define TRASH_SOME_GPR
97 #define USE_SOME_CR
98 #define USE_SOME_VR
99 #define USE_SOME_FPR
100 #define USE_SOME_GPR
101 #define INIT_REGS
102 #define VERIFY_REGS
103 #endif
105 #ifdef __ALTIVEC__
106 #ifndef __NO_FPRS__
107 void b_all (void)
109 char a[33000];
110 TRASH_ALL_CR;
111 TRASH_ALL_VR;
112 TRASH_ALL_FPR;
113 TRASH_ALL_GPR;
114 USE_ALL_CR;
115 USE_ALL_VR;
116 USE_ALL_FPR;
117 USE_ALL_GPR;
118 __asm __volatile ("#%0" : "=m" (a) : : "cr2", "cr3", "cr4", "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31", "fr14", "fr15", "fr16", "fr17", "fr18", "fr19", "fr20", "fr21", "fr22", "fr23", "fr24", "fr25", "fr26", "fr27", "fr28", "fr29", "fr30", "fr31", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31");
121 void b_cvfr (void)
123 char a[33000];
124 TRASH_SOME_CR;
125 TRASH_SOME_VR;
126 TRASH_SOME_FPR;
127 TRASH_SOME_GPR;
128 USE_SOME_CR;
129 USE_SOME_VR;
130 USE_SOME_FPR;
131 USE_SOME_GPR;
132 __asm __volatile ("#%0" : "=m" (a) : : "cr2", "v26", "v27", "v31", "fr28", "fr31", "r30", "r31");
135 void b_vfr (void)
137 char a[33000];
138 TRASH_SOME_VR;
139 TRASH_SOME_FPR;
140 TRASH_SOME_GPR;
141 USE_SOME_VR;
142 USE_SOME_FPR;
143 USE_SOME_GPR;
144 __asm __volatile ("#%0" : "=m" (a) : : "v26", "v27", "v31", "fr28", "fr31", "r30", "r31");
147 void b_cvf (void)
149 char a[33000];
150 TRASH_SOME_CR;
151 TRASH_SOME_VR;
152 TRASH_SOME_FPR;
153 USE_SOME_CR;
154 USE_SOME_VR;
155 USE_SOME_FPR;
156 __asm __volatile ("#%0" : "=m" (a) : : "cr2", "v26", "v27", "v31", "fr28", "fr31");
159 void b_vf (void)
161 char a[33000];
162 TRASH_SOME_VR;
163 TRASH_SOME_FPR;
164 USE_SOME_VR;
165 USE_SOME_FPR;
166 __asm __volatile ("#%0" : "=m" (a) : : "v26", "v27", "v31", "fr28", "fr31");
168 #endif
170 void b_cvr (void)
172 char a[33000];
173 TRASH_SOME_CR;
174 TRASH_SOME_VR;
175 TRASH_SOME_GPR;
176 USE_SOME_CR;
177 USE_SOME_VR;
178 USE_SOME_GPR;
179 __asm __volatile ("#%0" : "=m" (a) : : "cr2", "v26", "v27", "v31", "r30", "r31");
182 void b_vr (void)
184 char a[33000];
185 TRASH_SOME_VR;
186 TRASH_SOME_GPR;
187 USE_SOME_VR;
188 USE_SOME_GPR;
189 __asm __volatile ("#%0" : "=m" (a) : : "v26", "v27", "v31", "r30", "r31");
192 void b_cv (void)
194 char a[33000];
195 TRASH_SOME_CR;
196 TRASH_SOME_VR;
197 USE_SOME_CR;
198 USE_SOME_VR;
199 __asm __volatile ("#%0" : "=m" (a) : : "cr2", "v26", "v27", "v31");
202 void b_v (void)
204 char a[33000];
205 TRASH_SOME_VR;
206 USE_SOME_VR;
207 __asm __volatile ("#%0" : "=m" (a) : : "v26", "v27", "v31");
209 #endif
211 #ifndef __NO_FPRS__
212 void b_cfr (void)
214 char a[33000];
215 TRASH_SOME_CR;
216 TRASH_SOME_FPR;
217 TRASH_SOME_GPR;
218 USE_SOME_CR;
219 USE_SOME_FPR;
220 USE_SOME_GPR;
221 __asm __volatile ("#%0" : "=m" (a) : : "cr2", "fr28", "fr31", "r30", "r31");
224 void b_fr (void)
226 char a[33000];
227 TRASH_SOME_FPR;
228 TRASH_SOME_GPR;
229 USE_SOME_FPR;
230 USE_SOME_GPR;
231 __asm __volatile ("#%0" : "=m" (a) : : "fr28", "fr31", "r30", "r31");
234 void b_cf (void)
236 char a[33000];
237 TRASH_SOME_CR;
238 TRASH_SOME_FPR;
239 USE_SOME_CR;
240 USE_SOME_FPR;
241 __asm __volatile ("#%0" : "=m" (a) : : "cr2", "fr28", "fr31");
244 void b_f (void)
246 char a[33000];
247 TRASH_SOME_FPR;
248 USE_SOME_FPR;
249 __asm __volatile ("#%0" : "=m" (a) : : "fr28", "fr31");
251 #endif
253 void b_cr (void)
255 char a[33000];
256 TRASH_SOME_CR;
257 TRASH_SOME_GPR;
258 USE_SOME_CR;
259 USE_SOME_GPR;
260 __asm __volatile ("#%0" : "=m" (a) : : "cr2", "r30", "r31");
263 void b_r (void)
265 char a[33000];
266 TRASH_SOME_GPR;
267 USE_SOME_GPR;
268 __asm __volatile ("#%0" : "=m" (a) : : "r30", "r31");
271 void b_c (void)
273 char a[33000];
274 TRASH_SOME_CR;
275 USE_SOME_CR;
276 __asm __volatile ("#%0" : "=m" (a) : : "cr2");
279 void b_0 (void)
281 char a[33000];
282 __asm __volatile ("#%0" : "=m" (a) );
285 #ifdef __ALTIVEC__
286 #ifndef __NO_FPRS__
287 void s_all (void)
289 char a[33];
290 TRASH_ALL_CR;
291 TRASH_ALL_VR;
292 TRASH_ALL_FPR;
293 TRASH_ALL_GPR;
294 USE_ALL_CR;
295 USE_ALL_VR;
296 USE_ALL_FPR;
297 USE_ALL_GPR;
298 __asm __volatile ("#%0" : "=m" (a) : : "cr2", "cr3", "cr4", "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31", "fr14", "fr15", "fr16", "fr17", "fr18", "fr19", "fr20", "fr21", "fr22", "fr23", "fr24", "fr25", "fr26", "fr27", "fr28", "fr29", "fr30", "fr31", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31");
301 void s_cvfr (void)
303 char a[33];
304 TRASH_SOME_CR;
305 TRASH_SOME_VR;
306 TRASH_SOME_FPR;
307 TRASH_SOME_GPR;
308 USE_SOME_CR;
309 USE_SOME_VR;
310 USE_SOME_FPR;
311 USE_SOME_GPR;
312 __asm __volatile ("#%0" : "=m" (a) : : "cr2", "v26", "v27", "v31", "fr28", "fr31", "r30", "r31");
315 void s_vfr (void)
317 char a[33];
318 TRASH_SOME_VR;
319 TRASH_SOME_FPR;
320 TRASH_SOME_GPR;
321 USE_SOME_VR;
322 USE_SOME_FPR;
323 USE_SOME_GPR;
324 __asm __volatile ("#%0" : "=m" (a) : : "v26", "v27", "v31", "fr28", "fr31", "r30", "r31");
327 void s_cvf (void)
329 char a[33];
330 TRASH_SOME_CR;
331 TRASH_SOME_VR;
332 TRASH_SOME_FPR;
333 USE_SOME_CR;
334 USE_SOME_VR;
335 USE_SOME_FPR;
336 __asm __volatile ("#%0" : "=m" (a) : : "cr2", "v26", "v27", "v31", "fr28", "fr31");
339 void s_vf (void)
341 char a[33];
342 TRASH_SOME_VR;
343 TRASH_SOME_FPR;
344 USE_SOME_VR;
345 USE_SOME_FPR;
346 __asm __volatile ("#%0" : "=m" (a) : : "v26", "v27", "v31", "fr28", "fr31");
348 #endif
350 void s_cvr (void)
352 char a[33];
353 TRASH_SOME_CR;
354 TRASH_SOME_VR;
355 TRASH_SOME_GPR;
356 USE_SOME_CR;
357 USE_SOME_VR;
358 USE_SOME_GPR;
359 __asm __volatile ("#%0" : "=m" (a) : : "cr2", "v26", "v27", "v31", "r30", "r31");
362 void s_vr (void)
364 char a[33];
365 TRASH_SOME_VR;
366 TRASH_SOME_GPR;
367 USE_SOME_VR;
368 USE_SOME_GPR;
369 __asm __volatile ("#%0" : "=m" (a) : : "v26", "v27", "v31", "r30", "r31");
372 void s_cv (void)
374 char a[33];
375 TRASH_SOME_CR;
376 TRASH_SOME_VR;
377 USE_SOME_CR;
378 USE_SOME_VR;
379 __asm __volatile ("#%0" : "=m" (a) : : "cr2", "v26", "v27", "v31");
382 void s_v (void)
384 char a[33];
385 TRASH_SOME_VR;
386 USE_SOME_VR;
387 __asm __volatile ("#%0" : "=m" (a) : : "v26", "v27", "v31");
389 #endif
391 #ifndef __NO_FPRS__
392 void s_cfr (void)
394 char a[33];
395 TRASH_SOME_CR;
396 TRASH_SOME_FPR;
397 TRASH_SOME_GPR;
398 USE_SOME_CR;
399 USE_SOME_FPR;
400 USE_SOME_GPR;
401 __asm __volatile ("#%0" : "=m" (a) : : "cr2", "fr28", "fr31", "r30", "r31");
404 void s_fr (void)
406 char a[33];
407 TRASH_SOME_FPR;
408 TRASH_SOME_GPR;
409 USE_SOME_FPR;
410 USE_SOME_GPR;
411 __asm __volatile ("#%0" : "=m" (a) : : "fr28", "fr31", "r30", "r31");
414 void s_cf (void)
416 char a[33];
417 TRASH_SOME_CR;
418 TRASH_SOME_FPR;
419 USE_SOME_CR;
420 USE_SOME_FPR;
421 __asm __volatile ("#%0" : "=m" (a) : : "cr2", "fr28", "fr31");
424 void s_f (void)
426 char a[33];
427 TRASH_SOME_FPR;
428 USE_SOME_FPR;
429 __asm __volatile ("#%0" : "=m" (a) : : "fr28", "fr31");
431 #endif
433 void s_cr (void)
435 char a[33];
436 TRASH_SOME_CR;
437 TRASH_SOME_GPR;
438 USE_SOME_CR;
439 USE_SOME_GPR;
440 __asm __volatile ("#%0" : "=m" (a) : : "cr2", "r30", "r31");
443 void s_r (void)
445 char a[33];
446 TRASH_SOME_GPR;
447 USE_SOME_GPR;
448 __asm __volatile ("#%0" : "=m" (a) : : "r30", "r31");
451 void s_r31 (void)
453 char a[33];
454 #ifndef NO_BODY
455 TRASH_GPR (r31);
456 __asm__ __volatile__ ("#%0" : : "r" (r31));
457 #endif
458 __asm __volatile ("#%0" : "=m" (a) : : "r31");
461 void s_c (void)
463 char a[33];
464 TRASH_SOME_CR;
465 USE_SOME_CR;
466 __asm __volatile ("#%0" : "=m" (a) : : "cr2");
469 void s_0 (void)
471 char a[33];
472 __asm __volatile ("#%0" : "=m" (a) );
475 #ifdef __ALTIVEC__
476 #ifndef __NO_FPRS__
477 void wb_all (void)
479 char b[10];
480 char *nb_all (void)
482 char a[33000];
483 TRASH_ALL_CR;
484 TRASH_ALL_VR;
485 TRASH_ALL_FPR;
486 TRASH_ALL_GPR;
487 USE_ALL_CR;
488 USE_ALL_VR;
489 USE_ALL_FPR;
490 USE_ALL_GPR;
491 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "cr3", "cr4", "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31", "fr14", "fr15", "fr16", "fr17", "fr18", "fr19", "fr20", "fr21", "fr22", "fr23", "fr24", "fr25", "fr26", "fr27", "fr28", "fr29", "fr30", "fr31", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31");
492 return b;
494 if (nb_all() != b)
495 abort ();
498 void wb_cvfr (void)
500 char b[10];
501 char *nb_cvfr (void)
503 char a[33000];
504 TRASH_SOME_CR;
505 TRASH_SOME_VR;
506 TRASH_SOME_FPR;
507 TRASH_SOME_GPR;
508 USE_SOME_CR;
509 USE_SOME_VR;
510 USE_SOME_FPR;
511 USE_SOME_GPR;
512 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "v26", "v27", "v31", "fr28", "fr31", "r30", "r31");
513 return b;
515 if (nb_cvfr () != b)
516 abort ();
519 void wb_vfr (void)
521 char b[10];
522 char *nb_vfr (void)
524 char a[33000];
525 TRASH_SOME_VR;
526 TRASH_SOME_FPR;
527 TRASH_SOME_GPR;
528 USE_SOME_VR;
529 USE_SOME_FPR;
530 USE_SOME_GPR;
531 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "v26", "v27", "v31", "fr28", "fr31", "r30", "r31");
532 return b;
534 if (nb_vfr () != b)
535 abort ();
538 void wb_cvf (void)
540 char b[10];
541 char *nb_cvf (void)
543 char a[33000];
544 TRASH_SOME_CR;
545 TRASH_SOME_VR;
546 TRASH_SOME_FPR;
547 USE_SOME_CR;
548 USE_SOME_VR;
549 USE_SOME_FPR;
550 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "v26", "v27", "v31", "fr28", "fr31");
551 return b;
553 if (nb_cvf () != b)
554 abort ();
557 void wb_vf (void)
559 char b[10];
560 char *nb_vf (void)
562 char a[33000];
563 TRASH_SOME_VR;
564 TRASH_SOME_FPR;
565 USE_SOME_VR;
566 USE_SOME_FPR;
567 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "v26", "v27", "v31", "fr28", "fr31");
568 return b;
570 if (nb_vf () != b)
571 abort ();
573 #endif
575 void wb_cvr (void)
577 char b[10];
578 char *nb_cvr (void)
580 char a[33000];
581 TRASH_SOME_CR;
582 TRASH_SOME_VR;
583 TRASH_SOME_GPR;
584 USE_SOME_CR;
585 USE_SOME_VR;
586 USE_SOME_GPR;
587 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "v26", "v27", "v31", "r30", "r31");
588 return b;
590 if (nb_cvr () != b)
591 abort ();
594 void wb_vr (void)
596 char b[10];
597 char *nb_vr (void)
599 char a[33000];
600 TRASH_SOME_VR;
601 TRASH_SOME_GPR;
602 USE_SOME_VR;
603 USE_SOME_GPR;
604 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "v26", "v27", "v31", "r30", "r31");
605 return b;
607 if (nb_vr () != b)
608 abort ();
611 void wb_cv (void)
613 char b[10];
614 char *nb_cv (void)
616 char a[33000];
617 TRASH_SOME_CR;
618 TRASH_SOME_VR;
619 USE_SOME_CR;
620 USE_SOME_VR;
621 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "v26", "v27", "v31");
622 return b;
624 if (nb_cv () != b)
625 abort ();
628 void wb_v (void)
630 char b[10];
631 char *nb_v (void)
633 char a[33000];
634 TRASH_SOME_VR;
635 USE_SOME_VR;
636 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "v26", "v27", "v31");
637 return b;
639 if (nb_v () != b)
640 abort ();
642 #endif
644 #ifndef __NO_FPRS__
645 void wb_cfr (void)
647 char b[10];
648 char *nb_cfr (void)
650 char a[33000];
651 TRASH_SOME_CR;
652 TRASH_SOME_FPR;
653 TRASH_SOME_GPR;
654 USE_SOME_CR;
655 USE_SOME_FPR;
656 USE_SOME_GPR;
657 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "fr28", "fr31", "r30", "r31");
658 return b;
660 if (nb_cfr () != b)
661 abort ();
664 void wb_fr (void)
666 char b[10];
667 char *nb_fr (void)
669 char a[33000];
670 TRASH_SOME_FPR;
671 TRASH_SOME_GPR;
672 USE_SOME_FPR;
673 USE_SOME_GPR;
674 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "fr28", "fr31", "r30", "r31");
675 return b;
677 if (nb_fr () != b)
678 abort ();
681 void wb_cf (void)
683 char b[10];
684 char *nb_cf (void)
686 char a[33000];
687 TRASH_SOME_CR;
688 TRASH_SOME_FPR;
689 USE_SOME_CR;
690 USE_SOME_FPR;
691 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "fr28", "fr31");
692 return b;
694 if (nb_cf () != b)
695 abort ();
698 void wb_f (void)
700 char b[10];
701 char *nb_f (void)
703 char a[33000];
704 TRASH_SOME_FPR;
705 USE_SOME_FPR;
706 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "fr28", "fr31");
707 return b;
709 if (nb_f () != b)
710 abort ();
712 #endif
714 void wb_cr (void)
716 char b[10];
717 char *nb_cr (void)
719 char a[33000];
720 TRASH_SOME_CR;
721 TRASH_SOME_GPR;
722 USE_SOME_CR;
723 USE_SOME_GPR;
724 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "r30", "r31");
725 return b;
727 if (nb_cr () != b)
728 abort ();
731 void wb_r (void)
733 char b[10];
734 char *nb_r (void)
736 char a[33000];
737 TRASH_SOME_GPR;
738 USE_SOME_GPR;
739 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "r30", "r31");
740 return b;
742 if (nb_r () != b)
743 abort ();
746 void wb_c (void)
748 char b[10];
749 char *nb_c (void)
751 char a[33000];
752 TRASH_SOME_CR;
753 USE_SOME_CR;
754 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2");
755 return b;
757 if (nb_c () != b)
758 abort ();
761 void wb_0 (void)
763 char b[10];
764 char *nb_0 (void)
766 char a[33000];
767 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) );
768 return b;
770 if (nb_0 () != b)
771 abort ();
774 #ifdef __ALTIVEC__
775 #ifndef __NO_FPRS__
776 void ws_all (void)
778 char b[10];
779 char *ns_all (void)
781 char a[33];
782 TRASH_ALL_CR;
783 TRASH_ALL_VR;
784 TRASH_ALL_FPR;
785 TRASH_ALL_GPR;
786 USE_ALL_CR;
787 USE_ALL_VR;
788 USE_ALL_FPR;
789 USE_ALL_GPR;
790 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "cr3", "cr4", "v20", "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31", "fr14", "fr15", "fr16", "fr17", "fr18", "fr19", "fr20", "fr21", "fr22", "fr23", "fr24", "fr25", "fr26", "fr27", "fr28", "fr29", "fr30", "fr31", "r14", "r15", "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31");
791 return b;
793 if (ns_all() != b)
794 abort ();
797 void ws_cvfr (void)
799 char b[10];
800 char *ns_cvfr (void)
802 char a[33];
803 TRASH_SOME_CR;
804 TRASH_SOME_VR;
805 TRASH_SOME_FPR;
806 TRASH_SOME_GPR;
807 USE_SOME_CR;
808 USE_SOME_VR;
809 USE_SOME_FPR;
810 USE_SOME_GPR;
811 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "v26", "v27", "v31", "fr28", "fr31", "r30", "r31");
812 return b;
814 if (ns_cvfr () != b)
815 abort ();
818 void ws_vfr (void)
820 char b[10];
821 char *ns_vfr (void)
823 char a[33];
824 TRASH_SOME_VR;
825 TRASH_SOME_FPR;
826 TRASH_SOME_GPR;
827 USE_SOME_VR;
828 USE_SOME_FPR;
829 USE_SOME_GPR;
830 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "v26", "v27", "v31", "fr28", "fr31", "r30", "r31");
831 return b;
833 if (ns_vfr () != b)
834 abort ();
837 void ws_cvf (void)
839 char b[10];
840 char *ns_cvf (void)
842 char a[33];
843 TRASH_SOME_CR;
844 TRASH_SOME_VR;
845 TRASH_SOME_FPR;
846 USE_SOME_CR;
847 USE_SOME_VR;
848 USE_SOME_FPR;
849 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "v26", "v27", "v31", "fr28", "fr31");
850 return b;
852 if (ns_cvf () != b)
853 abort ();
856 void ws_vf (void)
858 char b[10];
859 char *ns_vf (void)
861 char a[33];
862 TRASH_SOME_VR;
863 TRASH_SOME_FPR;
864 USE_SOME_VR;
865 USE_SOME_FPR;
866 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "v26", "v27", "v31", "fr28", "fr31");
867 return b;
869 if (ns_vf () != b)
870 abort ();
872 #endif
874 void ws_cvr (void)
876 char b[10];
877 char *ns_cvr (void)
879 char a[33];
880 TRASH_SOME_CR;
881 TRASH_SOME_VR;
882 TRASH_SOME_GPR;
883 USE_SOME_CR;
884 USE_SOME_VR;
885 USE_SOME_GPR;
886 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "v26", "v27", "v31", "r30", "r31");
887 return b;
889 if (ns_cvr () != b)
890 abort ();
893 void ws_vr (void)
895 char b[10];
896 char *ns_vr (void)
898 char a[33];
899 TRASH_SOME_VR;
900 TRASH_SOME_FPR;
901 USE_SOME_VR;
902 USE_SOME_FPR;
903 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "v26", "v27", "v31", "r30", "r31");
904 return b;
906 if (ns_vr () != b)
907 abort ();
910 void ws_cv (void)
912 char b[10];
913 char *ns_cv (void)
915 char a[33];
916 TRASH_SOME_CR;
917 TRASH_SOME_VR;
918 USE_SOME_CR;
919 USE_SOME_VR;
920 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "v26", "v27", "v31");
921 return b;
923 if (ns_cv () != b)
924 abort ();
927 void ws_v (void)
929 char b[10];
930 char *ns_v (void)
932 char a[33];
933 TRASH_SOME_VR;
934 USE_SOME_VR;
935 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "v26", "v27", "v31");
936 return b;
938 if (ns_v () != b)
939 abort ();
941 #endif
943 #ifndef __NO_FPRS__
944 void ws_cfr (void)
946 char b[10];
947 char *ns_cfr (void)
949 char a[33];
950 TRASH_SOME_CR;
951 TRASH_SOME_FPR;
952 TRASH_SOME_GPR;
953 USE_SOME_CR;
954 USE_SOME_FPR;
955 USE_SOME_GPR;
956 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "fr28", "fr31", "r30", "r31");
957 return b;
959 if (ns_cfr () != b)
960 abort ();
963 void ws_fr (void)
965 char b[10];
966 char *ns_fr (void)
968 char a[33];
969 TRASH_SOME_FPR;
970 TRASH_SOME_GPR;
971 USE_SOME_FPR;
972 USE_SOME_GPR;
973 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "fr28", "fr31", "r30", "r31");
974 return b;
976 if (ns_fr () != b)
977 abort ();
980 void ws_cf (void)
982 char b[10];
983 char *ns_cf (void)
985 char a[33];
986 TRASH_SOME_CR;
987 TRASH_SOME_FPR;
988 USE_SOME_CR;
989 USE_SOME_FPR;
990 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "fr28", "fr31");
991 return b;
993 if (ns_cf () != b)
994 abort ();
997 void ws_f (void)
999 char b[10];
1000 char *ns_f (void)
1002 char a[33];
1003 TRASH_SOME_FPR;
1004 USE_SOME_FPR;
1005 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "fr28", "fr31");
1006 return b;
1008 if (ns_f () != b)
1009 abort ();
1011 #endif
1013 void ws_cr (void)
1015 char b[10];
1016 char *ns_cr (void)
1018 char a[33];
1019 TRASH_SOME_CR;
1020 TRASH_SOME_GPR;
1021 USE_SOME_CR;
1022 USE_SOME_GPR;
1023 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "r30", "r31");
1024 return b;
1026 if (ns_cr () != b)
1027 abort ();
1030 void ws_r (void)
1032 char b[10];
1033 char *ns_r (void)
1035 char a[33];
1036 TRASH_SOME_GPR;
1037 USE_SOME_GPR;
1038 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "r30", "r31");
1039 return b;
1041 if (ns_r () != b)
1042 abort ();
1045 void ws_c (void)
1047 char b[10];
1048 char *ns_c (void)
1050 char a[33];
1051 TRASH_SOME_CR;
1052 USE_SOME_CR;
1053 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2");
1054 return b;
1056 if (ns_c () != b)
1057 abort ();
1060 void ws_0 (void)
1062 char b[10];
1063 char *ns_0 (void)
1065 char a[33];
1066 __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) );
1067 return b;
1069 if (ns_0 () != b)
1070 abort ();
1073 /* We'd like to compile main with
1074 __attribute__ ((__optimize__ ("fixed-cr2,fixed-cr3,fixed-cr4")))
1075 but that doesn't do anything currently. Obviously we don't want to
1076 compile the whole file with -ffixed-cr2 -ffixed-cr3 -ffixed-cr4 as
1077 that would also tell gcc not to save/restore cr, and we're trying
1078 to check that the above functions do save/restore cr.
1079 __attribute__ ((__optimize__ ("no-rename-registers,omit-frame-pointer")))
1080 works, but it seems odd to need omit-frame-pointer and raises the
1081 question of whether darwin would need -mdynamic-no-pic.
1082 So for now use -fno-rename-registers over the whole test. */
1084 main (void)
1086 INIT_REGS;
1087 USE_ALL_CR;
1088 #ifdef __ALTIVEC__
1089 USE_ALL_VR;
1090 #ifndef __NO_FPRS__
1091 USE_ALL_FPR;
1092 #endif
1093 #endif
1094 USE_ALL_GPR;
1095 #ifdef __ALTIVEC__
1096 #ifndef __NO_FPRS__
1097 b_all ();
1098 VERIFY_REGS;
1099 b_cvfr ();
1100 VERIFY_REGS;
1101 b_vfr ();
1102 VERIFY_REGS;
1103 b_cvf ();
1104 VERIFY_REGS;
1105 b_vf ();
1106 VERIFY_REGS;
1107 #endif
1108 b_cvr ();
1109 VERIFY_REGS;
1110 b_vr ();
1111 VERIFY_REGS;
1112 b_cv ();
1113 VERIFY_REGS;
1114 b_v ();
1115 VERIFY_REGS;
1116 #endif
1117 #ifndef __NO_FPRS__
1118 b_cfr ();
1119 VERIFY_REGS;
1120 b_fr ();
1121 VERIFY_REGS;
1122 b_cf ();
1123 VERIFY_REGS;
1124 b_f ();
1125 VERIFY_REGS;
1126 #endif
1127 b_cr ();
1128 VERIFY_REGS;
1129 b_r ();
1130 VERIFY_REGS;
1131 b_c ();
1132 VERIFY_REGS;
1133 b_0 ();
1134 VERIFY_REGS;
1135 #ifdef __ALTIVEC__
1136 #ifndef __NO_FPRS__
1137 s_all ();
1138 VERIFY_REGS;
1139 s_cvfr ();
1140 VERIFY_REGS;
1141 s_vfr ();
1142 VERIFY_REGS;
1143 s_cvf ();
1144 VERIFY_REGS;
1145 s_vf ();
1146 VERIFY_REGS;
1147 #endif
1148 s_cvr ();
1149 VERIFY_REGS;
1150 s_vr ();
1151 VERIFY_REGS;
1152 s_cv ();
1153 VERIFY_REGS;
1154 s_v ();
1155 VERIFY_REGS;
1156 #endif
1157 #ifndef __NO_FPRS__
1158 s_cfr ();
1159 VERIFY_REGS;
1160 s_fr ();
1161 VERIFY_REGS;
1162 s_cf ();
1163 VERIFY_REGS;
1164 s_f ();
1165 VERIFY_REGS;
1166 #endif
1167 s_cr ();
1168 VERIFY_REGS;
1169 s_r ();
1170 VERIFY_REGS;
1171 s_r31 ();
1172 VERIFY_REGS;
1173 s_c ();
1174 VERIFY_REGS;
1175 s_0 ();
1176 VERIFY_REGS;
1177 #ifdef __ALTIVEC__
1178 #ifndef __NO_FPRS__
1179 wb_all ();
1180 VERIFY_REGS;
1181 wb_cvfr ();
1182 VERIFY_REGS;
1183 wb_vfr ();
1184 VERIFY_REGS;
1185 wb_cvf ();
1186 VERIFY_REGS;
1187 wb_vf ();
1188 VERIFY_REGS;
1189 #endif
1190 wb_cvr ();
1191 VERIFY_REGS;
1192 wb_vr ();
1193 VERIFY_REGS;
1194 wb_cv ();
1195 VERIFY_REGS;
1196 wb_v ();
1197 VERIFY_REGS;
1198 #endif
1199 #ifndef __NO_FPRS__
1200 wb_cfr ();
1201 VERIFY_REGS;
1202 wb_fr ();
1203 VERIFY_REGS;
1204 wb_cf ();
1205 VERIFY_REGS;
1206 wb_f ();
1207 VERIFY_REGS;
1208 #endif
1209 wb_cr ();
1210 VERIFY_REGS;
1211 wb_r ();
1212 VERIFY_REGS;
1213 wb_c ();
1214 VERIFY_REGS;
1215 wb_0 ();
1216 VERIFY_REGS;
1217 #ifdef __ALTIVEC__
1218 #ifndef __NO_FPRS__
1219 ws_all ();
1220 VERIFY_REGS;
1221 ws_cvfr ();
1222 VERIFY_REGS;
1223 ws_vfr ();
1224 VERIFY_REGS;
1225 ws_cvf ();
1226 VERIFY_REGS;
1227 ws_vf ();
1228 VERIFY_REGS;
1229 #endif
1230 ws_cvr ();
1231 VERIFY_REGS;
1232 ws_vr ();
1233 VERIFY_REGS;
1234 ws_cv ();
1235 VERIFY_REGS;
1236 ws_v ();
1237 VERIFY_REGS;
1238 #endif
1239 #ifndef __NO_FPRS__
1240 ws_cfr ();
1241 VERIFY_REGS;
1242 ws_fr ();
1243 VERIFY_REGS;
1244 ws_cf ();
1245 VERIFY_REGS;
1246 ws_f ();
1247 VERIFY_REGS;
1248 #endif
1249 ws_cr ();
1250 VERIFY_REGS;
1251 ws_r ();
1252 VERIFY_REGS;
1253 ws_c ();
1254 VERIFY_REGS;
1255 ws_0 ();
1256 VERIFY_REGS;
1257 return 0;