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