blob: c1b10c9dfe212b4a91928f53b39508424caa0e17 [file] [log] [blame]
/* PR libgcc/65833 */
/* Test non-canonical BID significands. */
/* { dg-do run { target { int128 && bitint } } } */
/* { dg-options "-O2 -std=gnu2x" } */
/* { dg-require-effective-target dfp_bid } */
union U32
{
_Decimal32 d;
unsigned int u;
};
union U64
{
_Decimal64 d;
unsigned long long int u;
};
union U128
{
_Decimal128 d;
unsigned long long int u[2];
};
int
main ()
{
volatile union U32 u32;
u32.d = 0.9999999e+27DF;
u32.u++;
volatile union U64 u64;
u64.d = 0.9999999999999999e+90DD;
u64.u++;
volatile union U128 u128;
u128.d = 0.9999999999999999999999999999999999e+39DL;
if (u128.u[0] == 0x378d8e63ffffffffULL)
u128.u[0]++;
else if (u128.u[1] == 0x378d8e63ffffffffULL)
u128.u[1]++;
else
u128.d = 0.DL;
if ((__int128) u32.d != 0
|| (unsigned __int128) u32.d != 0U
|| (__int128) u64.d != 0
|| (unsigned __int128) u64.d != 0U
|| (__int128) u128.d != 0
|| (unsigned __int128) u128.d != 0U)
__builtin_abort ();
u32.u = 0xe59fffffU;
u64.u = 0xe3ffffffffffffffULL;
if (u128.u[0] == 0x378d8e6400000000ULL)
{
u128.u[0] = -1ULL;
u128.u[1] = 0xe1be7fffffffffffULL;
}
else if (u128.u[1] == 0x378d8e6400000000ULL)
{
u128.u[1] = -1ULL;
u128.u[0] = 0xe1be7fffffffffffULL;
}
if ((__int128) u32.d != 0
|| (unsigned __int128) u32.d != 0U
|| (__int128) u64.d != 0
|| (unsigned __int128) u64.d != 0U
|| (__int128) u128.d != 0
|| (unsigned __int128) u128.d != 0U)
__builtin_abort ();
if (u128.u[0] == -1ULL)
{
u128.u[0] = 0;
u128.u[1] = 0xe629800000000000ULL;
}
else if (u128.u[1] == -1ULL)
{
u128.u[1] = 0;
u128.u[0] = 0xe629800000000000ULL;
}
if ((__int128) u128.d != 0
|| (unsigned __int128) u128.d != 0U)
__builtin_abort ();
}