Imported Upstream version 4.8.1
[platform/upstream/gcc48.git] / libgcc / config / libbid / bid64_to_int32.c
1 /* Copyright (C) 2007-2013 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 }