OSDN Git Service

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