Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

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