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