1 /* { dg-do run { target { powerpc*-*-linux* } } } */
2 /* { dg-skip-if "" { powerpc*-*-darwin* } } */
3 /* { dg-skip-if "" { powerpc*-*-*spe* } } */
4 /* { dg-require-effective-target powerpc_fprs } */
5 /* { dg-require-effective-target longdouble128 } */
6 /* { dg-options "-O2 -mhard-float" } */
16 #if defined(__LONG_DOUBLE_IEEE128__)
17 /* If long double is IEEE 128-bit, we need to use the __ibm128 type instead of
18 long double, and to use the appropriate pack/unpack routines. We can't use
19 __ibm128 on systems that don't support IEEE 128-bit floating point, because
20 the type is not enabled on those systems. */
21 #define PACK __builtin_pack_ibm128
22 #define UNPACK __builtin_unpack_ibm128
23 #define LDOUBLE __ibm128
25 #elif defined(__LONG_DOUBLE_IBM128__)
26 #define PACK __builtin_pack_longdouble
27 #define UNPACK __builtin_unpack_longdouble
28 #define LDOUBLE long double
31 #error "long double must be either IBM 128-bit or IEEE 128-bit"
37 double high
= pow (2.0, 60);
39 LDOUBLE a
= ((LDOUBLE
)high
) + ((LDOUBLE
)low
);
40 double x0
= UNPACK (a
, 0);
41 double x1
= UNPACK (a
, 1);
42 LDOUBLE b
= PACK (x0
, x1
);
50 unsigned char uc
[sizeof (LDOUBLE
)];
51 char c
[sizeof (LDOUBLE
)];
56 for (i
= 0; i
< sizeof (LDOUBLE
); i
++)
57 printf ("%.2x", u
.uc
[i
]);
59 printf (", %Lg\n", a
);
63 for (i
= 0; i
< sizeof (LDOUBLE
); i
++)
64 printf ("%.2x", u
.uc
[i
]);
66 printf (", %Lg\n", b
);
70 for (i
= 0; i
< sizeof (double); i
++)
71 printf ("%.2x", u
.uc
[i
]);
73 printf (",%*s %g\n", (int)(2 * (sizeof (LDOUBLE
) - sizeof (double))), "", high
);
77 for (i
= 0; i
< sizeof (double); i
++)
78 printf ("%.2x", u
.uc
[i
]);
80 printf (",%*s %g\n", (int)(2 * (sizeof (LDOUBLE
) - sizeof (double))), "", low
);
84 for (i
= 0; i
< sizeof (double); i
++)
85 printf ("%.2x", u
.uc
[i
]);
87 printf (",%*s %g\n", (int)(2 * (sizeof (LDOUBLE
) - sizeof (double))), "", x0
);
91 for (i
= 0; i
< sizeof (double); i
++)
92 printf ("%.2x", u
.uc
[i
]);
94 printf (",%*s %g\n", (int)(2 * (sizeof (LDOUBLE
) - sizeof (double))), "", x1
);