| /* { 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; | |
| } |