/* Check for Darwin m64 that we do not try to pass & return by value for a struct exceeding the number of arg FPRs (the struct here straddles the split-point). */ /* { dg-do run { target { powerpc*-*-darwin* && lp64 } } } */ extern void abort (void); /*#define DEBUG*/ #ifdef DEBUG extern int printf (const char *, ...); extern int printf$LDBL128 (const char *, ...); #endif typedef struct fourteen { long double a, b, c, d, e, f, g; } fourteen_t ; fourteen_t foo (fourteen_t, fourteen_t) __attribute__ ((noinline)); fourteen_t foo (fourteen_t aa, fourteen_t bb) { fourteen_t r; r.a = aa.a + bb.a; r.b = aa.b + bb.b; r.c = aa.c + bb.c; r.d = aa.d + bb.d; r.e = aa.e + bb.e; r.f = aa.f + bb.f; r.g = aa.g + bb.g; #ifdef DEBUG #ifdef __ppc64__ printf #else printf$LDBL128 #endif ("%Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg: " "%Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", aa.a, aa.b, aa.c, aa.d, aa.e, aa.f, aa.g, bb.a, bb.b, bb.c, bb.d, bb.e, bb.f, bb.g, r.a, r.b, r.c, r.d, r.e, r.f, r.g); printf ("aa.g %ll16x %ll16x\nbb.g %ll16x %ll16x\n", *(unsigned long long*)&aa.g, *(unsigned long long*)(((char *)&aa.g)+8), *(unsigned long long*)&bb.g, *(unsigned long long*)(((char *)&bb.g)+8)); #endif __asm__ (""); /* double make sure we don't get inlined */ return r; } int main (void) { fourteen_t x = { 1.L, 2.L, 3.L, 4.L, 5.L, 6.L,-12.3456789123456789L }; fourteen_t y = { 8.L, 9.L, 10.L, 11.L, 12.L, 13.L, 12.3456789123456789L }; fourteen_t z ; long double zz; z = foo (x,y); zz = x.g + y.g; #ifdef DEBUG #ifdef __ppc64__ printf #else printf$LDBL128 #endif (" z: %Lg %Lg %Lg %Lg %Lg %Lg %Lg\n" "ret: %ll16x %ll16x\nzz : %ll16x %ll16x\n", z.a, z.b, z.c, z.d, z.e, z.f, z.g, *(unsigned long long*)&z.g, *(unsigned long long*)(((char *)&z.g)+8), *(unsigned long long*)&zz, *(unsigned long long*)(((char *)&zz)+8)); #endif /* Yes, we really do want to do an equality test here. */ if (z.g != zz) abort (); return 0; }