OSDN Git Service

3d8f44c874ac54c608237b0b187cb84f76491470
[pf3gnuchains/gcc-fork.git] / libgcc / config / libbid / bid128_to_uint32.c
1 /* Copyright (C) 2007, 2009  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 }