/* PR libgcc/65833 */
/* Test non-canonical BID significands.  */
/* { dg-require-effective-target int128 } */
/* { dg-require-effective-target 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 ();
}