blob: f724f308094c462fd050ada0c30b05676024c0ab [file] [log] [blame]
/* { 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;
}