Home | History | Annotate | Line # | Download | only in libbid
      1 /* Copyright (C) 2007-2024 Free Software Foundation, Inc.
      2 
      3 This file is part of GCC.
      4 
      5 GCC is free software; you can redistribute it and/or modify it under
      6 the terms of the GNU General Public License as published by the Free
      7 Software Foundation; either version 3, or (at your option) any later
      8 version.
      9 
     10 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     11 WARRANTY; without even the implied warranty of MERCHANTABILITY or
     12 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     13 for more details.
     14 
     15 Under Section 7 of GPL version 3, you are granted additional
     16 permissions described in the GCC Runtime Library Exception, version
     17 3.1, as published by the Free Software Foundation.
     18 
     19 You should have received a copy of the GNU General Public License and
     20 a copy of the GCC Runtime Library Exception along with this program;
     21 see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     22 <http://www.gnu.org/licenses/>.  */
     23 
     24 #include "bid_internal.h"
     25 
     26 /*****************************************************************************
     27  *  BID64_to_uint32_rnint
     28  ****************************************************************************/
     29 
     30 #if DECIMAL_CALL_BY_REFERENCE
     31 void
     32 bid64_to_uint32_rnint (unsigned int *pres, UINT64 * px
     33 		       _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
     34 		       _EXC_INFO_PARAM) {
     35   UINT64 x = *px;
     36 #else
     37 unsigned int
     38 bid64_to_uint32_rnint (UINT64 x
     39 		       _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
     40 		       _EXC_INFO_PARAM) {
     41 #endif
     42   unsigned int res;
     43   UINT64 x_sign;
     44   UINT64 x_exp;
     45   int exp;			// unbiased exponent
     46   // Note: C1 represents x_significand (UINT64)
     47   UINT64 tmp64;
     48   BID_UI64DOUBLE tmp1;
     49   unsigned int x_nr_bits;
     50   int q, ind, shift;
     51   UINT64 C1;
     52   UINT64 Cstar;			// C* represents up to 16 decimal digits ~ 54 bits
     53   UINT128 fstar;
     54   UINT128 P128;
     55 
     56   // check for NaN or Infinity
     57   if ((x & MASK_NAN) == MASK_NAN || (x & MASK_INF) == MASK_INF) {
     58     // set invalid flag
     59     *pfpsf |= INVALID_EXCEPTION;
     60     // return Integer Indefinite
     61     res = 0x80000000;
     62     BID_RETURN (res);
     63   }
     64   // unpack x
     65   x_sign = x & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
     66   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
     67   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
     68     x_exp = (x & MASK_BINARY_EXPONENT2) >> 51;	// biased
     69     C1 = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
     70     if (C1 > 9999999999999999ull) {	// non-canonical
     71       x_exp = 0;
     72       C1 = 0;
     73     }
     74   } else {
     75     x_exp = (x & MASK_BINARY_EXPONENT1) >> 53;	// biased
     76     C1 = x & MASK_BINARY_SIG1;
     77   }
     78 
     79   // check for zeros (possibly from non-canonical values)
     80   if (C1 == 0x0ull) {
     81     // x is 0
     82     res = 0x00000000;
     83     BID_RETURN (res);
     84   }
     85   // x is not special and is not zero
     86 
     87   // q = nr. of decimal digits in x (1 <= q <= 54)
     88   //  determine first the nr. of bits in x
     89   if (C1 >= 0x0020000000000000ull) {	// x >= 2^53
     90     // split the 64-bit value in two 32-bit halves to avoid rounding errors
     91     if (C1 >= 0x0000000100000000ull) {	// x >= 2^32
     92       tmp1.d = (double) (C1 >> 32);	// exact conversion
     93       x_nr_bits =
     94 	33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
     95     } else {	// x < 2^32
     96       tmp1.d = (double) C1;	// exact conversion
     97       x_nr_bits =
     98 	1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
     99     }
    100   } else {	// if x < 2^53
    101     tmp1.d = (double) C1;	// exact conversion
    102     x_nr_bits =
    103       1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
    104   }
    105   q = nr_digits[x_nr_bits - 1].digits;
    106   if (q == 0) {
    107     q = nr_digits[x_nr_bits - 1].digits1;
    108     if (C1 >= nr_digits[x_nr_bits - 1].threshold_lo)
    109       q++;
    110   }
    111   exp = x_exp - 398;	// unbiased exponent
    112 
    113   if ((q + exp) > 10) {	// x >= 10^10 ~= 2^33.2... (cannot fit in 32 bits)
    114     // set invalid flag
    115     *pfpsf |= INVALID_EXCEPTION;
    116     // return Integer Indefinite
    117     res = 0x80000000;
    118     BID_RETURN (res);
    119   } else if ((q + exp) == 10) {	// x = c(0)c(1)...c(9).c(10)...c(q-1)
    120     // in this case 2^29.89... ~= 10^9 <= x < 10^10 ~= 2^33.2...
    121     // so x rounded to an integer may or may not fit in an unsigned 32-bit int
    122     // the cases that do not fit are identified here; the ones that fit
    123     // fall through and will be handled with other cases further,
    124     // under '1 <= q + exp <= 10'
    125     if (x_sign) {	// if n < 0 and q + exp = 10 then x is much less than -1/2
    126       // => set invalid flag
    127       *pfpsf |= INVALID_EXCEPTION;
    128       // return Integer Indefinite
    129       res = 0x80000000;
    130       BID_RETURN (res);
    131     } else {	// if n > 0 and q + exp = 10
    132       // if n >= 2^32 - 1/2 then n is too large
    133       // too large if c(0)c(1)...c(9).c(10)...c(q-1) >= 2^32-1/2
    134       // <=> 0.c(0)c(1)...c(q-1) * 10^11 >= 0x9fffffffb, 1<=q<=16
    135       // <=> C * 10^(11-q) >= 0x9fffffffb, 1<=q<=16
    136       if (q <= 11) {
    137 	// Note: C * 10^(11-q) has 10 or 11 digits; 0x9fffffffb has 11 digits
    138 	tmp64 = C1 * ten2k64[11 - q];	// C scaled up to 11-digit int
    139 	// c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
    140 	if (tmp64 >= 0x9fffffffbull) {
    141 	  // set invalid flag
    142 	  *pfpsf |= INVALID_EXCEPTION;
    143 	  // return Integer Indefinite
    144 	  res = 0x80000000;
    145 	  BID_RETURN (res);
    146 	}
    147 	// else cases that can be rounded to a 32-bit unsigned int fall through
    148 	// to '1 <= q + exp <= 10'
    149       } else {	// if (q > 11), i.e. 12 <= q <= 16 and so -15 <= exp <= -2
    150 	// C * 10^(11-q) >= 0x9fffffffb <=>
    151 	// C >= 0x9fffffffb * 10^(q-11) where 1 <= q - 11 <= 5
    152 	// (scale 2^32-1/2 up)
    153 	// Note: 0x9fffffffb*10^(q-11) has q-1 or q digits, where q <= 16
    154 	tmp64 = 0x9fffffffbull * ten2k64[q - 11];
    155 	if (C1 >= tmp64) {
    156 	  // set invalid flag
    157 	  *pfpsf |= INVALID_EXCEPTION;
    158 	  // return Integer Indefinite
    159 	  res = 0x80000000;
    160 	  BID_RETURN (res);
    161 	}
    162 	// else cases that can be rounded to a 32-bit int fall through
    163 	// to '1 <= q + exp <= 10'
    164       }
    165     }
    166   }
    167   // n is not too large to be converted to int32 if -1/2 <= n < 2^32 - 1/2
    168   // Note: some of the cases tested for above fall through to this point
    169   if ((q + exp) < 0) {	// n = +/-0.0...c(0)c(1)...c(q-1)
    170     // return 0
    171     res = 0x00000000;
    172     BID_RETURN (res);
    173   } else if ((q + exp) == 0) {	// n = +/-0.c(0)c(1)...c(q-1)
    174     // if 0.c(0)c(1)...c(q-1) <= 0.5 <=> c(0)c(1)...c(q-1) <= 5 * 10^(q-1)
    175     //   res = 0
    176     // else if x > 0
    177     //   res = +1
    178     // else // if x < 0
    179     //   invalid exc
    180     ind = q - 1;
    181     if (C1 <= midpoint64[ind]) {
    182       res = 0x00000000;	// return 0
    183     } else if (x_sign) {	// n < 0
    184       // set invalid flag
    185       *pfpsf |= INVALID_EXCEPTION;
    186       // return Integer Indefinite
    187       res = 0x80000000;
    188       BID_RETURN (res);
    189     } else {	// n > 0
    190       res = 0x00000001;	// return +1
    191     }
    192   } else {	// if (1 <= q + exp <= 10, 1 <= q <= 16, -15 <= exp <= 9)
    193     // -2^32-1/2 <= x <= -1 or 1 <= x < 2^32-1/2 so if positive, x can be
    194     // rounded to nearest to a 32-bit unsigned integer
    195     if (x_sign) {	// x <= -1
    196       // set invalid flag
    197       *pfpsf |= INVALID_EXCEPTION;
    198       // return Integer Indefinite
    199       res = 0x80000000;
    200       BID_RETURN (res);
    201     }
    202     // 1 <= x < 2^32-1/2 so x can be rounded
    203     // to nearest to a 32-bit unsigned integer
    204     if (exp < 0) {	// 2 <= q <= 16, -15 <= exp <= -1, 1 <= q + exp <= 10
    205       ind = -exp;	// 1 <= ind <= 15; ind is a synonym for 'x'
    206       // chop off ind digits from the lower part of C1
    207       // C1 = C1 + 1/2 * 10^ind where the result C1 fits in 64 bits
    208       C1 = C1 + midpoint64[ind - 1];
    209       // calculate C* and f*
    210       // C* is actually floor(C*) in this case
    211       // C* and f* need shifting and masking, as shown by
    212       // shiftright128[] and maskhigh128[]
    213       // 1 <= x <= 15
    214       // kx = 10^(-x) = ten2mk64[ind - 1]
    215       // C* = (C1 + 1/2 * 10^x) * 10^(-x)
    216       // the approximation of 10^(-x) was rounded up to 54 bits
    217       __mul_64x64_to_128MACH (P128, C1, ten2mk64[ind - 1]);
    218       Cstar = P128.w[1];
    219       fstar.w[1] = P128.w[1] & maskhigh128[ind - 1];
    220       fstar.w[0] = P128.w[0];
    221       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind].w[0], e.g.
    222       // if x=1, T*=ten2mk128trunc[0].w[0]=0x1999999999999999
    223       // if (0 < f* < 10^(-x)) then the result is a midpoint
    224       //   if floor(C*) is even then C* = floor(C*) - logical right
    225       //       shift; C* has p decimal digits, correct by Prop. 1)
    226       //   else if floor(C*) is odd C* = floor(C*)-1 (logical right
    227       //       shift; C* has p decimal digits, correct by Pr. 1)
    228       // else
    229       //   C* = floor(C*) (logical right shift; C has p decimal digits,
    230       //       correct by Property 1)
    231       // n = C* * 10^(e+x)
    232 
    233       // shift right C* by Ex-64 = shiftright128[ind]
    234       shift = shiftright128[ind - 1];	// 0 <= shift <= 39
    235       Cstar = Cstar >> shift;
    236 
    237       // if the result was a midpoint it was rounded away from zero, so
    238       // it will need a correction
    239       // check for midpoints
    240       if ((fstar.w[1] == 0) && fstar.w[0] &&
    241 	  (fstar.w[0] <= ten2mk128trunc[ind - 1].w[1])) {
    242 	// ten2mk128trunc[ind -1].w[1] is identical to
    243 	// ten2mk128[ind -1].w[1]
    244 	// the result is a midpoint; round to nearest
    245 	if (Cstar & 0x01) {	// Cstar is odd; MP in [EVEN, ODD]
    246 	  // if floor(C*) is odd C = floor(C*) - 1; the result >= 1
    247 	  Cstar--;	// Cstar is now even
    248 	}	// else MP in [ODD, EVEN]
    249       }
    250       res = Cstar;	// the result is positive
    251     } else if (exp == 0) {
    252       // 1 <= q <= 10
    253       // res = +C (exact)
    254       res = C1;	// the result is positive
    255     } else {	// if (exp > 0) => 1 <= exp <= 9, 1 <= q < 9, 2 <= q + exp <= 10
    256       // res = +C * 10^exp (exact)
    257       res = C1 * ten2k64[exp];	// the result is positive
    258     }
    259   }
    260   BID_RETURN (res);
    261 }
    262 
    263 /*****************************************************************************
    264  *  BID64_to_uint32_xrnint
    265  ****************************************************************************/
    266 
    267 #if DECIMAL_CALL_BY_REFERENCE
    268 void
    269 bid64_to_uint32_xrnint (unsigned int *pres, UINT64 * px
    270 			_EXC_FLAGS_PARAM _EXC_MASKS_PARAM
    271 			_EXC_INFO_PARAM) {
    272   UINT64 x = *px;
    273 #else
    274 unsigned int
    275 bid64_to_uint32_xrnint (UINT64 x
    276 			_EXC_FLAGS_PARAM _EXC_MASKS_PARAM
    277 			_EXC_INFO_PARAM) {
    278 #endif
    279   unsigned int res;
    280   UINT64 x_sign;
    281   UINT64 x_exp;
    282   int exp;			// unbiased exponent
    283   // Note: C1 represents x_significand (UINT64)
    284   UINT64 tmp64;
    285   BID_UI64DOUBLE tmp1;
    286   unsigned int x_nr_bits;
    287   int q, ind, shift;
    288   UINT64 C1;
    289   UINT64 Cstar;			// C* represents up to 16 decimal digits ~ 54 bits
    290   UINT128 fstar;
    291   UINT128 P128;
    292 
    293   // check for NaN or Infinity
    294   if ((x & MASK_NAN) == MASK_NAN || (x & MASK_INF) == MASK_INF) {
    295     // set invalid flag
    296     *pfpsf |= INVALID_EXCEPTION;
    297     // return Integer Indefinite
    298     res = 0x80000000;
    299     BID_RETURN (res);
    300   }
    301   // unpack x
    302   x_sign = x & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
    303   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
    304   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
    305     x_exp = (x & MASK_BINARY_EXPONENT2) >> 51;	// biased
    306     C1 = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
    307     if (C1 > 9999999999999999ull) {	// non-canonical
    308       x_exp = 0;
    309       C1 = 0;
    310     }
    311   } else {
    312     x_exp = (x & MASK_BINARY_EXPONENT1) >> 53;	// biased
    313     C1 = x & MASK_BINARY_SIG1;
    314   }
    315 
    316   // check for zeros (possibly from non-canonical values)
    317   if (C1 == 0x0ull) {
    318     // x is 0
    319     res = 0x00000000;
    320     BID_RETURN (res);
    321   }
    322   // x is not special and is not zero
    323 
    324   // q = nr. of decimal digits in x (1 <= q <= 54)
    325   //  determine first the nr. of bits in x
    326   if (C1 >= 0x0020000000000000ull) {	// x >= 2^53
    327     // split the 64-bit value in two 32-bit halves to avoid rounding errors
    328     if (C1 >= 0x0000000100000000ull) {	// x >= 2^32
    329       tmp1.d = (double) (C1 >> 32);	// exact conversion
    330       x_nr_bits =
    331 	33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
    332     } else {	// x < 2^32
    333       tmp1.d = (double) C1;	// exact conversion
    334       x_nr_bits =
    335 	1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
    336     }
    337   } else {	// if x < 2^53
    338     tmp1.d = (double) C1;	// exact conversion
    339     x_nr_bits =
    340       1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
    341   }
    342   q = nr_digits[x_nr_bits - 1].digits;
    343   if (q == 0) {
    344     q = nr_digits[x_nr_bits - 1].digits1;
    345     if (C1 >= nr_digits[x_nr_bits - 1].threshold_lo)
    346       q++;
    347   }
    348   exp = x_exp - 398;	// unbiased exponent
    349 
    350   if ((q + exp) > 10) {	// x >= 10^10 ~= 2^33.2... (cannot fit in 32 bits)
    351     // set invalid flag
    352     *pfpsf |= INVALID_EXCEPTION;
    353     // return Integer Indefinite
    354     res = 0x80000000;
    355     BID_RETURN (res);
    356   } else if ((q + exp) == 10) {	// x = c(0)c(1)...c(9).c(10)...c(q-1)
    357     // in this case 2^29.89... ~= 10^9 <= x < 10^10 ~= 2^33.2...
    358     // so x rounded to an integer may or may not fit in an unsigned 32-bit int
    359     // the cases that do not fit are identified here; the ones that fit
    360     // fall through and will be handled with other cases further,
    361     // under '1 <= q + exp <= 10'
    362     if (x_sign) {	// if n < 0 and q + exp = 10 then x is much less than -1/2
    363       // => set invalid flag
    364       *pfpsf |= INVALID_EXCEPTION;
    365       // return Integer Indefinite
    366       res = 0x80000000;
    367       BID_RETURN (res);
    368     } else {	// if n > 0 and q + exp = 10
    369       // if n >= 2^32 - 1/2 then n is too large
    370       // too large if c(0)c(1)...c(9).c(10)...c(q-1) >= 2^32-1/2
    371       // <=> 0.c(0)c(1)...c(q-1) * 10^11 >= 0x9fffffffb, 1<=q<=16
    372       // <=> C * 10^(11-q) >= 0x9fffffffb, 1<=q<=16
    373       if (q <= 11) {
    374 	// Note: C * 10^(11-q) has 10 or 11 digits; 0x9fffffffb has 11 digits
    375 	tmp64 = C1 * ten2k64[11 - q];	// C scaled up to 11-digit int
    376 	// c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
    377 	if (tmp64 >= 0x9fffffffbull) {
    378 	  // set invalid flag
    379 	  *pfpsf |= INVALID_EXCEPTION;
    380 	  // return Integer Indefinite
    381 	  res = 0x80000000;
    382 	  BID_RETURN (res);
    383 	}
    384 	// else cases that can be rounded to a 32-bit unsigned int fall through
    385 	// to '1 <= q + exp <= 10'
    386       } else {	// if (q > 11), i.e. 12 <= q <= 16 and so -15 <= exp <= -2
    387 	// C * 10^(11-q) >= 0x9fffffffb <=>
    388 	// C >= 0x9fffffffb * 10^(q-11) where 1 <= q - 11 <= 5
    389 	// (scale 2^32-1/2 up)
    390 	// Note: 0x9fffffffb*10^(q-11) has q-1 or q digits, where q <= 16
    391 	tmp64 = 0x9fffffffbull * ten2k64[q - 11];
    392 	if (C1 >= tmp64) {
    393 	  // set invalid flag
    394 	  *pfpsf |= INVALID_EXCEPTION;
    395 	  // return Integer Indefinite
    396 	  res = 0x80000000;
    397 	  BID_RETURN (res);
    398 	}
    399 	// else cases that can be rounded to a 32-bit int fall through
    400 	// to '1 <= q + exp <= 10'
    401       }
    402     }
    403   }
    404   // n is not too large to be converted to int32 if -1/2 <= n < 2^32 - 1/2
    405   // Note: some of the cases tested for above fall through to this point
    406   if ((q + exp) < 0) {	// n = +/-0.0...c(0)c(1)...c(q-1)
    407     // set inexact flag
    408     *pfpsf |= INEXACT_EXCEPTION;
    409     // return 0
    410     res = 0x00000000;
    411     BID_RETURN (res);
    412   } else if ((q + exp) == 0) {	// n = +/-0.c(0)c(1)...c(q-1)
    413     // if 0.c(0)c(1)...c(q-1) <= 0.5 <=> c(0)c(1)...c(q-1) <= 5 * 10^(q-1)
    414     //   res = 0
    415     // else if x > 0
    416     //   res = +1
    417     // else // if x < 0
    418     //   invalid exc
    419     ind = q - 1;
    420     if (C1 <= midpoint64[ind]) {
    421       res = 0x00000000;	// return 0
    422     } else if (x_sign) {	// n < 0
    423       // set invalid flag
    424       *pfpsf |= INVALID_EXCEPTION;
    425       // return Integer Indefinite
    426       res = 0x80000000;
    427       BID_RETURN (res);
    428     } else {	// n > 0
    429       res = 0x00000001;	// return +1
    430     }
    431     // set inexact flag
    432     *pfpsf |= INEXACT_EXCEPTION;
    433   } else {	// if (1 <= q + exp <= 10, 1 <= q <= 16, -15 <= exp <= 9)
    434     // -2^32-1/2 <= x <= -1 or 1 <= x < 2^32-1/2 so if positive, x can be
    435     // rounded to nearest to a 32-bit unsigned integer
    436     if (x_sign) {	// x <= -1
    437       // set invalid flag
    438       *pfpsf |= INVALID_EXCEPTION;
    439       // return Integer Indefinite
    440       res = 0x80000000;
    441       BID_RETURN (res);
    442     }
    443     // 1 <= x < 2^32-1/2 so x can be rounded
    444     // to nearest to a 32-bit unsigned integer
    445     if (exp < 0) {	// 2 <= q <= 16, -15 <= exp <= -1, 1 <= q + exp <= 10
    446       ind = -exp;	// 1 <= ind <= 15; ind is a synonym for 'x'
    447       // chop off ind digits from the lower part of C1
    448       // C1 = C1 + 1/2 * 10^ind where the result C1 fits in 64 bits
    449       C1 = C1 + midpoint64[ind - 1];
    450       // calculate C* and f*
    451       // C* is actually floor(C*) in this case
    452       // C* and f* need shifting and masking, as shown by
    453       // shiftright128[] and maskhigh128[]
    454       // 1 <= x <= 15
    455       // kx = 10^(-x) = ten2mk64[ind - 1]
    456       // C* = (C1 + 1/2 * 10^x) * 10^(-x)
    457       // the approximation of 10^(-x) was rounded up to 54 bits
    458       __mul_64x64_to_128MACH (P128, C1, ten2mk64[ind - 1]);
    459       Cstar = P128.w[1];
    460       fstar.w[1] = P128.w[1] & maskhigh128[ind - 1];
    461       fstar.w[0] = P128.w[0];
    462       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind].w[0], e.g.
    463       // if x=1, T*=ten2mk128trunc[0].w[0]=0x1999999999999999
    464       // if (0 < f* < 10^(-x)) then the result is a midpoint
    465       //   if floor(C*) is even then C* = floor(C*) - logical right
    466       //       shift; C* has p decimal digits, correct by Prop. 1)
    467       //   else if floor(C*) is odd C* = floor(C*)-1 (logical right
    468       //       shift; C* has p decimal digits, correct by Pr. 1)
    469       // else
    470       //   C* = floor(C*) (logical right shift; C has p decimal digits,
    471       //       correct by Property 1)
    472       // n = C* * 10^(e+x)
    473 
    474       // shift right C* by Ex-64 = shiftright128[ind]
    475       shift = shiftright128[ind - 1];	// 0 <= shift <= 39
    476       Cstar = Cstar >> shift;
    477       // determine inexactness of the rounding of C*
    478       // if (0 < f* - 1/2 < 10^(-x)) then
    479       //   the result is exact
    480       // else // if (f* - 1/2 > T*) then
    481       //   the result is inexact
    482       if (ind - 1 <= 2) {	// fstar.w[1] is 0
    483 	if (fstar.w[0] > 0x8000000000000000ull) {
    484 	  // f* > 1/2 and the result may be exact
    485 	  tmp64 = fstar.w[0] - 0x8000000000000000ull;	// f* - 1/2
    486 	  if ((tmp64 > ten2mk128trunc[ind - 1].w[1])) {
    487 	    // ten2mk128trunc[ind -1].w[1] is identical to
    488 	    // ten2mk128[ind -1].w[1]
    489 	    // set the inexact flag
    490 	    *pfpsf |= INEXACT_EXCEPTION;
    491 	  }	// else the result is exact
    492 	} else {	// the result is inexact; f2* <= 1/2
    493 	  // set the inexact flag
    494 	  *pfpsf |= INEXACT_EXCEPTION;
    495 	}
    496       } else {	// if 3 <= ind - 1 <= 14
    497 	if (fstar.w[1] > onehalf128[ind - 1] ||
    498 	    (fstar.w[1] == onehalf128[ind - 1] && fstar.w[0])) {
    499 	  // f2* > 1/2 and the result may be exact
    500 	  // Calculate f2* - 1/2
    501 	  tmp64 = fstar.w[1] - onehalf128[ind - 1];
    502 	  if (tmp64 || fstar.w[0] > ten2mk128trunc[ind - 1].w[1]) {
    503 	    // ten2mk128trunc[ind -1].w[1] is identical to
    504 	    // ten2mk128[ind -1].w[1]
    505 	    // set the inexact flag
    506 	    *pfpsf |= INEXACT_EXCEPTION;
    507 	  }	// else the result is exact
    508 	} else {	// the result is inexact; f2* <= 1/2
    509 	  // set the inexact flag
    510 	  *pfpsf |= INEXACT_EXCEPTION;
    511 	}
    512       }
    513 
    514       // if the result was a midpoint it was rounded away from zero, so
    515       // it will need a correction
    516       // check for midpoints
    517       if ((fstar.w[1] == 0) && fstar.w[0] &&
    518 	  (fstar.w[0] <= ten2mk128trunc[ind - 1].w[1])) {
    519 	// ten2mk128trunc[ind -1].w[1] is identical to
    520 	// ten2mk128[ind -1].w[1]
    521 	// the result is a midpoint; round to nearest
    522 	if (Cstar & 0x01) {	// Cstar is odd; MP in [EVEN, ODD]
    523 	  // if floor(C*) is odd C = floor(C*) - 1; the result >= 1
    524 	  Cstar--;	// Cstar is now even
    525 	}	// else MP in [ODD, EVEN]
    526       }
    527       res = Cstar;	// the result is positive
    528     } else if (exp == 0) {
    529       // 1 <= q <= 10
    530       // res = +C (exact)
    531       res = C1;	// the result is positive
    532     } else {	// if (exp > 0) => 1 <= exp <= 9, 1 <= q < 9, 2 <= q + exp <= 10
    533       // res = +C * 10^exp (exact)
    534       res = C1 * ten2k64[exp];	// the result is positive
    535     }
    536   }
    537   BID_RETURN (res);
    538 }
    539 
    540 /*****************************************************************************
    541  *  BID64_to_uint32_floor
    542  ****************************************************************************/
    543 
    544 #if DECIMAL_CALL_BY_REFERENCE
    545 void
    546 bid64_to_uint32_floor (unsigned int *pres, UINT64 * px
    547 		       _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
    548 		       _EXC_INFO_PARAM) {
    549   UINT64 x = *px;
    550 #else
    551 unsigned int
    552 bid64_to_uint32_floor (UINT64 x
    553 		       _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
    554 		       _EXC_INFO_PARAM) {
    555 #endif
    556   unsigned int res;
    557   UINT64 x_sign;
    558   UINT64 x_exp;
    559   int exp;			// unbiased exponent
    560   // Note: C1 represents x_significand (UINT64)
    561   UINT64 tmp64;
    562   BID_UI64DOUBLE tmp1;
    563   unsigned int x_nr_bits;
    564   int q, ind, shift;
    565   UINT64 C1;
    566   UINT64 Cstar;			// C* represents up to 16 decimal digits ~ 54 bits
    567   UINT128 P128;
    568 
    569   // check for NaN or Infinity
    570   if ((x & MASK_NAN) == MASK_NAN || (x & MASK_INF) == MASK_INF) {
    571     // set invalid flag
    572     *pfpsf |= INVALID_EXCEPTION;
    573     // return Integer Indefinite
    574     res = 0x80000000;
    575     BID_RETURN (res);
    576   }
    577   // unpack x
    578   x_sign = x & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
    579   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
    580   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
    581     x_exp = (x & MASK_BINARY_EXPONENT2) >> 51;	// biased
    582     C1 = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
    583     if (C1 > 9999999999999999ull) {	// non-canonical
    584       x_exp = 0;
    585       C1 = 0;
    586     }
    587   } else {
    588     x_exp = (x & MASK_BINARY_EXPONENT1) >> 53;	// biased
    589     C1 = x & MASK_BINARY_SIG1;
    590   }
    591 
    592   // check for zeros (possibly from non-canonical values)
    593   if (C1 == 0x0ull) {
    594     // x is 0
    595     res = 0x00000000;
    596     BID_RETURN (res);
    597   }
    598   // x is not special and is not zero
    599 
    600   if (x_sign) {	// if n < 0 the conversion is invalid
    601     // set invalid flag
    602     *pfpsf |= INVALID_EXCEPTION;
    603     // return Integer Indefinite
    604     res = 0x80000000;
    605     BID_RETURN (res);
    606   }
    607   // q = nr. of decimal digits in x (1 <= q <= 54)
    608   //  determine first the nr. of bits in x
    609   if (C1 >= 0x0020000000000000ull) {	// x >= 2^53
    610     // split the 64-bit value in two 32-bit halves to avoid rounding errors
    611     if (C1 >= 0x0000000100000000ull) {	// x >= 2^32
    612       tmp1.d = (double) (C1 >> 32);	// exact conversion
    613       x_nr_bits =
    614 	33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
    615     } else {	// x < 2^32
    616       tmp1.d = (double) C1;	// exact conversion
    617       x_nr_bits =
    618 	1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
    619     }
    620   } else {	// if x < 2^53
    621     tmp1.d = (double) C1;	// exact conversion
    622     x_nr_bits =
    623       1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
    624   }
    625   q = nr_digits[x_nr_bits - 1].digits;
    626   if (q == 0) {
    627     q = nr_digits[x_nr_bits - 1].digits1;
    628     if (C1 >= nr_digits[x_nr_bits - 1].threshold_lo)
    629       q++;
    630   }
    631   exp = x_exp - 398;	// unbiased exponent
    632 
    633   if ((q + exp) > 10) {	// x >= 10^10 ~= 2^33.2... (cannot fit in 32 bits)
    634     // set invalid flag
    635     *pfpsf |= INVALID_EXCEPTION;
    636     // return Integer Indefinite
    637     res = 0x80000000;
    638     BID_RETURN (res);
    639   } else if ((q + exp) == 10) {	// x = c(0)c(1)...c(9).c(10)...c(q-1)
    640     // in this case 2^29.89... ~= 10^9 <= x < 10^10 ~= 2^33.2...
    641     // so x rounded to an integer may or may not fit in an unsigned 32-bit int
    642     // the cases that do not fit are identified here; the ones that fit
    643     // fall through and will be handled with other cases further,
    644     // under '1 <= q + exp <= 10'
    645     // n > 0 and q + exp = 10
    646     // if n >= 2^32 then n is too large
    647     // too large if c(0)c(1)...c(9).c(10)...c(q-1) >= 2^32
    648     // <=> 0.c(0)c(1)...c(q-1) * 10^11 >= 0xa00000000, 1<=q<=16
    649     // <=> C * 10^(11-q) >= 0xa00000000, 1<=q<=16
    650     if (q <= 11) {
    651       // Note: C * 10^(11-q) has 10 or 11 digits; 0xa00000000 has 11 digits
    652       tmp64 = C1 * ten2k64[11 - q];	// C scaled up to 11-digit int
    653       // c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
    654       if (tmp64 >= 0xa00000000ull) {
    655 	// set invalid flag
    656 	*pfpsf |= INVALID_EXCEPTION;
    657 	// return Integer Indefinite
    658 	res = 0x80000000;
    659 	BID_RETURN (res);
    660       }
    661       // else cases that can be rounded to a 32-bit unsigned int fall through
    662       // to '1 <= q + exp <= 10'
    663     } else {	// if (q > 11), i.e. 12 <= q <= 16 and so -15 <= exp <= -2
    664       // C * 10^(11-q) >= 0xa00000000 <=>
    665       // C >= 0xa00000000 * 10^(q-11) where 1 <= q - 11 <= 5
    666       // (scale 2^32-1/2 up)
    667       // Note: 0xa00000000*10^(q-11) has q-1 or q digits, where q <= 16
    668       tmp64 = 0xa00000000ull * ten2k64[q - 11];
    669       if (C1 >= tmp64) {
    670 	// set invalid flag
    671 	*pfpsf |= INVALID_EXCEPTION;
    672 	// return Integer Indefinite
    673 	res = 0x80000000;
    674 	BID_RETURN (res);
    675       }
    676       // else cases that can be rounded to a 32-bit int fall through
    677       // to '1 <= q + exp <= 10'
    678     }
    679   }
    680   // n is not too large to be converted to int32 if -1 < n < 2^32
    681   // Note: some of the cases tested for above fall through to this point
    682   if ((q + exp) <= 0) {	// n = +0.[0...0]c(0)c(1)...c(q-1)
    683     // return 0
    684     res = 0x00000000;
    685     BID_RETURN (res);
    686   } else {	// if (1 <= q + exp <= 10, 1 <= q <= 16, -15 <= exp <= 9)
    687     // 1 <= x < 2^32 so x can be rounded
    688     // to nearest to a 32-bit unsigned integer
    689     if (exp < 0) {	// 2 <= q <= 16, -15 <= exp <= -1, 1 <= q + exp <= 10
    690       ind = -exp;	// 1 <= ind <= 15; ind is a synonym for 'x'
    691       // chop off ind digits from the lower part of C1
    692       // C1 fits in 64 bits
    693       // calculate C* and f*
    694       // C* is actually floor(C*) in this case
    695       // C* and f* need shifting and masking, as shown by
    696       // shiftright128[] and maskhigh128[]
    697       // 1 <= x <= 15
    698       // kx = 10^(-x) = ten2mk64[ind - 1]
    699       // C* = C1 * 10^(-x)
    700       // the approximation of 10^(-x) was rounded up to 54 bits
    701       __mul_64x64_to_128MACH (P128, C1, ten2mk64[ind - 1]);
    702       Cstar = P128.w[1];
    703       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind].w[0], e.g.
    704       // if x=1, T*=ten2mk128trunc[0].w[0]=0x1999999999999999
    705       // C* = floor(C*) (logical right shift; C has p decimal digits,
    706       //     correct by Property 1)
    707       // n = C* * 10^(e+x)
    708 
    709       // shift right C* by Ex-64 = shiftright128[ind]
    710       shift = shiftright128[ind - 1];	// 0 <= shift <= 39
    711       Cstar = Cstar >> shift;
    712 
    713       res = Cstar;	// the result is positive
    714     } else if (exp == 0) {
    715       // 1 <= q <= 10
    716       // res = +C (exact)
    717       res = C1;	// the result is positive
    718     } else {	// if (exp > 0) => 1 <= exp <= 9, 1 <= q < 9, 2 <= q + exp <= 10
    719       // res = +C * 10^exp (exact)
    720       res = C1 * ten2k64[exp];	// the result is positive
    721     }
    722   }
    723   BID_RETURN (res);
    724 }
    725 
    726 /*****************************************************************************
    727  *  BID64_to_uint32_xfloor
    728  ****************************************************************************/
    729 
    730 #if DECIMAL_CALL_BY_REFERENCE
    731 void
    732 bid64_to_uint32_xfloor (unsigned int *pres, UINT64 * px
    733 			_EXC_FLAGS_PARAM _EXC_MASKS_PARAM
    734 			_EXC_INFO_PARAM) {
    735   UINT64 x = *px;
    736 #else
    737 unsigned int
    738 bid64_to_uint32_xfloor (UINT64 x
    739 			_EXC_FLAGS_PARAM _EXC_MASKS_PARAM
    740 			_EXC_INFO_PARAM) {
    741 #endif
    742   unsigned int res;
    743   UINT64 x_sign;
    744   UINT64 x_exp;
    745   int exp;			// unbiased exponent
    746   // Note: C1 represents x_significand (UINT64)
    747   UINT64 tmp64;
    748   BID_UI64DOUBLE tmp1;
    749   unsigned int x_nr_bits;
    750   int q, ind, shift;
    751   UINT64 C1;
    752   UINT64 Cstar;			// C* represents up to 16 decimal digits ~ 54 bits
    753   UINT128 fstar;
    754   UINT128 P128;
    755 
    756   // check for NaN or Infinity
    757   if ((x & MASK_NAN) == MASK_NAN || (x & MASK_INF) == MASK_INF) {
    758     // set invalid flag
    759     *pfpsf |= INVALID_EXCEPTION;
    760     // return Integer Indefinite
    761     res = 0x80000000;
    762     BID_RETURN (res);
    763   }
    764   // unpack x
    765   x_sign = x & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
    766   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
    767   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
    768     x_exp = (x & MASK_BINARY_EXPONENT2) >> 51;	// biased
    769     C1 = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
    770     if (C1 > 9999999999999999ull) {	// non-canonical
    771       x_exp = 0;
    772       C1 = 0;
    773     }
    774   } else {
    775     x_exp = (x & MASK_BINARY_EXPONENT1) >> 53;	// biased
    776     C1 = x & MASK_BINARY_SIG1;
    777   }
    778 
    779   // check for zeros (possibly from non-canonical values)
    780   if (C1 == 0x0ull) {
    781     // x is 0
    782     res = 0x00000000;
    783     BID_RETURN (res);
    784   }
    785   // x is not special and is not zero
    786 
    787   if (x_sign) {	// if n < 0 the conversion is invalid
    788     // set invalid flag
    789     *pfpsf |= INVALID_EXCEPTION;
    790     // return Integer Indefinite
    791     res = 0x80000000;
    792     BID_RETURN (res);
    793   }
    794   // q = nr. of decimal digits in x (1 <= q <= 54)
    795   //  determine first the nr. of bits in x
    796   if (C1 >= 0x0020000000000000ull) {	// x >= 2^53
    797     // split the 64-bit value in two 32-bit halves to avoid rounding errors
    798     if (C1 >= 0x0000000100000000ull) {	// x >= 2^32
    799       tmp1.d = (double) (C1 >> 32);	// exact conversion
    800       x_nr_bits =
    801 	33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
    802     } else {	// x < 2^32
    803       tmp1.d = (double) C1;	// exact conversion
    804       x_nr_bits =
    805 	1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
    806     }
    807   } else {	// if x < 2^53
    808     tmp1.d = (double) C1;	// exact conversion
    809     x_nr_bits =
    810       1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
    811   }
    812   q = nr_digits[x_nr_bits - 1].digits;
    813   if (q == 0) {
    814     q = nr_digits[x_nr_bits - 1].digits1;
    815     if (C1 >= nr_digits[x_nr_bits - 1].threshold_lo)
    816       q++;
    817   }
    818   exp = x_exp - 398;	// unbiased exponent
    819 
    820   if ((q + exp) > 10) {	// x >= 10^10 ~= 2^33.2... (cannot fit in 32 bits)
    821     // set invalid flag
    822     *pfpsf |= INVALID_EXCEPTION;
    823     // return Integer Indefinite
    824     res = 0x80000000;
    825     BID_RETURN (res);
    826   } else if ((q + exp) == 10) {	// x = c(0)c(1)...c(9).c(10)...c(q-1)
    827     // in this case 2^29.89... ~= 10^9 <= x < 10^10 ~= 2^33.2...
    828     // so x rounded to an integer may or may not fit in an unsigned 32-bit int
    829     // the cases that do not fit are identified here; the ones that fit
    830     // fall through and will be handled with other cases further,
    831     // under '1 <= q + exp <= 10'
    832     // if n > 0 and q + exp = 10
    833     // if n >= 2^32 then n is too large
    834     // too large if c(0)c(1)...c(9).c(10)...c(q-1) >= 2^32
    835     // <=> 0.c(0)c(1)...c(q-1) * 10^11 >= 0xa00000000, 1<=q<=16
    836     // <=> C * 10^(11-q) >= 0xa00000000, 1<=q<=16
    837     if (q <= 11) {
    838       // Note: C * 10^(11-q) has 10 or 11 digits; 0xa00000000 has 11 digits
    839       tmp64 = C1 * ten2k64[11 - q];	// C scaled up to 11-digit int
    840       // c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
    841       if (tmp64 >= 0xa00000000ull) {
    842 	// set invalid flag
    843 	*pfpsf |= INVALID_EXCEPTION;
    844 	// return Integer Indefinite
    845 	res = 0x80000000;
    846 	BID_RETURN (res);
    847       }
    848       // else cases that can be rounded to a 32-bit unsigned int fall through
    849       // to '1 <= q + exp <= 10'
    850     } else {	// if (q > 11), i.e. 12 <= q <= 16 and so -15 <= exp <= -2
    851       // C * 10^(11-q) >= 0xa00000000 <=>
    852       // C >= 0xa00000000 * 10^(q-11) where 1 <= q - 11 <= 5
    853       // (scale 2^32-1/2 up)
    854       // Note: 0xa00000000*10^(q-11) has q-1 or q digits, where q <= 16
    855       tmp64 = 0xa00000000ull * ten2k64[q - 11];
    856       if (C1 >= tmp64) {
    857 	// set invalid flag
    858 	*pfpsf |= INVALID_EXCEPTION;
    859 	// return Integer Indefinite
    860 	res = 0x80000000;
    861 	BID_RETURN (res);
    862       }
    863       // else cases that can be rounded to a 32-bit int fall through
    864       // to '1 <= q + exp <= 10'
    865     }
    866   }
    867   // n is not too large to be converted to int32 if -1 < n < 2^32
    868   // Note: some of the cases tested for above fall through to this point
    869   if ((q + exp) <= 0) {	// n = +/-0.[0...0]c(0)c(1)...c(q-1)
    870     // set inexact flag
    871     *pfpsf |= INEXACT_EXCEPTION;
    872     // return 0
    873     res = 0x00000000;
    874     BID_RETURN (res);
    875   } else {	// if (1 <= q + exp <= 10, 1 <= q <= 16, -15 <= exp <= 9)
    876     // 1 <= x < 2^32 so x can be rounded
    877     // to nearest to a 32-bit unsigned integer
    878     if (exp < 0) {	// 2 <= q <= 16, -15 <= exp <= -1, 1 <= q + exp <= 10
    879       ind = -exp;	// 1 <= ind <= 15; ind is a synonym for 'x'
    880       // chop off ind digits from the lower part of C1
    881       // C1 fits in 64 bits
    882       // calculate C* and f*
    883       // C* is actually floor(C*) in this case
    884       // C* and f* need shifting and masking, as shown by
    885       // shiftright128[] and maskhigh128[]
    886       // 1 <= x <= 15
    887       // kx = 10^(-x) = ten2mk64[ind - 1]
    888       // C* = C1 * 10^(-x)
    889       // the approximation of 10^(-x) was rounded up to 54 bits
    890       __mul_64x64_to_128MACH (P128, C1, ten2mk64[ind - 1]);
    891       Cstar = P128.w[1];
    892       fstar.w[1] = P128.w[1] & maskhigh128[ind - 1];
    893       fstar.w[0] = P128.w[0];
    894       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind].w[0], e.g.
    895       // if x=1, T*=ten2mk128trunc[0].w[0]=0x1999999999999999
    896       // C* = floor(C*) (logical right shift; C has p decimal digits,
    897       //     correct by Property 1)
    898       // n = C* * 10^(e+x)
    899 
    900       // shift right C* by Ex-64 = shiftright128[ind]
    901       shift = shiftright128[ind - 1];	// 0 <= shift <= 39
    902       Cstar = Cstar >> shift;
    903       // determine inexactness of the rounding of C*
    904       // if (0 < f* < 10^(-x)) then
    905       //   the result is exact
    906       // else // if (f* > T*) then
    907       //   the result is inexact
    908       if (ind - 1 <= 2) {
    909 	if (fstar.w[0] > ten2mk128trunc[ind - 1].w[1]) {
    910 	  // ten2mk128trunc[ind -1].w[1] is identical to
    911 	  // ten2mk128[ind -1].w[1]
    912 	  // set the inexact flag
    913 	  *pfpsf |= INEXACT_EXCEPTION;
    914 	}	// else the result is exact
    915       } else {	// if 3 <= ind - 1 <= 14
    916 	if (fstar.w[1] || fstar.w[0] > ten2mk128trunc[ind - 1].w[1]) {
    917 	  // ten2mk128trunc[ind -1].w[1] is identical to
    918 	  // ten2mk128[ind -1].w[1]
    919 	  // set the inexact flag
    920 	  *pfpsf |= INEXACT_EXCEPTION;
    921 	}	// else the result is exact
    922       }
    923 
    924       res = Cstar;	// the result is positive
    925     } else if (exp == 0) {
    926       // 1 <= q <= 10
    927       // res = +C (exact)
    928       res = C1;	// the result is positive
    929     } else {	// if (exp > 0) => 1 <= exp <= 9, 1 <= q < 9, 2 <= q + exp <= 10
    930       // res = +C * 10^exp (exact)
    931       res = C1 * ten2k64[exp];	// the result is positive
    932     }
    933   }
    934   BID_RETURN (res);
    935 }
    936 
    937 /*****************************************************************************
    938  *  BID64_to_uint32_ceil
    939  ****************************************************************************/
    940 
    941 #if DECIMAL_CALL_BY_REFERENCE
    942 void
    943 bid64_to_uint32_ceil (unsigned int *pres, UINT64 * px
    944 		      _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
    945 		      _EXC_INFO_PARAM) {
    946   UINT64 x = *px;
    947 #else
    948 unsigned int
    949 bid64_to_uint32_ceil (UINT64 x
    950 		      _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
    951 		      _EXC_INFO_PARAM) {
    952 #endif
    953   unsigned int res;
    954   UINT64 x_sign;
    955   UINT64 x_exp;
    956   int exp;			// unbiased exponent
    957   // Note: C1 represents x_significand (UINT64)
    958   UINT64 tmp64;
    959   BID_UI64DOUBLE tmp1;
    960   unsigned int x_nr_bits;
    961   int q, ind, shift;
    962   UINT64 C1;
    963   UINT64 Cstar;			// C* represents up to 16 decimal digits ~ 54 bits
    964   UINT128 fstar;
    965   UINT128 P128;
    966 
    967   // check for NaN or Infinity
    968   if ((x & MASK_NAN) == MASK_NAN || (x & MASK_INF) == MASK_INF) {
    969     // set invalid flag
    970     *pfpsf |= INVALID_EXCEPTION;
    971     // return Integer Indefinite
    972     res = 0x80000000;
    973     BID_RETURN (res);
    974   }
    975   // unpack x
    976   x_sign = x & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
    977   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
    978   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
    979     x_exp = (x & MASK_BINARY_EXPONENT2) >> 51;	// biased
    980     C1 = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
    981     if (C1 > 9999999999999999ull) {	// non-canonical
    982       x_exp = 0;
    983       C1 = 0;
    984     }
    985   } else {
    986     x_exp = (x & MASK_BINARY_EXPONENT1) >> 53;	// biased
    987     C1 = x & MASK_BINARY_SIG1;
    988   }
    989 
    990   // check for zeros (possibly from non-canonical values)
    991   if (C1 == 0x0ull) {
    992     // x is 0
    993     res = 0x00000000;
    994     BID_RETURN (res);
    995   }
    996   // x is not special and is not zero
    997 
    998   // q = nr. of decimal digits in x (1 <= q <= 54)
    999   //  determine first the nr. of bits in x
   1000   if (C1 >= 0x0020000000000000ull) {	// x >= 2^53
   1001     // split the 64-bit value in two 32-bit halves to avoid rounding errors
   1002     if (C1 >= 0x0000000100000000ull) {	// x >= 2^32
   1003       tmp1.d = (double) (C1 >> 32);	// exact conversion
   1004       x_nr_bits =
   1005 	33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
   1006     } else {	// x < 2^32
   1007       tmp1.d = (double) C1;	// exact conversion
   1008       x_nr_bits =
   1009 	1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
   1010     }
   1011   } else {	// if x < 2^53
   1012     tmp1.d = (double) C1;	// exact conversion
   1013     x_nr_bits =
   1014       1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
   1015   }
   1016   q = nr_digits[x_nr_bits - 1].digits;
   1017   if (q == 0) {
   1018     q = nr_digits[x_nr_bits - 1].digits1;
   1019     if (C1 >= nr_digits[x_nr_bits - 1].threshold_lo)
   1020       q++;
   1021   }
   1022   exp = x_exp - 398;	// unbiased exponent
   1023 
   1024   if ((q + exp) > 10) {	// x >= 10^10 ~= 2^33.2... (cannot fit in 32 bits)
   1025     // set invalid flag
   1026     *pfpsf |= INVALID_EXCEPTION;
   1027     // return Integer Indefinite
   1028     res = 0x80000000;
   1029     BID_RETURN (res);
   1030   } else if ((q + exp) == 10) {	// x = c(0)c(1)...c(9).c(10)...c(q-1)
   1031     // in this case 2^29.89... ~= 10^9 <= x < 10^10 ~= 2^33.2...
   1032     // so x rounded to an integer may or may not fit in an unsigned 32-bit int
   1033     // the cases that do not fit are identified here; the ones that fit
   1034     // fall through and will be handled with other cases further,
   1035     // under '1 <= q + exp <= 10'
   1036     if (x_sign) {	// if n < 0 and q + exp = 10 then x is much less than -1
   1037       // => set invalid flag
   1038       *pfpsf |= INVALID_EXCEPTION;
   1039       // return Integer Indefinite
   1040       res = 0x80000000;
   1041       BID_RETURN (res);
   1042     } else {	// if n > 0 and q + exp = 10
   1043       // if n > 2^32 - 1 then n is too large
   1044       // too large if c(0)c(1)...c(9).c(10)...c(q-1) > 2^32 - 1
   1045       // <=> 0.c(0)c(1)...c(q-1) * 10^11 > 0x9fffffff6, 1<=q<=16
   1046       // <=> C * 10^(11-q) > 0x9fffffff6, 1<=q<=16
   1047       if (q <= 11) {
   1048 	// Note: C * 10^(11-q) has 10 or 11 digits; 0x9fffffff6 has 11 digits
   1049 	tmp64 = C1 * ten2k64[11 - q];	// C scaled up to 11-digit int
   1050 	// c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
   1051 	if (tmp64 > 0x9fffffff6ull) {
   1052 	  // set invalid flag
   1053 	  *pfpsf |= INVALID_EXCEPTION;
   1054 	  // return Integer Indefinite
   1055 	  res = 0x80000000;
   1056 	  BID_RETURN (res);
   1057 	}
   1058 	// else cases that can be rounded to a 32-bit unsigned int fall through
   1059 	// to '1 <= q + exp <= 10'
   1060       } else {	// if (q > 11), i.e. 12 <= q <= 16 and so -15 <= exp <= -2
   1061 	// C * 10^(11-q) > 0x9fffffff6 <=>
   1062 	// C > 0x9fffffff6 * 10^(q-11) where 1 <= q - 11 <= 5
   1063 	// (scale 2^32-1 up)
   1064 	// Note: 0x9fffffff6*10^(q-11) has q-1 or q digits, where q <= 16
   1065 	tmp64 = 0x9fffffff6ull * ten2k64[q - 11];
   1066 	if (C1 > tmp64) {
   1067 	  // set invalid flag
   1068 	  *pfpsf |= INVALID_EXCEPTION;
   1069 	  // return Integer Indefinite
   1070 	  res = 0x80000000;
   1071 	  BID_RETURN (res);
   1072 	}
   1073 	// else cases that can be rounded to a 32-bit int fall through
   1074 	// to '1 <= q + exp <= 10'
   1075       }
   1076     }
   1077   }
   1078   // n is not too large to be converted to int32 if -1 < n < 2^32
   1079   // Note: some of the cases tested for above fall through to this point
   1080   if ((q + exp) <= 0) {	// n = +/-0.[0...0]c(0)c(1)...c(q-1)
   1081     // return 0 or 1
   1082     if (x_sign)
   1083       res = 0x00000000;
   1084     else
   1085       res = 0x00000001;
   1086     BID_RETURN (res);
   1087   } else {	// if (1 <= q + exp <= 10, 1 <= q <= 16, -15 <= exp <= 9)
   1088     // x <= -1 or 1 <= x <= 2^32 - 1 so if positive, x can be
   1089     // rounded to nearest to a 32-bit unsigned integer
   1090     if (x_sign) {	// x <= -1
   1091       // set invalid flag
   1092       *pfpsf |= INVALID_EXCEPTION;
   1093       // return Integer Indefinite
   1094       res = 0x80000000;
   1095       BID_RETURN (res);
   1096     }
   1097     // 1 <= x <= 2^32 - 1 so x can be rounded
   1098     // to nearest to a 32-bit unsigned integer
   1099     if (exp < 0) {	// 2 <= q <= 16, -15 <= exp <= -1, 1 <= q + exp <= 10
   1100       ind = -exp;	// 1 <= ind <= 15; ind is a synonym for 'x'
   1101       // chop off ind digits from the lower part of C1
   1102       // C1 fits in 64 bits
   1103       // calculate C* and f*
   1104       // C* is actually floor(C*) in this case
   1105       // C* and f* need shifting and masking, as shown by
   1106       // shiftright128[] and maskhigh128[]
   1107       // 1 <= x <= 15
   1108       // kx = 10^(-x) = ten2mk64[ind - 1]
   1109       // C* = C1 * 10^(-x)
   1110       // the approximation of 10^(-x) was rounded up to 54 bits
   1111       __mul_64x64_to_128MACH (P128, C1, ten2mk64[ind - 1]);
   1112       Cstar = P128.w[1];
   1113       fstar.w[1] = P128.w[1] & maskhigh128[ind - 1];
   1114       fstar.w[0] = P128.w[0];
   1115       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind].w[0], e.g.
   1116       // if x=1, T*=ten2mk128trunc[0].w[0]=0x1999999999999999
   1117       // C* = floor(C*) (logical right shift; C has p decimal digits,
   1118       //     correct by Property 1)
   1119       // n = C* * 10^(e+x)
   1120 
   1121       // shift right C* by Ex-64 = shiftright128[ind]
   1122       shift = shiftright128[ind - 1];	// 0 <= shift <= 39
   1123       Cstar = Cstar >> shift;
   1124       // determine inexactness of the rounding of C*
   1125       // if (0 < f* < 10^(-x)) then
   1126       //   the result is exact
   1127       // else // if (f* > T*) then
   1128       //   the result is inexact
   1129       if (ind - 1 <= 2) {	// fstar.w[1] is 0
   1130 	if (fstar.w[0] > ten2mk128trunc[ind - 1].w[1]) {
   1131 	  // ten2mk128trunc[ind -1].w[1] is identical to
   1132 	  // ten2mk128[ind -1].w[1]
   1133 	  Cstar++;
   1134 	}	// else the result is exact
   1135       } else {	// if 3 <= ind - 1 <= 14
   1136 	if (fstar.w[1] || fstar.w[0] > ten2mk128trunc[ind - 1].w[1]) {
   1137 	  // ten2mk128trunc[ind -1].w[1] is identical to
   1138 	  // ten2mk128[ind -1].w[1]
   1139 	  Cstar++;
   1140 	}	// else the result is exact
   1141       }
   1142 
   1143       res = Cstar;	// the result is positive
   1144     } else if (exp == 0) {
   1145       // 1 <= q <= 10
   1146       // res = +C (exact)
   1147       res = C1;	// the result is positive
   1148     } else {	// if (exp > 0) => 1 <= exp <= 9, 1 <= q < 9, 2 <= q + exp <= 10
   1149       // res = +C * 10^exp (exact)
   1150       res = C1 * ten2k64[exp];	// the result is positive
   1151     }
   1152   }
   1153   BID_RETURN (res);
   1154 }
   1155 
   1156 /*****************************************************************************
   1157  *  BID64_to_uint32_xceil
   1158  ****************************************************************************/
   1159 
   1160 #if DECIMAL_CALL_BY_REFERENCE
   1161 void
   1162 bid64_to_uint32_xceil (unsigned int *pres, UINT64 * px
   1163 		       _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
   1164 		       _EXC_INFO_PARAM) {
   1165   UINT64 x = *px;
   1166 #else
   1167 unsigned int
   1168 bid64_to_uint32_xceil (UINT64 x
   1169 		       _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
   1170 		       _EXC_INFO_PARAM) {
   1171 #endif
   1172   unsigned int res;
   1173   UINT64 x_sign;
   1174   UINT64 x_exp;
   1175   int exp;			// unbiased exponent
   1176   // Note: C1 represents x_significand (UINT64)
   1177   UINT64 tmp64;
   1178   BID_UI64DOUBLE tmp1;
   1179   unsigned int x_nr_bits;
   1180   int q, ind, shift;
   1181   UINT64 C1;
   1182   UINT64 Cstar;			// C* represents up to 16 decimal digits ~ 54 bits
   1183   UINT128 fstar;
   1184   UINT128 P128;
   1185 
   1186   // check for NaN or Infinity
   1187   if ((x & MASK_NAN) == MASK_NAN || (x & MASK_INF) == MASK_INF) {
   1188     // set invalid flag
   1189     *pfpsf |= INVALID_EXCEPTION;
   1190     // return Integer Indefinite
   1191     res = 0x80000000;
   1192     BID_RETURN (res);
   1193   }
   1194   // unpack x
   1195   x_sign = x & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
   1196   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
   1197   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
   1198     x_exp = (x & MASK_BINARY_EXPONENT2) >> 51;	// biased
   1199     C1 = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
   1200     if (C1 > 9999999999999999ull) {	// non-canonical
   1201       x_exp = 0;
   1202       C1 = 0;
   1203     }
   1204   } else {
   1205     x_exp = (x & MASK_BINARY_EXPONENT1) >> 53;	// biased
   1206     C1 = x & MASK_BINARY_SIG1;
   1207   }
   1208 
   1209   // check for zeros (possibly from non-canonical values)
   1210   if (C1 == 0x0ull) {
   1211     // x is 0
   1212     res = 0x00000000;
   1213     BID_RETURN (res);
   1214   }
   1215   // x is not special and is not zero
   1216 
   1217   // q = nr. of decimal digits in x (1 <= q <= 54)
   1218   //  determine first the nr. of bits in x
   1219   if (C1 >= 0x0020000000000000ull) {	// x >= 2^53
   1220     // split the 64-bit value in two 32-bit halves to avoid rounding errors
   1221     if (C1 >= 0x0000000100000000ull) {	// x >= 2^32
   1222       tmp1.d = (double) (C1 >> 32);	// exact conversion
   1223       x_nr_bits =
   1224 	33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
   1225     } else {	// x < 2^32
   1226       tmp1.d = (double) C1;	// exact conversion
   1227       x_nr_bits =
   1228 	1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
   1229     }
   1230   } else {	// if x < 2^53
   1231     tmp1.d = (double) C1;	// exact conversion
   1232     x_nr_bits =
   1233       1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
   1234   }
   1235   q = nr_digits[x_nr_bits - 1].digits;
   1236   if (q == 0) {
   1237     q = nr_digits[x_nr_bits - 1].digits1;
   1238     if (C1 >= nr_digits[x_nr_bits - 1].threshold_lo)
   1239       q++;
   1240   }
   1241   exp = x_exp - 398;	// unbiased exponent
   1242 
   1243   if ((q + exp) > 10) {	// x >= 10^10 ~= 2^33.2... (cannot fit in 32 bits)
   1244     // set invalid flag
   1245     *pfpsf |= INVALID_EXCEPTION;
   1246     // return Integer Indefinite
   1247     res = 0x80000000;
   1248     BID_RETURN (res);
   1249   } else if ((q + exp) == 10) {	// x = c(0)c(1)...c(9).c(10)...c(q-1)
   1250     // in this case 2^29.89... ~= 10^9 <= x < 10^10 ~= 2^33.2...
   1251     // so x rounded to an integer may or may not fit in an unsigned 32-bit int
   1252     // the cases that do not fit are identified here; the ones that fit
   1253     // fall through and will be handled with other cases further,
   1254     // under '1 <= q + exp <= 10'
   1255     if (x_sign) {	// if n < 0 and q + exp = 10 then x is much less than -1
   1256       // => set invalid flag
   1257       *pfpsf |= INVALID_EXCEPTION;
   1258       // return Integer Indefinite
   1259       res = 0x80000000;
   1260       BID_RETURN (res);
   1261     } else {	// if n > 0 and q + exp = 10
   1262       // if n > 2^32 - 1 then n is too large
   1263       // too large if c(0)c(1)...c(9).c(10)...c(q-1) > 2^32 - 1
   1264       // <=> 0.c(0)c(1)...c(q-1) * 10^11 > 0x9fffffff6, 1<=q<=16
   1265       // <=> C * 10^(11-q) > 0x9fffffff6, 1<=q<=16
   1266       if (q <= 11) {
   1267 	// Note: C * 10^(11-q) has 10 or 11 digits; 0x9fffffff6 has 11 digits
   1268 	tmp64 = C1 * ten2k64[11 - q];	// C scaled up to 11-digit int
   1269 	// c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
   1270 	if (tmp64 > 0x9fffffff6ull) {
   1271 	  // set invalid flag
   1272 	  *pfpsf |= INVALID_EXCEPTION;
   1273 	  // return Integer Indefinite
   1274 	  res = 0x80000000;
   1275 	  BID_RETURN (res);
   1276 	}
   1277 	// else cases that can be rounded to a 32-bit unsigned int fall through
   1278 	// to '1 <= q + exp <= 10'
   1279       } else {	// if (q > 11), i.e. 12 <= q <= 16 and so -15 <= exp <= -2
   1280 	// C * 10^(11-q) > 0x9fffffff6 <=>
   1281 	// C > 0x9fffffff6 * 10^(q-11) where 1 <= q - 11 <= 5
   1282 	// (scale 2^32-1 up)
   1283 	// Note: 0x9fffffff6*10^(q-11) has q-1 or q digits, where q <= 16
   1284 	tmp64 = 0x9fffffff6ull * ten2k64[q - 11];
   1285 	if (C1 > tmp64) {
   1286 	  // set invalid flag
   1287 	  *pfpsf |= INVALID_EXCEPTION;
   1288 	  // return Integer Indefinite
   1289 	  res = 0x80000000;
   1290 	  BID_RETURN (res);
   1291 	}
   1292 	// else cases that can be rounded to a 32-bit int fall through
   1293 	// to '1 <= q + exp <= 10'
   1294       }
   1295     }
   1296   }
   1297   // n is not too large to be converted to int32 if -1 < n < 2^32
   1298   // Note: some of the cases tested for above fall through to this point
   1299   if ((q + exp) <= 0) {	// n = +/-0.[0...0]c(0)c(1)...c(q-1)
   1300     // set inexact flag
   1301     *pfpsf |= INEXACT_EXCEPTION;
   1302     // return 0 or 1
   1303     if (x_sign)
   1304       res = 0x00000000;
   1305     else
   1306       res = 0x00000001;
   1307     BID_RETURN (res);
   1308   } else {	// if (1 <= q + exp <= 10, 1 <= q <= 16, -15 <= exp <= 9)
   1309     // x <= -1 or 1 <= x < 2^32 so if positive, x can be
   1310     // rounded to nearest to a 32-bit unsigned integer
   1311     if (x_sign) {	// x <= -1
   1312       // set invalid flag
   1313       *pfpsf |= INVALID_EXCEPTION;
   1314       // return Integer Indefinite
   1315       res = 0x80000000;
   1316       BID_RETURN (res);
   1317     }
   1318     // 1 <= x < 2^32 so x can be rounded
   1319     // to nearest to a 32-bit unsigned integer
   1320     if (exp < 0) {	// 2 <= q <= 16, -15 <= exp <= -1, 1 <= q + exp <= 10
   1321       ind = -exp;	// 1 <= ind <= 15; ind is a synonym for 'x'
   1322       // chop off ind digits from the lower part of C1
   1323       // C1 fits in 64 bits
   1324       // calculate C* and f*
   1325       // C* is actually floor(C*) in this case
   1326       // C* and f* need shifting and masking, as shown by
   1327       // shiftright128[] and maskhigh128[]
   1328       // 1 <= x <= 15
   1329       // kx = 10^(-x) = ten2mk64[ind - 1]
   1330       // C* = C1 * 10^(-x)
   1331       // the approximation of 10^(-x) was rounded up to 54 bits
   1332       __mul_64x64_to_128MACH (P128, C1, ten2mk64[ind - 1]);
   1333       Cstar = P128.w[1];
   1334       fstar.w[1] = P128.w[1] & maskhigh128[ind - 1];
   1335       fstar.w[0] = P128.w[0];
   1336       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind].w[0], e.g.
   1337       // if x=1, T*=ten2mk128trunc[0].w[0]=0x1999999999999999
   1338       // C* = floor(C*) (logical right shift; C has p decimal digits,
   1339       //     correct by Property 1)
   1340       // n = C* * 10^(e+x)
   1341 
   1342       // shift right C* by Ex-64 = shiftright128[ind]
   1343       shift = shiftright128[ind - 1];	// 0 <= shift <= 39
   1344       Cstar = Cstar >> shift;
   1345       // determine inexactness of the rounding of C*
   1346       // if (0 < f* < 10^(-x)) then
   1347       //   the result is exact
   1348       // else // if (f* > T*) then
   1349       //   the result is inexact
   1350       if (ind - 1 <= 2) {	// fstar.w[1] is 0
   1351 	if (fstar.w[0] > ten2mk128trunc[ind - 1].w[1]) {
   1352 	  // ten2mk128trunc[ind -1].w[1] is identical to
   1353 	  // ten2mk128[ind -1].w[1]
   1354 	  Cstar++;
   1355 	  // set the inexact flag
   1356 	  *pfpsf |= INEXACT_EXCEPTION;
   1357 	}	// else the result is exact
   1358       } else {	// if 3 <= ind - 1 <= 14
   1359 	if (fstar.w[1] || fstar.w[0] > ten2mk128trunc[ind - 1].w[1]) {
   1360 	  // ten2mk128trunc[ind -1].w[1] is identical to
   1361 	  // ten2mk128[ind -1].w[1]
   1362 	  Cstar++;
   1363 	  // set the inexact flag
   1364 	  *pfpsf |= INEXACT_EXCEPTION;
   1365 	}	// else the result is exact
   1366       }
   1367 
   1368       res = Cstar;	// the result is positive
   1369     } else if (exp == 0) {
   1370       // 1 <= q <= 10
   1371       // res = +C (exact)
   1372       res = C1;	// the result is positive
   1373     } else {	// if (exp > 0) => 1 <= exp <= 9, 1 <= q < 9, 2 <= q + exp <= 10
   1374       // res = +C * 10^exp (exact)
   1375       res = C1 * ten2k64[exp];	// the result is positive
   1376     }
   1377   }
   1378   BID_RETURN (res);
   1379 }
   1380 
   1381 /*****************************************************************************
   1382  *  BID64_to_uint32_int
   1383  ****************************************************************************/
   1384 
   1385 #if DECIMAL_CALL_BY_REFERENCE
   1386 void
   1387 bid64_to_uint32_int (unsigned int *pres, UINT64 * px
   1388 		     _EXC_FLAGS_PARAM _EXC_MASKS_PARAM _EXC_INFO_PARAM)
   1389 {
   1390   UINT64 x = *px;
   1391 #else
   1392 unsigned int
   1393 bid64_to_uint32_int (UINT64 x
   1394 		     _EXC_FLAGS_PARAM _EXC_MASKS_PARAM _EXC_INFO_PARAM)
   1395 {
   1396 #endif
   1397   unsigned int res;
   1398   UINT64 x_sign;
   1399   UINT64 x_exp;
   1400   int exp;			// unbiased exponent
   1401   // Note: C1 represents x_significand (UINT64)
   1402   UINT64 tmp64;
   1403   BID_UI64DOUBLE tmp1;
   1404   unsigned int x_nr_bits;
   1405   int q, ind, shift;
   1406   UINT64 C1;
   1407   UINT64 Cstar;			// C* represents up to 16 decimal digits ~ 54 bits
   1408   UINT128 P128;
   1409 
   1410   // check for NaN or Infinity
   1411   if ((x & MASK_NAN) == MASK_NAN || (x & MASK_INF) == MASK_INF) {
   1412     // set invalid flag
   1413     *pfpsf |= INVALID_EXCEPTION;
   1414     // return Integer Indefinite
   1415     res = 0x80000000;
   1416     BID_RETURN (res);
   1417   }
   1418   // unpack x
   1419   x_sign = x & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
   1420   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
   1421   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
   1422     x_exp = (x & MASK_BINARY_EXPONENT2) >> 51;	// biased
   1423     C1 = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
   1424     if (C1 > 9999999999999999ull) {	// non-canonical
   1425       x_exp = 0;
   1426       C1 = 0;
   1427     }
   1428   } else {
   1429     x_exp = (x & MASK_BINARY_EXPONENT1) >> 53;	// biased
   1430     C1 = x & MASK_BINARY_SIG1;
   1431   }
   1432 
   1433   // check for zeros (possibly from non-canonical values)
   1434   if (C1 == 0x0ull) {
   1435     // x is 0
   1436     res = 0x00000000;
   1437     BID_RETURN (res);
   1438   }
   1439   // x is not special and is not zero
   1440 
   1441   // q = nr. of decimal digits in x (1 <= q <= 54)
   1442   //  determine first the nr. of bits in x
   1443   if (C1 >= 0x0020000000000000ull) {	// x >= 2^53
   1444     // split the 64-bit value in two 32-bit halves to avoid rounding errors
   1445     if (C1 >= 0x0000000100000000ull) {	// x >= 2^32
   1446       tmp1.d = (double) (C1 >> 32);	// exact conversion
   1447       x_nr_bits =
   1448 	33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
   1449     } else {	// x < 2^32
   1450       tmp1.d = (double) C1;	// exact conversion
   1451       x_nr_bits =
   1452 	1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
   1453     }
   1454   } else {	// if x < 2^53
   1455     tmp1.d = (double) C1;	// exact conversion
   1456     x_nr_bits =
   1457       1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
   1458   }
   1459   q = nr_digits[x_nr_bits - 1].digits;
   1460   if (q == 0) {
   1461     q = nr_digits[x_nr_bits - 1].digits1;
   1462     if (C1 >= nr_digits[x_nr_bits - 1].threshold_lo)
   1463       q++;
   1464   }
   1465   exp = x_exp - 398;	// unbiased exponent
   1466 
   1467   if ((q + exp) > 10) {	// x >= 10^10 ~= 2^33.2... (cannot fit in 32 bits)
   1468     // set invalid flag
   1469     *pfpsf |= INVALID_EXCEPTION;
   1470     // return Integer Indefinite
   1471     res = 0x80000000;
   1472     BID_RETURN (res);
   1473   } else if ((q + exp) == 10) {	// x = c(0)c(1)...c(9).c(10)...c(q-1)
   1474     // in this case 2^29.89... ~= 10^9 <= x < 10^10 ~= 2^33.2...
   1475     // so x rounded to an integer may or may not fit in an unsigned 32-bit int
   1476     // the cases that do not fit are identified here; the ones that fit
   1477     // fall through and will be handled with other cases further,
   1478     // under '1 <= q + exp <= 10'
   1479     if (x_sign) {	// if n < 0 and q + exp = 10 then x is much less than -1
   1480       // => set invalid flag
   1481       *pfpsf |= INVALID_EXCEPTION;
   1482       // return Integer Indefinite
   1483       res = 0x80000000;
   1484       BID_RETURN (res);
   1485     } else {	// if n > 0 and q + exp = 10
   1486       // if n >= 2^32 then n is too large
   1487       // too large if c(0)c(1)...c(9).c(10)...c(q-1) >= 2^32
   1488       // <=> 0.c(0)c(1)...c(q-1) * 10^11 >= 0xa00000000, 1<=q<=16
   1489       // <=> C * 10^(11-q) >= 0xa00000000, 1<=q<=16
   1490       if (q <= 11) {
   1491 	// Note: C * 10^(11-q) has 10 or 11 digits; 0xa00000000 has 11 digits
   1492 	tmp64 = C1 * ten2k64[11 - q];	// C scaled up to 11-digit int
   1493 	// c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
   1494 	if (tmp64 >= 0xa00000000ull) {
   1495 	  // set invalid flag
   1496 	  *pfpsf |= INVALID_EXCEPTION;
   1497 	  // return Integer Indefinite
   1498 	  res = 0x80000000;
   1499 	  BID_RETURN (res);
   1500 	}
   1501 	// else cases that can be rounded to a 32-bit unsigned int fall through
   1502 	// to '1 <= q + exp <= 10'
   1503       } else {	// if (q > 11), i.e. 12 <= q <= 16 and so -15 <= exp <= -2
   1504 	// C * 10^(11-q) >= 0xa00000000 <=>
   1505 	// C >= 0xa00000000 * 10^(q-11) where 1 <= q - 11 <= 5
   1506 	// (scale 2^32-1/2 up)
   1507 	// Note: 0xa00000000*10^(q-11) has q-1 or q digits, where q <= 16
   1508 	tmp64 = 0xa00000000ull * ten2k64[q - 11];
   1509 	if (C1 >= tmp64) {
   1510 	  // set invalid flag
   1511 	  *pfpsf |= INVALID_EXCEPTION;
   1512 	  // return Integer Indefinite
   1513 	  res = 0x80000000;
   1514 	  BID_RETURN (res);
   1515 	}
   1516 	// else cases that can be rounded to a 32-bit int fall through
   1517 	// to '1 <= q + exp <= 10'
   1518       }
   1519     }
   1520   }
   1521   // n is not too large to be converted to int32 if -1 < n < 2^32
   1522   // Note: some of the cases tested for above fall through to this point
   1523   if ((q + exp) <= 0) {	// n = +/-0.[0...0]c(0)c(1)...c(q-1)
   1524     // return 0
   1525     res = 0x00000000;
   1526     BID_RETURN (res);
   1527   } else {	// if (1 <= q + exp <= 10, 1 <= q <= 16, -15 <= exp <= 9)
   1528     // x <= -1 or 1 <= x < 2^32 so if positive, x can be
   1529     // rounded to nearest to a 32-bit unsigned integer
   1530     if (x_sign) {	// x <= -1
   1531       // set invalid flag
   1532       *pfpsf |= INVALID_EXCEPTION;
   1533       // return Integer Indefinite
   1534       res = 0x80000000;
   1535       BID_RETURN (res);
   1536     }
   1537     // 1 <= x < 2^32 so x can be rounded
   1538     // to nearest to a 32-bit unsigned integer
   1539     if (exp < 0) {	// 2 <= q <= 16, -15 <= exp <= -1, 1 <= q + exp <= 10
   1540       ind = -exp;	// 1 <= ind <= 15; ind is a synonym for 'x'
   1541       // chop off ind digits from the lower part of C1
   1542       // C1 fits in 64 bits
   1543       // calculate C* and f*
   1544       // C* is actually floor(C*) in this case
   1545       // C* and f* need shifting and masking, as shown by
   1546       // shiftright128[] and maskhigh128[]
   1547       // 1 <= x <= 15
   1548       // kx = 10^(-x) = ten2mk64[ind - 1]
   1549       // C* = C1 * 10^(-x)
   1550       // the approximation of 10^(-x) was rounded up to 54 bits
   1551       __mul_64x64_to_128MACH (P128, C1, ten2mk64[ind - 1]);
   1552       Cstar = P128.w[1];
   1553       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind].w[0], e.g.
   1554       // if x=1, T*=ten2mk128trunc[0].w[0]=0x1999999999999999
   1555       // C* = floor(C*) (logical right shift; C has p decimal digits,
   1556       //     correct by Property 1)
   1557       // n = C* * 10^(e+x)
   1558 
   1559       // shift right C* by Ex-64 = shiftright128[ind]
   1560       shift = shiftright128[ind - 1];	// 0 <= shift <= 39
   1561       Cstar = Cstar >> shift;
   1562 
   1563       res = Cstar;	// the result is positive
   1564     } else if (exp == 0) {
   1565       // 1 <= q <= 10
   1566       // res = +C (exact)
   1567       res = C1;	// the result is positive
   1568     } else {	// if (exp > 0) => 1 <= exp <= 9, 1 <= q < 9, 2 <= q + exp <= 10
   1569       // res = +C * 10^exp (exact)
   1570       res = C1 * ten2k64[exp];	// the result is positive
   1571     }
   1572   }
   1573   BID_RETURN (res);
   1574 }
   1575 
   1576 /*****************************************************************************
   1577  *  BID64_to_uint32_xint
   1578  ****************************************************************************/
   1579 
   1580 #if DECIMAL_CALL_BY_REFERENCE
   1581 void
   1582 bid64_to_uint32_xint (unsigned int *pres, UINT64 * px
   1583 		      _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
   1584 		      _EXC_INFO_PARAM) {
   1585   UINT64 x = *px;
   1586 #else
   1587 unsigned int
   1588 bid64_to_uint32_xint (UINT64 x
   1589 		      _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
   1590 		      _EXC_INFO_PARAM) {
   1591 #endif
   1592   unsigned int res;
   1593   UINT64 x_sign;
   1594   UINT64 x_exp;
   1595   int exp;			// unbiased exponent
   1596   // Note: C1 represents x_significand (UINT64)
   1597   UINT64 tmp64;
   1598   BID_UI64DOUBLE tmp1;
   1599   unsigned int x_nr_bits;
   1600   int q, ind, shift;
   1601   UINT64 C1;
   1602   UINT64 Cstar;			// C* represents up to 16 decimal digits ~ 54 bits
   1603   UINT128 fstar;
   1604   UINT128 P128;
   1605 
   1606   // check for NaN or Infinity
   1607   if ((x & MASK_NAN) == MASK_NAN || (x & MASK_INF) == MASK_INF) {
   1608     // set invalid flag
   1609     *pfpsf |= INVALID_EXCEPTION;
   1610     // return Integer Indefinite
   1611     res = 0x80000000;
   1612     BID_RETURN (res);
   1613   }
   1614   // unpack x
   1615   x_sign = x & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
   1616   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
   1617   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
   1618     x_exp = (x & MASK_BINARY_EXPONENT2) >> 51;	// biased
   1619     C1 = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
   1620     if (C1 > 9999999999999999ull) {	// non-canonical
   1621       x_exp = 0;
   1622       C1 = 0;
   1623     }
   1624   } else {
   1625     x_exp = (x & MASK_BINARY_EXPONENT1) >> 53;	// biased
   1626     C1 = x & MASK_BINARY_SIG1;
   1627   }
   1628 
   1629   // check for zeros (possibly from non-canonical values)
   1630   if (C1 == 0x0ull) {
   1631     // x is 0
   1632     res = 0x00000000;
   1633     BID_RETURN (res);
   1634   }
   1635   // x is not special and is not zero
   1636 
   1637   // q = nr. of decimal digits in x (1 <= q <= 54)
   1638   //  determine first the nr. of bits in x
   1639   if (C1 >= 0x0020000000000000ull) {	// x >= 2^53
   1640     // split the 64-bit value in two 32-bit halves to avoid rounding errors
   1641     if (C1 >= 0x0000000100000000ull) {	// x >= 2^32
   1642       tmp1.d = (double) (C1 >> 32);	// exact conversion
   1643       x_nr_bits =
   1644 	33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
   1645     } else {	// x < 2^32
   1646       tmp1.d = (double) C1;	// exact conversion
   1647       x_nr_bits =
   1648 	1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
   1649     }
   1650   } else {	// if x < 2^53
   1651     tmp1.d = (double) C1;	// exact conversion
   1652     x_nr_bits =
   1653       1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
   1654   }
   1655   q = nr_digits[x_nr_bits - 1].digits;
   1656   if (q == 0) {
   1657     q = nr_digits[x_nr_bits - 1].digits1;
   1658     if (C1 >= nr_digits[x_nr_bits - 1].threshold_lo)
   1659       q++;
   1660   }
   1661   exp = x_exp - 398;	// unbiased exponent
   1662 
   1663   if ((q + exp) > 10) {	// x >= 10^10 ~= 2^33.2... (cannot fit in 32 bits)
   1664     // set invalid flag
   1665     *pfpsf |= INVALID_EXCEPTION;
   1666     // return Integer Indefinite
   1667     res = 0x80000000;
   1668     BID_RETURN (res);
   1669   } else if ((q + exp) == 10) {	// x = c(0)c(1)...c(9).c(10)...c(q-1)
   1670     // in this case 2^29.89... ~= 10^9 <= x < 10^10 ~= 2^33.2...
   1671     // so x rounded to an integer may or may not fit in an unsigned 32-bit int
   1672     // the cases that do not fit are identified here; the ones that fit
   1673     // fall through and will be handled with other cases further,
   1674     // under '1 <= q + exp <= 10'
   1675     if (x_sign) {	// if n < 0 and q + exp = 10 then x is much less than -1
   1676       // => set invalid flag
   1677       *pfpsf |= INVALID_EXCEPTION;
   1678       // return Integer Indefinite
   1679       res = 0x80000000;
   1680       BID_RETURN (res);
   1681     } else {	// if n > 0 and q + exp = 10
   1682       // if n >= 2^32 then n is too large
   1683       // too large if c(0)c(1)...c(9).c(10)...c(q-1) >= 2^32
   1684       // <=> 0.c(0)c(1)...c(q-1) * 10^11 >= 0xa00000000, 1<=q<=16
   1685       // <=> C * 10^(11-q) >= 0xa00000000, 1<=q<=16
   1686       if (q <= 11) {
   1687 	// Note: C * 10^(11-q) has 10 or 11 digits; 0xa00000000 has 11 digits
   1688 	tmp64 = C1 * ten2k64[11 - q];	// C scaled up to 11-digit int
   1689 	// c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
   1690 	if (tmp64 >= 0xa00000000ull) {
   1691 	  // set invalid flag
   1692 	  *pfpsf |= INVALID_EXCEPTION;
   1693 	  // return Integer Indefinite
   1694 	  res = 0x80000000;
   1695 	  BID_RETURN (res);
   1696 	}
   1697 	// else cases that can be rounded to a 32-bit unsigned int fall through
   1698 	// to '1 <= q + exp <= 10'
   1699       } else {	// if (q > 11), i.e. 12 <= q <= 16 and so -15 <= exp <= -2
   1700 	// C * 10^(11-q) >= 0xa00000000 <=>
   1701 	// C >= 0xa00000000 * 10^(q-11) where 1 <= q - 11 <= 5
   1702 	// (scale 2^32-1/2 up)
   1703 	// Note: 0xa00000000*10^(q-11) has q-1 or q digits, where q <= 16
   1704 	tmp64 = 0xa00000000ull * ten2k64[q - 11];
   1705 	if (C1 >= tmp64) {
   1706 	  // set invalid flag
   1707 	  *pfpsf |= INVALID_EXCEPTION;
   1708 	  // return Integer Indefinite
   1709 	  res = 0x80000000;
   1710 	  BID_RETURN (res);
   1711 	}
   1712 	// else cases that can be rounded to a 32-bit int fall through
   1713 	// to '1 <= q + exp <= 10'
   1714       }
   1715     }
   1716   }
   1717   // n is not too large to be converted to int32 if -1 < n < 2^32
   1718   // Note: some of the cases tested for above fall through to this point
   1719   if ((q + exp) <= 0) {	// n = +/-0.[0...0]c(0)c(1)...c(q-1)
   1720     // set inexact flag
   1721     *pfpsf |= INEXACT_EXCEPTION;
   1722     // return 0
   1723     res = 0x00000000;
   1724     BID_RETURN (res);
   1725   } else {	// if (1 <= q + exp <= 10, 1 <= q <= 16, -15 <= exp <= 9)
   1726     // x <= -1 or 1 <= x < 2^32 so if positive, x can be
   1727     // rounded to nearest to a 32-bit unsigned integer
   1728     if (x_sign) {	// x <= -1
   1729       // set invalid flag
   1730       *pfpsf |= INVALID_EXCEPTION;
   1731       // return Integer Indefinite
   1732       res = 0x80000000;
   1733       BID_RETURN (res);
   1734     }
   1735     // 1 <= x < 2^32 so x can be rounded
   1736     // to nearest to a 32-bit unsigned integer
   1737     if (exp < 0) {	// 2 <= q <= 16, -15 <= exp <= -1, 1 <= q + exp <= 10
   1738       ind = -exp;	// 1 <= ind <= 15; ind is a synonym for 'x'
   1739       // chop off ind digits from the lower part of C1
   1740       // C1 fits in 64 bits
   1741       // calculate C* and f*
   1742       // C* is actually floor(C*) in this case
   1743       // C* and f* need shifting and masking, as shown by
   1744       // shiftright128[] and maskhigh128[]
   1745       // 1 <= x <= 15
   1746       // kx = 10^(-x) = ten2mk64[ind - 1]
   1747       // C* = C1 * 10^(-x)
   1748       // the approximation of 10^(-x) was rounded up to 54 bits
   1749       __mul_64x64_to_128MACH (P128, C1, ten2mk64[ind - 1]);
   1750       Cstar = P128.w[1];
   1751       fstar.w[1] = P128.w[1] & maskhigh128[ind - 1];
   1752       fstar.w[0] = P128.w[0];
   1753       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind].w[0], e.g.
   1754       // if x=1, T*=ten2mk128trunc[0].w[0]=0x1999999999999999
   1755       // C* = floor(C*) (logical right shift; C has p decimal digits,
   1756       //     correct by Property 1)
   1757       // n = C* * 10^(e+x)
   1758 
   1759       // shift right C* by Ex-64 = shiftright128[ind]
   1760       shift = shiftright128[ind - 1];	// 0 <= shift <= 39
   1761       Cstar = Cstar >> shift;
   1762       // determine inexactness of the rounding of C*
   1763       // if (0 < f* < 10^(-x)) then
   1764       //   the result is exact
   1765       // else // if (f* > T*) then
   1766       //   the result is inexact
   1767       if (ind - 1 <= 2) {	// fstar.w[1] is 0
   1768 	if (fstar.w[0] > ten2mk128trunc[ind - 1].w[1]) {
   1769 	  // ten2mk128trunc[ind -1].w[1] is identical to
   1770 	  // ten2mk128[ind -1].w[1]
   1771 	  // set the inexact flag
   1772 	  *pfpsf |= INEXACT_EXCEPTION;
   1773 	}	// else the result is exact
   1774       } else {	// if 3 <= ind - 1 <= 14
   1775 	if (fstar.w[1] || fstar.w[0] > ten2mk128trunc[ind - 1].w[1]) {
   1776 	  // ten2mk128trunc[ind -1].w[1] is identical to
   1777 	  // ten2mk128[ind -1].w[1]
   1778 	  // set the inexact flag
   1779 	  *pfpsf |= INEXACT_EXCEPTION;
   1780 	}	// else the result is exact
   1781       }
   1782 
   1783       res = Cstar;	// the result is positive
   1784     } else if (exp == 0) {
   1785       // 1 <= q <= 10
   1786       // res = +C (exact)
   1787       res = C1;	// the result is positive
   1788     } else {	// if (exp > 0) => 1 <= exp <= 9, 1 <= q < 9, 2 <= q + exp <= 10
   1789       // res = +C * 10^exp (exact)
   1790       res = C1 * ten2k64[exp];	// the result is positive
   1791     }
   1792   }
   1793   BID_RETURN (res);
   1794 }
   1795 
   1796 /*****************************************************************************
   1797  *  BID64_to_uint32_rninta
   1798  ****************************************************************************/
   1799 
   1800 #if DECIMAL_CALL_BY_REFERENCE
   1801 void
   1802 bid64_to_uint32_rninta (unsigned int *pres, UINT64 * px
   1803 			_EXC_FLAGS_PARAM _EXC_MASKS_PARAM
   1804 			_EXC_INFO_PARAM) {
   1805   UINT64 x = *px;
   1806 #else
   1807 unsigned int
   1808 bid64_to_uint32_rninta (UINT64 x
   1809 			_EXC_FLAGS_PARAM _EXC_MASKS_PARAM
   1810 			_EXC_INFO_PARAM) {
   1811 #endif
   1812   unsigned int res;
   1813   UINT64 x_sign;
   1814   UINT64 x_exp;
   1815   int exp;			// unbiased exponent
   1816   // Note: C1 represents x_significand (UINT64)
   1817   UINT64 tmp64;
   1818   BID_UI64DOUBLE tmp1;
   1819   unsigned int x_nr_bits;
   1820   int q, ind, shift;
   1821   UINT64 C1;
   1822   UINT64 Cstar;			// C* represents up to 16 decimal digits ~ 54 bits
   1823   UINT128 P128;
   1824 
   1825   // check for NaN or Infinity
   1826   if ((x & MASK_NAN) == MASK_NAN || (x & MASK_INF) == MASK_INF) {
   1827     // set invalid flag
   1828     *pfpsf |= INVALID_EXCEPTION;
   1829     // return Integer Indefinite
   1830     res = 0x80000000;
   1831     BID_RETURN (res);
   1832   }
   1833   // unpack x
   1834   x_sign = x & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
   1835   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
   1836   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
   1837     x_exp = (x & MASK_BINARY_EXPONENT2) >> 51;	// biased
   1838     C1 = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
   1839     if (C1 > 9999999999999999ull) {	// non-canonical
   1840       x_exp = 0;
   1841       C1 = 0;
   1842     }
   1843   } else {
   1844     x_exp = (x & MASK_BINARY_EXPONENT1) >> 53;	// biased
   1845     C1 = x & MASK_BINARY_SIG1;
   1846   }
   1847 
   1848   // check for zeros (possibly from non-canonical values)
   1849   if (C1 == 0x0ull) {
   1850     // x is 0
   1851     res = 0x00000000;
   1852     BID_RETURN (res);
   1853   }
   1854   // x is not special and is not zero
   1855 
   1856   // q = nr. of decimal digits in x (1 <= q <= 54)
   1857   //  determine first the nr. of bits in x
   1858   if (C1 >= 0x0020000000000000ull) {	// x >= 2^53
   1859     // split the 64-bit value in two 32-bit halves to avoid rounding errors
   1860     if (C1 >= 0x0000000100000000ull) {	// x >= 2^32
   1861       tmp1.d = (double) (C1 >> 32);	// exact conversion
   1862       x_nr_bits =
   1863 	33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
   1864     } else {	// x < 2^32
   1865       tmp1.d = (double) C1;	// exact conversion
   1866       x_nr_bits =
   1867 	1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
   1868     }
   1869   } else {	// if x < 2^53
   1870     tmp1.d = (double) C1;	// exact conversion
   1871     x_nr_bits =
   1872       1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
   1873   }
   1874   q = nr_digits[x_nr_bits - 1].digits;
   1875   if (q == 0) {
   1876     q = nr_digits[x_nr_bits - 1].digits1;
   1877     if (C1 >= nr_digits[x_nr_bits - 1].threshold_lo)
   1878       q++;
   1879   }
   1880   exp = x_exp - 398;	// unbiased exponent
   1881 
   1882   if ((q + exp) > 10) {	// x >= 10^10 ~= 2^33.2... (cannot fit in 32 bits)
   1883     // set invalid flag
   1884     *pfpsf |= INVALID_EXCEPTION;
   1885     // return Integer Indefinite
   1886     res = 0x80000000;
   1887     BID_RETURN (res);
   1888   } else if ((q + exp) == 10) {	// x = c(0)c(1)...c(9).c(10)...c(q-1)
   1889     // in this case 2^29.89... ~= 10^9 <= x < 10^10 ~= 2^33.2...
   1890     // so x rounded to an integer may or may not fit in an unsigned 32-bit int
   1891     // the cases that do not fit are identified here; the ones that fit
   1892     // fall through and will be handled with other cases further,
   1893     // under '1 <= q + exp <= 10'
   1894     if (x_sign) {	// if n < 0 and q + exp = 10 then x is much less than -1/2
   1895       // => set invalid flag
   1896       *pfpsf |= INVALID_EXCEPTION;
   1897       // return Integer Indefinite
   1898       res = 0x80000000;
   1899       BID_RETURN (res);
   1900     } else {	// if n > 0 and q + exp = 10
   1901       // if n >= 2^32 - 1/2 then n is too large
   1902       // too large if c(0)c(1)...c(9).c(10)...c(q-1) >= 2^32-1/2
   1903       // <=> 0.c(0)c(1)...c(q-1) * 10^11 >= 0x9fffffffb, 1<=q<=16
   1904       // <=> C * 10^(11-q) >= 0x9fffffffb, 1<=q<=16
   1905       if (q <= 11) {
   1906 	// Note: C * 10^(11-q) has 10 or 11 digits; 0x9fffffffb has 11 digits
   1907 	tmp64 = C1 * ten2k64[11 - q];	// C scaled up to 11-digit int
   1908 	// c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
   1909 	if (tmp64 >= 0x9fffffffbull) {
   1910 	  // set invalid flag
   1911 	  *pfpsf |= INVALID_EXCEPTION;
   1912 	  // return Integer Indefinite
   1913 	  res = 0x80000000;
   1914 	  BID_RETURN (res);
   1915 	}
   1916 	// else cases that can be rounded to a 32-bit unsigned int fall through
   1917 	// to '1 <= q + exp <= 10'
   1918       } else {	// if (q > 11), i.e. 12 <= q <= 16 and so -15 <= exp <= -2
   1919 	// C * 10^(11-q) >= 0x9fffffffb <=>
   1920 	// C >= 0x9fffffffb * 10^(q-11) where 1 <= q - 11 <= 5
   1921 	// (scale 2^32-1/2 up)
   1922 	// Note: 0x9fffffffb*10^(q-11) has q-1 or q digits, where q <= 16
   1923 	tmp64 = 0x9fffffffbull * ten2k64[q - 11];
   1924 	if (C1 >= tmp64) {
   1925 	  // set invalid flag
   1926 	  *pfpsf |= INVALID_EXCEPTION;
   1927 	  // return Integer Indefinite
   1928 	  res = 0x80000000;
   1929 	  BID_RETURN (res);
   1930 	}
   1931 	// else cases that can be rounded to a 32-bit int fall through
   1932 	// to '1 <= q + exp <= 10'
   1933       }
   1934     }
   1935   }
   1936   // n is not too large to be converted to int32 if -1/2 < n < 2^32 - 1/2
   1937   // Note: some of the cases tested for above fall through to this point
   1938   if ((q + exp) < 0) {	// n = +/-0.0...c(0)c(1)...c(q-1)
   1939     // return 0
   1940     res = 0x00000000;
   1941     BID_RETURN (res);
   1942   } else if ((q + exp) == 0) {	// n = +/-0.c(0)c(1)...c(q-1)
   1943     // if 0.c(0)c(1)...c(q-1) < 0.5 <=> c(0)c(1)...c(q-1) < 5 * 10^(q-1)
   1944     //   res = 0
   1945     // else if x > 0
   1946     //   res = +1
   1947     // else // if x < 0
   1948     //   invalid exc
   1949     ind = q - 1;
   1950     if (C1 < midpoint64[ind]) {
   1951       res = 0x00000000;	// return 0
   1952     } else if (x_sign) {	// n < 0
   1953       // set invalid flag
   1954       *pfpsf |= INVALID_EXCEPTION;
   1955       // return Integer Indefinite
   1956       res = 0x80000000;
   1957       BID_RETURN (res);
   1958     } else {	// n > 0
   1959       res = 0x00000001;	// return +1
   1960     }
   1961   } else {	// if (1 <= q + exp <= 10, 1 <= q <= 16, -15 <= exp <= 9)
   1962     // -2^32-1/2 <= x <= -1 or 1 <= x < 2^32-1/2 so if positive, x can be
   1963     // rounded to nearest to a 32-bit unsigned integer
   1964     if (x_sign) {	// x <= -1
   1965       // set invalid flag
   1966       *pfpsf |= INVALID_EXCEPTION;
   1967       // return Integer Indefinite
   1968       res = 0x80000000;
   1969       BID_RETURN (res);
   1970     }
   1971     // 1 <= x < 2^32-1/2 so x can be rounded
   1972     // to nearest to a 32-bit unsigned integer
   1973     if (exp < 0) {	// 2 <= q <= 16, -15 <= exp <= -1, 1 <= q + exp <= 10
   1974       ind = -exp;	// 1 <= ind <= 15; ind is a synonym for 'x'
   1975       // chop off ind digits from the lower part of C1
   1976       // C1 = C1 + 1/2 * 10^ind where the result C1 fits in 64 bits
   1977       C1 = C1 + midpoint64[ind - 1];
   1978       // calculate C* and f*
   1979       // C* is actually floor(C*) in this case
   1980       // C* and f* need shifting and masking, as shown by
   1981       // shiftright128[] and maskhigh128[]
   1982       // 1 <= x <= 15
   1983       // kx = 10^(-x) = ten2mk64[ind - 1]
   1984       // C* = (C1 + 1/2 * 10^x) * 10^(-x)
   1985       // the approximation of 10^(-x) was rounded up to 54 bits
   1986       __mul_64x64_to_128MACH (P128, C1, ten2mk64[ind - 1]);
   1987       Cstar = P128.w[1];
   1988       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind].w[0], e.g.
   1989       // if x=1, T*=ten2mk128trunc[0].w[0]=0x1999999999999999
   1990       // C* = floor(C*) (logical right shift; C has p decimal digits,
   1991       //     correct by Property 1)
   1992       // n = C* * 10^(e+x)
   1993 
   1994       // shift right C* by Ex-64 = shiftright128[ind]
   1995       shift = shiftright128[ind - 1];	// 0 <= shift <= 39
   1996       Cstar = Cstar >> shift;
   1997 
   1998       // if the result was a midpoint it was rounded away from zero
   1999       res = Cstar;	// the result is positive
   2000     } else if (exp == 0) {
   2001       // 1 <= q <= 10
   2002       // res = +C (exact)
   2003       res = C1;	// the result is positive
   2004     } else {	// if (exp > 0) => 1 <= exp <= 9, 1 <= q < 9, 2 <= q + exp <= 10
   2005       // res = +C * 10^exp (exact)
   2006       res = C1 * ten2k64[exp];	// the result is positive
   2007     }
   2008   }
   2009   BID_RETURN (res);
   2010 }
   2011 
   2012 /*****************************************************************************
   2013  *  BID64_to_uint32_xrninta
   2014  ****************************************************************************/
   2015 
   2016 #if DECIMAL_CALL_BY_REFERENCE
   2017 void
   2018 bid64_to_uint32_xrninta (unsigned int *pres, UINT64 * px
   2019 			 _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
   2020 			 _EXC_INFO_PARAM) {
   2021   UINT64 x = *px;
   2022 #else
   2023 unsigned int
   2024 bid64_to_uint32_xrninta (UINT64 x
   2025 			 _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
   2026 			 _EXC_INFO_PARAM) {
   2027 #endif
   2028   unsigned int res;
   2029   UINT64 x_sign;
   2030   UINT64 x_exp;
   2031   int exp;			// unbiased exponent
   2032   // Note: C1 represents x_significand (UINT64)
   2033   UINT64 tmp64;
   2034   BID_UI64DOUBLE tmp1;
   2035   unsigned int x_nr_bits;
   2036   int q, ind, shift;
   2037   UINT64 C1;
   2038   UINT64 Cstar;			// C* represents up to 16 decimal digits ~ 54 bits
   2039   UINT128 fstar;
   2040   UINT128 P128;
   2041 
   2042   // check for NaN or Infinity
   2043   if ((x & MASK_NAN) == MASK_NAN || (x & MASK_INF) == MASK_INF) {
   2044     // set invalid flag
   2045     *pfpsf |= INVALID_EXCEPTION;
   2046     // return Integer Indefinite
   2047     res = 0x80000000;
   2048     BID_RETURN (res);
   2049   }
   2050   // unpack x
   2051   x_sign = x & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
   2052   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
   2053   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
   2054     x_exp = (x & MASK_BINARY_EXPONENT2) >> 51;	// biased
   2055     C1 = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
   2056     if (C1 > 9999999999999999ull) {	// non-canonical
   2057       x_exp = 0;
   2058       C1 = 0;
   2059     }
   2060   } else {
   2061     x_exp = (x & MASK_BINARY_EXPONENT1) >> 53;	// biased
   2062     C1 = x & MASK_BINARY_SIG1;
   2063   }
   2064 
   2065   // check for zeros (possibly from non-canonical values)
   2066   if (C1 == 0x0ull) {
   2067     // x is 0
   2068     res = 0x00000000;
   2069     BID_RETURN (res);
   2070   }
   2071   // x is not special and is not zero
   2072 
   2073   // q = nr. of decimal digits in x (1 <= q <= 54)
   2074   //  determine first the nr. of bits in x
   2075   if (C1 >= 0x0020000000000000ull) {	// x >= 2^53
   2076     // split the 64-bit value in two 32-bit halves to avoid rounding errors
   2077     if (C1 >= 0x0000000100000000ull) {	// x >= 2^32
   2078       tmp1.d = (double) (C1 >> 32);	// exact conversion
   2079       x_nr_bits =
   2080 	33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
   2081     } else {	// x < 2^32
   2082       tmp1.d = (double) C1;	// exact conversion
   2083       x_nr_bits =
   2084 	1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
   2085     }
   2086   } else {	// if x < 2^53
   2087     tmp1.d = (double) C1;	// exact conversion
   2088     x_nr_bits =
   2089       1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
   2090   }
   2091   q = nr_digits[x_nr_bits - 1].digits;
   2092   if (q == 0) {
   2093     q = nr_digits[x_nr_bits - 1].digits1;
   2094     if (C1 >= nr_digits[x_nr_bits - 1].threshold_lo)
   2095       q++;
   2096   }
   2097   exp = x_exp - 398;	// unbiased exponent
   2098 
   2099   if ((q + exp) > 10) {	// x >= 10^10 ~= 2^33.2... (cannot fit in 32 bits)
   2100     // set invalid flag
   2101     *pfpsf |= INVALID_EXCEPTION;
   2102     // return Integer Indefinite
   2103     res = 0x80000000;
   2104     BID_RETURN (res);
   2105   } else if ((q + exp) == 10) {	// x = c(0)c(1)...c(9).c(10)...c(q-1)
   2106     // in this case 2^29.89... ~= 10^9 <= x < 10^10 ~= 2^33.2...
   2107     // so x rounded to an integer may or may not fit in an unsigned 32-bit int
   2108     // the cases that do not fit are identified here; the ones that fit
   2109     // fall through and will be handled with other cases further,
   2110     // under '1 <= q + exp <= 10'
   2111     if (x_sign) {	// if n < 0 and q + exp = 10 then x is much less than -1/2
   2112       // => set invalid flag
   2113       *pfpsf |= INVALID_EXCEPTION;
   2114       // return Integer Indefinite
   2115       res = 0x80000000;
   2116       BID_RETURN (res);
   2117     } else {	// if n > 0 and q + exp = 10
   2118       // if n >= 2^32 - 1/2 then n is too large
   2119       // too large if c(0)c(1)...c(9).c(10)...c(q-1) >= 2^32-1/2
   2120       // <=> 0.c(0)c(1)...c(q-1) * 10^11 >= 0x9fffffffb, 1<=q<=16
   2121       // <=> C * 10^(11-q) >= 0x9fffffffb, 1<=q<=16
   2122       if (q <= 11) {
   2123 	// Note: C * 10^(11-q) has 10 or 11 digits; 0x9fffffffb has 11 digits
   2124 	tmp64 = C1 * ten2k64[11 - q];	// C scaled up to 11-digit int
   2125 	// c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
   2126 	if (tmp64 >= 0x9fffffffbull) {
   2127 	  // set invalid flag
   2128 	  *pfpsf |= INVALID_EXCEPTION;
   2129 	  // return Integer Indefinite
   2130 	  res = 0x80000000;
   2131 	  BID_RETURN (res);
   2132 	}
   2133 	// else cases that can be rounded to a 32-bit unsigned int fall through
   2134 	// to '1 <= q + exp <= 10'
   2135       } else {	// if (q > 11), i.e. 12 <= q <= 16 and so -15 <= exp <= -2
   2136 	// C * 10^(11-q) >= 0x9fffffffb <=>
   2137 	// C >= 0x9fffffffb * 10^(q-11) where 1 <= q - 11 <= 5
   2138 	// (scale 2^32-1/2 up)
   2139 	// Note: 0x9fffffffb*10^(q-11) has q-1 or q digits, where q <= 16
   2140 	tmp64 = 0x9fffffffbull * ten2k64[q - 11];
   2141 	if (C1 >= tmp64) {
   2142 	  // set invalid flag
   2143 	  *pfpsf |= INVALID_EXCEPTION;
   2144 	  // return Integer Indefinite
   2145 	  res = 0x80000000;
   2146 	  BID_RETURN (res);
   2147 	}
   2148 	// else cases that can be rounded to a 32-bit int fall through
   2149 	// to '1 <= q + exp <= 10'
   2150       }
   2151     }
   2152   }
   2153   // n is not too large to be converted to int32 if -1/2 < n < 2^32 - 1/2
   2154   // Note: some of the cases tested for above fall through to this point
   2155   if ((q + exp) < 0) {	// n = +/-0.0...c(0)c(1)...c(q-1)
   2156     // set inexact flag
   2157     *pfpsf |= INEXACT_EXCEPTION;
   2158     // return 0
   2159     res = 0x00000000;
   2160     BID_RETURN (res);
   2161   } else if ((q + exp) == 0) {	// n = +/-0.c(0)c(1)...c(q-1)
   2162     // if 0.c(0)c(1)...c(q-1) < 0.5 <=> c(0)c(1)...c(q-1) < 5 * 10^(q-1)
   2163     //   res = 0
   2164     // else if x > 0
   2165     //   res = +1
   2166     // else // if x < 0
   2167     //   invalid exc
   2168     ind = q - 1;
   2169     if (C1 < midpoint64[ind]) {
   2170       res = 0x00000000;	// return 0
   2171     } else if (x_sign) {	// n < 0
   2172       // set invalid flag
   2173       *pfpsf |= INVALID_EXCEPTION;
   2174       // return Integer Indefinite
   2175       res = 0x80000000;
   2176       BID_RETURN (res);
   2177     } else {	// n > 0
   2178       res = 0x00000001;	// return +1
   2179     }
   2180     // set inexact flag
   2181     *pfpsf |= INEXACT_EXCEPTION;
   2182   } else {	// if (1 <= q + exp <= 10, 1 <= q <= 16, -15 <= exp <= 9)
   2183     // -2^32-1/2 <= x <= -1 or 1 <= x < 2^32-1/2 so if positive, x can be
   2184     // rounded to nearest to a 32-bit unsigned integer
   2185     if (x_sign) {	// x <= -1
   2186       // set invalid flag
   2187       *pfpsf |= INVALID_EXCEPTION;
   2188       // return Integer Indefinite
   2189       res = 0x80000000;
   2190       BID_RETURN (res);
   2191     }
   2192     // 1 <= x < 2^32-1/2 so x can be rounded
   2193     // to nearest to a 32-bit unsigned integer
   2194     if (exp < 0) {	// 2 <= q <= 16, -15 <= exp <= -1, 1 <= q + exp <= 10
   2195       ind = -exp;	// 1 <= ind <= 15; ind is a synonym for 'x'
   2196       // chop off ind digits from the lower part of C1
   2197       // C1 = C1 + 1/2 * 10^ind where the result C1 fits in 64 bits
   2198       C1 = C1 + midpoint64[ind - 1];
   2199       // calculate C* and f*
   2200       // C* is actually floor(C*) in this case
   2201       // C* and f* need shifting and masking, as shown by
   2202       // shiftright128[] and maskhigh128[]
   2203       // 1 <= x <= 15
   2204       // kx = 10^(-x) = ten2mk64[ind - 1]
   2205       // C* = (C1 + 1/2 * 10^x) * 10^(-x)
   2206       // the approximation of 10^(-x) was rounded up to 54 bits
   2207       __mul_64x64_to_128MACH (P128, C1, ten2mk64[ind - 1]);
   2208       Cstar = P128.w[1];
   2209       fstar.w[1] = P128.w[1] & maskhigh128[ind - 1];
   2210       fstar.w[0] = P128.w[0];
   2211       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind].w[0], e.g.
   2212       // if x=1, T*=ten2mk128trunc[0].w[0]=0x1999999999999999
   2213       // C* = floor(C*) (logical right shift; C has p decimal digits,
   2214       //     correct by Property 1)
   2215       // n = C* * 10^(e+x)
   2216 
   2217       // shift right C* by Ex-64 = shiftright128[ind]
   2218       shift = shiftright128[ind - 1];	// 0 <= shift <= 39
   2219       Cstar = Cstar >> shift;
   2220 
   2221       // determine inexactness of the rounding of C*
   2222       // if (0 < f* - 1/2 < 10^(-x)) then
   2223       //   the result is exact
   2224       // else // if (f* - 1/2 > T*) then
   2225       //   the result is inexact
   2226       if (ind - 1 <= 2) {	// fstar.w[1] is 0
   2227 	if (fstar.w[0] > 0x8000000000000000ull) {
   2228 	  // f* > 1/2 and the result may be exact
   2229 	  tmp64 = fstar.w[0] - 0x8000000000000000ull;	// f* - 1/2
   2230 	  if ((tmp64 > ten2mk128trunc[ind - 1].w[1])) {
   2231 	    // ten2mk128trunc[ind -1].w[1] is identical to
   2232 	    // ten2mk128[ind -1].w[1]
   2233 	    // set the inexact flag
   2234 	    *pfpsf |= INEXACT_EXCEPTION;
   2235 	  }	// else the result is exact
   2236 	} else {	// the result is inexact; f2* <= 1/2
   2237 	  // set the inexact flag
   2238 	  *pfpsf |= INEXACT_EXCEPTION;
   2239 	}
   2240       } else {	// if 3 <= ind - 1 <= 14
   2241 	if (fstar.w[1] > onehalf128[ind - 1] ||
   2242 	    (fstar.w[1] == onehalf128[ind - 1] && fstar.w[0])) {
   2243 	  // f2* > 1/2 and the result may be exact
   2244 	  // Calculate f2* - 1/2
   2245 	  tmp64 = fstar.w[1] - onehalf128[ind - 1];
   2246 	  if (tmp64 || fstar.w[0] > ten2mk128trunc[ind - 1].w[1]) {
   2247 	    // ten2mk128trunc[ind -1].w[1] is identical to
   2248 	    // ten2mk128[ind -1].w[1]
   2249 	    // set the inexact flag
   2250 	    *pfpsf |= INEXACT_EXCEPTION;
   2251 	  }	// else the result is exact
   2252 	} else {	// the result is inexact; f2* <= 1/2
   2253 	  // set the inexact flag
   2254 	  *pfpsf |= INEXACT_EXCEPTION;
   2255 	}
   2256       }
   2257 
   2258       // if the result was a midpoint it was rounded away from zero
   2259       res = Cstar;	// the result is positive
   2260     } else if (exp == 0) {
   2261       // 1 <= q <= 10
   2262       // res = +C (exact)
   2263       res = C1;	// the result is positive
   2264     } else {	// if (exp > 0) => 1 <= exp <= 9, 1 <= q < 9, 2 <= q + exp <= 10
   2265       // res = +C * 10^exp (exact)
   2266       res = C1 * ten2k64[exp];	// the result is positive
   2267     }
   2268   }
   2269   BID_RETURN (res);
   2270 }
   2271