blob: 0295a974cfb00d03a66b75e7a2c964dc38d4aadb [file] [log] [blame]
/* { dg-do run { target { powerpc*-*-linux* } } } */
/* { dg-skip-if "" { powerpc*-*-darwin* } } */
/* { dg-require-effective-target dfp_hw } */
/* { dg-options "-O2 -mhard-dfp" } */
#include <stddef.h>
#include <stdlib.h>
#include <math.h>
#ifdef DEBUG
#include <stdio.h>
#endif
int
main (void)
{
_Decimal128 one = (_Decimal128)1.0;
_Decimal128 two = (_Decimal128)2.0;
_Decimal128 ten = (_Decimal128)10.0;
_Decimal128 a = one;
_Decimal128 b;
_Decimal128 c;
unsigned long long x0;
unsigned long long x1;
size_t i;
for (i = 0; i < 25; i++)
a *= ten;
a += two;
x0 = __builtin_unpack_dec128 (a, 0);
x1 = __builtin_unpack_dec128 (a, 1);
b = __builtin_pack_dec128 (x0, x1);
c = __builtin_dscliq (one, 25) + two;
#ifdef DEBUG
{
union {
_Decimal128 d;
unsigned long long ull;
unsigned char uc[sizeof (_Decimal128)];
} u;
printf ("a = 0x");
u.d = a;
for (i = 0; i < sizeof (_Decimal128); i++)
printf ("%.2x", u.uc[i]);
printf (", %Lg\n", (long double)a);
printf ("b = 0x");
u.d = b;
for (i = 0; i < sizeof (_Decimal128); i++)
printf ("%.2x", u.uc[i]);
printf (", %Lg\n", (long double)b);
printf ("c = 0x");
u.d = c;
for (i = 0; i < sizeof (_Decimal128); i++)
printf ("%.2x", u.uc[i]);
printf (", %Lg\n", (long double)c);
printf ("x0 = 0x");
u.ull = x0;
for (i = 0; i < sizeof (unsigned long long); i++)
printf ("%.2x", u.uc[i]);
printf ("\nx1 = 0x");
u.ull = x1;
for (i = 0; i < sizeof (unsigned long long); i++)
printf ("%.2x", u.uc[i]);
printf ("\n");
}
#endif
if (a != b)
abort ();
if (a != c)
abort ();
return 0;
}