1 /* Copyright (C) 2007-2022 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  *  BID128_to_uint32_rnint
28  ****************************************************************************/
29 
30 BID128_FUNCTION_ARG1_NORND_CUSTOMRESTYPE (unsigned int,
31                                                     bid128_to_uint32_rnint, x)
32 
33      unsigned int res;
34      UINT64 x_sign;
35      UINT64 x_exp;
36      int exp;                           // unbiased exponent
37   // Note: C1.w[1], C1.w[0] represent x_signif_hi, x_signif_lo (all are UINT64)
38      UINT64 tmp64;
39      BID_UI64DOUBLE tmp1;
40      unsigned int x_nr_bits;
41      int q, ind, shift;
42      UINT128 C1, C;
43      UINT128 Cstar;           // C* represents up to 34 decimal digits ~ 113 bits
44      UINT256 fstar;
45      UINT256 P256;
46 
47   // unpack x
48 x_sign = x.w[1] & MASK_SIGN;  // 0 for positive, MASK_SIGN for negative
49 x_exp = x.w[1] & MASK_EXP;    // biased and shifted left 49 bit positions
50 C1.w[1] = x.w[1] & MASK_COEFF;
51 C1.w[0] = x.w[0];
52 
53   // check for NaN or Infinity
54 if ((x.w[1] & MASK_SPECIAL) == MASK_SPECIAL) {
55     // x is special
56 if ((x.w[1] & MASK_NAN) == MASK_NAN) {  // x is NAN
57   if ((x.w[1] & MASK_SNAN) == MASK_SNAN) {        // x is SNAN
58     // set invalid flag
59     *pfpsf |= INVALID_EXCEPTION;
60     // return Integer Indefinite
61     res = 0x80000000;
62   } else {          // x is QNaN
63     // set invalid flag
64     *pfpsf |= INVALID_EXCEPTION;
65     // return Integer Indefinite
66     res = 0x80000000;
67   }
68   BID_RETURN (res);
69 } else {  // x is not a NaN, so it must be infinity
70   if (!x_sign) {    // x is +inf
71     // set invalid flag
72     *pfpsf |= INVALID_EXCEPTION;
73     // return Integer Indefinite
74     res = 0x80000000;
75   } else {          // x is -inf
76     // set invalid flag
77     *pfpsf |= INVALID_EXCEPTION;
78     // return Integer Indefinite
79     res = 0x80000000;
80   }
81   BID_RETURN (res);
82 }
83 }
84   // check for non-canonical values (after the check for special values)
85 if ((C1.w[1] > 0x0001ed09bead87c0ull)
86     || (C1.w[1] == 0x0001ed09bead87c0ull
87           && (C1.w[0] > 0x378d8e63ffffffffull))
88     || ((x.w[1] & 0x6000000000000000ull) == 0x6000000000000000ull)) {
89   res = 0x00000000;
90   BID_RETURN (res);
91 } else if ((C1.w[1] == 0x0ull) && (C1.w[0] == 0x0ull)) {
92   // x is 0
93   res = 0x00000000;
94   BID_RETURN (res);
95 } else {  // x is not special and is not zero
96 
97   // q = nr. of decimal digits in x
98   //  determine first the nr. of bits in x
99   if (C1.w[1] == 0) {
100     if (C1.w[0] >= 0x0020000000000000ull) {       // x >= 2^53
101       // split the 64-bit value in two 32-bit halves to avoid rounding errors
102       if (C1.w[0] >= 0x0000000100000000ull) {     // x >= 2^32
103           tmp1.d = (double) (C1.w[0] >> 32);      // exact conversion
104           x_nr_bits =
105             33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
106       } else {      // x < 2^32
107           tmp1.d = (double) (C1.w[0]);  // exact conversion
108           x_nr_bits =
109             1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
110       }
111     } else {        // if x < 2^53
112       tmp1.d = (double) C1.w[0];        // exact conversion
113       x_nr_bits =
114           1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
115     }
116   } else {          // C1.w[1] != 0 => nr. bits = 64 + nr_bits (C1.w[1])
117     tmp1.d = (double) C1.w[1];          // exact conversion
118     x_nr_bits =
119       65 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
120   }
121   q = nr_digits[x_nr_bits - 1].digits;
122   if (q == 0) {
123     q = nr_digits[x_nr_bits - 1].digits1;
124     if (C1.w[1] > nr_digits[x_nr_bits - 1].threshold_hi
125           || (C1.w[1] == nr_digits[x_nr_bits - 1].threshold_hi
126               && C1.w[0] >= nr_digits[x_nr_bits - 1].threshold_lo))
127       q++;
128   }
129   exp = (x_exp >> 49) - 6176;
130   if ((q + exp) > 10) {       // x >= 10^10 ~= 2^33.2... (cannot fit in 32 bits)
131     // set invalid flag
132     *pfpsf |= INVALID_EXCEPTION;
133     // return Integer Indefinite
134     res = 0x80000000;
135     BID_RETURN (res);
136   } else if ((q + exp) == 10) {         // x = c(0)c(1)...c(9).c(10)...c(q-1)
137     // in this case 2^29.89... ~= 10^9 <= x < 10^10 ~= 2^33.2...
138     // so x rounded to an integer may or may not fit in an unsigned 32-bit int
139     // the cases that do not fit are identified here; the ones that fit
140     // fall through and will be handled with other cases further,
141     // under '1 <= q + exp <= 10'
142     if (x_sign) {   // if n < 0 and q + exp = 10
143       // if n < -1/2 then n cannot be converted to uint32 with RN
144       // too large if c(0)c(1)...c(9).c(10)...c(q-1) > 1/2
145       // <=> 0.c(0)c(1)...c(q-1) * 10^11 > 0x05, 1<=q<=34
146       if (q <= 11) {
147           tmp64 = C1.w[0] * ten2k64[11 - q];      // C scaled up to 11-digit int
148           // c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
149           if (tmp64 > 0x05ull) {
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       } else {      // if (q > 11), i.e. 12 <= q <= 34 and so -24 <= exp <= -2
159           // 0.c(0)c(1)...c(q-1) * 10^11 > 0x05 <=>
160           // C > 0x05 * 10^(q-11) where 1 <= q - 11 <= 23
161           // (scale 1/2 up)
162           tmp64 = 0x05ull;
163           if (q - 11 <= 19) { // 1 <= q - 11 <= 19; 10^(q-11) requires 64 bits
164             __mul_64x64_to_128MACH (C, tmp64, ten2k64[q - 11]);
165           } else {  // 20 <= q - 11 <= 23, and 10^(q-11) requires 128 bits
166             __mul_128x64_to_128 (C, tmp64, ten2k128[q - 31]);
167           }
168           if (C1.w[1] > C.w[1] || (C1.w[1] == C.w[1] && C1.w[0] > C.w[0])) {
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       }
178     } else {        // if n > 0 and q + exp = 10
179       // if n >= 2^32 - 1/2 then n is too large
180       // too large if c(0)c(1)...c(9).c(10)...c(q-1) >= 2^32-1/2
181       // too large if 0.c(0)c(1)...c(q-1) * 10^11 >= 0x9fffffffb, 1<=q<=34
182       if (q <= 11) {
183           tmp64 = C1.w[0] * ten2k64[11 - q];      // C scaled up to 11-digit int
184           // c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
185           if (tmp64 >= 0x9fffffffbull) {
186             // set invalid flag
187             *pfpsf |= INVALID_EXCEPTION;
188             // return Integer Indefinite
189             res = 0x80000000;
190             BID_RETURN (res);
191           }
192           // else cases that can be rounded to a 32-bit int fall through
193           // to '1 <= q + exp <= 10'
194       } else {      // if (q > 11), i.e. 12 <= q <= 34 and so -24 <= exp <= -2
195           // 0.c(0)c(1)...c(q-1) * 10^11 >= 0x9fffffffb <=>
196           // C >= 0x9fffffffb * 10^(q-11) where 1 <= q - 11 <= 23
197           // (scale 2^32-1/2 up)
198           tmp64 = 0x9fffffffbull;
199           if (q - 11 <= 19) { // 1 <= q - 11 <= 19; 10^(q-11) requires 64 bits
200             __mul_64x64_to_128MACH (C, tmp64, ten2k64[q - 11]);
201           } else {  // 20 <= q - 11 <= 23, and 10^(q-11) requires 128 bits
202             __mul_128x64_to_128 (C, tmp64, ten2k128[q - 31]);
203           }
204           if (C1.w[1] > C.w[1]
205               || (C1.w[1] == C.w[1] && C1.w[0] >= C.w[0])) {
206             // set invalid flag
207             *pfpsf |= INVALID_EXCEPTION;
208             // return Integer Indefinite
209             res = 0x80000000;
210             BID_RETURN (res);
211           }
212           // else cases that can be rounded to a 32-bit int fall through
213           // to '1 <= q + exp <= 10'
214       }
215     }
216   }
217   // n is not too large to be converted to int32: -1/2 <= n < 2^32 - 1/2
218   // Note: some of the cases tested for above fall through to this point
219   if ((q + exp) < 0) {        // n = +/-0.0...c(0)c(1)...c(q-1)
220     // return 0
221     res = 0x00000000;
222     BID_RETURN (res);
223   } else if ((q + exp) == 0) {          // n = +/-0.c(0)c(1)...c(q-1)
224     // if 0.c(0)c(1)...c(q-1) <= 0.5 <=> c(0)c(1)...c(q-1) <= 5 * 10^(q-1)
225     //   res = 0
226     // else if x > 0
227     //   res = +1
228     // else // if x < 0
229     //   invalid exc
230     ind = q - 1;
231     if (ind <= 18) {          // 0 <= ind <= 18
232       if ((C1.w[1] == 0) && (C1.w[0] <= midpoint64[ind])) {
233           res = 0x00000000;   // return 0
234       } else if (!x_sign) {   // n > 0
235           res = 0x00000001;   // return +1
236       } else {
237           res = 0x80000000;
238           *pfpsf |= INVALID_EXCEPTION;
239       }
240     } else {        // 19 <= ind <= 33
241       if ((C1.w[1] < midpoint128[ind - 19].w[1])
242             || ((C1.w[1] == midpoint128[ind - 19].w[1])
243                 && (C1.w[0] <= midpoint128[ind - 19].w[0]))) {
244           res = 0x00000000;   // return 0
245       } else if (!x_sign) {   // n > 0
246           res = 0x00000001;   // return +1
247       } else {
248           res = 0x80000000;
249           *pfpsf |= INVALID_EXCEPTION;
250       }
251     }
252   } else {          // if (1 <= q + exp <= 10, 1 <= q <= 34, -33 <= exp <= 9)
253     if (x_sign) {   // x <= -1
254       // set invalid flag
255       *pfpsf |= INVALID_EXCEPTION;
256       // return Integer Indefinite
257       res = 0x80000000;
258       BID_RETURN (res);
259     }
260     // 1 <= x < 2^32-1/2 so x can be rounded
261     // to nearest to a 32-bit unsigned integer
262     if (exp < 0) {  // 2 <= q <= 34, -33 <= exp <= -1, 1 <= q + exp <= 10
263       ind = -exp;   // 1 <= ind <= 33; ind is a synonym for 'x'
264       // chop off ind digits from the lower part of C1
265       // C1 = C1 + 1/2 * 10^ind where the result C1 fits in 127 bits
266       tmp64 = C1.w[0];
267       if (ind <= 19) {
268           C1.w[0] = C1.w[0] + midpoint64[ind - 1];
269       } else {
270           C1.w[0] = C1.w[0] + midpoint128[ind - 20].w[0];
271           C1.w[1] = C1.w[1] + midpoint128[ind - 20].w[1];
272       }
273       if (C1.w[0] < tmp64)
274           C1.w[1]++;
275       // calculate C* and f*
276       // C* is actually floor(C*) in this case
277       // C* and f* need shifting and masking, as shown by
278       // shiftright128[] and maskhigh128[]
279       // 1 <= x <= 33
280       // kx = 10^(-x) = ten2mk128[ind - 1]
281       // C* = (C1 + 1/2 * 10^x) * 10^(-x)
282       // the approximation of 10^(-x) was rounded up to 118 bits
283       __mul_128x128_to_256 (P256, C1, ten2mk128[ind - 1]);
284       if (ind - 1 <= 21) {    // 0 <= ind - 1 <= 21
285           Cstar.w[1] = P256.w[3];
286           Cstar.w[0] = P256.w[2];
287           fstar.w[3] = 0;
288           fstar.w[2] = P256.w[2] & maskhigh128[ind - 1];
289           fstar.w[1] = P256.w[1];
290           fstar.w[0] = P256.w[0];
291       } else {      // 22 <= ind - 1 <= 33
292           Cstar.w[1] = 0;
293           Cstar.w[0] = P256.w[3];
294           fstar.w[3] = P256.w[3] & maskhigh128[ind - 1];
295           fstar.w[2] = P256.w[2];
296           fstar.w[1] = P256.w[1];
297           fstar.w[0] = P256.w[0];
298       }
299       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind], e.g.
300       // if x=1, T*=ten2mk128trunc[0]=0x19999999999999999999999999999999
301       // if (0 < f* < 10^(-x)) then the result is a midpoint
302       //   if floor(C*) is even then C* = floor(C*) - logical right
303       //       shift; C* has p decimal digits, correct by Prop. 1)
304       //   else if floor(C*) is odd C* = floor(C*)-1 (logical right
305       //       shift; C* has p decimal digits, correct by Pr. 1)
306       // else
307       //   C* = floor(C*) (logical right shift; C has p decimal digits,
308       //       correct by Property 1)
309       // n = C* * 10^(e+x)
310 
311       // shift right C* by Ex-128 = shiftright128[ind]
312       shift = shiftright128[ind - 1];   // 0 <= shift <= 102
313       if (ind - 1 <= 21) {    // 0 <= ind - 1 <= 21
314           Cstar.w[0] =
315             (Cstar.w[0] >> shift) | (Cstar.w[1] << (64 - shift));
316           // redundant, it will be 0! Cstar.w[1] = (Cstar.w[1] >> shift);
317       } else {      // 22 <= ind - 1 <= 33
318           Cstar.w[0] = (Cstar.w[0] >> (shift - 64));        // 2 <= shift - 64 <= 38
319       }
320       // if the result was a midpoint it was rounded away from zero, so
321       // it will need a correction
322       // check for midpoints
323       if ((fstar.w[3] == 0) && (fstar.w[2] == 0)
324             && (fstar.w[1] || fstar.w[0])
325             && (fstar.w[1] < ten2mk128trunc[ind - 1].w[1]
326                 || (fstar.w[1] == ten2mk128trunc[ind - 1].w[1]
327                       && fstar.w[0] <= ten2mk128trunc[ind - 1].w[0]))) {
328           // the result is a midpoint; round to nearest
329           if (Cstar.w[0] & 0x01) {      // Cstar.w[0] is odd; MP in [EVEN, ODD]
330             // if floor(C*) is odd C = floor(C*) - 1; the result >= 1
331             Cstar.w[0]--;     // Cstar.w[0] is now even
332           }         // else MP in [ODD, EVEN]
333       }
334       res = Cstar.w[0];       // the result is positive
335     } else if (exp == 0) {
336       // 1 <= q <= 10
337       // res = C (exact)
338       res = C1.w[0];
339     } else {        // if (exp > 0) => 1 <= exp <= 9, 1 <= q < 9, 2 <= q + exp <= 10
340       // res = C * 10^exp (exact)
341       res = C1.w[0] * ten2k64[exp];
342     }
343   }
344 }
345 
346 BID_RETURN (res);
347 }
348 
349 /*****************************************************************************
350  *  BID128_to_uint32_xrnint
351  ****************************************************************************/
352 
353 BID128_FUNCTION_ARG1_NORND_CUSTOMRESTYPE (unsigned int,
354                                                     bid128_to_uint32_xrnint, x)
355 
356      unsigned int res;
357      UINT64 x_sign;
358      UINT64 x_exp;
359      int exp;                           // unbiased exponent
360   // Note: C1.w[1], C1.w[0] represent x_signif_hi, x_signif_lo (all are UINT64)
361      UINT64 tmp64, tmp64A;
362      BID_UI64DOUBLE tmp1;
363      unsigned int x_nr_bits;
364      int q, ind, shift;
365      UINT128 C1, C;
366      UINT128 Cstar;           // C* represents up to 34 decimal digits ~ 113 bits
367      UINT256 fstar;
368      UINT256 P256;
369      unsigned int tmp_inexact = 0;
370 
371   // unpack x
372 x_sign = x.w[1] & MASK_SIGN;  // 0 for positive, MASK_SIGN for negative
373 x_exp = x.w[1] & MASK_EXP;    // biased and shifted left 49 bit positions
374 C1.w[1] = x.w[1] & MASK_COEFF;
375 C1.w[0] = x.w[0];
376 
377   // check for NaN or Infinity
378 if ((x.w[1] & MASK_SPECIAL) == MASK_SPECIAL) {
379     // x is special
380 if ((x.w[1] & MASK_NAN) == MASK_NAN) {  // x is NAN
381   if ((x.w[1] & MASK_SNAN) == MASK_SNAN) {        // x is SNAN
382     // set invalid flag
383     *pfpsf |= INVALID_EXCEPTION;
384     // return Integer Indefinite
385     res = 0x80000000;
386   } else {          // x is QNaN
387     // set invalid flag
388     *pfpsf |= INVALID_EXCEPTION;
389     // return Integer Indefinite
390     res = 0x80000000;
391   }
392   BID_RETURN (res);
393 } else {  // x is not a NaN, so it must be infinity
394   if (!x_sign) {    // x is +inf
395     // set invalid flag
396     *pfpsf |= INVALID_EXCEPTION;
397     // return Integer Indefinite
398     res = 0x80000000;
399   } else {          // x is -inf
400     // set invalid flag
401     *pfpsf |= INVALID_EXCEPTION;
402     // return Integer Indefinite
403     res = 0x80000000;
404   }
405   BID_RETURN (res);
406 }
407 }
408   // check for non-canonical values (after the check for special values)
409 if ((C1.w[1] > 0x0001ed09bead87c0ull)
410     || (C1.w[1] == 0x0001ed09bead87c0ull
411           && (C1.w[0] > 0x378d8e63ffffffffull))
412     || ((x.w[1] & 0x6000000000000000ull) == 0x6000000000000000ull)) {
413   res = 0x00000000;
414   BID_RETURN (res);
415 } else if ((C1.w[1] == 0x0ull) && (C1.w[0] == 0x0ull)) {
416   // x is 0
417   res = 0x00000000;
418   BID_RETURN (res);
419 } else {  // x is not special and is not zero
420 
421   // q = nr. of decimal digits in x
422   //  determine first the nr. of bits in x
423   if (C1.w[1] == 0) {
424     if (C1.w[0] >= 0x0020000000000000ull) {       // x >= 2^53
425       // split the 64-bit value in two 32-bit halves to avoid rounding errors
426       if (C1.w[0] >= 0x0000000100000000ull) {     // x >= 2^32
427           tmp1.d = (double) (C1.w[0] >> 32);      // exact conversion
428           x_nr_bits =
429             33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
430       } else {      // x < 2^32
431           tmp1.d = (double) (C1.w[0]);  // exact conversion
432           x_nr_bits =
433             1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
434       }
435     } else {        // if x < 2^53
436       tmp1.d = (double) C1.w[0];        // exact conversion
437       x_nr_bits =
438           1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
439     }
440   } else {          // C1.w[1] != 0 => nr. bits = 64 + nr_bits (C1.w[1])
441     tmp1.d = (double) C1.w[1];          // exact conversion
442     x_nr_bits =
443       65 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
444   }
445   q = nr_digits[x_nr_bits - 1].digits;
446   if (q == 0) {
447     q = nr_digits[x_nr_bits - 1].digits1;
448     if (C1.w[1] > nr_digits[x_nr_bits - 1].threshold_hi
449           || (C1.w[1] == nr_digits[x_nr_bits - 1].threshold_hi
450               && C1.w[0] >= nr_digits[x_nr_bits - 1].threshold_lo))
451       q++;
452   }
453   exp = (x_exp >> 49) - 6176;
454   if ((q + exp) > 10) {       // x >= 10^10 ~= 2^33.2... (cannot fit in 32 bits)
455     // set invalid flag
456     *pfpsf |= INVALID_EXCEPTION;
457     // return Integer Indefinite
458     res = 0x80000000;
459     BID_RETURN (res);
460   } else if ((q + exp) == 10) {         // x = c(0)c(1)...c(9).c(10)...c(q-1)
461     // in this case 2^29.89... ~= 10^9 <= x < 10^10 ~= 2^33.2...
462     // so x rounded to an integer may or may not fit in an unsigned 32-bit int
463     // the cases that do not fit are identified here; the ones that fit
464     // fall through and will be handled with other cases further,
465     // under '1 <= q + exp <= 10'
466     if (x_sign) {   // if n < 0 and q + exp = 10
467       // if n < -1/2 then n cannot be converted to uint32 with RN
468       // too large if c(0)c(1)...c(9).c(10)...c(q-1) > 1/2
469       // <=> 0.c(0)c(1)...c(q-1) * 10^11 > 0x05, 1<=q<=34
470       if (q <= 11) {
471           tmp64 = C1.w[0] * ten2k64[11 - q];      // C scaled up to 11-digit int
472           // c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
473           if (tmp64 > 0x05ull) {
474             // set invalid flag
475             *pfpsf |= INVALID_EXCEPTION;
476             // return Integer Indefinite
477             res = 0x80000000;
478             BID_RETURN (res);
479           }
480           // else cases that can be rounded to a 32-bit int fall through
481           // to '1 <= q + exp <= 10'
482       } else {      // if (q > 11), i.e. 12 <= q <= 34 and so -24 <= exp <= -2
483           // 0.c(0)c(1)...c(q-1) * 10^11 > 0x05 <=>
484           // C > 0x05 * 10^(q-11) where 1 <= q - 11 <= 23
485           // (scale 1/2 up)
486           tmp64 = 0x05ull;
487           if (q - 11 <= 19) { // 1 <= q - 11 <= 19; 10^(q-11) requires 64 bits
488             __mul_64x64_to_128MACH (C, tmp64, ten2k64[q - 11]);
489           } else {  // 20 <= q - 11 <= 23, and 10^(q-11) requires 128 bits
490             __mul_128x64_to_128 (C, tmp64, ten2k128[q - 31]);
491           }
492           if (C1.w[1] > C.w[1] || (C1.w[1] == C.w[1] && C1.w[0] > C.w[0])) {
493             // set invalid flag
494             *pfpsf |= INVALID_EXCEPTION;
495             // return Integer Indefinite
496             res = 0x80000000;
497             BID_RETURN (res);
498           }
499           // else cases that can be rounded to a 32-bit int fall through
500           // to '1 <= q + exp <= 10'
501       }
502     } else {        // if n > 0 and q + exp = 10
503       // if n >= 2^32 - 1/2 then n is too large
504       // too large if c(0)c(1)...c(9).c(10)...c(q-1) >= 2^32-1/2
505       // too large if 0.c(0)c(1)...c(q-1) * 10^11 >= 0x9fffffffb, 1<=q<=34
506       if (q <= 11) {
507           tmp64 = C1.w[0] * ten2k64[11 - q];      // C scaled up to 11-digit int
508           // c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
509           if (tmp64 >= 0x9fffffffbull) {
510             // set invalid flag
511             *pfpsf |= INVALID_EXCEPTION;
512             // return Integer Indefinite
513             res = 0x80000000;
514             BID_RETURN (res);
515           }
516           // else cases that can be rounded to a 32-bit int fall through
517           // to '1 <= q + exp <= 10'
518       } else {      // if (q > 11), i.e. 12 <= q <= 34 and so -24 <= exp <= -2
519           // 0.c(0)c(1)...c(q-1) * 10^11 >= 0x9fffffffb <=>
520           // C >= 0x9fffffffb * 10^(q-11) where 1 <= q - 11 <= 23
521           // (scale 2^32-1/2 up)
522           tmp64 = 0x9fffffffbull;
523           if (q - 11 <= 19) { // 1 <= q - 11 <= 19; 10^(q-11) requires 64 bits
524             __mul_64x64_to_128MACH (C, tmp64, ten2k64[q - 11]);
525           } else {  // 20 <= q - 11 <= 23, and 10^(q-11) requires 128 bits
526             __mul_128x64_to_128 (C, tmp64, ten2k128[q - 31]);
527           }
528           if (C1.w[1] > C.w[1]
529               || (C1.w[1] == C.w[1] && C1.w[0] >= C.w[0])) {
530             // set invalid flag
531             *pfpsf |= INVALID_EXCEPTION;
532             // return Integer Indefinite
533             res = 0x80000000;
534             BID_RETURN (res);
535           }
536           // else cases that can be rounded to a 32-bit int fall through
537           // to '1 <= q + exp <= 10'
538       }
539     }
540   }
541   // n is not too large to be converted to int32: -1/2 <= n < 2^32 - 1/2
542   // Note: some of the cases tested for above fall through to this point
543   if ((q + exp) < 0) {        // n = +/-0.0...c(0)c(1)...c(q-1)
544     // set inexact flag
545     *pfpsf |= INEXACT_EXCEPTION;
546     // return 0
547     res = 0x00000000;
548     BID_RETURN (res);
549   } else if ((q + exp) == 0) {          // n = +/-0.c(0)c(1)...c(q-1)
550     // if 0.c(0)c(1)...c(q-1) <= 0.5 <=> c(0)c(1)...c(q-1) <= 5 * 10^(q-1)
551     //   res = 0
552     // else if x > 0
553     //   res = +1
554     // else // if x < 0
555     //   invalid exc
556     ind = q - 1;
557     if (ind <= 18) {          // 0 <= ind <= 18
558       if ((C1.w[1] == 0) && (C1.w[0] <= midpoint64[ind])) {
559           res = 0x00000000;   // return 0
560       } else if (!x_sign) {   // n > 0
561           res = 0x00000001;   // return +1
562       } else {
563           res = 0x80000000;
564           *pfpsf |= INVALID_EXCEPTION;
565           BID_RETURN (res);
566       }
567     } else {        // 19 <= ind <= 33
568       if ((C1.w[1] < midpoint128[ind - 19].w[1])
569             || ((C1.w[1] == midpoint128[ind - 19].w[1])
570                 && (C1.w[0] <= midpoint128[ind - 19].w[0]))) {
571           res = 0x00000000;   // return 0
572       } else if (!x_sign) {   // n > 0
573           res = 0x00000001;   // return +1
574       } else {
575           res = 0x80000000;
576           *pfpsf |= INVALID_EXCEPTION;
577           BID_RETURN (res);
578       }
579     }
580     // set inexact flag
581     *pfpsf |= INEXACT_EXCEPTION;
582   } else {          // if (1 <= q + exp <= 10, 1 <= q <= 34, -33 <= exp <= 9)
583     if (x_sign) {   // x <= -1
584       // set invalid flag
585       *pfpsf |= INVALID_EXCEPTION;
586       // return Integer Indefinite
587       res = 0x80000000;
588       BID_RETURN (res);
589     }
590     // 1 <= x < 2^32-1/2 so x can be rounded
591     // to nearest to a 32-bit unsigned integer
592     if (exp < 0) {  // 2 <= q <= 34, -33 <= exp <= -1, 1 <= q + exp <= 10
593       ind = -exp;   // 1 <= ind <= 33; ind is a synonym for 'x'
594       // chop off ind digits from the lower part of C1
595       // C1 = C1 + 1/2 * 10^ind where the result C1 fits in 127 bits
596       tmp64 = C1.w[0];
597       if (ind <= 19) {
598           C1.w[0] = C1.w[0] + midpoint64[ind - 1];
599       } else {
600           C1.w[0] = C1.w[0] + midpoint128[ind - 20].w[0];
601           C1.w[1] = C1.w[1] + midpoint128[ind - 20].w[1];
602       }
603       if (C1.w[0] < tmp64)
604           C1.w[1]++;
605       // calculate C* and f*
606       // C* is actually floor(C*) in this case
607       // C* and f* need shifting and masking, as shown by
608       // shiftright128[] and maskhigh128[]
609       // 1 <= x <= 33
610       // kx = 10^(-x) = ten2mk128[ind - 1]
611       // C* = (C1 + 1/2 * 10^x) * 10^(-x)
612       // the approximation of 10^(-x) was rounded up to 118 bits
613       __mul_128x128_to_256 (P256, C1, ten2mk128[ind - 1]);
614       if (ind - 1 <= 21) {    // 0 <= ind - 1 <= 21
615           Cstar.w[1] = P256.w[3];
616           Cstar.w[0] = P256.w[2];
617           fstar.w[3] = 0;
618           fstar.w[2] = P256.w[2] & maskhigh128[ind - 1];
619           fstar.w[1] = P256.w[1];
620           fstar.w[0] = P256.w[0];
621       } else {      // 22 <= ind - 1 <= 33
622           Cstar.w[1] = 0;
623           Cstar.w[0] = P256.w[3];
624           fstar.w[3] = P256.w[3] & maskhigh128[ind - 1];
625           fstar.w[2] = P256.w[2];
626           fstar.w[1] = P256.w[1];
627           fstar.w[0] = P256.w[0];
628       }
629       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind], e.g.
630       // if x=1, T*=ten2mk128trunc[0]=0x19999999999999999999999999999999
631       // if (0 < f* < 10^(-x)) then the result is a midpoint
632       //   if floor(C*) is even then C* = floor(C*) - logical right
633       //       shift; C* has p decimal digits, correct by Prop. 1)
634       //   else if floor(C*) is odd C* = floor(C*)-1 (logical right
635       //       shift; C* has p decimal digits, correct by Pr. 1)
636       // else
637       //   C* = floor(C*) (logical right shift; C has p decimal digits,
638       //       correct by Property 1)
639       // n = C* * 10^(e+x)
640 
641       // shift right C* by Ex-128 = shiftright128[ind]
642       shift = shiftright128[ind - 1];   // 0 <= shift <= 102
643       if (ind - 1 <= 21) {    // 0 <= ind - 1 <= 21
644           Cstar.w[0] =
645             (Cstar.w[0] >> shift) | (Cstar.w[1] << (64 - shift));
646           // redundant, it will be 0! Cstar.w[1] = (Cstar.w[1] >> shift);
647       } else {      // 22 <= ind - 1 <= 33
648           Cstar.w[0] = (Cstar.w[0] >> (shift - 64));        // 2 <= shift - 64 <= 38
649       }
650       // determine inexactness of the rounding of C*
651       // if (0 < f* - 1/2 < 10^(-x)) then
652       //   the result is exact
653       // else // if (f* - 1/2 > T*) then
654       //   the result is inexact
655       if (ind - 1 <= 2) {
656           if (fstar.w[1] > 0x8000000000000000ull ||
657               (fstar.w[1] == 0x8000000000000000ull
658                && fstar.w[0] > 0x0ull)) {
659             // f* > 1/2 and the result may be exact
660             tmp64 = fstar.w[1] - 0x8000000000000000ull;     // f* - 1/2
661             if (tmp64 > ten2mk128trunc[ind - 1].w[1]
662                 || (tmp64 == ten2mk128trunc[ind - 1].w[1]
663                       && fstar.w[0] >= ten2mk128trunc[ind - 1].w[0])) {
664               // set the inexact flag
665               // *pfpsf |= INEXACT_EXCEPTION;
666               tmp_inexact = 1;
667             }       // else the result is exact
668           } else {  // the result is inexact; f2* <= 1/2
669             // set the inexact flag
670             // *pfpsf |= INEXACT_EXCEPTION;
671             tmp_inexact = 1;
672           }
673       } else if (ind - 1 <= 21) {       // if 3 <= ind <= 21
674           if (fstar.w[3] > 0x0 ||
675               (fstar.w[3] == 0x0 && fstar.w[2] > onehalf128[ind - 1]) ||
676               (fstar.w[3] == 0x0 && fstar.w[2] == onehalf128[ind - 1] &&
677                (fstar.w[1] || fstar.w[0]))) {
678             // f2* > 1/2 and the result may be exact
679             // Calculate f2* - 1/2
680             tmp64 = fstar.w[2] - onehalf128[ind - 1];
681             tmp64A = fstar.w[3];
682             if (tmp64 > fstar.w[2])
683               tmp64A--;
684             if (tmp64A || tmp64
685                 || fstar.w[1] > ten2mk128trunc[ind - 1].w[1]
686                 || (fstar.w[1] == ten2mk128trunc[ind - 1].w[1]
687                       && fstar.w[0] > ten2mk128trunc[ind - 1].w[0])) {
688               // set the inexact flag
689               // *pfpsf |= INEXACT_EXCEPTION;
690               tmp_inexact = 1;
691             }       // else the result is exact
692           } else {  // the result is inexact; f2* <= 1/2
693             // set the inexact flag
694             // *pfpsf |= INEXACT_EXCEPTION;
695             tmp_inexact = 1;
696           }
697       } else {      // if 22 <= ind <= 33
698           if (fstar.w[3] > onehalf128[ind - 1] ||
699               (fstar.w[3] == onehalf128[ind - 1] &&
700                (fstar.w[2] || fstar.w[1] || fstar.w[0]))) {
701             // f2* > 1/2 and the result may be exact
702             // Calculate f2* - 1/2
703             tmp64 = fstar.w[3] - onehalf128[ind - 1];
704             if (tmp64 || fstar.w[2]
705                 || fstar.w[1] > ten2mk128trunc[ind - 1].w[1]
706                 || (fstar.w[1] == ten2mk128trunc[ind - 1].w[1]
707                       && fstar.w[0] > ten2mk128trunc[ind - 1].w[0])) {
708               // set the inexact flag
709               // *pfpsf |= INEXACT_EXCEPTION;
710               tmp_inexact = 1;
711             }       // else the result is exact
712           } else {  // the result is inexact; f2* <= 1/2
713             // set the inexact flag
714             // *pfpsf |= INEXACT_EXCEPTION;
715             tmp_inexact = 1;
716           }
717       }
718 
719       // if the result was a midpoint it was rounded away from zero, so
720       // it will need a correction
721       // check for midpoints
722       if ((fstar.w[3] == 0) && (fstar.w[2] == 0)
723             && (fstar.w[1] || fstar.w[0])
724             && (fstar.w[1] < ten2mk128trunc[ind - 1].w[1]
725                 || (fstar.w[1] == ten2mk128trunc[ind - 1].w[1]
726                       && fstar.w[0] <= ten2mk128trunc[ind - 1].w[0]))) {
727           // the result is a midpoint; round to nearest
728           if (Cstar.w[0] & 0x01) {      // Cstar.w[0] is odd; MP in [EVEN, ODD]
729             // if floor(C*) is odd C = floor(C*) - 1; the result >= 1
730             Cstar.w[0]--;     // Cstar.w[0] is now even
731           }         // else MP in [ODD, EVEN]
732       }
733       res = Cstar.w[0];       // the result is positive
734       if (tmp_inexact)
735           *pfpsf |= INEXACT_EXCEPTION;
736     } else if (exp == 0) {
737       // 1 <= q <= 10
738       // res = C (exact)
739       res = C1.w[0];
740     } else {        // if (exp > 0) => 1 <= exp <= 9, 1 <= q < 9, 2 <= q + exp <= 10
741       // res = C * 10^exp (exact)
742       res = C1.w[0] * ten2k64[exp];
743     }
744   }
745 }
746 
747 BID_RETURN (res);
748 }
749 
750 /*****************************************************************************
751  *  BID128_to_uint32_floor
752  ****************************************************************************/
753 
754 BID128_FUNCTION_ARG1_NORND_CUSTOMRESTYPE (unsigned int,
755                                                     bid128_to_uint32_floor, x)
756 
757      unsigned int res;
758      UINT64 x_sign;
759      UINT64 x_exp;
760      int exp;                           // unbiased exponent
761   // Note: C1.w[1], C1.w[0] represent x_signif_hi, x_signif_lo (all are UINT64)
762      UINT64 tmp64, tmp64A;
763      BID_UI64DOUBLE tmp1;
764      unsigned int x_nr_bits;
765      int q, ind, shift;
766      UINT128 C1, C;
767      UINT128 Cstar;           // C* represents up to 34 decimal digits ~ 113 bits
768      UINT256 fstar;
769      UINT256 P256;
770      int is_inexact_gt_midpoint = 0;
771      int is_midpoint_lt_even = 0;
772 
773   // unpack x
774 x_sign = x.w[1] & MASK_SIGN;  // 0 for positive, MASK_SIGN for negative
775 x_exp = x.w[1] & MASK_EXP;    // biased and shifted left 49 bit positions
776 C1.w[1] = x.w[1] & MASK_COEFF;
777 C1.w[0] = x.w[0];
778 
779   // check for NaN or Infinity
780 if ((x.w[1] & MASK_SPECIAL) == MASK_SPECIAL) {
781     // x is special
782 if ((x.w[1] & MASK_NAN) == MASK_NAN) {  // x is NAN
783   if ((x.w[1] & MASK_SNAN) == MASK_SNAN) {        // x is SNAN
784     // set invalid flag
785     *pfpsf |= INVALID_EXCEPTION;
786     // return Integer Indefinite
787     res = 0x80000000;
788   } else {          // x is QNaN
789     // set invalid flag
790     *pfpsf |= INVALID_EXCEPTION;
791     // return Integer Indefinite
792     res = 0x80000000;
793   }
794   BID_RETURN (res);
795 } else {  // x is not a NaN, so it must be infinity
796   if (!x_sign) {    // x is +inf
797     // set invalid flag
798     *pfpsf |= INVALID_EXCEPTION;
799     // return Integer Indefinite
800     res = 0x80000000;
801   } else {          // x is -inf
802     // set invalid flag
803     *pfpsf |= INVALID_EXCEPTION;
804     // return Integer Indefinite
805     res = 0x80000000;
806   }
807   BID_RETURN (res);
808 }
809 }
810   // check for non-canonical values (after the check for special values)
811 if ((C1.w[1] > 0x0001ed09bead87c0ull)
812     || (C1.w[1] == 0x0001ed09bead87c0ull
813           && (C1.w[0] > 0x378d8e63ffffffffull))
814     || ((x.w[1] & 0x6000000000000000ull) == 0x6000000000000000ull)) {
815   res = 0x00000000;
816   BID_RETURN (res);
817 } else if ((C1.w[1] == 0x0ull) && (C1.w[0] == 0x0ull)) {
818   // x is 0
819   res = 0x00000000;
820   BID_RETURN (res);
821 } else {  // x is not special and is not zero
822   // x < 0 is invalid
823   if (x_sign) {
824     // set invalid flag
825     *pfpsf |= INVALID_EXCEPTION;
826     // return Integer Indefinite
827     res = 0x80000000;
828     BID_RETURN (res);
829   }
830   // x > 0 from this point on
831   // q = nr. of decimal digits in x
832   //  determine first the nr. of bits in x
833   if (C1.w[1] == 0) {
834     if (C1.w[0] >= 0x0020000000000000ull) {       // x >= 2^53
835       // split the 64-bit value in two 32-bit halves to avoid rounding errors
836       if (C1.w[0] >= 0x0000000100000000ull) {     // x >= 2^32
837           tmp1.d = (double) (C1.w[0] >> 32);      // exact conversion
838           x_nr_bits =
839             33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
840       } else {      // x < 2^32
841           tmp1.d = (double) (C1.w[0]);  // exact conversion
842           x_nr_bits =
843             1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
844       }
845     } else {        // if x < 2^53
846       tmp1.d = (double) C1.w[0];        // exact conversion
847       x_nr_bits =
848           1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
849     }
850   } else {          // C1.w[1] != 0 => nr. bits = 64 + nr_bits (C1.w[1])
851     tmp1.d = (double) C1.w[1];          // exact conversion
852     x_nr_bits =
853       65 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
854   }
855   q = nr_digits[x_nr_bits - 1].digits;
856   if (q == 0) {
857     q = nr_digits[x_nr_bits - 1].digits1;
858     if (C1.w[1] > nr_digits[x_nr_bits - 1].threshold_hi
859           || (C1.w[1] == nr_digits[x_nr_bits - 1].threshold_hi
860               && C1.w[0] >= nr_digits[x_nr_bits - 1].threshold_lo))
861       q++;
862   }
863   exp = (x_exp >> 49) - 6176;
864 
865   if ((q + exp) > 10) {       // x >= 10^10 ~= 2^33.2... (cannot fit in 32 bits)
866     // set invalid flag
867     *pfpsf |= INVALID_EXCEPTION;
868     // return Integer Indefinite
869     res = 0x80000000;
870     BID_RETURN (res);
871   } else if ((q + exp) == 10) {         // x = c(0)c(1)...c(9).c(10)...c(q-1)
872     // in this case 2^29.89... ~= 10^9 <= x < 10^10 ~= 2^33.2...
873     // so x rounded to an integer may or may not fit in a signed 32-bit int
874     // the cases that do not fit are identified here; the ones that fit
875     // fall through and will be handled with other cases further,
876     // under '1 <= q + exp <= 10'
877     // n > 0 and q + exp = 10
878     // if n >= 2^32 then n is too large
879     // too large if c(0)c(1)...c(9).c(10)...c(q-1) >= 2^32
880     // too large if 0.c(0)c(1)...c(q-1) * 10^11 >= 0xa00000000, 1<=q<=34
881     if (q <= 11) {
882       tmp64 = C1.w[0] * ten2k64[11 - q];          // C scaled up to 11-digit int
883       // c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
884       if (tmp64 >= 0xa00000000ull) {
885           // set invalid flag
886           *pfpsf |= INVALID_EXCEPTION;
887           // return Integer Indefinite
888           res = 0x80000000;
889           BID_RETURN (res);
890       }
891       // else cases that can be rounded to a 32-bit int fall through
892       // to '1 <= q + exp <= 10'
893     } else {        // if (q > 11), i.e. 12 <= q <= 34 and so -24 <= exp <= -2
894       // 0.c(0)c(1)...c(q-1) * 10^11 >= 0xa00000000 <=>
895       // C >= 0xa00000000 * 10^(q-11) where 1 <= q - 11 <= 23
896       // (scale 2^32 up)
897       tmp64 = 0xa00000000ull;
898       if (q - 11 <= 19) {     // 1 <= q - 11 <= 19; 10^(q-11) requires 64 bits
899           __mul_64x64_to_128MACH (C, tmp64, ten2k64[q - 11]);
900       } else {      // 20 <= q - 11 <= 23, and 10^(q-11) requires 128 bits
901           __mul_128x64_to_128 (C, tmp64, ten2k128[q - 31]);
902       }
903       if (C1.w[1] > C.w[1] || (C1.w[1] == C.w[1] && C1.w[0] >= C.w[0])) {
904           // set invalid flag
905           *pfpsf |= INVALID_EXCEPTION;
906           // return Integer Indefinite
907           res = 0x80000000;
908           BID_RETURN (res);
909       }
910       // else cases that can be rounded to a 32-bit int fall through
911       // to '1 <= q + exp <= 10'
912     }
913   }
914   // n is not too large to be converted to int32: 0 <= n < 2^31
915   // Note: some of the cases tested for above fall through to this point
916   if ((q + exp) <= 0) {
917     // n = +0.0...c(0)c(1)...c(q-1) or n = +0.c(0)c(1)...c(q-1)
918     // return 0
919     res = 0x00000000;
920     BID_RETURN (res);
921   } else {          // if (1 <= q + exp <= 10, 1 <= q <= 34, -33 <= exp <= 9)
922     // 1 <= x < 2^32 so x can be rounded down to a 32-bit unsigned integer
923     if (exp < 0) {  // 2 <= q <= 34, -33 <= exp <= -1, 1 <= q + exp <= 10
924       ind = -exp;   // 1 <= ind <= 33; ind is a synonym for 'x'
925       // chop off ind digits from the lower part of C1
926       // C1 = C1 + 1/2 * 10^ind where the result C1 fits in 127 bits
927       tmp64 = C1.w[0];
928       if (ind <= 19) {
929           C1.w[0] = C1.w[0] + midpoint64[ind - 1];
930       } else {
931           C1.w[0] = C1.w[0] + midpoint128[ind - 20].w[0];
932           C1.w[1] = C1.w[1] + midpoint128[ind - 20].w[1];
933       }
934       if (C1.w[0] < tmp64)
935           C1.w[1]++;
936       // calculate C* and f*
937       // C* is actually floor(C*) in this case
938       // C* and f* need shifting and masking, as shown by
939       // shiftright128[] and maskhigh128[]
940       // 1 <= x <= 33
941       // kx = 10^(-x) = ten2mk128[ind - 1]
942       // C* = (C1 + 1/2 * 10^x) * 10^(-x)
943       // the approximation of 10^(-x) was rounded up to 118 bits
944       __mul_128x128_to_256 (P256, C1, ten2mk128[ind - 1]);
945       if (ind - 1 <= 21) {    // 0 <= ind - 1 <= 21
946           Cstar.w[1] = P256.w[3];
947           Cstar.w[0] = P256.w[2];
948           fstar.w[3] = 0;
949           fstar.w[2] = P256.w[2] & maskhigh128[ind - 1];
950           fstar.w[1] = P256.w[1];
951           fstar.w[0] = P256.w[0];
952       } else {      // 22 <= ind - 1 <= 33
953           Cstar.w[1] = 0;
954           Cstar.w[0] = P256.w[3];
955           fstar.w[3] = P256.w[3] & maskhigh128[ind - 1];
956           fstar.w[2] = P256.w[2];
957           fstar.w[1] = P256.w[1];
958           fstar.w[0] = P256.w[0];
959       }
960       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind], e.g.
961       // if x=1, T*=ten2mk128trunc[0]=0x19999999999999999999999999999999
962       // if (0 < f* < 10^(-x)) then the result is a midpoint
963       //   if floor(C*) is even then C* = floor(C*) - logical right
964       //       shift; C* has p decimal digits, correct by Prop. 1)
965       //   else if floor(C*) is odd C* = floor(C*)-1 (logical right
966       //       shift; C* has p decimal digits, correct by Pr. 1)
967       // else
968       //   C* = floor(C*) (logical right shift; C has p decimal digits,
969       //       correct by Property 1)
970       // n = C* * 10^(e+x)
971 
972       // shift right C* by Ex-128 = shiftright128[ind]
973       shift = shiftright128[ind - 1];   // 0 <= shift <= 102
974       if (ind - 1 <= 21) {    // 0 <= ind - 1 <= 21
975           Cstar.w[0] =
976             (Cstar.w[0] >> shift) | (Cstar.w[1] << (64 - shift));
977           // redundant, it will be 0! Cstar.w[1] = (Cstar.w[1] >> shift);
978       } else {      // 22 <= ind - 1 <= 33
979           Cstar.w[0] = (Cstar.w[0] >> (shift - 64));        // 2 <= shift - 64 <= 38
980       }
981       // determine inexactness of the rounding of C*
982       // if (0 < f* - 1/2 < 10^(-x)) then
983       //   the result is exact
984       // else // if (f* - 1/2 > T*) then
985       //   the result is inexact
986       if (ind - 1 <= 2) {
987           if (fstar.w[1] > 0x8000000000000000ull ||
988               (fstar.w[1] == 0x8000000000000000ull
989                && fstar.w[0] > 0x0ull)) {
990             // f* > 1/2 and the result may be exact
991             tmp64 = fstar.w[1] - 0x8000000000000000ull;     // f* - 1/2
992             if (tmp64 > ten2mk128trunc[ind - 1].w[1]
993                 || (tmp64 == ten2mk128trunc[ind - 1].w[1]
994                       && fstar.w[0] >= ten2mk128trunc[ind - 1].w[0])) {
995             }       // else the result is exact
996           } else {  // the result is inexact; f2* <= 1/2
997             is_inexact_gt_midpoint = 1;
998           }
999       } else if (ind - 1 <= 21) {       // if 3 <= ind <= 21
1000           if (fstar.w[3] > 0x0 ||
1001               (fstar.w[3] == 0x0 && fstar.w[2] > onehalf128[ind - 1]) ||
1002               (fstar.w[3] == 0x0 && fstar.w[2] == onehalf128[ind - 1] &&
1003                (fstar.w[1] || fstar.w[0]))) {
1004             // f2* > 1/2 and the result may be exact
1005             // Calculate f2* - 1/2
1006             tmp64 = fstar.w[2] - onehalf128[ind - 1];
1007             tmp64A = fstar.w[3];
1008             if (tmp64 > fstar.w[2])
1009               tmp64A--;
1010             if (tmp64A || tmp64
1011                 || fstar.w[1] > ten2mk128trunc[ind - 1].w[1]
1012                 || (fstar.w[1] == ten2mk128trunc[ind - 1].w[1]
1013                       && fstar.w[0] > ten2mk128trunc[ind - 1].w[0])) {
1014             }       // else the result is exact
1015           } else {  // the result is inexact; f2* <= 1/2
1016             is_inexact_gt_midpoint = 1;
1017           }
1018       } else {      // if 22 <= ind <= 33
1019           if (fstar.w[3] > onehalf128[ind - 1] ||
1020               (fstar.w[3] == onehalf128[ind - 1] &&
1021                (fstar.w[2] || fstar.w[1] || fstar.w[0]))) {
1022             // f2* > 1/2 and the result may be exact
1023             // Calculate f2* - 1/2
1024             tmp64 = fstar.w[3] - onehalf128[ind - 1];
1025             if (tmp64 || fstar.w[2]
1026                 || fstar.w[1] > ten2mk128trunc[ind - 1].w[1]
1027                 || (fstar.w[1] == ten2mk128trunc[ind - 1].w[1]
1028                       && fstar.w[0] > ten2mk128trunc[ind - 1].w[0])) {
1029             }       // else the result is exact
1030           } else {  // the result is inexact; f2* <= 1/2
1031             is_inexact_gt_midpoint = 1;
1032           }
1033       }
1034 
1035       // if the result was a midpoint it was rounded away from zero, so
1036       // it will need a correction
1037       // check for midpoints
1038       if ((fstar.w[3] == 0) && (fstar.w[2] == 0)
1039             && (fstar.w[1] || fstar.w[0])
1040             && (fstar.w[1] < ten2mk128trunc[ind - 1].w[1]
1041                 || (fstar.w[1] == ten2mk128trunc[ind - 1].w[1]
1042                       && fstar.w[0] <= ten2mk128trunc[ind - 1].w[0]))) {
1043           // the result is a midpoint; round to nearest
1044           if (Cstar.w[0] & 0x01) {      // Cstar.w[0] is odd; MP in [EVEN, ODD]
1045             // if floor(C*) is odd C = floor(C*) - 1; the result >= 1
1046             Cstar.w[0]--;     // Cstar.w[0] is now even
1047             is_inexact_gt_midpoint = 0;
1048           } else {  // else MP in [ODD, EVEN]
1049             is_midpoint_lt_even = 1;
1050             is_inexact_gt_midpoint = 0;
1051           }
1052       }
1053       // general correction for RM
1054       if (is_midpoint_lt_even || is_inexact_gt_midpoint) {
1055           Cstar.w[0] = Cstar.w[0] - 1;
1056       } else {
1057           ;         // the result is already correct
1058       }
1059       res = Cstar.w[0];
1060     } else if (exp == 0) {
1061       // 1 <= q <= 10
1062       // res = +C (exact)
1063       res = C1.w[0];
1064     } else {        // if (exp > 0) => 1 <= exp <= 9, 1 <= q < 9, 2 <= q + exp <= 10
1065       // res = +C * 10^exp (exact)
1066       res = C1.w[0] * ten2k64[exp];
1067     }
1068   }
1069 }
1070 
1071 BID_RETURN (res);
1072 }
1073 
1074 /*****************************************************************************
1075  *  BID128_to_uint32_xfloor
1076  ****************************************************************************/
1077 
1078 BID128_FUNCTION_ARG1_NORND_CUSTOMRESTYPE (unsigned int,
1079                                                     bid128_to_uint32_xfloor, x)
1080 
1081      unsigned int res;
1082      UINT64 x_sign;
1083      UINT64 x_exp;
1084      int exp;                           // unbiased exponent
1085   // Note: C1.w[1], C1.w[0] represent x_signif_hi, x_signif_lo (all are UINT64)
1086      UINT64 tmp64, tmp64A;
1087      BID_UI64DOUBLE tmp1;
1088      unsigned int x_nr_bits;
1089      int q, ind, shift;
1090      UINT128 C1, C;
1091      UINT128 Cstar;           // C* represents up to 34 decimal digits ~ 113 bits
1092      UINT256 fstar;
1093      UINT256 P256;
1094      int is_inexact_gt_midpoint = 0;
1095      int is_midpoint_lt_even = 0;
1096 
1097   // unpack x
1098 x_sign = x.w[1] & MASK_SIGN;  // 0 for positive, MASK_SIGN for negative
1099 x_exp = x.w[1] & MASK_EXP;    // biased and shifted left 49 bit positions
1100 C1.w[1] = x.w[1] & MASK_COEFF;
1101 C1.w[0] = x.w[0];
1102 
1103   // check for NaN or Infinity
1104 if ((x.w[1] & MASK_SPECIAL) == MASK_SPECIAL) {
1105     // x is special
1106 if ((x.w[1] & MASK_NAN) == MASK_NAN) {  // x is NAN
1107   if ((x.w[1] & MASK_SNAN) == MASK_SNAN) {        // x is SNAN
1108     // set invalid flag
1109     *pfpsf |= INVALID_EXCEPTION;
1110     // return Integer Indefinite
1111     res = 0x80000000;
1112   } else {          // x is QNaN
1113     // set invalid flag
1114     *pfpsf |= INVALID_EXCEPTION;
1115     // return Integer Indefinite
1116     res = 0x80000000;
1117   }
1118   BID_RETURN (res);
1119 } else {  // x is not a NaN, so it must be infinity
1120   if (!x_sign) {    // x is +inf
1121     // set invalid flag
1122     *pfpsf |= INVALID_EXCEPTION;
1123     // return Integer Indefinite
1124     res = 0x80000000;
1125   } else {          // x is -inf
1126     // set invalid flag
1127     *pfpsf |= INVALID_EXCEPTION;
1128     // return Integer Indefinite
1129     res = 0x80000000;
1130   }
1131   BID_RETURN (res);
1132 }
1133 }
1134   // check for non-canonical values (after the check for special values)
1135 if ((C1.w[1] > 0x0001ed09bead87c0ull)
1136     || (C1.w[1] == 0x0001ed09bead87c0ull
1137           && (C1.w[0] > 0x378d8e63ffffffffull))
1138     || ((x.w[1] & 0x6000000000000000ull) == 0x6000000000000000ull)) {
1139   res = 0x00000000;
1140   BID_RETURN (res);
1141 } else if ((C1.w[1] == 0x0ull) && (C1.w[0] == 0x0ull)) {
1142   // x is 0
1143   res = 0x00000000;
1144   BID_RETURN (res);
1145 } else {  // x is not special and is not zero
1146   // x < 0 is invalid
1147   if (x_sign) {
1148     // set invalid flag
1149     *pfpsf |= INVALID_EXCEPTION;
1150     // return Integer Indefinite
1151     res = 0x80000000;
1152     BID_RETURN (res);
1153   }
1154   // x > 0 from this point on
1155   // q = nr. of decimal digits in x
1156   //  determine first the nr. of bits in x
1157   if (C1.w[1] == 0) {
1158     if (C1.w[0] >= 0x0020000000000000ull) {       // x >= 2^53
1159       // split the 64-bit value in two 32-bit halves to avoid rounding errors
1160       if (C1.w[0] >= 0x0000000100000000ull) {     // x >= 2^32
1161           tmp1.d = (double) (C1.w[0] >> 32);      // exact conversion
1162           x_nr_bits =
1163             33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
1164       } else {      // x < 2^32
1165           tmp1.d = (double) (C1.w[0]);  // exact conversion
1166           x_nr_bits =
1167             1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
1168       }
1169     } else {        // if x < 2^53
1170       tmp1.d = (double) C1.w[0];        // exact conversion
1171       x_nr_bits =
1172           1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
1173     }
1174   } else {          // C1.w[1] != 0 => nr. bits = 64 + nr_bits (C1.w[1])
1175     tmp1.d = (double) C1.w[1];          // exact conversion
1176     x_nr_bits =
1177       65 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
1178   }
1179   q = nr_digits[x_nr_bits - 1].digits;
1180   if (q == 0) {
1181     q = nr_digits[x_nr_bits - 1].digits1;
1182     if (C1.w[1] > nr_digits[x_nr_bits - 1].threshold_hi
1183           || (C1.w[1] == nr_digits[x_nr_bits - 1].threshold_hi
1184               && C1.w[0] >= nr_digits[x_nr_bits - 1].threshold_lo))
1185       q++;
1186   }
1187   exp = (x_exp >> 49) - 6176;
1188   if ((q + exp) > 10) {       // x >= 10^10 ~= 2^33.2... (cannot fit in 32 bits)
1189     // set invalid flag
1190     *pfpsf |= INVALID_EXCEPTION;
1191     // return Integer Indefinite
1192     res = 0x80000000;
1193     BID_RETURN (res);
1194   } else if ((q + exp) == 10) {         // x = c(0)c(1)...c(9).c(10)...c(q-1)
1195     // in this case 2^29.89... ~= 10^9 <= x < 10^10 ~= 2^33.2...
1196     // so x rounded to an integer may or may not fit in a signed 32-bit int
1197     // the cases that do not fit are identified here; the ones that fit
1198     // fall through and will be handled with other cases further,
1199     // under '1 <= q + exp <= 10'
1200     // n > 0 and q + exp = 10
1201     // if n >= 2^32 then n is too large
1202     // too large if c(0)c(1)...c(9).c(10)...c(q-1) >= 2^32
1203     // too large if 0.c(0)c(1)...c(q-1) * 10^11 >= 0xa00000000, 1<=q<=34
1204     if (q <= 11) {
1205       tmp64 = C1.w[0] * ten2k64[11 - q];          // C scaled up to 11-digit int
1206       // c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
1207       if (tmp64 >= 0xa00000000ull) {
1208           // set invalid flag
1209           *pfpsf |= INVALID_EXCEPTION;
1210           // return Integer Indefinite
1211           res = 0x80000000;
1212           BID_RETURN (res);
1213       }
1214       // else cases that can be rounded to a 32-bit int fall through
1215       // to '1 <= q + exp <= 10'
1216     } else {        // if (q > 11), i.e. 12 <= q <= 34 and so -24 <= exp <= -2
1217       // 0.c(0)c(1)...c(q-1) * 10^11 >= 0xa00000000 <=>
1218       // C >= 0xa00000000 * 10^(q-11) where 1 <= q - 11 <= 23
1219       // (scale 2^32 up)
1220       tmp64 = 0xa00000000ull;
1221       if (q - 11 <= 19) {     // 1 <= q - 11 <= 19; 10^(q-11) requires 64 bits
1222           __mul_64x64_to_128MACH (C, tmp64, ten2k64[q - 11]);
1223       } else {      // 20 <= q - 11 <= 23, and 10^(q-11) requires 128 bits
1224           __mul_128x64_to_128 (C, tmp64, ten2k128[q - 31]);
1225       }
1226       if (C1.w[1] > C.w[1] || (C1.w[1] == C.w[1] && C1.w[0] >= C.w[0])) {
1227           // set invalid flag
1228           *pfpsf |= INVALID_EXCEPTION;
1229           // return Integer Indefinite
1230           res = 0x80000000;
1231           BID_RETURN (res);
1232       }
1233       // else cases that can be rounded to a 32-bit int fall through
1234       // to '1 <= q + exp <= 10'
1235     }
1236   }
1237   // n is not too large to be converted to int32: 0 <= n < 2^31
1238   // Note: some of the cases tested for above fall through to this point
1239   if ((q + exp) <= 0) {
1240     // n = +0.0...c(0)c(1)...c(q-1) or n = +0.c(0)c(1)...c(q-1)
1241     // set inexact flag
1242     *pfpsf |= INEXACT_EXCEPTION;
1243     // return 0
1244     res = 0x00000000;
1245     BID_RETURN (res);
1246   } else {          // if (1 <= q + exp <= 10, 1 <= q <= 34, -33 <= exp <= 9)
1247     // 1 <= x < 2^32 so x can be rounded down to a 32-bit unsigned integer
1248     if (exp < 0) {  // 2 <= q <= 34, -33 <= exp <= -1, 1 <= q + exp <= 10
1249       ind = -exp;   // 1 <= ind <= 33; ind is a synonym for 'x'
1250       // chop off ind digits from the lower part of C1
1251       // C1 = C1 + 1/2 * 10^ind where the result C1 fits in 127 bits
1252       tmp64 = C1.w[0];
1253       if (ind <= 19) {
1254           C1.w[0] = C1.w[0] + midpoint64[ind - 1];
1255       } else {
1256           C1.w[0] = C1.w[0] + midpoint128[ind - 20].w[0];
1257           C1.w[1] = C1.w[1] + midpoint128[ind - 20].w[1];
1258       }
1259       if (C1.w[0] < tmp64)
1260           C1.w[1]++;
1261       // calculate C* and f*
1262       // C* is actually floor(C*) in this case
1263       // C* and f* need shifting and masking, as shown by
1264       // shiftright128[] and maskhigh128[]
1265       // 1 <= x <= 33
1266       // kx = 10^(-x) = ten2mk128[ind - 1]
1267       // C* = (C1 + 1/2 * 10^x) * 10^(-x)
1268       // the approximation of 10^(-x) was rounded up to 118 bits
1269       __mul_128x128_to_256 (P256, C1, ten2mk128[ind - 1]);
1270       if (ind - 1 <= 21) {    // 0 <= ind - 1 <= 21
1271           Cstar.w[1] = P256.w[3];
1272           Cstar.w[0] = P256.w[2];
1273           fstar.w[3] = 0;
1274           fstar.w[2] = P256.w[2] & maskhigh128[ind - 1];
1275           fstar.w[1] = P256.w[1];
1276           fstar.w[0] = P256.w[0];
1277       } else {      // 22 <= ind - 1 <= 33
1278           Cstar.w[1] = 0;
1279           Cstar.w[0] = P256.w[3];
1280           fstar.w[3] = P256.w[3] & maskhigh128[ind - 1];
1281           fstar.w[2] = P256.w[2];
1282           fstar.w[1] = P256.w[1];
1283           fstar.w[0] = P256.w[0];
1284       }
1285       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind], e.g.
1286       // if x=1, T*=ten2mk128trunc[0]=0x19999999999999999999999999999999
1287       // if (0 < f* < 10^(-x)) then the result is a midpoint
1288       //   if floor(C*) is even then C* = floor(C*) - logical right
1289       //       shift; C* has p decimal digits, correct by Prop. 1)
1290       //   else if floor(C*) is odd C* = floor(C*)-1 (logical right
1291       //       shift; C* has p decimal digits, correct by Pr. 1)
1292       // else
1293       //   C* = floor(C*) (logical right shift; C has p decimal digits,
1294       //       correct by Property 1)
1295       // n = C* * 10^(e+x)
1296 
1297       // shift right C* by Ex-128 = shiftright128[ind]
1298       shift = shiftright128[ind - 1];   // 0 <= shift <= 102
1299       if (ind - 1 <= 21) {    // 0 <= ind - 1 <= 21
1300           Cstar.w[0] =
1301             (Cstar.w[0] >> shift) | (Cstar.w[1] << (64 - shift));
1302           // redundant, it will be 0! Cstar.w[1] = (Cstar.w[1] >> shift);
1303       } else {      // 22 <= ind - 1 <= 33
1304           Cstar.w[0] = (Cstar.w[0] >> (shift - 64));        // 2 <= shift - 64 <= 38
1305       }
1306       // determine inexactness of the rounding of C*
1307       // if (0 < f* - 1/2 < 10^(-x)) then
1308       //   the result is exact
1309       // else // if (f* - 1/2 > T*) then
1310       //   the result is inexact
1311       if (ind - 1 <= 2) {
1312           if (fstar.w[1] > 0x8000000000000000ull ||
1313               (fstar.w[1] == 0x8000000000000000ull
1314                && fstar.w[0] > 0x0ull)) {
1315             // f* > 1/2 and the result may be exact
1316             tmp64 = fstar.w[1] - 0x8000000000000000ull;     // f* - 1/2
1317             if (tmp64 > ten2mk128trunc[ind - 1].w[1]
1318                 || (tmp64 == ten2mk128trunc[ind - 1].w[1]
1319                       && fstar.w[0] >= ten2mk128trunc[ind - 1].w[0])) {
1320               // set the inexact flag
1321               *pfpsf |= INEXACT_EXCEPTION;
1322             }       // else the result is exact
1323           } else {  // the result is inexact; f2* <= 1/2
1324             // set the inexact flag
1325             *pfpsf |= INEXACT_EXCEPTION;
1326             is_inexact_gt_midpoint = 1;
1327           }
1328       } else if (ind - 1 <= 21) {       // if 3 <= ind <= 21
1329           if (fstar.w[3] > 0x0 ||
1330               (fstar.w[3] == 0x0 && fstar.w[2] > onehalf128[ind - 1]) ||
1331               (fstar.w[3] == 0x0 && fstar.w[2] == onehalf128[ind - 1] &&
1332                (fstar.w[1] || fstar.w[0]))) {
1333             // f2* > 1/2 and the result may be exact
1334             // Calculate f2* - 1/2
1335             tmp64 = fstar.w[2] - onehalf128[ind - 1];
1336             tmp64A = fstar.w[3];
1337             if (tmp64 > fstar.w[2])
1338               tmp64A--;
1339             if (tmp64A || tmp64
1340                 || fstar.w[1] > ten2mk128trunc[ind - 1].w[1]
1341                 || (fstar.w[1] == ten2mk128trunc[ind - 1].w[1]
1342                       && fstar.w[0] > ten2mk128trunc[ind - 1].w[0])) {
1343               // set the inexact flag
1344               *pfpsf |= INEXACT_EXCEPTION;
1345             }       // else the result is exact
1346           } else {  // the result is inexact; f2* <= 1/2
1347             // set the inexact flag
1348             *pfpsf |= INEXACT_EXCEPTION;
1349             is_inexact_gt_midpoint = 1;
1350           }
1351       } else {      // if 22 <= ind <= 33
1352           if (fstar.w[3] > onehalf128[ind - 1] ||
1353               (fstar.w[3] == onehalf128[ind - 1] &&
1354                (fstar.w[2] || fstar.w[1] || fstar.w[0]))) {
1355             // f2* > 1/2 and the result may be exact
1356             // Calculate f2* - 1/2
1357             tmp64 = fstar.w[3] - onehalf128[ind - 1];
1358             if (tmp64 || fstar.w[2]
1359                 || fstar.w[1] > ten2mk128trunc[ind - 1].w[1]
1360                 || (fstar.w[1] == ten2mk128trunc[ind - 1].w[1]
1361                       && fstar.w[0] > ten2mk128trunc[ind - 1].w[0])) {
1362               // set the inexact flag
1363               *pfpsf |= INEXACT_EXCEPTION;
1364             }       // else the result is exact
1365           } else {  // the result is inexact; f2* <= 1/2
1366             // set the inexact flag
1367             *pfpsf |= INEXACT_EXCEPTION;
1368             is_inexact_gt_midpoint = 1;
1369           }
1370       }
1371 
1372       // if the result was a midpoint it was rounded away from zero, so
1373       // it will need a correction
1374       // check for midpoints
1375       if ((fstar.w[3] == 0) && (fstar.w[2] == 0)
1376             && (fstar.w[1] || fstar.w[0])
1377             && (fstar.w[1] < ten2mk128trunc[ind - 1].w[1]
1378                 || (fstar.w[1] == ten2mk128trunc[ind - 1].w[1]
1379                       && fstar.w[0] <= ten2mk128trunc[ind - 1].w[0]))) {
1380           // the result is a midpoint; round to nearest
1381           if (Cstar.w[0] & 0x01) {      // Cstar.w[0] is odd; MP in [EVEN, ODD]
1382             // if floor(C*) is odd C = floor(C*) - 1; the result >= 1
1383             Cstar.w[0]--;     // Cstar.w[0] is now even
1384             is_inexact_gt_midpoint = 0;
1385           } else {  // else MP in [ODD, EVEN]
1386             is_midpoint_lt_even = 1;
1387             is_inexact_gt_midpoint = 0;
1388           }
1389       }
1390       // general correction for RM
1391       if (is_midpoint_lt_even || is_inexact_gt_midpoint) {
1392           Cstar.w[0] = Cstar.w[0] - 1;
1393       } else {
1394           ;         // the result is already correct
1395       }
1396       res = Cstar.w[0];
1397     } else if (exp == 0) {
1398       // 1 <= q <= 10
1399       // res = +C (exact)
1400       res = C1.w[0];
1401     } else {        // if (exp > 0) => 1 <= exp <= 9, 1 <= q < 9, 2 <= q + exp <= 10
1402       // res = +C * 10^exp (exact)
1403       res = C1.w[0] * ten2k64[exp];
1404     }
1405   }
1406 }
1407 
1408 BID_RETURN (res);
1409 }
1410 
1411 /*****************************************************************************
1412  *  BID128_to_uint32_ceil
1413  ****************************************************************************/
1414 
1415 BID128_FUNCTION_ARG1_NORND_CUSTOMRESTYPE (unsigned int,
1416                                                     bid128_to_uint32_ceil, x)
1417 
1418      unsigned int res;
1419      UINT64 x_sign;
1420      UINT64 x_exp;
1421      int exp;                           // unbiased exponent
1422   // Note: C1.w[1], C1.w[0] represent x_signif_hi, x_signif_lo (all are UINT64)
1423      UINT64 tmp64, tmp64A;
1424      BID_UI64DOUBLE tmp1;
1425      unsigned int x_nr_bits;
1426      int q, ind, shift;
1427      UINT128 C1, C;
1428      UINT128 Cstar;           // C* represents up to 34 decimal digits ~ 113 bits
1429      UINT256 fstar;
1430      UINT256 P256;
1431      int is_inexact_lt_midpoint = 0;
1432      int is_midpoint_gt_even = 0;
1433 
1434   // unpack x
1435 x_sign = x.w[1] & MASK_SIGN;  // 0 for positive, MASK_SIGN for negative
1436 x_exp = x.w[1] & MASK_EXP;    // biased and shifted left 49 bit positions
1437 C1.w[1] = x.w[1] & MASK_COEFF;
1438 C1.w[0] = x.w[0];
1439 
1440   // check for NaN or Infinity
1441 if ((x.w[1] & MASK_SPECIAL) == MASK_SPECIAL) {
1442     // x is special
1443 if ((x.w[1] & MASK_NAN) == MASK_NAN) {  // x is NAN
1444   if ((x.w[1] & MASK_SNAN) == MASK_SNAN) {        // x is SNAN
1445     // set invalid flag
1446     *pfpsf |= INVALID_EXCEPTION;
1447     // return Integer Indefinite
1448     res = 0x80000000;
1449   } else {          // x is QNaN
1450     // set invalid flag
1451     *pfpsf |= INVALID_EXCEPTION;
1452     // return Integer Indefinite
1453     res = 0x80000000;
1454   }
1455   BID_RETURN (res);
1456 } else {  // x is not a NaN, so it must be infinity
1457   if (!x_sign) {    // x is +inf
1458     // set invalid flag
1459     *pfpsf |= INVALID_EXCEPTION;
1460     // return Integer Indefinite
1461     res = 0x80000000;
1462   } else {          // x is -inf
1463     // set invalid flag
1464     *pfpsf |= INVALID_EXCEPTION;
1465     // return Integer Indefinite
1466     res = 0x80000000;
1467   }
1468   BID_RETURN (res);
1469 }
1470 }
1471   // check for non-canonical values (after the check for special values)
1472 if ((C1.w[1] > 0x0001ed09bead87c0ull)
1473     || (C1.w[1] == 0x0001ed09bead87c0ull
1474           && (C1.w[0] > 0x378d8e63ffffffffull))
1475     || ((x.w[1] & 0x6000000000000000ull) == 0x6000000000000000ull)) {
1476   res = 0x00000000;
1477   BID_RETURN (res);
1478 } else if ((C1.w[1] == 0x0ull) && (C1.w[0] == 0x0ull)) {
1479   // x is 0
1480   res = 0x00000000;
1481   BID_RETURN (res);
1482 } else {  // x is not special and is not zero
1483 
1484   // q = nr. of decimal digits in x
1485   //  determine first the nr. of bits in x
1486   if (C1.w[1] == 0) {
1487     if (C1.w[0] >= 0x0020000000000000ull) {       // x >= 2^53
1488       // split the 64-bit value in two 32-bit halves to avoid rounding errors
1489       if (C1.w[0] >= 0x0000000100000000ull) {     // x >= 2^32
1490           tmp1.d = (double) (C1.w[0] >> 32);      // exact conversion
1491           x_nr_bits =
1492             33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
1493       } else {      // x < 2^32
1494           tmp1.d = (double) (C1.w[0]);  // exact conversion
1495           x_nr_bits =
1496             1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
1497       }
1498     } else {        // if x < 2^53
1499       tmp1.d = (double) C1.w[0];        // exact conversion
1500       x_nr_bits =
1501           1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
1502     }
1503   } else {          // C1.w[1] != 0 => nr. bits = 64 + nr_bits (C1.w[1])
1504     tmp1.d = (double) C1.w[1];          // exact conversion
1505     x_nr_bits =
1506       65 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
1507   }
1508   q = nr_digits[x_nr_bits - 1].digits;
1509   if (q == 0) {
1510     q = nr_digits[x_nr_bits - 1].digits1;
1511     if (C1.w[1] > nr_digits[x_nr_bits - 1].threshold_hi
1512           || (C1.w[1] == nr_digits[x_nr_bits - 1].threshold_hi
1513               && C1.w[0] >= nr_digits[x_nr_bits - 1].threshold_lo))
1514       q++;
1515   }
1516   exp = (x_exp >> 49) - 6176;
1517 
1518   if ((q + exp) > 10) {       // x >= 10^10 ~= 2^33.2... (cannot fit in 32 bits)
1519     // set invalid flag
1520     *pfpsf |= INVALID_EXCEPTION;
1521     // return Integer Indefinite
1522     res = 0x80000000;
1523     BID_RETURN (res);
1524   } else if ((q + exp) == 10) {         // x = c(0)c(1)...c(9).c(10)...c(q-1)
1525     // in this case 2^29.89... ~= 10^9 <= x < 10^10 ~= 2^33.2...
1526     // so x rounded to an integer may or may not fit in a signed 32-bit int
1527     // the cases that do not fit are identified here; the ones that fit
1528     // fall through and will be handled with other cases further,
1529     // under '1 <= q + exp <= 10'
1530     if (x_sign) {   // if n < 0 and q + exp = 10
1531       // if n <= -1 then n is too large
1532       // too large if c(0)c(1)...c(9).c(10)...c(q-1) >= 1
1533       // <=> 0.c(0)c(1)...c(q-1) * 10^11 >= 0x50000000a, 1<=q<=34
1534       if (q <= 11) {
1535           tmp64 = C1.w[0] * ten2k64[11 - q];      // C scaled up to 11-digit int
1536           // c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
1537           if (tmp64 >= 0x0aull) {
1538             // set invalid flag
1539             *pfpsf |= INVALID_EXCEPTION;
1540             // return Integer Indefinite
1541             res = 0x80000000;
1542             BID_RETURN (res);
1543           }
1544           // else cases that can be rounded to a 32-bit int fall through
1545           // to '1 <= q + exp <= 10'
1546       } else {      // if (q > 11), i.e. 12 <= q <= 34 and so -24 <= exp <= -2
1547           // 0.c(0)c(1)...c(q-1) * 10^11 >= 0x0a <=>
1548           // C >= 0x0a * 10^(q-11) where 1 <= q - 11 <= 23
1549           // (scale 1 up)
1550           tmp64 = 0x0aull;
1551           if (q - 11 <= 19) { // 1 <= q - 11 <= 19; 10^(q-11) requires 64 bits
1552             __mul_64x64_to_128MACH (C, tmp64, ten2k64[q - 11]);
1553           } else {  // 20 <= q - 11 <= 23, and 10^(q-11) requires 128 bits
1554             __mul_128x64_to_128 (C, tmp64, ten2k128[q - 31]);
1555           }
1556           if (C1.w[1] > C.w[1]
1557               || (C1.w[1] == C.w[1] && C1.w[0] >= C.w[0])) {
1558             // set invalid flag
1559             *pfpsf |= INVALID_EXCEPTION;
1560             // return Integer Indefinite
1561             res = 0x80000000;
1562             BID_RETURN (res);
1563           }
1564           // else cases that can be rounded to a 32-bit int fall through
1565           // to '1 <= q + exp <= 10'
1566       }
1567     } else {        // if n > 0 and q + exp = 10
1568       // if n > 2^32 - 1 then n is too large
1569       // too large if c(0)c(1)...c(9).c(10)...c(q-1) > 2^32 - 1
1570       // too large if 0.c(0)c(1)...c(q-1) * 10^11 > 0x9fffffff6, 1<=q<=34
1571       if (q <= 11) {
1572           tmp64 = C1.w[0] * ten2k64[11 - q];      // C scaled up to 11-digit int
1573           // c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
1574           if (tmp64 > 0x9fffffff6ull) {
1575             // set invalid flag
1576             *pfpsf |= INVALID_EXCEPTION;
1577             // return Integer Indefinite
1578             res = 0x80000000;
1579             BID_RETURN (res);
1580           }
1581           // else cases that can be rounded to a 32-bit int fall through
1582           // to '1 <= q + exp <= 10'
1583       } else {      // if (q > 11), i.e. 12 <= q <= 34 and so -24 <= exp <= -2
1584           // 0.c(0)c(1)...c(q-1) * 10^11 > 0x9fffffff6 <=>
1585           // C > 0x9fffffff6 * 10^(q-11) where 1 <= q - 11 <= 23
1586           // (scale 2^32 up)
1587           tmp64 = 0x9fffffff6ull;
1588           if (q - 11 <= 19) { // 1 <= q - 11 <= 19; 10^(q-11) requires 64 bits
1589             __mul_64x64_to_128MACH (C, tmp64, ten2k64[q - 11]);
1590           } else {  // 20 <= q - 11 <= 23, and 10^(q-11) requires 128 bits
1591             __mul_128x64_to_128 (C, tmp64, ten2k128[q - 31]);
1592           }
1593           if (C1.w[1] > C.w[1] || (C1.w[1] == C.w[1] && C1.w[0] > C.w[0])) {
1594             // set invalid flag
1595             *pfpsf |= INVALID_EXCEPTION;
1596             // return Integer Indefinite
1597             res = 0x80000000;
1598             BID_RETURN (res);
1599           }
1600           // else cases that can be rounded to a 32-bit int fall through
1601           // to '1 <= q + exp <= 10'
1602       }
1603     }
1604   }
1605   // n is not too large to be converted to int32: -2^32-1 < n <= 2^32-1
1606   // Note: some of the cases tested for above fall through to this point
1607   if ((q + exp) <= 0) {
1608     // n = +/-0.0...c(0)c(1)...c(q-1) or n = +/-0.c(0)c(1)...c(q-1)
1609     // return 0
1610     if (x_sign)
1611       res = 0x00000000;
1612     else
1613       res = 0x00000001;
1614     BID_RETURN (res);
1615   } else {          // if (1 <= q + exp <= 10, 1 <= q <= 34, -33 <= exp <= 9)
1616     // -2^32-1 < x <= -1 or 1 <= x <= 2^32-1 so x can be rounded
1617     // toward positive infinity to a 32-bit signed integer
1618     if (x_sign) {   // x <= -1 is invalid
1619       // set invalid flag
1620       *pfpsf |= INVALID_EXCEPTION;
1621       // return Integer Indefinite
1622       res = 0x80000000;
1623       BID_RETURN (res);
1624     }
1625     // x > 0 from this point on
1626     if (exp < 0) {  // 2 <= q <= 34, -33 <= exp <= -1, 1 <= q + exp <= 10
1627       ind = -exp;   // 1 <= ind <= 33; ind is a synonym for 'x'
1628       // chop off ind digits from the lower part of C1
1629       // C1 = C1 + 1/2 * 10^ind where the result C1 fits in 127 bits
1630       tmp64 = C1.w[0];
1631       if (ind <= 19) {
1632           C1.w[0] = C1.w[0] + midpoint64[ind - 1];
1633       } else {
1634           C1.w[0] = C1.w[0] + midpoint128[ind - 20].w[0];
1635           C1.w[1] = C1.w[1] + midpoint128[ind - 20].w[1];
1636       }
1637       if (C1.w[0] < tmp64)
1638           C1.w[1]++;
1639       // calculate C* and f*
1640       // C* is actually floor(C*) in this case
1641       // C* and f* need shifting and masking, as shown by
1642       // shiftright128[] and maskhigh128[]
1643       // 1 <= x <= 33
1644       // kx = 10^(-x) = ten2mk128[ind - 1]
1645       // C* = (C1 + 1/2 * 10^x) * 10^(-x)
1646       // the approximation of 10^(-x) was rounded up to 118 bits
1647       __mul_128x128_to_256 (P256, C1, ten2mk128[ind - 1]);
1648       if (ind - 1 <= 21) {    // 0 <= ind - 1 <= 21
1649           Cstar.w[1] = P256.w[3];
1650           Cstar.w[0] = P256.w[2];
1651           fstar.w[3] = 0;
1652           fstar.w[2] = P256.w[2] & maskhigh128[ind - 1];
1653           fstar.w[1] = P256.w[1];
1654           fstar.w[0] = P256.w[0];
1655       } else {      // 22 <= ind - 1 <= 33
1656           Cstar.w[1] = 0;
1657           Cstar.w[0] = P256.w[3];
1658           fstar.w[3] = P256.w[3] & maskhigh128[ind - 1];
1659           fstar.w[2] = P256.w[2];
1660           fstar.w[1] = P256.w[1];
1661           fstar.w[0] = P256.w[0];
1662       }
1663       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind], e.g.
1664       // if x=1, T*=ten2mk128trunc[0]=0x19999999999999999999999999999999
1665       // if (0 < f* < 10^(-x)) then the result is a midpoint
1666       //   if floor(C*) is even then C* = floor(C*) - logical right
1667       //       shift; C* has p decimal digits, correct by Prop. 1)
1668       //   else if floor(C*) is odd C* = floor(C*)-1 (logical right
1669       //       shift; C* has p decimal digits, correct by Pr. 1)
1670       // else
1671       //   C* = floor(C*) (logical right shift; C has p decimal digits,
1672       //       correct by Property 1)
1673       // n = C* * 10^(e+x)
1674 
1675       // shift right C* by Ex-128 = shiftright128[ind]
1676       shift = shiftright128[ind - 1];   // 0 <= shift <= 102
1677       if (ind - 1 <= 21) {    // 0 <= ind - 1 <= 21
1678           Cstar.w[0] =
1679             (Cstar.w[0] >> shift) | (Cstar.w[1] << (64 - shift));
1680           // redundant, it will be 0! Cstar.w[1] = (Cstar.w[1] >> shift);
1681       } else {      // 22 <= ind - 1 <= 33
1682           Cstar.w[0] = (Cstar.w[0] >> (shift - 64));        // 2 <= shift - 64 <= 38
1683       }
1684       // determine inexactness of the rounding of C*
1685       // if (0 < f* - 1/2 < 10^(-x)) then
1686       //   the result is exact
1687       // else // if (f* - 1/2 > T*) then
1688       //   the result is inexact
1689       if (ind - 1 <= 2) {
1690           if (fstar.w[1] > 0x8000000000000000ull ||
1691               (fstar.w[1] == 0x8000000000000000ull
1692                && fstar.w[0] > 0x0ull)) {
1693             // f* > 1/2 and the result may be exact
1694             tmp64 = fstar.w[1] - 0x8000000000000000ull;     // f* - 1/2
1695             if (tmp64 > ten2mk128trunc[ind - 1].w[1]
1696                 || (tmp64 == ten2mk128trunc[ind - 1].w[1]
1697                       && fstar.w[0] >= ten2mk128trunc[ind - 1].w[0])) {
1698               is_inexact_lt_midpoint = 1;
1699             }       // else the result is exact
1700           } else {  // the result is inexact; f2* <= 1/2
1701             ;
1702           }
1703       } else if (ind - 1 <= 21) {       // if 3 <= ind <= 21
1704           if (fstar.w[3] > 0x0 ||
1705               (fstar.w[3] == 0x0 && fstar.w[2] > onehalf128[ind - 1]) ||
1706               (fstar.w[3] == 0x0 && fstar.w[2] == onehalf128[ind - 1] &&
1707                (fstar.w[1] || fstar.w[0]))) {
1708             // f2* > 1/2 and the result may be exact
1709             // Calculate f2* - 1/2
1710             tmp64 = fstar.w[2] - onehalf128[ind - 1];
1711             tmp64A = fstar.w[3];
1712             if (tmp64 > fstar.w[2])
1713               tmp64A--;
1714             if (tmp64A || tmp64
1715                 || fstar.w[1] > ten2mk128trunc[ind - 1].w[1]
1716                 || (fstar.w[1] == ten2mk128trunc[ind - 1].w[1]
1717                       && fstar.w[0] > ten2mk128trunc[ind - 1].w[0])) {
1718               is_inexact_lt_midpoint = 1;
1719             }       // else the result is exact
1720           } else {  // the result is inexact; f2* <= 1/2
1721           }
1722       } else {      // if 22 <= ind <= 33
1723           if (fstar.w[3] > onehalf128[ind - 1] ||
1724               (fstar.w[3] == onehalf128[ind - 1] &&
1725                (fstar.w[2] || fstar.w[1] || fstar.w[0]))) {
1726             // f2* > 1/2 and the result may be exact
1727             // Calculate f2* - 1/2
1728             tmp64 = fstar.w[3] - onehalf128[ind - 1];
1729             if (tmp64 || fstar.w[2]
1730                 || fstar.w[1] > ten2mk128trunc[ind - 1].w[1]
1731                 || (fstar.w[1] == ten2mk128trunc[ind - 1].w[1]
1732                       && fstar.w[0] > ten2mk128trunc[ind - 1].w[0])) {
1733               is_inexact_lt_midpoint = 1;
1734             }       // else the result is exact
1735           } else {  // the result is inexact; f2* <= 1/2
1736             ;
1737           }
1738       }
1739 
1740       // if the result was a midpoint it was rounded away from zero, so
1741       // it will need a correction
1742       // check for midpoints
1743       if ((fstar.w[3] == 0) && (fstar.w[2] == 0)
1744             && (fstar.w[1] || fstar.w[0])
1745             && (fstar.w[1] < ten2mk128trunc[ind - 1].w[1]
1746                 || (fstar.w[1] == ten2mk128trunc[ind - 1].w[1]
1747                       && fstar.w[0] <= ten2mk128trunc[ind - 1].w[0]))) {
1748           // the result is a midpoint; round to nearest
1749           if (Cstar.w[0] & 0x01) {      // Cstar.w[0] is odd; MP in [EVEN, ODD]
1750             // if floor(C*) is odd C = floor(C*) - 1; the result >= 1
1751             Cstar.w[0]--;     // Cstar.w[0] is now even
1752             is_midpoint_gt_even = 1;
1753             is_inexact_lt_midpoint = 0;
1754           } else {  // else MP in [ODD, EVEN]
1755             is_inexact_lt_midpoint = 0;
1756           }
1757       }
1758       // general correction for RM
1759       if (is_midpoint_gt_even || is_inexact_lt_midpoint) {
1760           Cstar.w[0] = Cstar.w[0] + 1;
1761       } else {
1762           ;         // the result is already correct
1763       }
1764       res = Cstar.w[0];
1765     } else if (exp == 0) {
1766       // 1 <= q <= 10
1767       // res = +C (exact)
1768       res = C1.w[0];
1769     } else {        // if (exp > 0) => 1 <= exp <= 9, 1 <= q < 9, 2 <= q + exp <= 10
1770       // res = +C * 10^exp (exact)
1771       res = C1.w[0] * ten2k64[exp];
1772     }
1773   }
1774 }
1775 
1776 BID_RETURN (res);
1777 }
1778 
1779 /*****************************************************************************
1780  *  BID128_to_uint32_xceil
1781  ****************************************************************************/
1782 
1783 BID128_FUNCTION_ARG1_NORND_CUSTOMRESTYPE (unsigned int,
1784                                                     bid128_to_uint32_xceil, x)
1785 
1786      unsigned int res;
1787      UINT64 x_sign;
1788      UINT64 x_exp;
1789      int exp;                           // unbiased exponent
1790   // Note: C1.w[1], C1.w[0] represent x_signif_hi, x_signif_lo (all are UINT64)
1791      UINT64 tmp64, tmp64A;
1792      BID_UI64DOUBLE tmp1;
1793      unsigned int x_nr_bits;
1794      int q, ind, shift;
1795      UINT128 C1, C;
1796      UINT128 Cstar;           // C* represents up to 34 decimal digits ~ 113 bits
1797      UINT256 fstar;
1798      UINT256 P256;
1799      int is_inexact_lt_midpoint = 0;
1800      int is_midpoint_gt_even = 0;
1801 
1802   // unpack x
1803 x_sign = x.w[1] & MASK_SIGN;  // 0 for positive, MASK_SIGN for negative
1804 x_exp = x.w[1] & MASK_EXP;    // biased and shifted left 49 bit positions
1805 C1.w[1] = x.w[1] & MASK_COEFF;
1806 C1.w[0] = x.w[0];
1807 
1808   // check for NaN or Infinity
1809 if ((x.w[1] & MASK_SPECIAL) == MASK_SPECIAL) {
1810     // x is special
1811 if ((x.w[1] & MASK_NAN) == MASK_NAN) {  // x is NAN
1812   if ((x.w[1] & MASK_SNAN) == MASK_SNAN) {        // x is SNAN
1813     // set invalid flag
1814     *pfpsf |= INVALID_EXCEPTION;
1815     // return Integer Indefinite
1816     res = 0x80000000;
1817   } else {          // x is QNaN
1818     // set invalid flag
1819     *pfpsf |= INVALID_EXCEPTION;
1820     // return Integer Indefinite
1821     res = 0x80000000;
1822   }
1823   BID_RETURN (res);
1824 } else {  // x is not a NaN, so it must be infinity
1825   if (!x_sign) {    // x is +inf
1826     // set invalid flag
1827     *pfpsf |= INVALID_EXCEPTION;
1828     // return Integer Indefinite
1829     res = 0x80000000;
1830   } else {          // x is -inf
1831     // set invalid flag
1832     *pfpsf |= INVALID_EXCEPTION;
1833     // return Integer Indefinite
1834     res = 0x80000000;
1835   }
1836   BID_RETURN (res);
1837 }
1838 }
1839   // check for non-canonical values (after the check for special values)
1840 if ((C1.w[1] > 0x0001ed09bead87c0ull)
1841     || (C1.w[1] == 0x0001ed09bead87c0ull
1842           && (C1.w[0] > 0x378d8e63ffffffffull))
1843     || ((x.w[1] & 0x6000000000000000ull) == 0x6000000000000000ull)) {
1844   res = 0x00000000;
1845   BID_RETURN (res);
1846 } else if ((C1.w[1] == 0x0ull) && (C1.w[0] == 0x0ull)) {
1847   // x is 0
1848   res = 0x00000000;
1849   BID_RETURN (res);
1850 } else {  // x is not special and is not zero
1851 
1852   // q = nr. of decimal digits in x
1853   //  determine first the nr. of bits in x
1854   if (C1.w[1] == 0) {
1855     if (C1.w[0] >= 0x0020000000000000ull) {       // x >= 2^53
1856       // split the 64-bit value in two 32-bit halves to avoid rounding errors
1857       if (C1.w[0] >= 0x0000000100000000ull) {     // x >= 2^32
1858           tmp1.d = (double) (C1.w[0] >> 32);      // exact conversion
1859           x_nr_bits =
1860             33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
1861       } else {      // x < 2^32
1862           tmp1.d = (double) (C1.w[0]);  // exact conversion
1863           x_nr_bits =
1864             1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
1865       }
1866     } else {        // if x < 2^53
1867       tmp1.d = (double) C1.w[0];        // exact conversion
1868       x_nr_bits =
1869           1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
1870     }
1871   } else {          // C1.w[1] != 0 => nr. bits = 64 + nr_bits (C1.w[1])
1872     tmp1.d = (double) C1.w[1];          // exact conversion
1873     x_nr_bits =
1874       65 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
1875   }
1876   q = nr_digits[x_nr_bits - 1].digits;
1877   if (q == 0) {
1878     q = nr_digits[x_nr_bits - 1].digits1;
1879     if (C1.w[1] > nr_digits[x_nr_bits - 1].threshold_hi
1880           || (C1.w[1] == nr_digits[x_nr_bits - 1].threshold_hi
1881               && C1.w[0] >= nr_digits[x_nr_bits - 1].threshold_lo))
1882       q++;
1883   }
1884   exp = (x_exp >> 49) - 6176;
1885   if ((q + exp) > 10) {       // x >= 10^10 ~= 2^33.2... (cannot fit in 32 bits)
1886     // set invalid flag
1887     *pfpsf |= INVALID_EXCEPTION;
1888     // return Integer Indefinite
1889     res = 0x80000000;
1890     BID_RETURN (res);
1891   } else if ((q + exp) == 10) {         // x = c(0)c(1)...c(9).c(10)...c(q-1)
1892     // in this case 2^29.89... ~= 10^9 <= x < 10^10 ~= 2^33.2...
1893     // so x rounded to an integer may or may not fit in a signed 32-bit int
1894     // the cases that do not fit are identified here; the ones that fit
1895     // fall through and will be handled with other cases further,
1896     // under '1 <= q + exp <= 10'
1897     if (x_sign) {   // if n < 0 and q + exp = 10
1898       // if n <= -1 then n is too large
1899       // too large if c(0)c(1)...c(9).c(10)...c(q-1) >= 1
1900       // <=> 0.c(0)c(1)...c(q-1) * 10^11 >= 0x50000000a, 1<=q<=34
1901       if (q <= 11) {
1902           tmp64 = C1.w[0] * ten2k64[11 - q];      // C scaled up to 11-digit int
1903           // c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
1904           if (tmp64 >= 0x0aull) {
1905             // set invalid flag
1906             *pfpsf |= INVALID_EXCEPTION;
1907             // return Integer Indefinite
1908             res = 0x80000000;
1909             BID_RETURN (res);
1910           }
1911           // else cases that can be rounded to a 32-bit int fall through
1912           // to '1 <= q + exp <= 10'
1913       } else {      // if (q > 11), i.e. 12 <= q <= 34 and so -24 <= exp <= -2
1914           // 0.c(0)c(1)...c(q-1) * 10^11 >= 0x0a <=>
1915           // C >= 0x0a * 10^(q-11) where 1 <= q - 11 <= 23
1916           // (scale 1 up)
1917           tmp64 = 0x0aull;
1918           if (q - 11 <= 19) { // 1 <= q - 11 <= 19; 10^(q-11) requires 64 bits
1919             __mul_64x64_to_128MACH (C, tmp64, ten2k64[q - 11]);
1920           } else {  // 20 <= q - 11 <= 23, and 10^(q-11) requires 128 bits
1921             __mul_128x64_to_128 (C, tmp64, ten2k128[q - 31]);
1922           }
1923           if (C1.w[1] > C.w[1]
1924               || (C1.w[1] == C.w[1] && C1.w[0] >= C.w[0])) {
1925             // set invalid flag
1926             *pfpsf |= INVALID_EXCEPTION;
1927             // return Integer Indefinite
1928             res = 0x80000000;
1929             BID_RETURN (res);
1930           }
1931           // else cases that can be rounded to a 32-bit int fall through
1932           // to '1 <= q + exp <= 10'
1933       }
1934     } else {        // if n > 0 and q + exp = 10
1935       // if n > 2^32 - 1 then n is too large
1936       // too large if c(0)c(1)...c(9).c(10)...c(q-1) > 2^32 - 1
1937       // too large if 0.c(0)c(1)...c(q-1) * 10^11 > 0x9fffffff6, 1<=q<=34
1938       if (q <= 11) {
1939           tmp64 = C1.w[0] * ten2k64[11 - q];      // C scaled up to 11-digit int
1940           // c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
1941           if (tmp64 > 0x9fffffff6ull) {
1942             // set invalid flag
1943             *pfpsf |= INVALID_EXCEPTION;
1944             // return Integer Indefinite
1945             res = 0x80000000;
1946             BID_RETURN (res);
1947           }
1948           // else cases that can be rounded to a 32-bit int fall through
1949           // to '1 <= q + exp <= 10'
1950       } else {      // if (q > 11), i.e. 12 <= q <= 34 and so -24 <= exp <= -2
1951           // 0.c(0)c(1)...c(q-1) * 10^11 > 0x9fffffff6 <=>
1952           // C > 0x9fffffff6 * 10^(q-11) where 1 <= q - 11 <= 23
1953           // (scale 2^32 up)
1954           tmp64 = 0x9fffffff6ull;
1955           if (q - 11 <= 19) { // 1 <= q - 11 <= 19; 10^(q-11) requires 64 bits
1956             __mul_64x64_to_128MACH (C, tmp64, ten2k64[q - 11]);
1957           } else {  // 20 <= q - 11 <= 23, and 10^(q-11) requires 128 bits
1958             __mul_128x64_to_128 (C, tmp64, ten2k128[q - 31]);
1959           }
1960           if (C1.w[1] > C.w[1] || (C1.w[1] == C.w[1] && C1.w[0] > C.w[0])) {
1961             // set invalid flag
1962             *pfpsf |= INVALID_EXCEPTION;
1963             // return Integer Indefinite
1964             res = 0x80000000;
1965             BID_RETURN (res);
1966           }
1967           // else cases that can be rounded to a 32-bit int fall through
1968           // to '1 <= q + exp <= 10'
1969       }
1970     }
1971   }
1972   // n is not too large to be converted to int32: -2^32-1 < n <= 2^32-1
1973   // Note: some of the cases tested for above fall through to this point
1974   if ((q + exp) <= 0) {
1975     // n = +/-0.0...c(0)c(1)...c(q-1) or n = +/-0.c(0)c(1)...c(q-1)
1976     // set inexact flag
1977     *pfpsf |= INEXACT_EXCEPTION;
1978     // return 0
1979     if (x_sign)
1980       res = 0x00000000;
1981     else
1982       res = 0x00000001;
1983     BID_RETURN (res);
1984   } else {          // if (1 <= q + exp <= 10, 1 <= q <= 34, -33 <= exp <= 9)
1985     // -2^32-1 < x <= -1 or 1 <= x <= 2^32-1 so x can be rounded
1986     // toward positive infinity to a 32-bit signed integer
1987     if (x_sign) {   // x <= -1 is invalid
1988       // set invalid flag
1989       *pfpsf |= INVALID_EXCEPTION;
1990       // return Integer Indefinite
1991       res = 0x80000000;
1992       BID_RETURN (res);
1993     }
1994     // x > 0 from this point on
1995     if (exp < 0) {  // 2 <= q <= 34, -33 <= exp <= -1, 1 <= q + exp <= 10
1996       ind = -exp;   // 1 <= ind <= 33; ind is a synonym for 'x'
1997       // chop off ind digits from the lower part of C1
1998       // C1 = C1 + 1/2 * 10^ind where the result C1 fits in 127 bits
1999       tmp64 = C1.w[0];
2000       if (ind <= 19) {
2001           C1.w[0] = C1.w[0] + midpoint64[ind - 1];
2002       } else {
2003           C1.w[0] = C1.w[0] + midpoint128[ind - 20].w[0];
2004           C1.w[1] = C1.w[1] + midpoint128[ind - 20].w[1];
2005       }
2006       if (C1.w[0] < tmp64)
2007           C1.w[1]++;
2008       // calculate C* and f*
2009       // C* is actually floor(C*) in this case
2010       // C* and f* need shifting and masking, as shown by
2011       // shiftright128[] and maskhigh128[]
2012       // 1 <= x <= 33
2013       // kx = 10^(-x) = ten2mk128[ind - 1]
2014       // C* = (C1 + 1/2 * 10^x) * 10^(-x)
2015       // the approximation of 10^(-x) was rounded up to 118 bits
2016       __mul_128x128_to_256 (P256, C1, ten2mk128[ind - 1]);
2017       if (ind - 1 <= 21) {    // 0 <= ind - 1 <= 21
2018           Cstar.w[1] = P256.w[3];
2019           Cstar.w[0] = P256.w[2];
2020           fstar.w[3] = 0;
2021           fstar.w[2] = P256.w[2] & maskhigh128[ind - 1];
2022           fstar.w[1] = P256.w[1];
2023           fstar.w[0] = P256.w[0];
2024       } else {      // 22 <= ind - 1 <= 33
2025           Cstar.w[1] = 0;
2026           Cstar.w[0] = P256.w[3];
2027           fstar.w[3] = P256.w[3] & maskhigh128[ind - 1];
2028           fstar.w[2] = P256.w[2];
2029           fstar.w[1] = P256.w[1];
2030           fstar.w[0] = P256.w[0];
2031       }
2032       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind], e.g.
2033       // if x=1, T*=ten2mk128trunc[0]=0x19999999999999999999999999999999
2034       // if (0 < f* < 10^(-x)) then the result is a midpoint
2035       //   if floor(C*) is even then C* = floor(C*) - logical right
2036       //       shift; C* has p decimal digits, correct by Prop. 1)
2037       //   else if floor(C*) is odd C* = floor(C*)-1 (logical right
2038       //       shift; C* has p decimal digits, correct by Pr. 1)
2039       // else
2040       //   C* = floor(C*) (logical right shift; C has p decimal digits,
2041       //       correct by Property 1)
2042       // n = C* * 10^(e+x)
2043 
2044       // shift right C* by Ex-128 = shiftright128[ind]
2045       shift = shiftright128[ind - 1];   // 0 <= shift <= 102
2046       if (ind - 1 <= 21) {    // 0 <= ind - 1 <= 21
2047           Cstar.w[0] =
2048             (Cstar.w[0] >> shift) | (Cstar.w[1] << (64 - shift));
2049           // redundant, it will be 0! Cstar.w[1] = (Cstar.w[1] >> shift);
2050       } else {      // 22 <= ind - 1 <= 33
2051           Cstar.w[0] = (Cstar.w[0] >> (shift - 64));        // 2 <= shift - 64 <= 38
2052       }
2053       // determine inexactness of the rounding of C*
2054       // if (0 < f* - 1/2 < 10^(-x)) then
2055       //   the result is exact
2056       // else // if (f* - 1/2 > T*) then
2057       //   the result is inexact
2058       if (ind - 1 <= 2) {
2059           if (fstar.w[1] > 0x8000000000000000ull ||
2060               (fstar.w[1] == 0x8000000000000000ull
2061                && fstar.w[0] > 0x0ull)) {
2062             // f* > 1/2 and the result may be exact
2063             tmp64 = fstar.w[1] - 0x8000000000000000ull;     // f* - 1/2
2064             if (tmp64 > ten2mk128trunc[ind - 1].w[1]
2065                 || (tmp64 == ten2mk128trunc[ind - 1].w[1]
2066                       && fstar.w[0] >= ten2mk128trunc[ind - 1].w[0])) {
2067               // set the inexact flag
2068               *pfpsf |= INEXACT_EXCEPTION;
2069               is_inexact_lt_midpoint = 1;
2070             }       // else the result is exact
2071           } else {  // the result is inexact; f2* <= 1/2
2072             // set the inexact flag
2073             *pfpsf |= INEXACT_EXCEPTION;
2074           }
2075       } else if (ind - 1 <= 21) {       // if 3 <= ind <= 21
2076           if (fstar.w[3] > 0x0 ||
2077               (fstar.w[3] == 0x0 && fstar.w[2] > onehalf128[ind - 1]) ||
2078               (fstar.w[3] == 0x0 && fstar.w[2] == onehalf128[ind - 1] &&
2079                (fstar.w[1] || fstar.w[0]))) {
2080             // f2* > 1/2 and the result may be exact
2081             // Calculate f2* - 1/2
2082             tmp64 = fstar.w[2] - onehalf128[ind - 1];
2083             tmp64A = fstar.w[3];
2084             if (tmp64 > fstar.w[2])
2085               tmp64A--;
2086             if (tmp64A || tmp64
2087                 || fstar.w[1] > ten2mk128trunc[ind - 1].w[1]
2088                 || (fstar.w[1] == ten2mk128trunc[ind - 1].w[1]
2089                       && fstar.w[0] > ten2mk128trunc[ind - 1].w[0])) {
2090               // set the inexact flag
2091               *pfpsf |= INEXACT_EXCEPTION;
2092               is_inexact_lt_midpoint = 1;
2093             }       // else the result is exact
2094           } else {  // the result is inexact; f2* <= 1/2
2095             // set the inexact flag
2096             *pfpsf |= INEXACT_EXCEPTION;
2097           }
2098       } else {      // if 22 <= ind <= 33
2099           if (fstar.w[3] > onehalf128[ind - 1] ||
2100               (fstar.w[3] == onehalf128[ind - 1] &&
2101                (fstar.w[2] || fstar.w[1] || fstar.w[0]))) {
2102             // f2* > 1/2 and the result may be exact
2103             // Calculate f2* - 1/2
2104             tmp64 = fstar.w[3] - onehalf128[ind - 1];
2105             if (tmp64 || fstar.w[2]
2106                 || fstar.w[1] > ten2mk128trunc[ind - 1].w[1]
2107                 || (fstar.w[1] == ten2mk128trunc[ind - 1].w[1]
2108                       && fstar.w[0] > ten2mk128trunc[ind - 1].w[0])) {
2109               // set the inexact flag
2110               *pfpsf |= INEXACT_EXCEPTION;
2111               is_inexact_lt_midpoint = 1;
2112             }       // else the result is exact
2113           } else {  // the result is inexact; f2* <= 1/2
2114             // set the inexact flag
2115             *pfpsf |= INEXACT_EXCEPTION;
2116           }
2117       }
2118 
2119       // if the result was a midpoint it was rounded away from zero, so
2120       // it will need a correction
2121       // check for midpoints
2122       if ((fstar.w[3] == 0) && (fstar.w[2] == 0)
2123             && (fstar.w[1] || fstar.w[0])
2124             && (fstar.w[1] < ten2mk128trunc[ind - 1].w[1]
2125                 || (fstar.w[1] == ten2mk128trunc[ind - 1].w[1]
2126                       && fstar.w[0] <= ten2mk128trunc[ind - 1].w[0]))) {
2127           // the result is a midpoint; round to nearest
2128           if (Cstar.w[0] & 0x01) {      // Cstar.w[0] is odd; MP in [EVEN, ODD]
2129             // if floor(C*) is odd C = floor(C*) - 1; the result >= 1
2130             Cstar.w[0]--;     // Cstar.w[0] is now even
2131             is_midpoint_gt_even = 1;
2132             is_inexact_lt_midpoint = 0;
2133           } else {  // else MP in [ODD, EVEN]
2134             is_inexact_lt_midpoint = 0;
2135           }
2136       }
2137       // general correction for RM
2138       if (is_midpoint_gt_even || is_inexact_lt_midpoint) {
2139           Cstar.w[0] = Cstar.w[0] + 1;
2140       } else {
2141           ;         // the result is already correct
2142       }
2143       res = Cstar.w[0];
2144     } else if (exp == 0) {
2145       // 1 <= q <= 10
2146       // res = +C (exact)
2147       res = C1.w[0];
2148     } else {        // if (exp > 0) => 1 <= exp <= 9, 1 <= q < 9, 2 <= q + exp <= 10
2149       // res = +C * 10^exp (exact)
2150       res = C1.w[0] * ten2k64[exp];
2151     }
2152   }
2153 }
2154 
2155 BID_RETURN (res);
2156 }
2157 
2158 /*****************************************************************************
2159  *  BID128_to_uint32_int
2160  ****************************************************************************/
2161 
2162 BID128_FUNCTION_ARG1_NORND_CUSTOMRESTYPE (unsigned int,
2163                                                     bid128_to_uint32_int, x)
2164 
2165      int res;
2166      UINT64 x_sign;
2167      UINT64 x_exp;
2168      int exp;                           // unbiased exponent
2169   // Note: C1.w[1], C1.w[0] represent x_signif_hi, x_signif_lo (all are UINT64)
2170      UINT64 tmp64, tmp64A;
2171      BID_UI64DOUBLE tmp1;
2172      unsigned int x_nr_bits;
2173      int q, ind, shift;
2174      UINT128 C1, C;
2175      UINT128 Cstar;           // C* represents up to 34 decimal digits ~ 113 bits
2176      UINT256 fstar;
2177      UINT256 P256;
2178      int is_inexact_gt_midpoint = 0;
2179      int is_midpoint_lt_even = 0;
2180 
2181   // unpack x
2182 x_sign = x.w[1] & MASK_SIGN;  // 0 for positive, MASK_SIGN for negative
2183 x_exp = x.w[1] & MASK_EXP;    // biased and shifted left 49 bit positions
2184 C1.w[1] = x.w[1] & MASK_COEFF;
2185 C1.w[0] = x.w[0];
2186 
2187   // check for NaN or Infinity
2188 if ((x.w[1] & MASK_SPECIAL) == MASK_SPECIAL) {
2189     // x is special
2190 if ((x.w[1] & MASK_NAN) == MASK_NAN) {  // x is NAN
2191   if ((x.w[1] & MASK_SNAN) == MASK_SNAN) {        // x is SNAN
2192     // set invalid flag
2193     *pfpsf |= INVALID_EXCEPTION;
2194     // return Integer Indefinite
2195     res = 0x80000000;
2196   } else {          // x is QNaN
2197     // set invalid flag
2198     *pfpsf |= INVALID_EXCEPTION;
2199     // return Integer Indefinite
2200     res = 0x80000000;
2201   }
2202   BID_RETURN (res);
2203 } else {  // x is not a NaN, so it must be infinity
2204   if (!x_sign) {    // x is +inf
2205     // set invalid flag
2206     *pfpsf |= INVALID_EXCEPTION;
2207     // return Integer Indefinite
2208     res = 0x80000000;
2209   } else {          // x is -inf
2210     // set invalid flag
2211     *pfpsf |= INVALID_EXCEPTION;
2212     // return Integer Indefinite
2213     res = 0x80000000;
2214   }
2215   BID_RETURN (res);
2216 }
2217 }
2218   // check for non-canonical values (after the check for special values)
2219 if ((C1.w[1] > 0x0001ed09bead87c0ull)
2220     || (C1.w[1] == 0x0001ed09bead87c0ull
2221           && (C1.w[0] > 0x378d8e63ffffffffull))
2222     || ((x.w[1] & 0x6000000000000000ull) == 0x6000000000000000ull)) {
2223   res = 0x00000000;
2224   BID_RETURN (res);
2225 } else if ((C1.w[1] == 0x0ull) && (C1.w[0] == 0x0ull)) {
2226   // x is 0
2227   res = 0x00000000;
2228   BID_RETURN (res);
2229 } else {  // x is not special and is not zero
2230 
2231   // q = nr. of decimal digits in x
2232   //  determine first the nr. of bits in x
2233   if (C1.w[1] == 0) {
2234     if (C1.w[0] >= 0x0020000000000000ull) {       // x >= 2^53
2235       // split the 64-bit value in two 32-bit halves to avoid rounding errors
2236       if (C1.w[0] >= 0x0000000100000000ull) {     // x >= 2^32
2237           tmp1.d = (double) (C1.w[0] >> 32);      // exact conversion
2238           x_nr_bits =
2239             33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
2240       } else {      // x < 2^32
2241           tmp1.d = (double) (C1.w[0]);  // exact conversion
2242           x_nr_bits =
2243             1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
2244       }
2245     } else {        // if x < 2^53
2246       tmp1.d = (double) C1.w[0];        // exact conversion
2247       x_nr_bits =
2248           1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
2249     }
2250   } else {          // C1.w[1] != 0 => nr. bits = 64 + nr_bits (C1.w[1])
2251     tmp1.d = (double) C1.w[1];          // exact conversion
2252     x_nr_bits =
2253       65 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
2254   }
2255   q = nr_digits[x_nr_bits - 1].digits;
2256   if (q == 0) {
2257     q = nr_digits[x_nr_bits - 1].digits1;
2258     if (C1.w[1] > nr_digits[x_nr_bits - 1].threshold_hi
2259           || (C1.w[1] == nr_digits[x_nr_bits - 1].threshold_hi
2260               && C1.w[0] >= nr_digits[x_nr_bits - 1].threshold_lo))
2261       q++;
2262   }
2263   exp = (x_exp >> 49) - 6176;
2264   if ((q + exp) > 10) {       // x >= 10^10 ~= 2^33.2... (cannot fit in 32 bits)
2265     // set invalid flag
2266     *pfpsf |= INVALID_EXCEPTION;
2267     // return Integer Indefinite
2268     res = 0x80000000;
2269     BID_RETURN (res);
2270   } else if ((q + exp) == 10) {         // x = c(0)c(1)...c(9).c(10)...c(q-1)
2271     // in this case 2^29.89... ~= 10^9 <= x < 10^10 ~= 2^33.2...
2272     // so x rounded to an integer may or may not fit in a signed 32-bit int
2273     // the cases that do not fit are identified here; the ones that fit
2274     // fall through and will be handled with other cases further,
2275     // under '1 <= q + exp <= 10'
2276     if (x_sign) {   // if n < 0 and q + exp = 10
2277       // if n <= -1 then n is too large
2278       // too large if c(0)c(1)...c(9).c(10)...c(q-1) >= 1
2279       // <=> 0.c(0)c(1)...c(q-1) * 10^11 >= 0x0a, 1<=q<=34
2280       if (q <= 11) {
2281           tmp64 = C1.w[0] * ten2k64[11 - q];      // C scaled up to 11-digit int
2282           // c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
2283           if (tmp64 >= 0x0aull) {
2284             // set invalid flag
2285             *pfpsf |= INVALID_EXCEPTION;
2286             // return Integer Indefinite
2287             res = 0x80000000;
2288             BID_RETURN (res);
2289           }
2290           // else cases that can be rounded to a 32-bit uint fall through
2291           // to '1 <= q + exp <= 10'
2292       } else {      // if (q > 11), i.e. 12 <= q <= 34 and so -24 <= exp <= -2
2293           // 0.c(0)c(1)...c(q-1) * 10^11 >= 0x0a <=>
2294           // C >= 0x0a * 10^(q-11) where 1 <= q - 11 <= 23
2295           // (scale 1 up)
2296           tmp64 = 0x0aull;
2297           if (q - 11 <= 19) { // 1 <= q - 11 <= 19; 10^(q-11) requires 64 bits
2298             __mul_64x64_to_128MACH (C, tmp64, ten2k64[q - 11]);
2299           } else {  // 20 <= q - 11 <= 23, and 10^(q-11) requires 128 bits
2300             __mul_128x64_to_128 (C, tmp64, ten2k128[q - 31]);
2301           }
2302           if (C1.w[1] > C.w[1]
2303               || (C1.w[1] == C.w[1] && C1.w[0] >= C.w[0])) {
2304             // set invalid flag
2305             *pfpsf |= INVALID_EXCEPTION;
2306             // return Integer Indefinite
2307             res = 0x80000000;
2308             BID_RETURN (res);
2309           }
2310           // else cases that can be rounded to a 32-bit int fall through
2311           // to '1 <= q + exp <= 10'
2312       }
2313     } else {        // if n > 0 and q + exp = 10
2314       // if n >= 2^32 then n is too large
2315       // too large if c(0)c(1)...c(9).c(10)...c(q-1) >= 2^32
2316       // too large if 0.c(0)c(1)...c(q-1) * 10^11 >= 0xa00000000, 1<=q<=34
2317       if (q <= 11) {
2318           tmp64 = C1.w[0] * ten2k64[11 - q];      // C scaled up to 11-digit int
2319           // c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
2320           if (tmp64 >= 0xa00000000ull) {
2321             // set invalid flag
2322             *pfpsf |= INVALID_EXCEPTION;
2323             // return Integer Indefinite
2324             res = 0x80000000;
2325             BID_RETURN (res);
2326           }
2327           // else cases that can be rounded to a 32-bit uint fall through
2328           // to '1 <= q + exp <= 10'
2329       } else {      // if (q > 11), i.e. 12 <= q <= 34 and so -24 <= exp <= -2
2330           // 0.c(0)c(1)...c(q-1) * 10^11 >= 0xa00000000 <=>
2331           // C >= 0xa00000000 * 10^(q-11) where 1 <= q - 11 <= 23
2332           // (scale 2^32 up)
2333           tmp64 = 0xa00000000ull;
2334           if (q - 11 <= 19) { // 1 <= q - 11 <= 19; 10^(q-11) requires 64 bits
2335             __mul_64x64_to_128MACH (C, tmp64, ten2k64[q - 11]);
2336           } else {  // 20 <= q - 11 <= 23, and 10^(q-11) requires 128 bits
2337             __mul_128x64_to_128 (C, tmp64, ten2k128[q - 31]);
2338           }
2339           if (C1.w[1] > C.w[1]
2340               || (C1.w[1] == C.w[1] && C1.w[0] >= C.w[0])) {
2341             // set invalid flag
2342             *pfpsf |= INVALID_EXCEPTION;
2343             // return Integer Indefinite
2344             res = 0x80000000;
2345             BID_RETURN (res);
2346           }
2347           // else cases that can be rounded to a 32-bit int fall through
2348           // to '1 <= q + exp <= 10'
2349       }
2350     }
2351   }
2352   // n is not too large to be converted to uint32: -2^32 < n < 2^32
2353   // Note: some of the cases tested for above fall through to this point
2354   if ((q + exp) <= 0) {
2355     // n = +/-0.0...c(0)c(1)...c(q-1) or n = +/-0.c(0)c(1)...c(q-1)
2356     // return 0
2357     res = 0x00000000;
2358     BID_RETURN (res);
2359   } else {          // if (1 <= q + exp <= 10, 1 <= q <= 34, -33 <= exp <= 9)
2360     // x = d(0)...d(k).d(k+1)..., k >= 0, d(0) != 0
2361     if (x_sign) {   // x <= -1
2362       // set invalid flag
2363       *pfpsf |= INVALID_EXCEPTION;
2364       // return Integer Indefinite
2365       res = 0x80000000;
2366       BID_RETURN (res);
2367     }
2368     // x > 0 from this point on
2369     // 1 <= x < 2^32 so x can be rounded to zero to a 32-bit unsigned integer
2370     if (exp < 0) {  // 2 <= q <= 34, -33 <= exp <= -1, 1 <= q + exp <= 10
2371       ind = -exp;   // 1 <= ind <= 33; ind is a synonym for 'x'
2372       // chop off ind digits from the lower part of C1
2373       // C1 = C1 + 1/2 * 10^ind where the result C1 fits in 127 bits
2374       tmp64 = C1.w[0];
2375       if (ind <= 19) {
2376           C1.w[0] = C1.w[0] + midpoint64[ind - 1];
2377       } else {
2378           C1.w[0] = C1.w[0] + midpoint128[ind - 20].w[0];
2379           C1.w[1] = C1.w[1] + midpoint128[ind - 20].w[1];
2380       }
2381       if (C1.w[0] < tmp64)
2382           C1.w[1]++;
2383       // calculate C* and f*
2384       // C* is actually floor(C*) in this case
2385       // C* and f* need shifting and masking, as shown by
2386       // shiftright128[] and maskhigh128[]
2387       // 1 <= x <= 33
2388       // kx = 10^(-x) = ten2mk128[ind - 1]
2389       // C* = (C1 + 1/2 * 10^x) * 10^(-x)
2390       // the approximation of 10^(-x) was rounded up to 118 bits
2391       __mul_128x128_to_256 (P256, C1, ten2mk128[ind - 1]);
2392       if (ind - 1 <= 21) {    // 0 <= ind - 1 <= 21
2393           Cstar.w[1] = P256.w[3];
2394           Cstar.w[0] = P256.w[2];
2395           fstar.w[3] = 0;
2396           fstar.w[2] = P256.w[2] & maskhigh128[ind - 1];
2397           fstar.w[1] = P256.w[1];
2398           fstar.w[0] = P256.w[0];
2399       } else {      // 22 <= ind - 1 <= 33
2400           Cstar.w[1] = 0;
2401           Cstar.w[0] = P256.w[3];
2402           fstar.w[3] = P256.w[3] & maskhigh128[ind - 1];
2403           fstar.w[2] = P256.w[2];
2404           fstar.w[1] = P256.w[1];
2405           fstar.w[0] = P256.w[0];
2406       }
2407       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind], e.g.
2408       // if x=1, T*=ten2mk128trunc[0]=0x19999999999999999999999999999999
2409       // if (0 < f* < 10^(-x)) then the result is a midpoint
2410       //   if floor(C*) is even then C* = floor(C*) - logical right
2411       //       shift; C* has p decimal digits, correct by Prop. 1)
2412       //   else if floor(C*) is odd C* = floor(C*)-1 (logical right
2413       //       shift; C* has p decimal digits, correct by Pr. 1)
2414       // else
2415       //   C* = floor(C*) (logical right shift; C has p decimal digits,
2416       //       correct by Property 1)
2417       // n = C* * 10^(e+x)
2418 
2419       // shift right C* by Ex-128 = shiftright128[ind]
2420       shift = shiftright128[ind - 1];   // 0 <= shift <= 102
2421       if (ind - 1 <= 21) {    // 0 <= ind - 1 <= 21
2422           Cstar.w[0] =
2423             (Cstar.w[0] >> shift) | (Cstar.w[1] << (64 - shift));
2424           // redundant, it will be 0! Cstar.w[1] = (Cstar.w[1] >> shift);
2425       } else {      // 22 <= ind - 1 <= 33
2426           Cstar.w[0] = (Cstar.w[0] >> (shift - 64));        // 2 <= shift - 64 <= 38
2427       }
2428       // determine inexactness of the rounding of C*
2429       // if (0 < f* - 1/2 < 10^(-x)) then
2430       //   the result is exact
2431       // else // if (f* - 1/2 > T*) then
2432       //   the result is inexact
2433       if (ind - 1 <= 2) {
2434           if (fstar.w[1] > 0x8000000000000000ull ||
2435               (fstar.w[1] == 0x8000000000000000ull
2436                && fstar.w[0] > 0x0ull)) {
2437             // f* > 1/2 and the result may be exact
2438             tmp64 = fstar.w[1] - 0x8000000000000000ull;     // f* - 1/2
2439             if (tmp64 > ten2mk128trunc[ind - 1].w[1]
2440                 || (tmp64 == ten2mk128trunc[ind - 1].w[1]
2441                       && fstar.w[0] >= ten2mk128trunc[ind - 1].w[0])) {
2442             }       // else the result is exact
2443           } else {  // the result is inexact; f2* <= 1/2
2444             is_inexact_gt_midpoint = 1;
2445           }
2446       } else if (ind - 1 <= 21) {       // if 3 <= ind <= 21
2447           if (fstar.w[3] > 0x0 ||
2448               (fstar.w[3] == 0x0 && fstar.w[2] > onehalf128[ind - 1]) ||
2449               (fstar.w[3] == 0x0 && fstar.w[2] == onehalf128[ind - 1] &&
2450                (fstar.w[1] || fstar.w[0]))) {
2451             // f2* > 1/2 and the result may be exact
2452             // Calculate f2* - 1/2
2453             tmp64 = fstar.w[2] - onehalf128[ind - 1];
2454             tmp64A = fstar.w[3];
2455             if (tmp64 > fstar.w[2])
2456               tmp64A--;
2457             if (tmp64A || tmp64
2458                 || fstar.w[1] > ten2mk128trunc[ind - 1].w[1]
2459                 || (fstar.w[1] == ten2mk128trunc[ind - 1].w[1]
2460                       && fstar.w[0] > ten2mk128trunc[ind - 1].w[0])) {
2461             }       // else the result is exact
2462           } else {  // the result is inexact; f2* <= 1/2
2463             is_inexact_gt_midpoint = 1;
2464           }
2465       } else {      // if 22 <= ind <= 33
2466           if (fstar.w[3] > onehalf128[ind - 1] ||
2467               (fstar.w[3] == onehalf128[ind - 1] &&
2468                (fstar.w[2] || fstar.w[1] || fstar.w[0]))) {
2469             // f2* > 1/2 and the result may be exact
2470             // Calculate f2* - 1/2
2471             tmp64 = fstar.w[3] - onehalf128[ind - 1];
2472             if (tmp64 || fstar.w[2]
2473                 || fstar.w[1] > ten2mk128trunc[ind - 1].w[1]
2474                 || (fstar.w[1] == ten2mk128trunc[ind - 1].w[1]
2475                       && fstar.w[0] > ten2mk128trunc[ind - 1].w[0])) {
2476             }       // else the result is exact
2477           } else {  // the result is inexact; f2* <= 1/2
2478             is_inexact_gt_midpoint = 1;
2479           }
2480       }
2481 
2482       // if the result was a midpoint it was rounded away from zero, so
2483       // it will need a correction
2484       // check for midpoints
2485       if ((fstar.w[3] == 0) && (fstar.w[2] == 0)
2486             && (fstar.w[1] || fstar.w[0])
2487             && (fstar.w[1] < ten2mk128trunc[ind - 1].w[1]
2488                 || (fstar.w[1] == ten2mk128trunc[ind - 1].w[1]
2489                       && fstar.w[0] <= ten2mk128trunc[ind - 1].w[0]))) {
2490           // the result is a midpoint; round to nearest
2491           if (Cstar.w[0] & 0x01) {      // Cstar.w[0] is odd; MP in [EVEN, ODD]
2492             // if floor(C*) is odd C = floor(C*) - 1; the result >= 1
2493             Cstar.w[0]--;     // Cstar.w[0] is now even
2494             is_inexact_gt_midpoint = 0;
2495           } else {  // else MP in [ODD, EVEN]
2496             is_midpoint_lt_even = 1;
2497             is_inexact_gt_midpoint = 0;
2498           }
2499       }
2500       // general correction for RZ
2501       if (is_midpoint_lt_even || is_inexact_gt_midpoint) {
2502           Cstar.w[0] = Cstar.w[0] - 1;
2503       } else {
2504           ;         // exact, the result is already correct
2505       }
2506       res = Cstar.w[0];
2507     } else if (exp == 0) {
2508       // 1 <= q <= 10
2509       // res = +C (exact)
2510       res = C1.w[0];
2511     } else {        // if (exp > 0) => 1 <= exp <= 9, 1 <= q < 9, 2 <= q + exp <= 10
2512       // res = +C * 10^exp (exact)
2513       res = C1.w[0] * ten2k64[exp];
2514     }
2515   }
2516 }
2517 
2518 BID_RETURN (res);
2519 }
2520 
2521 /*****************************************************************************
2522  *  BID128_to_uint32_xint
2523  ****************************************************************************/
2524 
2525 BID128_FUNCTION_ARG1_NORND_CUSTOMRESTYPE (unsigned int,
2526                                                     bid128_to_uint32_xint, x)
2527 
2528      int res;
2529      UINT64 x_sign;
2530      UINT64 x_exp;
2531      int exp;                           // unbiased exponent
2532   // Note: C1.w[1], C1.w[0] represent x_signif_hi, x_signif_lo (all are UINT64)
2533      UINT64 tmp64, tmp64A;
2534      BID_UI64DOUBLE tmp1;
2535      unsigned int x_nr_bits;
2536      int q, ind, shift;
2537      UINT128 C1, C;
2538      UINT128 Cstar;           // C* represents up to 34 decimal digits ~ 113 bits
2539      UINT256 fstar;
2540      UINT256 P256;
2541      int is_inexact_gt_midpoint = 0;
2542      int is_midpoint_lt_even = 0;
2543 
2544   // unpack x
2545 x_sign = x.w[1] & MASK_SIGN;  // 0 for positive, MASK_SIGN for negative
2546 x_exp = x.w[1] & MASK_EXP;    // biased and shifted left 49 bit positions
2547 C1.w[1] = x.w[1] & MASK_COEFF;
2548 C1.w[0] = x.w[0];
2549 
2550   // check for NaN or Infinity
2551 if ((x.w[1] & MASK_SPECIAL) == MASK_SPECIAL) {
2552     // x is special
2553 if ((x.w[1] & MASK_NAN) == MASK_NAN) {  // x is NAN
2554   if ((x.w[1] & MASK_SNAN) == MASK_SNAN) {        // x is SNAN
2555     // set invalid flag
2556     *pfpsf |= INVALID_EXCEPTION;
2557     // return Integer Indefinite
2558     res = 0x80000000;
2559   } else {          // x is QNaN
2560     // set invalid flag
2561     *pfpsf |= INVALID_EXCEPTION;
2562     // return Integer Indefinite
2563     res = 0x80000000;
2564   }
2565   BID_RETURN (res);
2566 } else {  // x is not a NaN, so it must be infinity
2567   if (!x_sign) {    // x is +inf
2568     // set invalid flag
2569     *pfpsf |= INVALID_EXCEPTION;
2570     // return Integer Indefinite
2571     res = 0x80000000;
2572   } else {          // x is -inf
2573     // set invalid flag
2574     *pfpsf |= INVALID_EXCEPTION;
2575     // return Integer Indefinite
2576     res = 0x80000000;
2577   }
2578   BID_RETURN (res);
2579 }
2580 }
2581   // check for non-canonical values (after the check for special values)
2582 if ((C1.w[1] > 0x0001ed09bead87c0ull)
2583     || (C1.w[1] == 0x0001ed09bead87c0ull
2584           && (C1.w[0] > 0x378d8e63ffffffffull))
2585     || ((x.w[1] & 0x6000000000000000ull) == 0x6000000000000000ull)) {
2586   res = 0x00000000;
2587   BID_RETURN (res);
2588 } else if ((C1.w[1] == 0x0ull) && (C1.w[0] == 0x0ull)) {
2589   // x is 0
2590   res = 0x00000000;
2591   BID_RETURN (res);
2592 } else {  // x is not special and is not zero
2593 
2594   // q = nr. of decimal digits in x
2595   //  determine first the nr. of bits in x
2596   if (C1.w[1] == 0) {
2597     if (C1.w[0] >= 0x0020000000000000ull) {       // x >= 2^53
2598       // split the 64-bit value in two 32-bit halves to avoid rounding errors
2599       if (C1.w[0] >= 0x0000000100000000ull) {     // x >= 2^32
2600           tmp1.d = (double) (C1.w[0] >> 32);      // exact conversion
2601           x_nr_bits =
2602             33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
2603       } else {      // x < 2^32
2604           tmp1.d = (double) (C1.w[0]);  // exact conversion
2605           x_nr_bits =
2606             1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
2607       }
2608     } else {        // if x < 2^53
2609       tmp1.d = (double) C1.w[0];        // exact conversion
2610       x_nr_bits =
2611           1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
2612     }
2613   } else {          // C1.w[1] != 0 => nr. bits = 64 + nr_bits (C1.w[1])
2614     tmp1.d = (double) C1.w[1];          // exact conversion
2615     x_nr_bits =
2616       65 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
2617   }
2618   q = nr_digits[x_nr_bits - 1].digits;
2619   if (q == 0) {
2620     q = nr_digits[x_nr_bits - 1].digits1;
2621     if (C1.w[1] > nr_digits[x_nr_bits - 1].threshold_hi
2622           || (C1.w[1] == nr_digits[x_nr_bits - 1].threshold_hi
2623               && C1.w[0] >= nr_digits[x_nr_bits - 1].threshold_lo))
2624       q++;
2625   }
2626   exp = (x_exp >> 49) - 6176;
2627   if ((q + exp) > 10) {       // x >= 10^10 ~= 2^33.2... (cannot fit in 32 bits)
2628     // set invalid flag
2629     *pfpsf |= INVALID_EXCEPTION;
2630     // return Integer Indefinite
2631     res = 0x80000000;
2632     BID_RETURN (res);
2633   } else if ((q + exp) == 10) {         // x = c(0)c(1)...c(9).c(10)...c(q-1)
2634     // in this case 2^29.89... ~= 10^9 <= x < 10^10 ~= 2^33.2...
2635     // so x rounded to an integer may or may not fit in a signed 32-bit int
2636     // the cases that do not fit are identified here; the ones that fit
2637     // fall through and will be handled with other cases further,
2638     // under '1 <= q + exp <= 10'
2639     if (x_sign) {   // if n < 0 and q + exp = 10
2640       // if n <= -1 then n is too large
2641       // too large if c(0)c(1)...c(9).c(10)...c(q-1) >= 1
2642       // <=> 0.c(0)c(1)...c(q-1) * 10^11 >= 0x0a, 1<=q<=34
2643       if (q <= 11) {
2644           tmp64 = C1.w[0] * ten2k64[11 - q];      // C scaled up to 11-digit int
2645           // c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
2646           if (tmp64 >= 0x0aull) {
2647             // set invalid flag
2648             *pfpsf |= INVALID_EXCEPTION;
2649             // return Integer Indefinite
2650             res = 0x80000000;
2651             BID_RETURN (res);
2652           }
2653           // else cases that can be rounded to a 32-bit uint fall through
2654           // to '1 <= q + exp <= 10'
2655       } else {      // if (q > 11), i.e. 12 <= q <= 34 and so -24 <= exp <= -2
2656           // 0.c(0)c(1)...c(q-1) * 10^11 >= 0x0a <=>
2657           // C >= 0x0a * 10^(q-11) where 1 <= q - 11 <= 23
2658           // (scale 1 up)
2659           tmp64 = 0x0aull;
2660           if (q - 11 <= 19) { // 1 <= q - 11 <= 19; 10^(q-11) requires 64 bits
2661             __mul_64x64_to_128MACH (C, tmp64, ten2k64[q - 11]);
2662           } else {  // 20 <= q - 11 <= 23, and 10^(q-11) requires 128 bits
2663             __mul_128x64_to_128 (C, tmp64, ten2k128[q - 31]);
2664           }
2665           if (C1.w[1] > C.w[1]
2666               || (C1.w[1] == C.w[1] && C1.w[0] >= C.w[0])) {
2667             // set invalid flag
2668             *pfpsf |= INVALID_EXCEPTION;
2669             // return Integer Indefinite
2670             res = 0x80000000;
2671             BID_RETURN (res);
2672           }
2673           // else cases that can be rounded to a 32-bit int fall through
2674           // to '1 <= q + exp <= 10'
2675       }
2676     } else {        // if n > 0 and q + exp = 10
2677       // if n >= 2^32 then n is too large
2678       // too large if c(0)c(1)...c(9).c(10)...c(q-1) >= 2^32
2679       // too large if 0.c(0)c(1)...c(q-1) * 10^11 >= 0xa00000000, 1<=q<=34
2680       if (q <= 11) {
2681           tmp64 = C1.w[0] * ten2k64[11 - q];      // C scaled up to 11-digit int
2682           // c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
2683           if (tmp64 >= 0xa00000000ull) {
2684             // set invalid flag
2685             *pfpsf |= INVALID_EXCEPTION;
2686             // return Integer Indefinite
2687             res = 0x80000000;
2688             BID_RETURN (res);
2689           }
2690           // else cases that can be rounded to a 32-bit uint fall through
2691           // to '1 <= q + exp <= 10'
2692       } else {      // if (q > 11), i.e. 12 <= q <= 34 and so -24 <= exp <= -2
2693           // 0.c(0)c(1)...c(q-1) * 10^11 >= 0xa00000000 <=>
2694           // C >= 0xa00000000 * 10^(q-11) where 1 <= q - 11 <= 23
2695           // (scale 2^32 up)
2696           tmp64 = 0xa00000000ull;
2697           if (q - 11 <= 19) { // 1 <= q - 11 <= 19; 10^(q-11) requires 64 bits
2698             __mul_64x64_to_128MACH (C, tmp64, ten2k64[q - 11]);
2699           } else {  // 20 <= q - 11 <= 23, and 10^(q-11) requires 128 bits
2700             __mul_128x64_to_128 (C, tmp64, ten2k128[q - 31]);
2701           }
2702           if (C1.w[1] > C.w[1]
2703               || (C1.w[1] == C.w[1] && C1.w[0] >= C.w[0])) {
2704             // set invalid flag
2705             *pfpsf |= INVALID_EXCEPTION;
2706             // return Integer Indefinite
2707             res = 0x80000000;
2708             BID_RETURN (res);
2709           }
2710           // else cases that can be rounded to a 32-bit int fall through
2711           // to '1 <= q + exp <= 10'
2712       }
2713     }
2714   }
2715   // n is not too large to be converted to uint32: -2^32 < n < 2^32
2716   // Note: some of the cases tested for above fall through to this point
2717   if ((q + exp) <= 0) {
2718     // n = +/-0.0...c(0)c(1)...c(q-1) or n = +/-0.c(0)c(1)...c(q-1)
2719     // set inexact flag
2720     *pfpsf |= INEXACT_EXCEPTION;
2721     // return 0
2722     res = 0x00000000;
2723     BID_RETURN (res);
2724   } else {          // if (1 <= q + exp <= 10, 1 <= q <= 34, -33 <= exp <= 9)
2725     // x = d(0)...d(k).d(k+1)..., k >= 0, d(0) != 0
2726     if (x_sign) {   // x <= -1
2727       // set invalid flag
2728       *pfpsf |= INVALID_EXCEPTION;
2729       // return Integer Indefinite
2730       res = 0x80000000;
2731       BID_RETURN (res);
2732     }
2733     // x > 0 from this point on
2734     // 1 <= x < 2^32 so x can be rounded to zero to a 32-bit unsigned integer
2735     if (exp < 0) {  // 2 <= q <= 34, -33 <= exp <= -1, 1 <= q + exp <= 10
2736       ind = -exp;   // 1 <= ind <= 33; ind is a synonym for 'x'
2737       // chop off ind digits from the lower part of C1
2738       // C1 = C1 + 1/2 * 10^ind where the result C1 fits in 127 bits
2739       tmp64 = C1.w[0];
2740       if (ind <= 19) {
2741           C1.w[0] = C1.w[0] + midpoint64[ind - 1];
2742       } else {
2743           C1.w[0] = C1.w[0] + midpoint128[ind - 20].w[0];
2744           C1.w[1] = C1.w[1] + midpoint128[ind - 20].w[1];
2745       }
2746       if (C1.w[0] < tmp64)
2747           C1.w[1]++;
2748       // calculate C* and f*
2749       // C* is actually floor(C*) in this case
2750       // C* and f* need shifting and masking, as shown by
2751       // shiftright128[] and maskhigh128[]
2752       // 1 <= x <= 33
2753       // kx = 10^(-x) = ten2mk128[ind - 1]
2754       // C* = (C1 + 1/2 * 10^x) * 10^(-x)
2755       // the approximation of 10^(-x) was rounded up to 118 bits
2756       __mul_128x128_to_256 (P256, C1, ten2mk128[ind - 1]);
2757       if (ind - 1 <= 21) {    // 0 <= ind - 1 <= 21
2758           Cstar.w[1] = P256.w[3];
2759           Cstar.w[0] = P256.w[2];
2760           fstar.w[3] = 0;
2761           fstar.w[2] = P256.w[2] & maskhigh128[ind - 1];
2762           fstar.w[1] = P256.w[1];
2763           fstar.w[0] = P256.w[0];
2764       } else {      // 22 <= ind - 1 <= 33
2765           Cstar.w[1] = 0;
2766           Cstar.w[0] = P256.w[3];
2767           fstar.w[3] = P256.w[3] & maskhigh128[ind - 1];
2768           fstar.w[2] = P256.w[2];
2769           fstar.w[1] = P256.w[1];
2770           fstar.w[0] = P256.w[0];
2771       }
2772       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind], e.g.
2773       // if x=1, T*=ten2mk128trunc[0]=0x19999999999999999999999999999999
2774       // if (0 < f* < 10^(-x)) then the result is a midpoint
2775       //   if floor(C*) is even then C* = floor(C*) - logical right
2776       //       shift; C* has p decimal digits, correct by Prop. 1)
2777       //   else if floor(C*) is odd C* = floor(C*)-1 (logical right
2778       //       shift; C* has p decimal digits, correct by Pr. 1)
2779       // else
2780       //   C* = floor(C*) (logical right shift; C has p decimal digits,
2781       //       correct by Property 1)
2782       // n = C* * 10^(e+x)
2783 
2784       // shift right C* by Ex-128 = shiftright128[ind]
2785       shift = shiftright128[ind - 1];   // 0 <= shift <= 102
2786       if (ind - 1 <= 21) {    // 0 <= ind - 1 <= 21
2787           Cstar.w[0] =
2788             (Cstar.w[0] >> shift) | (Cstar.w[1] << (64 - shift));
2789           // redundant, it will be 0! Cstar.w[1] = (Cstar.w[1] >> shift);
2790       } else {      // 22 <= ind - 1 <= 33
2791           Cstar.w[0] = (Cstar.w[0] >> (shift - 64));        // 2 <= shift - 64 <= 38
2792       }
2793       // determine inexactness of the rounding of C*
2794       // if (0 < f* - 1/2 < 10^(-x)) then
2795       //   the result is exact
2796       // else // if (f* - 1/2 > T*) then
2797       //   the result is inexact
2798       if (ind - 1 <= 2) {
2799           if (fstar.w[1] > 0x8000000000000000ull ||
2800               (fstar.w[1] == 0x8000000000000000ull
2801                && fstar.w[0] > 0x0ull)) {
2802             // f* > 1/2 and the result may be exact
2803             tmp64 = fstar.w[1] - 0x8000000000000000ull;     // f* - 1/2
2804             if (tmp64 > ten2mk128trunc[ind - 1].w[1]
2805                 || (tmp64 == ten2mk128trunc[ind - 1].w[1]
2806                       && fstar.w[0] >= ten2mk128trunc[ind - 1].w[0])) {
2807               // set the inexact flag
2808               *pfpsf |= INEXACT_EXCEPTION;
2809             }       // else the result is exact
2810           } else {  // the result is inexact; f2* <= 1/2
2811             // set the inexact flag
2812             *pfpsf |= INEXACT_EXCEPTION;
2813             is_inexact_gt_midpoint = 1;
2814           }
2815       } else if (ind - 1 <= 21) {       // if 3 <= ind <= 21
2816           if (fstar.w[3] > 0x0 ||
2817               (fstar.w[3] == 0x0 && fstar.w[2] > onehalf128[ind - 1]) ||
2818               (fstar.w[3] == 0x0 && fstar.w[2] == onehalf128[ind - 1] &&
2819                (fstar.w[1] || fstar.w[0]))) {
2820             // f2* > 1/2 and the result may be exact
2821             // Calculate f2* - 1/2
2822             tmp64 = fstar.w[2] - onehalf128[ind - 1];
2823             tmp64A = fstar.w[3];
2824             if (tmp64 > fstar.w[2])
2825               tmp64A--;
2826             if (tmp64A || tmp64
2827                 || fstar.w[1] > ten2mk128trunc[ind - 1].w[1]
2828                 || (fstar.w[1] == ten2mk128trunc[ind - 1].w[1]
2829                       && fstar.w[0] > ten2mk128trunc[ind - 1].w[0])) {
2830               // set the inexact flag
2831               *pfpsf |= INEXACT_EXCEPTION;
2832             }       // else the result is exact
2833           } else {  // the result is inexact; f2* <= 1/2
2834             // set the inexact flag
2835             *pfpsf |= INEXACT_EXCEPTION;
2836             is_inexact_gt_midpoint = 1;
2837           }
2838       } else {      // if 22 <= ind <= 33
2839           if (fstar.w[3] > onehalf128[ind - 1] ||
2840               (fstar.w[3] == onehalf128[ind - 1] &&
2841                (fstar.w[2] || fstar.w[1] || fstar.w[0]))) {
2842             // f2* > 1/2 and the result may be exact
2843             // Calculate f2* - 1/2
2844             tmp64 = fstar.w[3] - onehalf128[ind - 1];
2845             if (tmp64 || fstar.w[2]
2846                 || fstar.w[1] > ten2mk128trunc[ind - 1].w[1]
2847                 || (fstar.w[1] == ten2mk128trunc[ind - 1].w[1]
2848                       && fstar.w[0] > ten2mk128trunc[ind - 1].w[0])) {
2849               // set the inexact flag
2850               *pfpsf |= INEXACT_EXCEPTION;
2851             }       // else the result is exact
2852           } else {  // the result is inexact; f2* <= 1/2
2853             // set the inexact flag
2854             *pfpsf |= INEXACT_EXCEPTION;
2855             is_inexact_gt_midpoint = 1;
2856           }
2857       }
2858 
2859       // if the result was a midpoint it was rounded away from zero, so
2860       // it will need a correction
2861       // check for midpoints
2862       if ((fstar.w[3] == 0) && (fstar.w[2] == 0)
2863             && (fstar.w[1] || fstar.w[0])
2864             && (fstar.w[1] < ten2mk128trunc[ind - 1].w[1]
2865                 || (fstar.w[1] == ten2mk128trunc[ind - 1].w[1]
2866                       && fstar.w[0] <= ten2mk128trunc[ind - 1].w[0]))) {
2867           // the result is a midpoint; round to nearest
2868           if (Cstar.w[0] & 0x01) {      // Cstar.w[0] is odd; MP in [EVEN, ODD]
2869             // if floor(C*) is odd C = floor(C*) - 1; the result >= 1
2870             Cstar.w[0]--;     // Cstar.w[0] is now even
2871             is_inexact_gt_midpoint = 0;
2872           } else {  // else MP in [ODD, EVEN]
2873             is_midpoint_lt_even = 1;
2874             is_inexact_gt_midpoint = 0;
2875           }
2876       }
2877       // general correction for RZ
2878       if (is_midpoint_lt_even || is_inexact_gt_midpoint) {
2879           Cstar.w[0] = Cstar.w[0] - 1;
2880       } else {
2881           ;         // exact, the result is already correct
2882       }
2883       res = Cstar.w[0];
2884     } else if (exp == 0) {
2885       // 1 <= q <= 10
2886       // res = +C (exact)
2887       res = C1.w[0];
2888     } else {        // if (exp > 0) => 1 <= exp <= 9, 1 <= q < 9, 2 <= q + exp <= 10
2889       // res = +C * 10^exp (exact)
2890       res = C1.w[0] * ten2k64[exp];
2891     }
2892   }
2893 }
2894 
2895 BID_RETURN (res);
2896 }
2897 
2898 /*****************************************************************************
2899  *  BID128_to_uint32_rninta
2900  ****************************************************************************/
2901 
2902 BID128_FUNCTION_ARG1_NORND_CUSTOMRESTYPE (unsigned int,
2903                                                     bid128_to_uint32_rninta, x)
2904 
2905      unsigned int res;
2906      UINT64 x_sign;
2907      UINT64 x_exp;
2908      int exp;                           // unbiased exponent
2909   // Note: C1.w[1], C1.w[0] represent x_signif_hi, x_signif_lo (all are UINT64)
2910      UINT64 tmp64;
2911      BID_UI64DOUBLE tmp1;
2912      unsigned int x_nr_bits;
2913      int q, ind, shift;
2914      UINT128 C1, C;
2915      UINT128 Cstar;           // C* represents up to 34 decimal digits ~ 113 bits
2916      UINT256 P256;
2917 
2918   // unpack x
2919 x_sign = x.w[1] & MASK_SIGN;  // 0 for positive, MASK_SIGN for negative
2920 x_exp = x.w[1] & MASK_EXP;    // biased and shifted left 49 bit positions
2921 C1.w[1] = x.w[1] & MASK_COEFF;
2922 C1.w[0] = x.w[0];
2923 
2924   // check for NaN or Infinity
2925 if ((x.w[1] & MASK_SPECIAL) == MASK_SPECIAL) {
2926     // x is special
2927 if ((x.w[1] & MASK_NAN) == MASK_NAN) {  // x is NAN
2928   if ((x.w[1] & MASK_SNAN) == MASK_SNAN) {        // x is SNAN
2929     // set invalid flag
2930     *pfpsf |= INVALID_EXCEPTION;
2931     // return Integer Indefinite
2932     res = 0x80000000;
2933   } else {          // x is QNaN
2934     // set invalid flag
2935     *pfpsf |= INVALID_EXCEPTION;
2936     // return Integer Indefinite
2937     res = 0x80000000;
2938   }
2939   BID_RETURN (res);
2940 } else {  // x is not a NaN, so it must be infinity
2941   if (!x_sign) {    // x is +inf
2942     // set invalid flag
2943     *pfpsf |= INVALID_EXCEPTION;
2944     // return Integer Indefinite
2945     res = 0x80000000;
2946   } else {          // x is -inf
2947     // set invalid flag
2948     *pfpsf |= INVALID_EXCEPTION;
2949     // return Integer Indefinite
2950     res = 0x80000000;
2951   }
2952   BID_RETURN (res);
2953 }
2954 }
2955   // check for non-canonical values (after the check for special values)
2956 if ((C1.w[1] > 0x0001ed09bead87c0ull)
2957     || (C1.w[1] == 0x0001ed09bead87c0ull
2958           && (C1.w[0] > 0x378d8e63ffffffffull))
2959     || ((x.w[1] & 0x6000000000000000ull) == 0x6000000000000000ull)) {
2960   res = 0x00000000;
2961   BID_RETURN (res);
2962 } else if ((C1.w[1] == 0x0ull) && (C1.w[0] == 0x0ull)) {
2963   // x is 0
2964   res = 0x00000000;
2965   BID_RETURN (res);
2966 } else {  // x is not special and is not zero
2967 
2968   // q = nr. of decimal digits in x
2969   //  determine first the nr. of bits in x
2970   if (C1.w[1] == 0) {
2971     if (C1.w[0] >= 0x0020000000000000ull) {       // x >= 2^53
2972       // split the 64-bit value in two 32-bit halves to avoid rounding errors
2973       if (C1.w[0] >= 0x0000000100000000ull) {     // x >= 2^32
2974           tmp1.d = (double) (C1.w[0] >> 32);      // exact conversion
2975           x_nr_bits =
2976             33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
2977       } else {      // x < 2^32
2978           tmp1.d = (double) (C1.w[0]);  // exact conversion
2979           x_nr_bits =
2980             1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
2981       }
2982     } else {        // if x < 2^53
2983       tmp1.d = (double) C1.w[0];        // exact conversion
2984       x_nr_bits =
2985           1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
2986     }
2987   } else {          // C1.w[1] != 0 => nr. bits = 64 + nr_bits (C1.w[1])
2988     tmp1.d = (double) C1.w[1];          // exact conversion
2989     x_nr_bits =
2990       65 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
2991   }
2992   q = nr_digits[x_nr_bits - 1].digits;
2993   if (q == 0) {
2994     q = nr_digits[x_nr_bits - 1].digits1;
2995     if (C1.w[1] > nr_digits[x_nr_bits - 1].threshold_hi
2996           || (C1.w[1] == nr_digits[x_nr_bits - 1].threshold_hi
2997               && C1.w[0] >= nr_digits[x_nr_bits - 1].threshold_lo))
2998       q++;
2999   }
3000   exp = (x_exp >> 49) - 6176;
3001   if ((q + exp) > 10) {       // x >= 10^10 ~= 2^33.2... (cannot fit in 32 bits)
3002     // set invalid flag
3003     *pfpsf |= INVALID_EXCEPTION;
3004     // return Integer Indefinite
3005     res = 0x80000000;
3006     BID_RETURN (res);
3007   } else if ((q + exp) == 10) {         // x = c(0)c(1)...c(9).c(10)...c(q-1)
3008     // in this case 2^29.89... ~= 10^9 <= x < 10^10 ~= 2^33.2...
3009     // so x rounded to an integer may or may not fit in a signed 32-bit int
3010     // the cases that do not fit are identified here; the ones that fit
3011     // fall through and will be handled with other cases further,
3012     // under '1 <= q + exp <= 10'
3013     if (x_sign) {   // if n < 0 and q + exp = 10
3014       // if n <= -1/2 then n is too large
3015       // too large if c(0)c(1)...c(9).c(10)...c(q-1) >= 1/2
3016       // <=> 0.c(0)c(1)...c(q-1) * 10^11 >= 0x05, 1<=q<=34
3017       if (q <= 11) {
3018           tmp64 = C1.w[0] * ten2k64[11 - q];      // C scaled up to 11-digit int
3019           // c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
3020           if (tmp64 >= 0x05ull) {
3021             // set invalid flag
3022             *pfpsf |= INVALID_EXCEPTION;
3023             // return Integer Indefinite
3024             res = 0x80000000;
3025             BID_RETURN (res);
3026           }
3027           // else cases that can be rounded to a 32-bit int fall through
3028           // to '1 <= q + exp <= 10'
3029       } else {      // if (q > 11), i.e. 12 <= q <= 34 and so -24 <= exp <= -2
3030           // 0.c(0)c(1)...c(q-1) * 10^11 >= 0x05 <=>
3031           // C >= 0x05 * 10^(q-11) where 1 <= q - 11 <= 23
3032           // (scale 1/2 up)
3033           tmp64 = 0x05ull;
3034           if (q - 11 <= 19) { // 1 <= q - 11 <= 19; 10^(q-11) requires 64 bits
3035             __mul_64x64_to_128MACH (C, tmp64, ten2k64[q - 11]);
3036           } else {  // 20 <= q - 11 <= 23, and 10^(q-11) requires 128 bits
3037             __mul_128x64_to_128 (C, tmp64, ten2k128[q - 31]);
3038           }
3039           if (C1.w[1] > C.w[1]
3040               || (C1.w[1] == C.w[1] && C1.w[0] >= C.w[0])) {
3041             // set invalid flag
3042             *pfpsf |= INVALID_EXCEPTION;
3043             // return Integer Indefinite
3044             res = 0x80000000;
3045             BID_RETURN (res);
3046           }
3047           // else cases that can be rounded to a 32-bit int fall through
3048           // to '1 <= q + exp <= 10'
3049       }
3050     } else {        // if n > 0 and q + exp = 10
3051       // if n >= 2^32 - 1/2 then n is too large
3052       // too large if c(0)c(1)...c(9).c(10)...c(q-1) >= 2^32-1/2
3053       // too large if 0.c(0)c(1)...c(q-1) * 10^11 >= 0x9fffffffb, 1<=q<=34
3054       if (q <= 11) {
3055           tmp64 = C1.w[0] * ten2k64[11 - q];      // C scaled up to 11-digit int
3056           // c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
3057           if (tmp64 >= 0x9fffffffbull) {
3058             // set invalid flag
3059             *pfpsf |= INVALID_EXCEPTION;
3060             // return Integer Indefinite
3061             res = 0x80000000;
3062             BID_RETURN (res);
3063           }
3064           // else cases that can be rounded to a 32-bit int fall through
3065           // to '1 <= q + exp <= 10'
3066       } else {      // if (q > 11), i.e. 12 <= q <= 34 and so -24 <= exp <= -2
3067           // 0.c(0)c(1)...c(q-1) * 10^11 >= 0x9fffffffb <=>
3068           // C >= 0x9fffffffb * 10^(q-11) where 1 <= q - 11 <= 23
3069           // (scale 2^32-1/2 up)
3070           tmp64 = 0x9fffffffbull;
3071           if (q - 11 <= 19) { // 1 <= q - 11 <= 19; 10^(q-11) requires 64 bits
3072             __mul_64x64_to_128MACH (C, tmp64, ten2k64[q - 11]);
3073           } else {  // 20 <= q - 11 <= 23, and 10^(q-11) requires 128 bits
3074             __mul_128x64_to_128 (C, tmp64, ten2k128[q - 31]);
3075           }
3076           if (C1.w[1] > C.w[1]
3077               || (C1.w[1] == C.w[1] && C1.w[0] >= C.w[0])) {
3078             // set invalid flag
3079             *pfpsf |= INVALID_EXCEPTION;
3080             // return Integer Indefinite
3081             res = 0x80000000;
3082             BID_RETURN (res);
3083           }
3084           // else cases that can be rounded to a 32-bit int fall through
3085           // to '1 <= q + exp <= 10'
3086       }
3087     }
3088   }
3089   // n is not too large to be converted to int32: -1/2 < n < 2^32 - 1/2
3090   // Note: some of the cases tested for above fall through to this point
3091   if ((q + exp) < 0) {        // n = +/-0.0...c(0)c(1)...c(q-1)
3092     // return 0
3093     res = 0x00000000;
3094     BID_RETURN (res);
3095   } else if ((q + exp) == 0) {          // n = +/-0.c(0)c(1)...c(q-1)
3096     // if 0.c(0)c(1)...c(q-1) < 0.5 <=> c(0)c(1)...c(q-1) < 5 * 10^(q-1)
3097     //   res = 0
3098     // else if x > 0
3099     //   res = +1
3100     // else // if x < 0
3101     //   invalid exc
3102     ind = q - 1;
3103     if (ind <= 18) {          // 0 <= ind <= 18
3104       if ((C1.w[1] == 0) && (C1.w[0] < midpoint64[ind])) {
3105           res = 0x00000000;   // return 0
3106       } else if (!x_sign) {   // n > 0
3107           res = 0x00000001;   // return +1
3108       } else {
3109           res = 0x80000000;
3110           *pfpsf |= INVALID_EXCEPTION;
3111       }
3112     } else {        // 19 <= ind <= 33
3113       if ((C1.w[1] < midpoint128[ind - 19].w[1])
3114             || ((C1.w[1] == midpoint128[ind - 19].w[1])
3115                 && (C1.w[0] < midpoint128[ind - 19].w[0]))) {
3116           res = 0x00000000;   // return 0
3117       } else if (!x_sign) {   // n > 0
3118           res = 0x00000001;   // return +1
3119       } else {
3120           res = 0x80000000;
3121           *pfpsf |= INVALID_EXCEPTION;
3122       }
3123     }
3124   } else {          // if (1 <= q + exp <= 10, 1 <= q <= 34, -33 <= exp <= 9)
3125     if (x_sign) {   // x <= -1
3126       // set invalid flag
3127       *pfpsf |= INVALID_EXCEPTION;
3128       // return Integer Indefinite
3129       res = 0x80000000;
3130       BID_RETURN (res);
3131     }
3132     // 1 <= x < 2^31-1/2 so x can be rounded
3133     // to nearest-away to a 32-bit signed integer
3134     if (exp < 0) {  // 2 <= q <= 34, -33 <= exp <= -1, 1 <= q + exp <= 10
3135       ind = -exp;   // 1 <= ind <= 33; ind is a synonym for 'x'
3136       // chop off ind digits from the lower part of C1
3137       // C1 = C1 + 1/2 * 10^ind where the result C1 fits in 127 bits
3138       tmp64 = C1.w[0];
3139       if (ind <= 19) {
3140           C1.w[0] = C1.w[0] + midpoint64[ind - 1];
3141       } else {
3142           C1.w[0] = C1.w[0] + midpoint128[ind - 20].w[0];
3143           C1.w[1] = C1.w[1] + midpoint128[ind - 20].w[1];
3144       }
3145       if (C1.w[0] < tmp64)
3146           C1.w[1]++;
3147       // calculate C* and f*
3148       // C* is actually floor(C*) in this case
3149       // C* and f* need shifting and masking, as shown by
3150       // shiftright128[] and maskhigh128[]
3151       // 1 <= x <= 33
3152       // kx = 10^(-x) = ten2mk128[ind - 1]
3153       // C* = (C1 + 1/2 * 10^x) * 10^(-x)
3154       // the approximation of 10^(-x) was rounded up to 118 bits
3155       __mul_128x128_to_256 (P256, C1, ten2mk128[ind - 1]);
3156       if (ind - 1 <= 21) {    // 0 <= ind - 1 <= 21
3157           Cstar.w[1] = P256.w[3];
3158           Cstar.w[0] = P256.w[2];
3159       } else {      // 22 <= ind - 1 <= 33
3160           Cstar.w[1] = 0;
3161           Cstar.w[0] = P256.w[3];
3162       }
3163       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind], e.g.
3164       // if x=1, T*=ten2mk128trunc[0]=0x19999999999999999999999999999999
3165       // if (0 < f* < 10^(-x)) then the result is a midpoint
3166       //   if floor(C*) is even then C* = floor(C*) - logical right
3167       //       shift; C* has p decimal digits, correct by Prop. 1)
3168       //   else if floor(C*) is odd C* = floor(C*)-1 (logical right
3169       //       shift; C* has p decimal digits, correct by Pr. 1)
3170       // else
3171       //   C* = floor(C*) (logical right shift; C has p decimal digits,
3172       //       correct by Property 1)
3173       // n = C* * 10^(e+x)
3174 
3175       // shift right C* by Ex-128 = shiftright128[ind]
3176       shift = shiftright128[ind - 1];   // 0 <= shift <= 102
3177       if (ind - 1 <= 21) {    // 0 <= ind - 1 <= 21
3178           Cstar.w[0] =
3179             (Cstar.w[0] >> shift) | (Cstar.w[1] << (64 - shift));
3180           // redundant, it will be 0! Cstar.w[1] = (Cstar.w[1] >> shift);
3181       } else {      // 22 <= ind - 1 <= 33
3182           Cstar.w[0] = (Cstar.w[0] >> (shift - 64));        // 2 <= shift - 64 <= 38
3183       }
3184       // if the result was a midpoint, it was already rounded away from zero
3185       res = Cstar.w[0];       // always positive
3186       // no need to check for midpoints - already rounded away from zero!
3187     } else if (exp == 0) {
3188       // 1 <= q <= 10
3189       // res = +C (exact)
3190       res = C1.w[0];
3191     } else {        // if (exp > 0) => 1 <= exp <= 9, 1 <= q < 9, 2 <= q + exp <= 10
3192       // res = +C * 10^exp (exact)
3193       res = C1.w[0] * ten2k64[exp];
3194     }
3195   }
3196 }
3197 
3198 BID_RETURN (res);
3199 }
3200 
3201 /*****************************************************************************
3202  *  BID128_to_uint32_xrninta
3203  ****************************************************************************/
3204 
3205 BID128_FUNCTION_ARG1_NORND_CUSTOMRESTYPE (unsigned int,
3206                                                     bid128_to_uint32_xrninta, x)
3207 
3208      unsigned int res;
3209      UINT64 x_sign;
3210      UINT64 x_exp;
3211      int exp;                           // unbiased exponent
3212   // Note: C1.w[1], C1.w[0] represent x_signif_hi, x_signif_lo (all are UINT64)
3213      UINT64 tmp64, tmp64A;
3214      BID_UI64DOUBLE tmp1;
3215      unsigned int x_nr_bits;
3216      int q, ind, shift;
3217      UINT128 C1, C;
3218      UINT128 Cstar;           // C* represents up to 34 decimal digits ~ 113 bits
3219      UINT256 fstar;
3220      UINT256 P256;
3221      unsigned int tmp_inexact = 0;
3222 
3223   // unpack x
3224 x_sign = x.w[1] & MASK_SIGN;  // 0 for positive, MASK_SIGN for negative
3225 x_exp = x.w[1] & MASK_EXP;    // biased and shifted left 49 bit positions
3226 C1.w[1] = x.w[1] & MASK_COEFF;
3227 C1.w[0] = x.w[0];
3228 
3229   // check for NaN or Infinity
3230 if ((x.w[1] & MASK_SPECIAL) == MASK_SPECIAL) {
3231     // x is special
3232 if ((x.w[1] & MASK_NAN) == MASK_NAN) {  // x is NAN
3233   if ((x.w[1] & MASK_SNAN) == MASK_SNAN) {        // x is SNAN
3234     // set invalid flag
3235     *pfpsf |= INVALID_EXCEPTION;
3236     // return Integer Indefinite
3237     res = 0x80000000;
3238   } else {          // x is QNaN
3239     // set invalid flag
3240     *pfpsf |= INVALID_EXCEPTION;
3241     // return Integer Indefinite
3242     res = 0x80000000;
3243   }
3244   BID_RETURN (res);
3245 } else {  // x is not a NaN, so it must be infinity
3246   if (!x_sign) {    // x is +inf
3247     // set invalid flag
3248     *pfpsf |= INVALID_EXCEPTION;
3249     // return Integer Indefinite
3250     res = 0x80000000;
3251   } else {          // x is -inf
3252     // set invalid flag
3253     *pfpsf |= INVALID_EXCEPTION;
3254     // return Integer Indefinite
3255     res = 0x80000000;
3256   }
3257   BID_RETURN (res);
3258 }
3259 }
3260   // check for non-canonical values (after the check for special values)
3261 if ((C1.w[1] > 0x0001ed09bead87c0ull)
3262     || (C1.w[1] == 0x0001ed09bead87c0ull
3263           && (C1.w[0] > 0x378d8e63ffffffffull))
3264     || ((x.w[1] & 0x6000000000000000ull) == 0x6000000000000000ull)) {
3265   res = 0x00000000;
3266   BID_RETURN (res);
3267 } else if ((C1.w[1] == 0x0ull) && (C1.w[0] == 0x0ull)) {
3268   // x is 0
3269   res = 0x00000000;
3270   BID_RETURN (res);
3271 } else {  // x is not special and is not zero
3272 
3273   // q = nr. of decimal digits in x
3274   //  determine first the nr. of bits in x
3275   if (C1.w[1] == 0) {
3276     if (C1.w[0] >= 0x0020000000000000ull) {       // x >= 2^53
3277       // split the 64-bit value in two 32-bit halves to avoid rounding errors
3278       if (C1.w[0] >= 0x0000000100000000ull) {     // x >= 2^32
3279           tmp1.d = (double) (C1.w[0] >> 32);      // exact conversion
3280           x_nr_bits =
3281             33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
3282       } else {      // x < 2^32
3283           tmp1.d = (double) (C1.w[0]);  // exact conversion
3284           x_nr_bits =
3285             1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
3286       }
3287     } else {        // if x < 2^53
3288       tmp1.d = (double) C1.w[0];        // exact conversion
3289       x_nr_bits =
3290           1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
3291     }
3292   } else {          // C1.w[1] != 0 => nr. bits = 64 + nr_bits (C1.w[1])
3293     tmp1.d = (double) C1.w[1];          // exact conversion
3294     x_nr_bits =
3295       65 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
3296   }
3297   q = nr_digits[x_nr_bits - 1].digits;
3298   if (q == 0) {
3299     q = nr_digits[x_nr_bits - 1].digits1;
3300     if (C1.w[1] > nr_digits[x_nr_bits - 1].threshold_hi
3301           || (C1.w[1] == nr_digits[x_nr_bits - 1].threshold_hi
3302               && C1.w[0] >= nr_digits[x_nr_bits - 1].threshold_lo))
3303       q++;
3304   }
3305   exp = (x_exp >> 49) - 6176;
3306   if ((q + exp) > 10) {       // x >= 10^10 ~= 2^33.2... (cannot fit in 32 bits)
3307     // set invalid flag
3308     *pfpsf |= INVALID_EXCEPTION;
3309     // return Integer Indefinite
3310     res = 0x80000000;
3311     BID_RETURN (res);
3312   } else if ((q + exp) == 10) {         // x = c(0)c(1)...c(9).c(10)...c(q-1)
3313     // in this case 2^29.89... ~= 10^9 <= x < 10^10 ~= 2^33.2...
3314     // so x rounded to an integer may or may not fit in a signed 32-bit int
3315     // the cases that do not fit are identified here; the ones that fit
3316     // fall through and will be handled with other cases further,
3317     // under '1 <= q + exp <= 10'
3318     if (x_sign) {   // if n < 0 and q + exp = 10
3319       // if n <= -1/2 then n is too large
3320       // too large if c(0)c(1)...c(9).c(10)...c(q-1) >= 1/2
3321       // <=> 0.c(0)c(1)...c(q-1) * 10^11 >= 0x05, 1<=q<=34
3322       if (q <= 11) {
3323           tmp64 = C1.w[0] * ten2k64[11 - q];      // C scaled up to 11-digit int
3324           // c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
3325           if (tmp64 >= 0x05ull) {
3326             // set invalid flag
3327             *pfpsf |= INVALID_EXCEPTION;
3328             // return Integer Indefinite
3329             res = 0x80000000;
3330             BID_RETURN (res);
3331           }
3332           // else cases that can be rounded to a 32-bit int fall through
3333           // to '1 <= q + exp <= 10'
3334       } else {      // if (q > 11), i.e. 12 <= q <= 34 and so -24 <= exp <= -2
3335           // 0.c(0)c(1)...c(q-1) * 10^11 >= 0x05 <=>
3336           // C >= 0x05 * 10^(q-11) where 1 <= q - 11 <= 23
3337           // (scale 1/2 up)
3338           tmp64 = 0x05ull;
3339           if (q - 11 <= 19) { // 1 <= q - 11 <= 19; 10^(q-11) requires 64 bits
3340             __mul_64x64_to_128MACH (C, tmp64, ten2k64[q - 11]);
3341           } else {  // 20 <= q - 11 <= 23, and 10^(q-11) requires 128 bits
3342             __mul_128x64_to_128 (C, tmp64, ten2k128[q - 31]);
3343           }
3344           if (C1.w[1] > C.w[1]
3345               || (C1.w[1] == C.w[1] && C1.w[0] >= C.w[0])) {
3346             // set invalid flag
3347             *pfpsf |= INVALID_EXCEPTION;
3348             // return Integer Indefinite
3349             res = 0x80000000;
3350             BID_RETURN (res);
3351           }
3352           // else cases that can be rounded to a 32-bit int fall through
3353           // to '1 <= q + exp <= 10'
3354       }
3355     } else {        // if n > 0 and q + exp = 10
3356       // if n >= 2^32 - 1/2 then n is too large
3357       // too large if c(0)c(1)...c(9).c(10)...c(q-1) >= 2^32-1/2
3358       // too large if 0.c(0)c(1)...c(q-1) * 10^11 >= 0x9fffffffb, 1<=q<=34
3359       if (q <= 11) {
3360           tmp64 = C1.w[0] * ten2k64[11 - q];      // C scaled up to 11-digit int
3361           // c(0)c(1)...c(9)c(10) or c(0)c(1)...c(q-1)0...0 (11 digits)
3362           if (tmp64 >= 0x9fffffffbull) {
3363             // set invalid flag
3364             *pfpsf |= INVALID_EXCEPTION;
3365             // return Integer Indefinite
3366             res = 0x80000000;
3367             BID_RETURN (res);
3368           }
3369           // else cases that can be rounded to a 32-bit int fall through
3370           // to '1 <= q + exp <= 10'
3371       } else {      // if (q > 11), i.e. 12 <= q <= 34 and so -24 <= exp <= -2
3372           // 0.c(0)c(1)...c(q-1) * 10^11 >= 0x9fffffffb <=>
3373           // C >= 0x9fffffffb * 10^(q-11) where 1 <= q - 11 <= 23
3374           // (scale 2^32-1/2 up)
3375           tmp64 = 0x9fffffffbull;
3376           if (q - 11 <= 19) { // 1 <= q - 11 <= 19; 10^(q-11) requires 64 bits
3377             __mul_64x64_to_128MACH (C, tmp64, ten2k64[q - 11]);
3378           } else {  // 20 <= q - 11 <= 23, and 10^(q-11) requires 128 bits
3379             __mul_128x64_to_128 (C, tmp64, ten2k128[q - 31]);
3380           }
3381           if (C1.w[1] > C.w[1]
3382               || (C1.w[1] == C.w[1] && C1.w[0] >= C.w[0])) {
3383             // set invalid flag
3384             *pfpsf |= INVALID_EXCEPTION;
3385             // return Integer Indefinite
3386             res = 0x80000000;
3387             BID_RETURN (res);
3388           }
3389           // else cases that can be rounded to a 32-bit int fall through
3390           // to '1 <= q + exp <= 10'
3391       }
3392     }
3393   }
3394   // n is not too large to be converted to int32: -1/2 < n < 2^32 - 1/2
3395   // Note: some of the cases tested for above fall through to this point
3396   if ((q + exp) < 0) {        // n = +/-0.0...c(0)c(1)...c(q-1)
3397     // set inexact flag
3398     *pfpsf |= INEXACT_EXCEPTION;
3399     // return 0
3400     res = 0x00000000;
3401     BID_RETURN (res);
3402   } else if ((q + exp) == 0) {          // n = +/-0.c(0)c(1)...c(q-1)
3403     // if 0.c(0)c(1)...c(q-1) < 0.5 <=> c(0)c(1)...c(q-1) < 5 * 10^(q-1)
3404     //   res = 0
3405     // else if x > 0
3406     //   res = +1
3407     // else // if x < 0
3408     //   invalid exc
3409     ind = q - 1;
3410     if (ind <= 18) {          // 0 <= ind <= 18
3411       if ((C1.w[1] == 0) && (C1.w[0] < midpoint64[ind])) {
3412           res = 0x00000000;   // return 0
3413       } else if (!x_sign) {   // n > 0
3414           res = 0x00000001;   // return +1
3415       } else {
3416           res = 0x80000000;
3417           *pfpsf |= INVALID_EXCEPTION;
3418           BID_RETURN (res);
3419       }
3420     } else {        // 19 <= ind <= 33
3421       if ((C1.w[1] < midpoint128[ind - 19].w[1])
3422             || ((C1.w[1] == midpoint128[ind - 19].w[1])
3423                 && (C1.w[0] < midpoint128[ind - 19].w[0]))) {
3424           res = 0x00000000;   // return 0
3425       } else if (!x_sign) {   // n > 0
3426           res = 0x00000001;   // return +1
3427       } else {
3428           res = 0x80000000;
3429           *pfpsf |= INVALID_EXCEPTION;
3430           BID_RETURN (res);
3431       }
3432     }
3433     // set inexact flag
3434     *pfpsf |= INEXACT_EXCEPTION;
3435   } else {          // if (1 <= q + exp <= 10, 1 <= q <= 34, -33 <= exp <= 9)
3436     if (x_sign) {   // x <= -1
3437       // set invalid flag
3438       *pfpsf |= INVALID_EXCEPTION;
3439       // return Integer Indefinite
3440       res = 0x80000000;
3441       BID_RETURN (res);
3442     }
3443     // 1 <= x < 2^31-1/2 so x can be rounded
3444     // to nearest-away to a 32-bit signed integer
3445     if (exp < 0) {  // 2 <= q <= 34, -33 <= exp <= -1, 1 <= q + exp <= 10
3446       ind = -exp;   // 1 <= ind <= 33; ind is a synonym for 'x'
3447       // chop off ind digits from the lower part of C1
3448       // C1 = C1 + 1/2 * 10^ind where the result C1 fits in 127 bits
3449       tmp64 = C1.w[0];
3450       if (ind <= 19) {
3451           C1.w[0] = C1.w[0] + midpoint64[ind - 1];
3452       } else {
3453           C1.w[0] = C1.w[0] + midpoint128[ind - 20].w[0];
3454           C1.w[1] = C1.w[1] + midpoint128[ind - 20].w[1];
3455       }
3456       if (C1.w[0] < tmp64)
3457           C1.w[1]++;
3458       // calculate C* and f*
3459       // C* is actually floor(C*) in this case
3460       // C* and f* need shifting and masking, as shown by
3461       // shiftright128[] and maskhigh128[]
3462       // 1 <= x <= 33
3463       // kx = 10^(-x) = ten2mk128[ind - 1]
3464       // C* = (C1 + 1/2 * 10^x) * 10^(-x)
3465       // the approximation of 10^(-x) was rounded up to 118 bits
3466       __mul_128x128_to_256 (P256, C1, ten2mk128[ind - 1]);
3467       if (ind - 1 <= 21) {    // 0 <= ind - 1 <= 21
3468           Cstar.w[1] = P256.w[3];
3469           Cstar.w[0] = P256.w[2];
3470           fstar.w[3] = 0;
3471           fstar.w[2] = P256.w[2] & maskhigh128[ind - 1];
3472           fstar.w[1] = P256.w[1];
3473           fstar.w[0] = P256.w[0];
3474       } else {      // 22 <= ind - 1 <= 33
3475           Cstar.w[1] = 0;
3476           Cstar.w[0] = P256.w[3];
3477           fstar.w[3] = P256.w[3] & maskhigh128[ind - 1];
3478           fstar.w[2] = P256.w[2];
3479           fstar.w[1] = P256.w[1];
3480           fstar.w[0] = P256.w[0];
3481       }
3482       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind], e.g.
3483       // if x=1, T*=ten2mk128trunc[0]=0x19999999999999999999999999999999
3484       // if (0 < f* < 10^(-x)) then the result is a midpoint
3485       //   if floor(C*) is even then C* = floor(C*) - logical right
3486       //       shift; C* has p decimal digits, correct by Prop. 1)
3487       //   else if floor(C*) is odd C* = floor(C*)-1 (logical right
3488       //       shift; C* has p decimal digits, correct by Pr. 1)
3489       // else
3490       //   C* = floor(C*) (logical right shift; C has p decimal digits,
3491       //       correct by Property 1)
3492       // n = C* * 10^(e+x)
3493 
3494       // shift right C* by Ex-128 = shiftright128[ind]
3495       shift = shiftright128[ind - 1];   // 0 <= shift <= 102
3496       if (ind - 1 <= 21) {    // 0 <= ind - 1 <= 21
3497           Cstar.w[0] =
3498             (Cstar.w[0] >> shift) | (Cstar.w[1] << (64 - shift));
3499           // redundant, it will be 0! Cstar.w[1] = (Cstar.w[1] >> shift);
3500       } else {      // 22 <= ind - 1 <= 33
3501           Cstar.w[0] = (Cstar.w[0] >> (shift - 64));        // 2 <= shift - 64 <= 38
3502       }
3503       // if the result was a midpoint, it was already rounded away from zero
3504       // determine inexactness of the rounding of C*
3505       // if (0 < f* - 1/2 < 10^(-x)) then
3506       //   the result is exact
3507       // else // if (f* - 1/2 > T*) then
3508       //   the result is inexact
3509       if (ind - 1 <= 2) {
3510           if (fstar.w[1] > 0x8000000000000000ull ||
3511               (fstar.w[1] == 0x8000000000000000ull
3512                && fstar.w[0] > 0x0ull)) {
3513             // f* > 1/2 and the result may be exact
3514             tmp64 = fstar.w[1] - 0x8000000000000000ull;     // f* - 1/2
3515             if (tmp64 > ten2mk128trunc[ind - 1].w[1]
3516                 || (tmp64 == ten2mk128trunc[ind - 1].w[1]
3517                       && fstar.w[0] >= ten2mk128trunc[ind - 1].w[0])) {
3518               // set the inexact flag
3519               // *pfpsf |= INEXACT_EXCEPTION;
3520               tmp_inexact = 1;
3521             }       // else the result is exact
3522           } else {  // the result is inexact; f2* <= 1/2
3523             // set the inexact flag
3524             // *pfpsf |= INEXACT_EXCEPTION;
3525             tmp_inexact = 1;
3526           }
3527       } else if (ind - 1 <= 21) {       // if 3 <= ind <= 21
3528           if (fstar.w[3] > 0x0 ||
3529               (fstar.w[3] == 0x0 && fstar.w[2] > onehalf128[ind - 1]) ||
3530               (fstar.w[3] == 0x0 && fstar.w[2] == onehalf128[ind - 1] &&
3531                (fstar.w[1] || fstar.w[0]))) {
3532             // f2* > 1/2 and the result may be exact
3533             // Calculate f2* - 1/2
3534             tmp64 = fstar.w[2] - onehalf128[ind - 1];
3535             tmp64A = fstar.w[3];
3536             if (tmp64 > fstar.w[2])
3537               tmp64A--;
3538             if (tmp64A || tmp64
3539                 || fstar.w[1] > ten2mk128trunc[ind - 1].w[1]
3540                 || (fstar.w[1] == ten2mk128trunc[ind - 1].w[1]
3541                       && fstar.w[0] > ten2mk128trunc[ind - 1].w[0])) {
3542               // set the inexact flag
3543               // *pfpsf |= INEXACT_EXCEPTION;
3544               tmp_inexact = 1;
3545             }       // else the result is exact
3546           } else {  // the result is inexact; f2* <= 1/2
3547             // set the inexact flag
3548             // *pfpsf |= INEXACT_EXCEPTION;
3549             tmp_inexact = 1;
3550           }
3551       } else {      // if 22 <= ind <= 33
3552           if (fstar.w[3] > onehalf128[ind - 1] ||
3553               (fstar.w[3] == onehalf128[ind - 1] &&
3554                (fstar.w[2] || fstar.w[1] || fstar.w[0]))) {
3555             // f2* > 1/2 and the result may be exact
3556             // Calculate f2* - 1/2
3557             tmp64 = fstar.w[3] - onehalf128[ind - 1];
3558             if (tmp64 || fstar.w[2]
3559                 || fstar.w[1] > ten2mk128trunc[ind - 1].w[1]
3560                 || (fstar.w[1] == ten2mk128trunc[ind - 1].w[1]
3561                       && fstar.w[0] > ten2mk128trunc[ind - 1].w[0])) {
3562               // set the inexact flag
3563               // *pfpsf |= INEXACT_EXCEPTION;
3564               tmp_inexact = 1;
3565             }       // else the result is exact
3566           } else {  // the result is inexact; f2* <= 1/2
3567             // set the inexact flag
3568             // *pfpsf |= INEXACT_EXCEPTION;
3569             tmp_inexact = 1;
3570           }
3571       }
3572       // no need to check for midpoints - already rounded away from zero!
3573       res = Cstar.w[0];       // the result is positive
3574       if (tmp_inexact)
3575           *pfpsf |= INEXACT_EXCEPTION;
3576     } else if (exp == 0) {
3577       // 1 <= q <= 10
3578       // res = +C (exact)
3579       res = C1.w[0];
3580     } else {        // if (exp > 0) => 1 <= exp <= 9, 1 <= q < 9, 2 <= q + exp <= 10
3581       // res = +C * 10^exp (exact)
3582       res = C1.w[0] * ten2k64[exp];
3583     }
3584   }
3585 }
3586 
3587 BID_RETURN (res);
3588 }
3589