1/* Copyright (C) 2007-2022 Free Software Foundation, Inc.
2
3This file is part of GCC.
4
5GCC is free software; you can redistribute it and/or modify it under
6the terms of the GNU General Public License as published by the Free
7Software Foundation; either version 3, or (at your option) any later
8version.
9
10GCC is distributed in the hope that it will be useful, but WITHOUT ANY
11WARRANTY; without even the implied warranty of MERCHANTABILITY or
12FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13for more details.
14
15Under Section 7 of GPL version 3, you are granted additional
16permissions described in the GCC Runtime Library Exception, version
173.1, as published by the Free Software Foundation.
18
19You should have received a copy of the GNU General Public License and
20a copy of the GCC Runtime Library Exception along with this program;
21see 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
30BID128_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
47x_sign = x.w[1] & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
48x_exp = x.w[1] & MASK_EXP;	// biased and shifted left 49 bit positions
49C1.w[1] = x.w[1] & MASK_COEFF;
50C1.w[0] = x.w[0];
51
52  // check for NaN or Infinity
53if ((x.w[1] & MASK_SPECIAL) == MASK_SPECIAL) {
54    // x is special
55if ((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)
84if ((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
343BID_RETURN (res);
344}
345
346/*****************************************************************************
347 *  BID128_to_int32_xrnint
348 ****************************************************************************/
349
350BID128_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
368x_sign = x.w[1] & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
369x_exp = x.w[1] & MASK_EXP;	// biased and shifted left 49 bit positions
370C1.w[1] = x.w[1] & MASK_COEFF;
371C1.w[0] = x.w[0];
372
373  // check for NaN or Infinity
374if ((x.w[1] & MASK_SPECIAL) == MASK_SPECIAL) {
375    // x is special
376if ((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)
405if ((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
727BID_RETURN (res);
728}
729
730/*****************************************************************************
731 *  BID128_to_int32_floor
732 ****************************************************************************/
733
734BID128_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
755x_sign = x.w[1] & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
756x_exp = x.w[1] & MASK_EXP;	// biased and shifted left 49 bit positions
757C1.w[1] = x.w[1] & MASK_COEFF;
758C1.w[0] = x.w[0];
759
760  // check for NaN or Infinity
761if ((x.w[1] & MASK_SPECIAL) == MASK_SPECIAL) {
762    // x is special
763if ((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)
792if ((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
1100BID_RETURN (res);
1101}
1102
1103
1104/*****************************************************************************
1105 *  BID128_to_int32_xfloor
1106 ****************************************************************************/
1107
1108BID128_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
1130x_sign = x.w[1] & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
1131x_exp = x.w[1] & MASK_EXP;	// biased and shifted left 49 bit positions
1132C1.w[1] = x.w[1] & MASK_COEFF;
1133C1.w[0] = x.w[0];
1134
1135  // check for NaN or Infinity
1136if ((x.w[1] & MASK_SPECIAL) == MASK_SPECIAL) {
1137    // x is special
1138if ((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)
1167if ((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
1489BID_RETURN (res);
1490}
1491
1492/*****************************************************************************
1493 *  BID128_to_int32_ceil
1494 ****************************************************************************/
1495
1496BID128_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
1517x_sign = x.w[1] & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
1518x_exp = x.w[1] & MASK_EXP;	// biased and shifted left 49 bit positions
1519C1.w[1] = x.w[1] & MASK_COEFF;
1520C1.w[0] = x.w[0];
1521
1522  // check for NaN or Infinity
1523if ((x.w[1] & MASK_SPECIAL) == MASK_SPECIAL) {
1524    // x is special
1525if ((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)
1554if ((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
1862BID_RETURN (res);
1863}
1864
1865/*****************************************************************************
1866 *  BID128_to_int32_xceil
1867 ****************************************************************************/
1868
1869BID128_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
1890x_sign = x.w[1] & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
1891x_exp = x.w[1] & MASK_EXP;	// biased and shifted left 49 bit positions
1892C1.w[1] = x.w[1] & MASK_COEFF;
1893C1.w[0] = x.w[0];
1894
1895  // check for NaN or Infinity
1896if ((x.w[1] & MASK_SPECIAL) == MASK_SPECIAL) {
1897    // x is special
1898if ((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)
1927if ((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
2249BID_RETURN (res);
2250}
2251
2252/*****************************************************************************
2253 *  BID128_to_int32_int
2254 ****************************************************************************/
2255
2256BID128_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
2275x_sign = x.w[1] & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
2276x_exp = x.w[1] & MASK_EXP;	// biased and shifted left 49 bit positions
2277C1.w[1] = x.w[1] & MASK_COEFF;
2278C1.w[0] = x.w[0];
2279
2280  // check for NaN or Infinity
2281if ((x.w[1] & MASK_SPECIAL) == MASK_SPECIAL) {
2282    // x is special
2283if ((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)
2312if ((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
2609BID_RETURN (res);
2610}
2611
2612/*****************************************************************************
2613 *  BID128_to_int32_xint
2614 ****************************************************************************/
2615
2616BID128_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
2635x_sign = x.w[1] & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
2636x_exp = x.w[1] & MASK_EXP;	// biased and shifted left 49 bit positions
2637C1.w[1] = x.w[1] & MASK_COEFF;
2638C1.w[0] = x.w[0];
2639
2640  // check for NaN or Infinity
2641if ((x.w[1] & MASK_SPECIAL) == MASK_SPECIAL) {
2642    // x is special
2643if ((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)
2672if ((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
2984BID_RETURN (res);
2985}
2986
2987/*****************************************************************************
2988 *  BID128_to_int32_rninta
2989 ****************************************************************************/
2990
2991BID128_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
3008x_sign = x.w[1] & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
3009x_exp = x.w[1] & MASK_EXP;	// biased and shifted left 49 bit positions
3010C1.w[1] = x.w[1] & MASK_COEFF;
3011C1.w[0] = x.w[0];
3012
3013  // check for NaN or Infinity
3014if ((x.w[1] & MASK_SPECIAL) == MASK_SPECIAL) {
3015    // x is special
3016if ((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)
3045if ((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
3285BID_RETURN (res);
3286}
3287
3288/*****************************************************************************
3289 *  BID128_to_int32_xrninta
3290 ****************************************************************************/
3291
3292BID128_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
3310x_sign = x.w[1] & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
3311x_exp = x.w[1] & MASK_EXP;	// biased and shifted left 49 bit positions
3312C1.w[1] = x.w[1] & MASK_COEFF;
3313C1.w[0] = x.w[0];
3314
3315  // check for NaN or Infinity
3316if ((x.w[1] & MASK_SPECIAL) == MASK_SPECIAL) {
3317    // x is special
3318if ((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)
3347if ((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
3658BID_RETURN (res);
3659}
3660