/* { dg-do run } */ /* { dg-options "-fno-inline -fomit-frame-pointer -fno-rename-registers" } */ /* { dg-additional-options "-mdynamic-no-pic" { target *-*-darwin* } } */ /* -fno-inline -maltivec -m32/-m64 -mmultiple/no-multiple -Os/-O2. */ #ifndef NO_BODY #define abort() __builtin_abort () #define vec_all_eq(v1,v2) __builtin_vec_vcmpeq_p (2, v1, v2) #define SET(T,R,V) register T R __asm__ (#R) = V #define SET_GPR(R,V) SET (long, R, V) #define SET_FPR(R,V) SET (double, R, V) #define SET_VR(R,V) SET (__attribute__ ((vector_size (16))) int, R, V) /* There doesn't seem to be a way of letting gcc know that cr2, cr3 and cr4 are being used, and therefore should not be touched by gcc. Unlike gpr, fpr and vr we can't do something like register __attribute__ ((__mode__ ("__CC__"))) int cr2 __asm__ ("cr2"); This makes the test somewhat fragile, dependent on gcc not using any of cr2, cr3 and cr4 in main(), and is why -fno-rename-registers is required. */ #define SET_CR(R,V) __asm__ __volatile__ ("mtcrf %0,%1" : : "n" (1<<(7-R)), "r" (V<<(4*(7-R))) : "cr" #R) #define TRASH_GPR(R) SET_GPR (R, 0) #define TRASH_FPR(R) SET_FPR (R, 0) #define TRASH_VR(R) SET_VR (R, val0) #define TRASH_CR(R) SET_CR (R, 0) #define TRASH_SOME_GPR TRASH_GPR (r30); TRASH_GPR (r31) #define TRASH_SOME_FPR TRASH_FPR (fr28); TRASH_FPR (fr31) #define TRASH_SOME_VR TRASH_VR (v26); TRASH_VR (v27); TRASH_VR (v31) #define TRASH_SOME_CR TRASH_CR (2) #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) #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) #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) #define TRASH_ALL_CR TRASH_CR (2); TRASH_CR (3); TRASH_CR (4) #define USE_SOME_GPR __asm__ __volatile__ ("#%0 %1" : : "r" (r30), "r" (r31)) #define USE_SOME_FPR __asm__ __volatile__ ("#%0 %1" : : "f" (fr28), "f" (fr31)) #define USE_SOME_VR __asm__ __volatile__ ("#%0 %1 %2" : : "v" (v26), "v" (v27), "v" (v31)) #define USE_SOME_CR #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)) #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)) #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)) #define USE_ALL_CR #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) #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) #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) #define INIT_CR SET_CR (2, 6); SET_CR (3, 7); SET_CR (4, 8) #ifdef __ALTIVEC__ __attribute__ ((vector_size (16))) int val0 = {0,0,0,0}; __attribute__ ((vector_size (16))) int val20 = {-201,-202,-203,-204}; __attribute__ ((vector_size (16))) int val21 = {-211,-212,-213,-214}; __attribute__ ((vector_size (16))) int val22 = {-221,-222,-223,-224}; __attribute__ ((vector_size (16))) int val23 = {-231,-232,-233,-234}; __attribute__ ((vector_size (16))) int val24 = {-241,-242,-243,-244}; __attribute__ ((vector_size (16))) int val25 = {-251,-252,-253,-254}; __attribute__ ((vector_size (16))) int val26 = {-261,-262,-263,-264}; __attribute__ ((vector_size (16))) int val27 = {-271,-272,-273,-274}; __attribute__ ((vector_size (16))) int val28 = {-281,-282,-283,-284}; __attribute__ ((vector_size (16))) int val29 = {-291,-292,-293,-294}; __attribute__ ((vector_size (16))) int val30 = {-301,-302,-303,-304}; __attribute__ ((vector_size (16))) int val31 = {-311,-312,-313,-314}; #define INIT_REGS INIT_VR; INIT_FPR; INIT_GPR; INIT_CR #else #ifndef __NO_FPRS__ #define INIT_REGS INIT_FPR; INIT_GPR; INIT_CR #else #define INIT_REGS INIT_GPR; INIT_CR #endif #endif #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 () #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 () #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 () #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 (); }) #ifdef __ALTIVEC__ #define VERIFY_REGS VERIFY_VR; VERIFY_FPR; VERIFY_GPR; VERIFY_CR #else #ifndef __NO_FPRS__ #define VERIFY_REGS VERIFY_FPR; VERIFY_GPR; VERIFY_CR #else #define VERIFY_REGS VERIFY_GPR; VERIFY_CR #endif #endif #else /* NO_BODY */ /* For looking at prologue and epilogue code without distractions. */ #define abort() #define TRASH_ALL_CR #define TRASH_ALL_VR #define TRASH_ALL_FPR #define TRASH_ALL_GPR #define USE_ALL_CR #define USE_ALL_VR #define USE_ALL_FPR #define USE_ALL_GPR #define TRASH_SOME_CR #define TRASH_SOME_VR #define TRASH_SOME_FPR #define TRASH_SOME_GPR #define USE_SOME_CR #define USE_SOME_VR #define USE_SOME_FPR #define USE_SOME_GPR #define INIT_REGS #define VERIFY_REGS #endif #ifdef __ALTIVEC__ #ifndef __NO_FPRS__ void b_all (void) { char a[33000]; TRASH_ALL_CR; TRASH_ALL_VR; TRASH_ALL_FPR; TRASH_ALL_GPR; USE_ALL_CR; USE_ALL_VR; USE_ALL_FPR; USE_ALL_GPR; __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"); } void b_cvfr (void) { char a[33000]; TRASH_SOME_CR; TRASH_SOME_VR; TRASH_SOME_FPR; TRASH_SOME_GPR; USE_SOME_CR; USE_SOME_VR; USE_SOME_FPR; USE_SOME_GPR; __asm __volatile ("#%0" : "=m" (a) : : "cr2", "v26", "v27", "v31", "fr28", "fr31", "r30", "r31"); } void b_vfr (void) { char a[33000]; TRASH_SOME_VR; TRASH_SOME_FPR; TRASH_SOME_GPR; USE_SOME_VR; USE_SOME_FPR; USE_SOME_GPR; __asm __volatile ("#%0" : "=m" (a) : : "v26", "v27", "v31", "fr28", "fr31", "r30", "r31"); } void b_cvf (void) { char a[33000]; TRASH_SOME_CR; TRASH_SOME_VR; TRASH_SOME_FPR; USE_SOME_CR; USE_SOME_VR; USE_SOME_FPR; __asm __volatile ("#%0" : "=m" (a) : : "cr2", "v26", "v27", "v31", "fr28", "fr31"); } void b_vf (void) { char a[33000]; TRASH_SOME_VR; TRASH_SOME_FPR; USE_SOME_VR; USE_SOME_FPR; __asm __volatile ("#%0" : "=m" (a) : : "v26", "v27", "v31", "fr28", "fr31"); } #endif void b_cvr (void) { char a[33000]; TRASH_SOME_CR; TRASH_SOME_VR; TRASH_SOME_GPR; USE_SOME_CR; USE_SOME_VR; USE_SOME_GPR; __asm __volatile ("#%0" : "=m" (a) : : "cr2", "v26", "v27", "v31", "r30", "r31"); } void b_vr (void) { char a[33000]; TRASH_SOME_VR; TRASH_SOME_GPR; USE_SOME_VR; USE_SOME_GPR; __asm __volatile ("#%0" : "=m" (a) : : "v26", "v27", "v31", "r30", "r31"); } void b_cv (void) { char a[33000]; TRASH_SOME_CR; TRASH_SOME_VR; USE_SOME_CR; USE_SOME_VR; __asm __volatile ("#%0" : "=m" (a) : : "cr2", "v26", "v27", "v31"); } void b_v (void) { char a[33000]; TRASH_SOME_VR; USE_SOME_VR; __asm __volatile ("#%0" : "=m" (a) : : "v26", "v27", "v31"); } #endif #ifndef __NO_FPRS__ void b_cfr (void) { char a[33000]; TRASH_SOME_CR; TRASH_SOME_FPR; TRASH_SOME_GPR; USE_SOME_CR; USE_SOME_FPR; USE_SOME_GPR; __asm __volatile ("#%0" : "=m" (a) : : "cr2", "fr28", "fr31", "r30", "r31"); } void b_fr (void) { char a[33000]; TRASH_SOME_FPR; TRASH_SOME_GPR; USE_SOME_FPR; USE_SOME_GPR; __asm __volatile ("#%0" : "=m" (a) : : "fr28", "fr31", "r30", "r31"); } void b_cf (void) { char a[33000]; TRASH_SOME_CR; TRASH_SOME_FPR; USE_SOME_CR; USE_SOME_FPR; __asm __volatile ("#%0" : "=m" (a) : : "cr2", "fr28", "fr31"); } void b_f (void) { char a[33000]; TRASH_SOME_FPR; USE_SOME_FPR; __asm __volatile ("#%0" : "=m" (a) : : "fr28", "fr31"); } #endif void b_cr (void) { char a[33000]; TRASH_SOME_CR; TRASH_SOME_GPR; USE_SOME_CR; USE_SOME_GPR; __asm __volatile ("#%0" : "=m" (a) : : "cr2", "r30", "r31"); } void b_r (void) { char a[33000]; TRASH_SOME_GPR; USE_SOME_GPR; __asm __volatile ("#%0" : "=m" (a) : : "r30", "r31"); } void b_c (void) { char a[33000]; TRASH_SOME_CR; USE_SOME_CR; __asm __volatile ("#%0" : "=m" (a) : : "cr2"); } void b_0 (void) { char a[33000]; __asm __volatile ("#%0" : "=m" (a) ); } #ifdef __ALTIVEC__ #ifndef __NO_FPRS__ void s_all (void) { char a[33]; TRASH_ALL_CR; TRASH_ALL_VR; TRASH_ALL_FPR; TRASH_ALL_GPR; USE_ALL_CR; USE_ALL_VR; USE_ALL_FPR; USE_ALL_GPR; __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"); } void s_cvfr (void) { char a[33]; TRASH_SOME_CR; TRASH_SOME_VR; TRASH_SOME_FPR; TRASH_SOME_GPR; USE_SOME_CR; USE_SOME_VR; USE_SOME_FPR; USE_SOME_GPR; __asm __volatile ("#%0" : "=m" (a) : : "cr2", "v26", "v27", "v31", "fr28", "fr31", "r30", "r31"); } void s_vfr (void) { char a[33]; TRASH_SOME_VR; TRASH_SOME_FPR; TRASH_SOME_GPR; USE_SOME_VR; USE_SOME_FPR; USE_SOME_GPR; __asm __volatile ("#%0" : "=m" (a) : : "v26", "v27", "v31", "fr28", "fr31", "r30", "r31"); } void s_cvf (void) { char a[33]; TRASH_SOME_CR; TRASH_SOME_VR; TRASH_SOME_FPR; USE_SOME_CR; USE_SOME_VR; USE_SOME_FPR; __asm __volatile ("#%0" : "=m" (a) : : "cr2", "v26", "v27", "v31", "fr28", "fr31"); } void s_vf (void) { char a[33]; TRASH_SOME_VR; TRASH_SOME_FPR; USE_SOME_VR; USE_SOME_FPR; __asm __volatile ("#%0" : "=m" (a) : : "v26", "v27", "v31", "fr28", "fr31"); } #endif void s_cvr (void) { char a[33]; TRASH_SOME_CR; TRASH_SOME_VR; TRASH_SOME_GPR; USE_SOME_CR; USE_SOME_VR; USE_SOME_GPR; __asm __volatile ("#%0" : "=m" (a) : : "cr2", "v26", "v27", "v31", "r30", "r31"); } void s_vr (void) { char a[33]; TRASH_SOME_VR; TRASH_SOME_GPR; USE_SOME_VR; USE_SOME_GPR; __asm __volatile ("#%0" : "=m" (a) : : "v26", "v27", "v31", "r30", "r31"); } void s_cv (void) { char a[33]; TRASH_SOME_CR; TRASH_SOME_VR; USE_SOME_CR; USE_SOME_VR; __asm __volatile ("#%0" : "=m" (a) : : "cr2", "v26", "v27", "v31"); } void s_v (void) { char a[33]; TRASH_SOME_VR; USE_SOME_VR; __asm __volatile ("#%0" : "=m" (a) : : "v26", "v27", "v31"); } #endif #ifndef __NO_FPRS__ void s_cfr (void) { char a[33]; TRASH_SOME_CR; TRASH_SOME_FPR; TRASH_SOME_GPR; USE_SOME_CR; USE_SOME_FPR; USE_SOME_GPR; __asm __volatile ("#%0" : "=m" (a) : : "cr2", "fr28", "fr31", "r30", "r31"); } void s_fr (void) { char a[33]; TRASH_SOME_FPR; TRASH_SOME_GPR; USE_SOME_FPR; USE_SOME_GPR; __asm __volatile ("#%0" : "=m" (a) : : "fr28", "fr31", "r30", "r31"); } void s_cf (void) { char a[33]; TRASH_SOME_CR; TRASH_SOME_FPR; USE_SOME_CR; USE_SOME_FPR; __asm __volatile ("#%0" : "=m" (a) : : "cr2", "fr28", "fr31"); } void s_f (void) { char a[33]; TRASH_SOME_FPR; USE_SOME_FPR; __asm __volatile ("#%0" : "=m" (a) : : "fr28", "fr31"); } #endif void s_cr (void) { char a[33]; TRASH_SOME_CR; TRASH_SOME_GPR; USE_SOME_CR; USE_SOME_GPR; __asm __volatile ("#%0" : "=m" (a) : : "cr2", "r30", "r31"); } void s_r (void) { char a[33]; TRASH_SOME_GPR; USE_SOME_GPR; __asm __volatile ("#%0" : "=m" (a) : : "r30", "r31"); } void s_r31 (void) { char a[33]; #ifndef NO_BODY TRASH_GPR (r31); __asm__ __volatile__ ("#%0" : : "r" (r31)); #endif __asm __volatile ("#%0" : "=m" (a) : : "r31"); } void s_c (void) { char a[33]; TRASH_SOME_CR; USE_SOME_CR; __asm __volatile ("#%0" : "=m" (a) : : "cr2"); } void s_0 (void) { char a[33]; __asm __volatile ("#%0" : "=m" (a) ); } #ifdef __ALTIVEC__ #ifndef __NO_FPRS__ void wb_all (void) { char b[10]; char *nb_all (void) { char a[33000]; TRASH_ALL_CR; TRASH_ALL_VR; TRASH_ALL_FPR; TRASH_ALL_GPR; USE_ALL_CR; USE_ALL_VR; USE_ALL_FPR; USE_ALL_GPR; __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"); return b; } if (nb_all() != b) abort (); } void wb_cvfr (void) { char b[10]; char *nb_cvfr (void) { char a[33000]; TRASH_SOME_CR; TRASH_SOME_VR; TRASH_SOME_FPR; TRASH_SOME_GPR; USE_SOME_CR; USE_SOME_VR; USE_SOME_FPR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "v26", "v27", "v31", "fr28", "fr31", "r30", "r31"); return b; } if (nb_cvfr () != b) abort (); } void wb_vfr (void) { char b[10]; char *nb_vfr (void) { char a[33000]; TRASH_SOME_VR; TRASH_SOME_FPR; TRASH_SOME_GPR; USE_SOME_VR; USE_SOME_FPR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "v26", "v27", "v31", "fr28", "fr31", "r30", "r31"); return b; } if (nb_vfr () != b) abort (); } void wb_cvf (void) { char b[10]; char *nb_cvf (void) { char a[33000]; TRASH_SOME_CR; TRASH_SOME_VR; TRASH_SOME_FPR; USE_SOME_CR; USE_SOME_VR; USE_SOME_FPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "v26", "v27", "v31", "fr28", "fr31"); return b; } if (nb_cvf () != b) abort (); } void wb_vf (void) { char b[10]; char *nb_vf (void) { char a[33000]; TRASH_SOME_VR; TRASH_SOME_FPR; USE_SOME_VR; USE_SOME_FPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "v26", "v27", "v31", "fr28", "fr31"); return b; } if (nb_vf () != b) abort (); } #endif void wb_cvr (void) { char b[10]; char *nb_cvr (void) { char a[33000]; TRASH_SOME_CR; TRASH_SOME_VR; TRASH_SOME_GPR; USE_SOME_CR; USE_SOME_VR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "v26", "v27", "v31", "r30", "r31"); return b; } if (nb_cvr () != b) abort (); } void wb_vr (void) { char b[10]; char *nb_vr (void) { char a[33000]; TRASH_SOME_VR; TRASH_SOME_GPR; USE_SOME_VR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "v26", "v27", "v31", "r30", "r31"); return b; } if (nb_vr () != b) abort (); } void wb_cv (void) { char b[10]; char *nb_cv (void) { char a[33000]; TRASH_SOME_CR; TRASH_SOME_VR; USE_SOME_CR; USE_SOME_VR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "v26", "v27", "v31"); return b; } if (nb_cv () != b) abort (); } void wb_v (void) { char b[10]; char *nb_v (void) { char a[33000]; TRASH_SOME_VR; USE_SOME_VR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "v26", "v27", "v31"); return b; } if (nb_v () != b) abort (); } #endif #ifndef __NO_FPRS__ void wb_cfr (void) { char b[10]; char *nb_cfr (void) { char a[33000]; TRASH_SOME_CR; TRASH_SOME_FPR; TRASH_SOME_GPR; USE_SOME_CR; USE_SOME_FPR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "fr28", "fr31", "r30", "r31"); return b; } if (nb_cfr () != b) abort (); } void wb_fr (void) { char b[10]; char *nb_fr (void) { char a[33000]; TRASH_SOME_FPR; TRASH_SOME_GPR; USE_SOME_FPR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "fr28", "fr31", "r30", "r31"); return b; } if (nb_fr () != b) abort (); } void wb_cf (void) { char b[10]; char *nb_cf (void) { char a[33000]; TRASH_SOME_CR; TRASH_SOME_FPR; USE_SOME_CR; USE_SOME_FPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "fr28", "fr31"); return b; } if (nb_cf () != b) abort (); } void wb_f (void) { char b[10]; char *nb_f (void) { char a[33000]; TRASH_SOME_FPR; USE_SOME_FPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "fr28", "fr31"); return b; } if (nb_f () != b) abort (); } #endif void wb_cr (void) { char b[10]; char *nb_cr (void) { char a[33000]; TRASH_SOME_CR; TRASH_SOME_GPR; USE_SOME_CR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "r30", "r31"); return b; } if (nb_cr () != b) abort (); } void wb_r (void) { char b[10]; char *nb_r (void) { char a[33000]; TRASH_SOME_GPR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "r30", "r31"); return b; } if (nb_r () != b) abort (); } void wb_c (void) { char b[10]; char *nb_c (void) { char a[33000]; TRASH_SOME_CR; USE_SOME_CR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2"); return b; } if (nb_c () != b) abort (); } void wb_0 (void) { char b[10]; char *nb_0 (void) { char a[33000]; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) ); return b; } if (nb_0 () != b) abort (); } #ifdef __ALTIVEC__ #ifndef __NO_FPRS__ void ws_all (void) { char b[10]; char *ns_all (void) { char a[33]; TRASH_ALL_CR; TRASH_ALL_VR; TRASH_ALL_FPR; TRASH_ALL_GPR; USE_ALL_CR; USE_ALL_VR; USE_ALL_FPR; USE_ALL_GPR; __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"); return b; } if (ns_all() != b) abort (); } void ws_cvfr (void) { char b[10]; char *ns_cvfr (void) { char a[33]; TRASH_SOME_CR; TRASH_SOME_VR; TRASH_SOME_FPR; TRASH_SOME_GPR; USE_SOME_CR; USE_SOME_VR; USE_SOME_FPR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "v26", "v27", "v31", "fr28", "fr31", "r30", "r31"); return b; } if (ns_cvfr () != b) abort (); } void ws_vfr (void) { char b[10]; char *ns_vfr (void) { char a[33]; TRASH_SOME_VR; TRASH_SOME_FPR; TRASH_SOME_GPR; USE_SOME_VR; USE_SOME_FPR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "v26", "v27", "v31", "fr28", "fr31", "r30", "r31"); return b; } if (ns_vfr () != b) abort (); } void ws_cvf (void) { char b[10]; char *ns_cvf (void) { char a[33]; TRASH_SOME_CR; TRASH_SOME_VR; TRASH_SOME_FPR; USE_SOME_CR; USE_SOME_VR; USE_SOME_FPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "v26", "v27", "v31", "fr28", "fr31"); return b; } if (ns_cvf () != b) abort (); } void ws_vf (void) { char b[10]; char *ns_vf (void) { char a[33]; TRASH_SOME_VR; TRASH_SOME_FPR; USE_SOME_VR; USE_SOME_FPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "v26", "v27", "v31", "fr28", "fr31"); return b; } if (ns_vf () != b) abort (); } #endif void ws_cvr (void) { char b[10]; char *ns_cvr (void) { char a[33]; TRASH_SOME_CR; TRASH_SOME_VR; TRASH_SOME_GPR; USE_SOME_CR; USE_SOME_VR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "v26", "v27", "v31", "r30", "r31"); return b; } if (ns_cvr () != b) abort (); } void ws_vr (void) { char b[10]; char *ns_vr (void) { char a[33]; TRASH_SOME_VR; TRASH_SOME_FPR; USE_SOME_VR; USE_SOME_FPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "v26", "v27", "v31", "r30", "r31"); return b; } if (ns_vr () != b) abort (); } void ws_cv (void) { char b[10]; char *ns_cv (void) { char a[33]; TRASH_SOME_CR; TRASH_SOME_VR; USE_SOME_CR; USE_SOME_VR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "v26", "v27", "v31"); return b; } if (ns_cv () != b) abort (); } void ws_v (void) { char b[10]; char *ns_v (void) { char a[33]; TRASH_SOME_VR; USE_SOME_VR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "v26", "v27", "v31"); return b; } if (ns_v () != b) abort (); } #endif #ifndef __NO_FPRS__ void ws_cfr (void) { char b[10]; char *ns_cfr (void) { char a[33]; TRASH_SOME_CR; TRASH_SOME_FPR; TRASH_SOME_GPR; USE_SOME_CR; USE_SOME_FPR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "fr28", "fr31", "r30", "r31"); return b; } if (ns_cfr () != b) abort (); } void ws_fr (void) { char b[10]; char *ns_fr (void) { char a[33]; TRASH_SOME_FPR; TRASH_SOME_GPR; USE_SOME_FPR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "fr28", "fr31", "r30", "r31"); return b; } if (ns_fr () != b) abort (); } void ws_cf (void) { char b[10]; char *ns_cf (void) { char a[33]; TRASH_SOME_CR; TRASH_SOME_FPR; USE_SOME_CR; USE_SOME_FPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "fr28", "fr31"); return b; } if (ns_cf () != b) abort (); } void ws_f (void) { char b[10]; char *ns_f (void) { char a[33]; TRASH_SOME_FPR; USE_SOME_FPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "fr28", "fr31"); return b; } if (ns_f () != b) abort (); } #endif void ws_cr (void) { char b[10]; char *ns_cr (void) { char a[33]; TRASH_SOME_CR; TRASH_SOME_GPR; USE_SOME_CR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2", "r30", "r31"); return b; } if (ns_cr () != b) abort (); } void ws_r (void) { char b[10]; char *ns_r (void) { char a[33]; TRASH_SOME_GPR; USE_SOME_GPR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "r30", "r31"); return b; } if (ns_r () != b) abort (); } void ws_c (void) { char b[10]; char *ns_c (void) { char a[33]; TRASH_SOME_CR; USE_SOME_CR; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) : : "cr2"); return b; } if (ns_c () != b) abort (); } void ws_0 (void) { char b[10]; char *ns_0 (void) { char a[33]; __asm __volatile ("#%0 %1" : "=m" (a), "=m" (b) ); return b; } if (ns_0 () != b) abort (); } /* We'd like to compile main with __attribute__ ((__optimize__ ("fixed-cr2,fixed-cr3,fixed-cr4"))) but that doesn't do anything currently. Obviously we don't want to compile the whole file with -ffixed-cr2 -ffixed-cr3 -ffixed-cr4 as that would also tell gcc not to save/restore cr, and we're trying to check that the above functions do save/restore cr. __attribute__ ((__optimize__ ("no-rename-registers,omit-frame-pointer"))) works, but it seems odd to need omit-frame-pointer and raises the question of whether darwin would need -mdynamic-no-pic. So for now use -fno-rename-registers over the whole test. */ int main (void) { INIT_REGS; USE_ALL_CR; #ifdef __ALTIVEC__ USE_ALL_VR; #ifndef __NO_FPRS__ USE_ALL_FPR; #endif #endif USE_ALL_GPR; #ifdef __ALTIVEC__ #ifndef __NO_FPRS__ b_all (); VERIFY_REGS; b_cvfr (); VERIFY_REGS; b_vfr (); VERIFY_REGS; b_cvf (); VERIFY_REGS; b_vf (); VERIFY_REGS; #endif b_cvr (); VERIFY_REGS; b_vr (); VERIFY_REGS; b_cv (); VERIFY_REGS; b_v (); VERIFY_REGS; #endif #ifndef __NO_FPRS__ b_cfr (); VERIFY_REGS; b_fr (); VERIFY_REGS; b_cf (); VERIFY_REGS; b_f (); VERIFY_REGS; #endif b_cr (); VERIFY_REGS; b_r (); VERIFY_REGS; b_c (); VERIFY_REGS; b_0 (); VERIFY_REGS; #ifdef __ALTIVEC__ #ifndef __NO_FPRS__ s_all (); VERIFY_REGS; s_cvfr (); VERIFY_REGS; s_vfr (); VERIFY_REGS; s_cvf (); VERIFY_REGS; s_vf (); VERIFY_REGS; #endif s_cvr (); VERIFY_REGS; s_vr (); VERIFY_REGS; s_cv (); VERIFY_REGS; s_v (); VERIFY_REGS; #endif #ifndef __NO_FPRS__ s_cfr (); VERIFY_REGS; s_fr (); VERIFY_REGS; s_cf (); VERIFY_REGS; s_f (); VERIFY_REGS; #endif s_cr (); VERIFY_REGS; s_r (); VERIFY_REGS; s_r31 (); VERIFY_REGS; s_c (); VERIFY_REGS; s_0 (); VERIFY_REGS; #ifdef __ALTIVEC__ #ifndef __NO_FPRS__ wb_all (); VERIFY_REGS; wb_cvfr (); VERIFY_REGS; wb_vfr (); VERIFY_REGS; wb_cvf (); VERIFY_REGS; wb_vf (); VERIFY_REGS; #endif wb_cvr (); VERIFY_REGS; wb_vr (); VERIFY_REGS; wb_cv (); VERIFY_REGS; wb_v (); VERIFY_REGS; #endif #ifndef __NO_FPRS__ wb_cfr (); VERIFY_REGS; wb_fr (); VERIFY_REGS; wb_cf (); VERIFY_REGS; wb_f (); VERIFY_REGS; #endif wb_cr (); VERIFY_REGS; wb_r (); VERIFY_REGS; wb_c (); VERIFY_REGS; wb_0 (); VERIFY_REGS; #ifdef __ALTIVEC__ #ifndef __NO_FPRS__ ws_all (); VERIFY_REGS; ws_cvfr (); VERIFY_REGS; ws_vfr (); VERIFY_REGS; ws_cvf (); VERIFY_REGS; ws_vf (); VERIFY_REGS; #endif ws_cvr (); VERIFY_REGS; ws_vr (); VERIFY_REGS; ws_cv (); VERIFY_REGS; ws_v (); VERIFY_REGS; #endif #ifndef __NO_FPRS__ ws_cfr (); VERIFY_REGS; ws_fr (); VERIFY_REGS; ws_cf (); VERIFY_REGS; ws_f (); VERIFY_REGS; #endif ws_cr (); VERIFY_REGS; ws_r (); VERIFY_REGS; ws_c (); VERIFY_REGS; ws_0 (); VERIFY_REGS; return 0; }