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. */
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
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))
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))
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)
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
63 #define INIT_REGS INIT_FPR; INIT_GPR; INIT_CR
65 #define INIT_REGS INIT_GPR; INIT_CR
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 (); })
73 #define VERIFY_REGS VERIFY_VR; VERIFY_FPR; VERIFY_GPR; VERIFY_CR
76 #define VERIFY_REGS VERIFY_FPR; VERIFY_GPR; VERIFY_CR
78 #define VERIFY_REGS VERIFY_GPR; VERIFY_CR
83 /* For looking at prologue and epilogue code without distractions. */
95 #define TRASH_SOME_FPR
96 #define TRASH_SOME_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");
132 __asm
__volatile ("#%0" : "=m" (a
) : : "cr2", "v26", "v27", "v31", "fr28", "fr31", "r30", "r31");
144 __asm
__volatile ("#%0" : "=m" (a
) : : "v26", "v27", "v31", "fr28", "fr31", "r30", "r31");
156 __asm
__volatile ("#%0" : "=m" (a
) : : "cr2", "v26", "v27", "v31", "fr28", "fr31");
166 __asm
__volatile ("#%0" : "=m" (a
) : : "v26", "v27", "v31", "fr28", "fr31");
179 __asm
__volatile ("#%0" : "=m" (a
) : : "cr2", "v26", "v27", "v31", "r30", "r31");
189 __asm
__volatile ("#%0" : "=m" (a
) : : "v26", "v27", "v31", "r30", "r31");
199 __asm
__volatile ("#%0" : "=m" (a
) : : "cr2", "v26", "v27", "v31");
207 __asm
__volatile ("#%0" : "=m" (a
) : : "v26", "v27", "v31");
221 __asm
__volatile ("#%0" : "=m" (a
) : : "cr2", "fr28", "fr31", "r30", "r31");
231 __asm
__volatile ("#%0" : "=m" (a
) : : "fr28", "fr31", "r30", "r31");
241 __asm
__volatile ("#%0" : "=m" (a
) : : "cr2", "fr28", "fr31");
249 __asm
__volatile ("#%0" : "=m" (a
) : : "fr28", "fr31");
260 __asm
__volatile ("#%0" : "=m" (a
) : : "cr2", "r30", "r31");
268 __asm
__volatile ("#%0" : "=m" (a
) : : "r30", "r31");
276 __asm
__volatile ("#%0" : "=m" (a
) : : "cr2");
282 __asm
__volatile ("#%0" : "=m" (a
) );
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");
312 __asm
__volatile ("#%0" : "=m" (a
) : : "cr2", "v26", "v27", "v31", "fr28", "fr31", "r30", "r31");
324 __asm
__volatile ("#%0" : "=m" (a
) : : "v26", "v27", "v31", "fr28", "fr31", "r30", "r31");
336 __asm
__volatile ("#%0" : "=m" (a
) : : "cr2", "v26", "v27", "v31", "fr28", "fr31");
346 __asm
__volatile ("#%0" : "=m" (a
) : : "v26", "v27", "v31", "fr28", "fr31");
359 __asm
__volatile ("#%0" : "=m" (a
) : : "cr2", "v26", "v27", "v31", "r30", "r31");
369 __asm
__volatile ("#%0" : "=m" (a
) : : "v26", "v27", "v31", "r30", "r31");
379 __asm
__volatile ("#%0" : "=m" (a
) : : "cr2", "v26", "v27", "v31");
387 __asm
__volatile ("#%0" : "=m" (a
) : : "v26", "v27", "v31");
401 __asm
__volatile ("#%0" : "=m" (a
) : : "cr2", "fr28", "fr31", "r30", "r31");
411 __asm
__volatile ("#%0" : "=m" (a
) : : "fr28", "fr31", "r30", "r31");
421 __asm
__volatile ("#%0" : "=m" (a
) : : "cr2", "fr28", "fr31");
429 __asm
__volatile ("#%0" : "=m" (a
) : : "fr28", "fr31");
440 __asm
__volatile ("#%0" : "=m" (a
) : : "cr2", "r30", "r31");
448 __asm
__volatile ("#%0" : "=m" (a
) : : "r30", "r31");
456 __asm__
__volatile__ ("#%0" : : "r" (r31
));
458 __asm
__volatile ("#%0" : "=m" (a
) : : "r31");
466 __asm
__volatile ("#%0" : "=m" (a
) : : "cr2");
472 __asm
__volatile ("#%0" : "=m" (a
) );
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");
512 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "cr2", "v26", "v27", "v31", "fr28", "fr31", "r30", "r31");
531 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "v26", "v27", "v31", "fr28", "fr31", "r30", "r31");
550 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "cr2", "v26", "v27", "v31", "fr28", "fr31");
567 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "v26", "v27", "v31", "fr28", "fr31");
587 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "cr2", "v26", "v27", "v31", "r30", "r31");
604 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "v26", "v27", "v31", "r30", "r31");
621 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "cr2", "v26", "v27", "v31");
636 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "v26", "v27", "v31");
657 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "cr2", "fr28", "fr31", "r30", "r31");
674 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "fr28", "fr31", "r30", "r31");
691 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "cr2", "fr28", "fr31");
706 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "fr28", "fr31");
724 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "cr2", "r30", "r31");
739 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "r30", "r31");
754 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "cr2");
767 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) );
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");
811 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "cr2", "v26", "v27", "v31", "fr28", "fr31", "r30", "r31");
830 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "v26", "v27", "v31", "fr28", "fr31", "r30", "r31");
849 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "cr2", "v26", "v27", "v31", "fr28", "fr31");
866 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "v26", "v27", "v31", "fr28", "fr31");
886 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "cr2", "v26", "v27", "v31", "r30", "r31");
903 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "v26", "v27", "v31", "r30", "r31");
920 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "cr2", "v26", "v27", "v31");
935 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "v26", "v27", "v31");
956 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "cr2", "fr28", "fr31", "r30", "r31");
973 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "fr28", "fr31", "r30", "r31");
990 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "cr2", "fr28", "fr31");
1005 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "fr28", "fr31");
1023 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "cr2", "r30", "r31");
1038 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "r30", "r31");
1053 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) : : "cr2");
1066 __asm
__volatile ("#%0 %1" : "=m" (a
), "=m" (b
) );
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. */