1 /* Copyright (C) 2007-2018 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  *  BID64_to_int64_rnint
28  ****************************************************************************/
29 
30 #if DECIMAL_CALL_BY_REFERENCE
31 void
bid64_to_int64_rnint(SINT64 * pres,UINT64 * px _EXC_FLAGS_PARAM _EXC_MASKS_PARAM _EXC_INFO_PARAM)32 bid64_to_int64_rnint (SINT64 * pres, UINT64 * px
33 		      _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
34 		      _EXC_INFO_PARAM) {
35   UINT64 x = *px;
36 #else
37 SINT64
38 bid64_to_int64_rnint (UINT64 x
39 		      _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
40 		      _EXC_INFO_PARAM) {
41 #endif
42   SINT64 res;
43   UINT64 x_sign;
44   UINT64 x_exp;
45   int exp;			// unbiased exponent
46   // Note: C1 represents x_significand (UINT64)
47   BID_UI64DOUBLE tmp1;
48   unsigned int x_nr_bits;
49   int q, ind, shift;
50   UINT64 C1;
51   UINT128 C;
52   UINT64 Cstar;			// C* represents up to 16 decimal digits ~ 54 bits
53   UINT128 fstar;
54   UINT128 P128;
55 
56   // check for NaN or Infinity
57   if ((x & MASK_NAN) == MASK_NAN || (x & MASK_INF) == MASK_INF) {
58     // set invalid flag
59     *pfpsf |= INVALID_EXCEPTION;
60     // return Integer Indefinite
61     res = 0x8000000000000000ull;
62     BID_RETURN (res);
63   }
64   // unpack x
65   x_sign = x & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
66   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
67   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
68     x_exp = (x & MASK_BINARY_EXPONENT2) >> 51;	// biased
69     C1 = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
70     if (C1 > 9999999999999999ull) {	// non-canonical
71       x_exp = 0;
72       C1 = 0;
73     }
74   } else {
75     x_exp = (x & MASK_BINARY_EXPONENT1) >> 53;	// biased
76     C1 = x & MASK_BINARY_SIG1;
77   }
78 
79   // check for zeros (possibly from non-canonical values)
80   if (C1 == 0x0ull) {
81     // x is 0
82     res = 0x00000000;
83     BID_RETURN (res);
84   }
85   // x is not special and is not zero
86 
87   // q = nr. of decimal digits in x (1 <= q <= 54)
88   //  determine first the nr. of bits in x
89   if (C1 >= 0x0020000000000000ull) {	// x >= 2^53
90     // split the 64-bit value in two 32-bit halves to avoid rounding errors
91     if (C1 >= 0x0000000100000000ull) {	// x >= 2^32
92       tmp1.d = (double) (C1 >> 32);	// exact conversion
93       x_nr_bits =
94 	33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
95     } else {	// x < 2^32
96       tmp1.d = (double) C1;	// exact conversion
97       x_nr_bits =
98 	1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
99     }
100   } else {	// if x < 2^53
101     tmp1.d = (double) C1;	// exact conversion
102     x_nr_bits =
103       1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
104   }
105   q = nr_digits[x_nr_bits - 1].digits;
106   if (q == 0) {
107     q = nr_digits[x_nr_bits - 1].digits1;
108     if (C1 >= nr_digits[x_nr_bits - 1].threshold_lo)
109       q++;
110   }
111   exp = x_exp - 398;	// unbiased exponent
112 
113   if ((q + exp) > 19) {	// x >= 10^19 ~= 2^63.11... (cannot fit in SINT64)
114     // set invalid flag
115     *pfpsf |= INVALID_EXCEPTION;
116     // return Integer Indefinite
117     res = 0x8000000000000000ull;
118     BID_RETURN (res);
119   } else if ((q + exp) == 19) {	// x = c(0)c(1)...c(18).c(19)...c(q-1)
120     // in this case 2^63.11... ~= 10^19 <= x < 10^20 ~= 2^66.43...
121     // so x rounded to an integer may or may not fit in a signed 64-bit int
122     // the cases that do not fit are identified here; the ones that fit
123     // fall through and will be handled with other cases further,
124     // under '1 <= q + exp <= 19'
125     if (x_sign) {	// if n < 0 and q + exp = 19
126       // if n < -2^63 - 1/2 then n is too large
127       // too large if c(0)c(1)...c(18).c(19)...c(q-1) > 2^63+1/2
128       // <=> 0.c(0)c(1)...c(q-1) * 10^20 > 5*(2^64+1), 1<=q<=16
129       // <=> 0.c(0)c(1)...c(q-1) * 10^20 > 0x50000000000000005, 1<=q<=16
130       // <=> C * 10^(20-q) > 0x50000000000000005, 1<=q<=16
131       // 1 <= q <= 16 => 4 <= 20-q <= 19 => 10^(20-q) is 64-bit, and so is C1
132       __mul_64x64_to_128MACH (C, C1, ten2k64[20 - q]);
133       // Note: C1 * 10^(11-q) has 19 or 20 digits; 0x50000000000000005, has 20
134       if (C.w[1] > 0x05ull || (C.w[1] == 0x05ull && C.w[0] > 0x05ull)) {
135 	// set invalid flag
136 	*pfpsf |= INVALID_EXCEPTION;
137 	// return Integer Indefinite
138 	res = 0x8000000000000000ull;
139 	BID_RETURN (res);
140       }
141       // else cases that can be rounded to a 64-bit int fall through
142       // to '1 <= q + exp <= 19'
143     } else {	// if n > 0 and q + exp = 19
144       // if n >= 2^63 - 1/2 then n is too large
145       // too large if c(0)c(1)...c(18).c(19)...c(q-1) >= 2^63-1/2
146       // <=> if 0.c(0)c(1)...c(q-1) * 10^20 >= 5*(2^64-1), 1<=q<=16
147       // <=> if 0.c(0)c(1)...c(q-1) * 10^20 >= 0x4fffffffffffffffb, 1<=q<=16
148       // <=> if C * 10^(20-q) >= 0x4fffffffffffffffb, 1<=q<=16
149       C.w[1] = 0x0000000000000004ull;
150       C.w[0] = 0xfffffffffffffffbull;
151       // 1 <= q <= 16 => 4 <= 20-q <= 19 => 10^(20-q) is 64-bit, and so is C1
152       __mul_64x64_to_128MACH (C, C1, ten2k64[20 - q]);
153       if (C.w[1] > 0x04ull ||
154 	  (C.w[1] == 0x04ull && C.w[0] >= 0xfffffffffffffffbull)) {
155 	// set invalid flag
156 	*pfpsf |= INVALID_EXCEPTION;
157 	// return Integer Indefinite
158 	res = 0x8000000000000000ull;
159 	BID_RETURN (res);
160       }
161       // else cases that can be rounded to a 64-bit int fall through
162       // to '1 <= q + exp <= 19'
163     }	// end else if n > 0 and q + exp = 19
164   }	// end else if ((q + exp) == 19)
165 
166   // n is not too large to be converted to int64: -2^63-1/2 <= n < 2^63-1/2
167   // Note: some of the cases tested for above fall through to this point
168   if ((q + exp) < 0) {	// n = +/-0.0...c(0)c(1)...c(q-1)
169     // return 0
170     res = 0x0000000000000000ull;
171     BID_RETURN (res);
172   } else if ((q + exp) == 0) {	// n = +/-0.c(0)c(1)...c(q-1)
173     // if 0.c(0)c(1)...c(q-1) <= 0.5 <=> c(0)c(1)...c(q-1) <= 5 * 10^(q-1)
174     //   res = 0
175     // else
176     //   res = +/-1
177     ind = q - 1;	// 0 <= ind <= 15
178     if (C1 <= midpoint64[ind]) {
179       res = 0x0000000000000000ull;	// return 0
180     } else if (x_sign) {	// n < 0
181       res = 0xffffffffffffffffull;	// return -1
182     } else {	// n > 0
183       res = 0x0000000000000001ull;	// return +1
184     }
185   } else {	// if (1 <= q + exp <= 19, 1 <= q <= 16, -15 <= exp <= 18)
186     // -2^63-1/2 <= x <= -1 or 1 <= x < 2^63-1/2 so x can be rounded
187     // to nearest to a 64-bit signed integer
188     if (exp < 0) {	// 2 <= q <= 16, -15 <= exp <= -1, 1 <= q + exp <= 19
189       ind = -exp;	// 1 <= ind <= 15; ind is a synonym for 'x'
190       // chop off ind digits from the lower part of C1
191       // C1 = C1 + 1/2 * 10^ind where the result C1 fits in 64 bits
192       C1 = C1 + midpoint64[ind - 1];
193       // calculate C* and f*
194       // C* is actually floor(C*) in this case
195       // C* and f* need shifting and masking, as shown by
196       // shiftright128[] and maskhigh128[]
197       // 1 <= x <= 15
198       // kx = 10^(-x) = ten2mk64[ind - 1]
199       // C* = (C1 + 1/2 * 10^x) * 10^(-x)
200       // the approximation of 10^(-x) was rounded up to 54 bits
201       __mul_64x64_to_128MACH (P128, C1, ten2mk64[ind - 1]);
202       Cstar = P128.w[1];
203       fstar.w[1] = P128.w[1] & maskhigh128[ind - 1];
204       fstar.w[0] = P128.w[0];
205       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind].w[0], e.g.
206       // if x=1, T*=ten2mk128trunc[0].w[0]=0x1999999999999999
207       // if (0 < f* < 10^(-x)) then the result is a midpoint
208       //   if floor(C*) is even then C* = floor(C*) - logical right
209       //       shift; C* has p decimal digits, correct by Prop. 1)
210       //   else if floor(C*) is odd C* = floor(C*)-1 (logical right
211       //       shift; C* has p decimal digits, correct by Pr. 1)
212       // else
213       //   C* = floor(C*) (logical right shift; C has p decimal digits,
214       //       correct by Property 1)
215       // n = C* * 10^(e+x)
216 
217       // shift right C* by Ex-64 = shiftright128[ind]
218       shift = shiftright128[ind - 1];	// 0 <= shift <= 39
219       Cstar = Cstar >> shift;
220 
221       // if the result was a midpoint it was rounded away from zero, so
222       // it will need a correction
223       // check for midpoints
224       if ((fstar.w[1] == 0) && fstar.w[0] &&
225 	  (fstar.w[0] <= ten2mk128trunc[ind - 1].w[1])) {
226 	// ten2mk128trunc[ind -1].w[1] is identical to
227 	// ten2mk128[ind -1].w[1]
228 	// the result is a midpoint; round to nearest
229 	if (Cstar & 0x01) {	// Cstar is odd; MP in [EVEN, ODD]
230 	  // if floor(C*) is odd C = floor(C*) - 1; the result >= 1
231 	  Cstar--;	// Cstar is now even
232 	}	// else MP in [ODD, EVEN]
233       }
234       if (x_sign)
235 	res = -Cstar;
236       else
237 	res = Cstar;
238     } else if (exp == 0) {
239       // 1 <= q <= 16
240       // res = +/-C (exact)
241       if (x_sign)
242 	res = -C1;
243       else
244 	res = C1;
245     } else {	// if (exp > 0) => 1 <= exp <= 18, 1 <= q <= 16, 2 <= q + exp <= 20
246       // (the upper limit of 20 on q + exp is due to the fact that
247       // +/-C * 10^exp is guaranteed to fit in 64 bits)
248       // res = +/-C * 10^exp (exact)
249       if (x_sign)
250 	res = -C1 * ten2k64[exp];
251       else
252 	res = C1 * ten2k64[exp];
253     }
254   }
255   BID_RETURN (res);
256 }
257 
258 /*****************************************************************************
259  *  BID64_to_int64_xrnint
260  ****************************************************************************/
261 
262 #if DECIMAL_CALL_BY_REFERENCE
263 void
264 bid64_to_int64_xrnint (SINT64 * pres, UINT64 * px
265 		       _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
266 		       _EXC_INFO_PARAM) {
267   UINT64 x = *px;
268 #else
269 SINT64
270 bid64_to_int64_xrnint (UINT64 x
271 		       _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
272 		       _EXC_INFO_PARAM) {
273 #endif
274   SINT64 res;
275   UINT64 x_sign;
276   UINT64 x_exp;
277   int exp;			// unbiased exponent
278   // Note: C1 represents x_significand (UINT64)
279   UINT64 tmp64;
280   BID_UI64DOUBLE tmp1;
281   unsigned int x_nr_bits;
282   int q, ind, shift;
283   UINT64 C1;
284   UINT128 C;
285   UINT64 Cstar;			// C* represents up to 16 decimal digits ~ 54 bits
286   UINT128 fstar;
287   UINT128 P128;
288 
289   // check for NaN or Infinity
290   if ((x & MASK_NAN) == MASK_NAN || (x & MASK_INF) == MASK_INF) {
291     // set invalid flag
292     *pfpsf |= INVALID_EXCEPTION;
293     // return Integer Indefinite
294     res = 0x8000000000000000ull;
295     BID_RETURN (res);
296   }
297   // unpack x
298   x_sign = x & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
299   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
300   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
301     x_exp = (x & MASK_BINARY_EXPONENT2) >> 51;	// biased
302     C1 = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
303     if (C1 > 9999999999999999ull) {	// non-canonical
304       x_exp = 0;
305       C1 = 0;
306     }
307   } else {
308     x_exp = (x & MASK_BINARY_EXPONENT1) >> 53;	// biased
309     C1 = x & MASK_BINARY_SIG1;
310   }
311 
312   // check for zeros (possibly from non-canonical values)
313   if (C1 == 0x0ull) {
314     // x is 0
315     res = 0x00000000;
316     BID_RETURN (res);
317   }
318   // x is not special and is not zero
319 
320   // q = nr. of decimal digits in x (1 <= q <= 54)
321   //  determine first the nr. of bits in x
322   if (C1 >= 0x0020000000000000ull) {	// x >= 2^53
323     // split the 64-bit value in two 32-bit halves to avoid rounding errors
324     if (C1 >= 0x0000000100000000ull) {	// x >= 2^32
325       tmp1.d = (double) (C1 >> 32);	// exact conversion
326       x_nr_bits =
327 	33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
328     } else {	// x < 2^32
329       tmp1.d = (double) C1;	// exact conversion
330       x_nr_bits =
331 	1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
332     }
333   } else {	// if x < 2^53
334     tmp1.d = (double) C1;	// exact conversion
335     x_nr_bits =
336       1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
337   }
338   q = nr_digits[x_nr_bits - 1].digits;
339   if (q == 0) {
340     q = nr_digits[x_nr_bits - 1].digits1;
341     if (C1 >= nr_digits[x_nr_bits - 1].threshold_lo)
342       q++;
343   }
344   exp = x_exp - 398;	// unbiased exponent
345 
346   if ((q + exp) > 19) {	// x >= 10^19 ~= 2^63.11... (cannot fit in SINT64)
347     // set invalid flag
348     *pfpsf |= INVALID_EXCEPTION;
349     // return Integer Indefinite
350     res = 0x8000000000000000ull;
351     BID_RETURN (res);
352   } else if ((q + exp) == 19) {	// x = c(0)c(1)...c(18).c(19)...c(q-1)
353     // in this case 2^63.11... ~= 10^19 <= x < 10^20 ~= 2^66.43...
354     // so x rounded to an integer may or may not fit in a signed 64-bit int
355     // the cases that do not fit are identified here; the ones that fit
356     // fall through and will be handled with other cases further,
357     // under '1 <= q + exp <= 19'
358     if (x_sign) {	// if n < 0 and q + exp = 19
359       // if n < -2^63 - 1/2 then n is too large
360       // too large if c(0)c(1)...c(18).c(19)...c(q-1) > 2^63+1/2
361       // <=> 0.c(0)c(1)...c(q-1) * 10^20 > 5*(2^64+1), 1<=q<=16
362       // <=> 0.c(0)c(1)...c(q-1) * 10^20 > 0x50000000000000005, 1<=q<=16
363       // <=> C * 10^(20-q) > 0x50000000000000005, 1<=q<=16
364       // 1 <= q <= 16 => 4 <= 20-q <= 19 => 10^(20-q) is 64-bit, and so is C1
365       __mul_64x64_to_128MACH (C, C1, ten2k64[20 - q]);
366       // Note: C1 * 10^(11-q) has 19 or 20 digits; 0x50000000000000005, has 20
367       if (C.w[1] > 0x05ull || (C.w[1] == 0x05ull && C.w[0] > 0x05ull)) {
368 	// set invalid flag
369 	*pfpsf |= INVALID_EXCEPTION;
370 	// return Integer Indefinite
371 	res = 0x8000000000000000ull;
372 	BID_RETURN (res);
373       }
374       // else cases that can be rounded to a 64-bit int fall through
375       // to '1 <= q + exp <= 19'
376     } else {	// if n > 0 and q + exp = 19
377       // if n >= 2^63 - 1/2 then n is too large
378       // too large if c(0)c(1)...c(18).c(19)...c(q-1) >= 2^63-1/2
379       // <=> if 0.c(0)c(1)...c(q-1) * 10^20 >= 5*(2^64-1), 1<=q<=16
380       // <=> if 0.c(0)c(1)...c(q-1) * 10^20 >= 0x4fffffffffffffffb, 1<=q<=16
381       // <=> if C * 10^(20-q) >= 0x4fffffffffffffffb, 1<=q<=16
382       C.w[1] = 0x0000000000000004ull;
383       C.w[0] = 0xfffffffffffffffbull;
384       // 1 <= q <= 16 => 4 <= 20-q <= 19 => 10^(20-q) is 64-bit, and so is C1
385       __mul_64x64_to_128MACH (C, C1, ten2k64[20 - q]);
386       if (C.w[1] > 0x04ull ||
387 	  (C.w[1] == 0x04ull && C.w[0] >= 0xfffffffffffffffbull)) {
388 	// set invalid flag
389 	*pfpsf |= INVALID_EXCEPTION;
390 	// return Integer Indefinite
391 	res = 0x8000000000000000ull;
392 	BID_RETURN (res);
393       }
394       // else cases that can be rounded to a 64-bit int fall through
395       // to '1 <= q + exp <= 19'
396     }	// end else if n > 0 and q + exp = 19
397   }	// end else if ((q + exp) == 19)
398 
399   // n is not too large to be converted to int64: -2^63-1/2 <= n < 2^63-1/2
400   // Note: some of the cases tested for above fall through to this point
401   if ((q + exp) < 0) {	// n = +/-0.0...c(0)c(1)...c(q-1)
402     // set inexact flag
403     *pfpsf |= INEXACT_EXCEPTION;
404     // return 0
405     res = 0x0000000000000000ull;
406     BID_RETURN (res);
407   } else if ((q + exp) == 0) {	// n = +/-0.c(0)c(1)...c(q-1)
408     // if 0.c(0)c(1)...c(q-1) <= 0.5 <=> c(0)c(1)...c(q-1) <= 5 * 10^(q-1)
409     //   res = 0
410     // else
411     //   res = +/-1
412     ind = q - 1;	// 0 <= ind <= 15
413     if (C1 <= midpoint64[ind]) {
414       res = 0x0000000000000000ull;	// return 0
415     } else if (x_sign) {	// n < 0
416       res = 0xffffffffffffffffull;	// return -1
417     } else {	// n > 0
418       res = 0x0000000000000001ull;	// return +1
419     }
420     // set inexact flag
421     *pfpsf |= INEXACT_EXCEPTION;
422   } else {	// if (1 <= q + exp <= 19, 1 <= q <= 16, -15 <= exp <= 18)
423     // -2^63-1/2 <= x <= -1 or 1 <= x < 2^63-1/2 so x can be rounded
424     // to nearest to a 64-bit signed integer
425     if (exp < 0) {	// 2 <= q <= 16, -15 <= exp <= -1, 1 <= q + exp <= 19
426       ind = -exp;	// 1 <= ind <= 15; ind is a synonym for 'x'
427       // chop off ind digits from the lower part of C1
428       // C1 = C1 + 1/2 * 10^ind where the result C1 fits in 64 bits
429       C1 = C1 + midpoint64[ind - 1];
430       // calculate C* and f*
431       // C* is actually floor(C*) in this case
432       // C* and f* need shifting and masking, as shown by
433       // shiftright128[] and maskhigh128[]
434       // 1 <= x <= 15
435       // kx = 10^(-x) = ten2mk64[ind - 1]
436       // C* = (C1 + 1/2 * 10^x) * 10^(-x)
437       // the approximation of 10^(-x) was rounded up to 54 bits
438       __mul_64x64_to_128MACH (P128, C1, ten2mk64[ind - 1]);
439       Cstar = P128.w[1];
440       fstar.w[1] = P128.w[1] & maskhigh128[ind - 1];
441       fstar.w[0] = P128.w[0];
442       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind].w[0], e.g.
443       // if x=1, T*=ten2mk128trunc[0].w[0]=0x1999999999999999
444       // if (0 < f* < 10^(-x)) then the result is a midpoint
445       //   if floor(C*) is even then C* = floor(C*) - logical right
446       //       shift; C* has p decimal digits, correct by Prop. 1)
447       //   else if floor(C*) is odd C* = floor(C*)-1 (logical right
448       //       shift; C* has p decimal digits, correct by Pr. 1)
449       // else
450       //   C* = floor(C*) (logical right shift; C has p decimal digits,
451       //       correct by Property 1)
452       // n = C* * 10^(e+x)
453 
454       // shift right C* by Ex-64 = shiftright128[ind]
455       shift = shiftright128[ind - 1];	// 0 <= shift <= 39
456       Cstar = Cstar >> shift;
457       // determine inexactness of the rounding of C*
458       // if (0 < f* - 1/2 < 10^(-x)) then
459       //   the result is exact
460       // else // if (f* - 1/2 > T*) then
461       //   the result is inexact
462       if (ind - 1 <= 2) {
463 	if (fstar.w[0] > 0x8000000000000000ull) {
464 	  // f* > 1/2 and the result may be exact
465 	  tmp64 = fstar.w[0] - 0x8000000000000000ull;	// f* - 1/2
466 	  if ((tmp64 > ten2mk128trunc[ind - 1].w[1])) {
467 	    // ten2mk128trunc[ind -1].w[1] is identical to
468 	    // ten2mk128[ind -1].w[1]
469 	    // set the inexact flag
470 	    *pfpsf |= INEXACT_EXCEPTION;
471 	  }	// else the result is exact
472 	} else {	// the result is inexact; f2* <= 1/2
473 	  // set the inexact flag
474 	  *pfpsf |= INEXACT_EXCEPTION;
475 	}
476       } else {	// if 3 <= ind - 1 <= 14
477 	if (fstar.w[1] > onehalf128[ind - 1] ||
478 	    (fstar.w[1] == onehalf128[ind - 1] && fstar.w[0])) {
479 	  // f2* > 1/2 and the result may be exact
480 	  // Calculate f2* - 1/2
481 	  tmp64 = fstar.w[1] - onehalf128[ind - 1];
482 	  if (tmp64 || fstar.w[0] > ten2mk128trunc[ind - 1].w[1]) {
483 	    // ten2mk128trunc[ind -1].w[1] is identical to
484 	    // ten2mk128[ind -1].w[1]
485 	    // set the inexact flag
486 	    *pfpsf |= INEXACT_EXCEPTION;
487 	  }	// else the result is exact
488 	} else {	// the result is inexact; f2* <= 1/2
489 	  // set the inexact flag
490 	  *pfpsf |= INEXACT_EXCEPTION;
491 	}
492       }
493 
494       // if the result was a midpoint it was rounded away from zero, so
495       // it will need a correction
496       // check for midpoints
497       if ((fstar.w[1] == 0) && fstar.w[0] &&
498 	  (fstar.w[0] <= ten2mk128trunc[ind - 1].w[1])) {
499 	// ten2mk128trunc[ind -1].w[1] is identical to
500 	// ten2mk128[ind -1].w[1]
501 	// the result is a midpoint; round to nearest
502 	if (Cstar & 0x01) {	// Cstar is odd; MP in [EVEN, ODD]
503 	  // if floor(C*) is odd C = floor(C*) - 1; the result >= 1
504 	  Cstar--;	// Cstar is now even
505 	}	// else MP in [ODD, EVEN]
506       }
507       if (x_sign)
508 	res = -Cstar;
509       else
510 	res = Cstar;
511     } else if (exp == 0) {
512       // 1 <= q <= 16
513       // res = +/-C (exact)
514       if (x_sign)
515 	res = -C1;
516       else
517 	res = C1;
518     } else {	// if (exp > 0) => 1 <= exp <= 18, 1 <= q <= 16, 2 <= q + exp <= 20
519       // (the upper limit of 20 on q + exp is due to the fact that
520       // +/-C * 10^exp is guaranteed to fit in 64 bits)
521       // res = +/-C * 10^exp (exact)
522       if (x_sign)
523 	res = -C1 * ten2k64[exp];
524       else
525 	res = C1 * ten2k64[exp];
526     }
527   }
528   BID_RETURN (res);
529 }
530 
531 /*****************************************************************************
532  *  BID64_to_int64_floor
533  ****************************************************************************/
534 
535 #if DECIMAL_CALL_BY_REFERENCE
536 void
537 bid64_to_int64_floor (SINT64 * pres, UINT64 * px
538 		      _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
539 		      _EXC_INFO_PARAM) {
540   UINT64 x = *px;
541 #else
542 SINT64
543 bid64_to_int64_floor (UINT64 x
544 		      _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
545 		      _EXC_INFO_PARAM) {
546 #endif
547   SINT64 res;
548   UINT64 x_sign;
549   UINT64 x_exp;
550   int exp;			// unbiased exponent
551   // Note: C1 represents x_significand (UINT64)
552   BID_UI64DOUBLE tmp1;
553   unsigned int x_nr_bits;
554   int q, ind, shift;
555   UINT64 C1;
556   UINT128 C;
557   UINT64 Cstar;			// C* represents up to 16 decimal digits ~ 54 bits
558   UINT128 fstar;
559   UINT128 P128;
560 
561   // check for NaN or Infinity
562   if ((x & MASK_NAN) == MASK_NAN || (x & MASK_INF) == MASK_INF) {
563     // set invalid flag
564     *pfpsf |= INVALID_EXCEPTION;
565     // return Integer Indefinite
566     res = 0x8000000000000000ull;
567     BID_RETURN (res);
568   }
569   // unpack x
570   x_sign = x & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
571   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
572   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
573     x_exp = (x & MASK_BINARY_EXPONENT2) >> 51;	// biased
574     C1 = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
575     if (C1 > 9999999999999999ull) {	// non-canonical
576       x_exp = 0;
577       C1 = 0;
578     }
579   } else {
580     x_exp = (x & MASK_BINARY_EXPONENT1) >> 53;	// biased
581     C1 = x & MASK_BINARY_SIG1;
582   }
583 
584   // check for zeros (possibly from non-canonical values)
585   if (C1 == 0x0ull) {
586     // x is 0
587     res = 0x0000000000000000ull;
588     BID_RETURN (res);
589   }
590   // x is not special and is not zero
591 
592   // q = nr. of decimal digits in x (1 <= q <= 54)
593   //  determine first the nr. of bits in x
594   if (C1 >= 0x0020000000000000ull) {	// x >= 2^53
595     // split the 64-bit value in two 32-bit halves to avoid rounding errors
596     if (C1 >= 0x0000000100000000ull) {	// x >= 2^32
597       tmp1.d = (double) (C1 >> 32);	// exact conversion
598       x_nr_bits =
599 	33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
600     } else {	// x < 2^32
601       tmp1.d = (double) C1;	// exact conversion
602       x_nr_bits =
603 	1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
604     }
605   } else {	// if x < 2^53
606     tmp1.d = (double) C1;	// exact conversion
607     x_nr_bits =
608       1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
609   }
610   q = nr_digits[x_nr_bits - 1].digits;
611   if (q == 0) {
612     q = nr_digits[x_nr_bits - 1].digits1;
613     if (C1 >= nr_digits[x_nr_bits - 1].threshold_lo)
614       q++;
615   }
616   exp = x_exp - 398;	// unbiased exponent
617 
618   if ((q + exp) > 19) {	// x >= 10^19 ~= 2^63.11... (cannot fit in SINT64)
619     // set invalid flag
620     *pfpsf |= INVALID_EXCEPTION;
621     // return Integer Indefinite
622     res = 0x8000000000000000ull;
623     BID_RETURN (res);
624   } else if ((q + exp) == 19) {	// x = c(0)c(1)...c(18).c(19)...c(q-1)
625     // in this case 2^63.11... ~= 10^19 <= x < 10^20 ~= 2^66.43...
626     // so x rounded to an integer may or may not fit in a signed 64-bit int
627     // the cases that do not fit are identified here; the ones that fit
628     // fall through and will be handled with other cases further,
629     // under '1 <= q + exp <= 19'
630     if (x_sign) {	// if n < 0 and q + exp = 19
631       // if n < -2^63 then n is too large
632       // too large if c(0)c(1)...c(18).c(19)...c(q-1) > 2^63
633       // <=> 0.c(0)c(1)...c(q-1) * 10^20 >= 5*2^64, 1<=q<=16
634       // <=> 0.c(0)c(1)...c(q-1) * 10^20 > 0x50000000000000000, 1<=q<=16
635       // <=> C * 10^(20-q) > 0x50000000000000000, 1<=q<=16
636       // 1 <= q <= 16 => 4 <= 20-q <= 19 => 10^(20-q) is 64-bit, and so is C1
637       __mul_64x64_to_128MACH (C, C1, ten2k64[20 - q]);
638       // Note: C1 * 10^(11-q) has 19 or 20 digits; 0x5000000000000000a, has 20
639       if (C.w[1] > 0x05ull || (C.w[1] == 0x05ull && C.w[0] != 0)) {
640 	// set invalid flag
641 	*pfpsf |= INVALID_EXCEPTION;
642 	// return Integer Indefinite
643 	res = 0x8000000000000000ull;
644 	BID_RETURN (res);
645       }
646       // else cases that can be rounded to a 64-bit int fall through
647       // to '1 <= q + exp <= 19'
648     } else {	// if n > 0 and q + exp = 19
649       // if n >= 2^63 then n is too large
650       // too large if c(0)c(1)...c(18).c(19)...c(q-1) >= 2^63
651       // <=> if 0.c(0)c(1)...c(q-1) * 10^20 >= 5*2^64, 1<=q<=16
652       // <=> if 0.c(0)c(1)...c(q-1) * 10^20 >= 0x50000000000000000, 1<=q<=16
653       // <=> if C * 10^(20-q) >= 0x50000000000000000, 1<=q<=16
654       C.w[1] = 0x0000000000000005ull;
655       C.w[0] = 0x0000000000000000ull;
656       // 1 <= q <= 16 => 4 <= 20-q <= 19 => 10^(20-q) is 64-bit, and so is C1
657       __mul_64x64_to_128MACH (C, C1, ten2k64[20 - q]);
658       if (C.w[1] >= 0x05ull) {
659 	// actually C.w[1] == 0x05ull && C.w[0] >= 0x0000000000000000ull) {
660 	// set invalid flag
661 	*pfpsf |= INVALID_EXCEPTION;
662 	// return Integer Indefinite
663 	res = 0x8000000000000000ull;
664 	BID_RETURN (res);
665       }
666       // else cases that can be rounded to a 64-bit int fall through
667       // to '1 <= q + exp <= 19'
668     }	// end else if n > 0 and q + exp = 19
669   }	// end else if ((q + exp) == 19)
670 
671   // n is not too large to be converted to int64: -2^63 <= n < 2^63
672   // Note: some of the cases tested for above fall through to this point
673   if ((q + exp) <= 0) {	// n = +/-0.0...c(0)c(1)...c(q-1)
674     // return -1 or 0
675     if (x_sign)
676       res = 0xffffffffffffffffull;
677     else
678       res = 0x0000000000000000ull;
679     BID_RETURN (res);
680   } else {	// if (1 <= q + exp <= 19, 1 <= q <= 16, -15 <= exp <= 18)
681     // -2^63 <= x <= -1 or 1 <= x < 2^63 so x can be rounded
682     // to nearest to a 64-bit signed integer
683     if (exp < 0) {	// 2 <= q <= 16, -15 <= exp <= -1, 1 <= q + exp <= 19
684       ind = -exp;	// 1 <= ind <= 15; ind is a synonym for 'x'
685       // chop off ind digits from the lower part of C1
686       // C1 fits in 64 bits
687       // calculate C* and f*
688       // C* is actually floor(C*) in this case
689       // C* and f* need shifting and masking, as shown by
690       // shiftright128[] and maskhigh128[]
691       // 1 <= x <= 15
692       // kx = 10^(-x) = ten2mk64[ind - 1]
693       // C* = C1 * 10^(-x)
694       // the approximation of 10^(-x) was rounded up to 54 bits
695       __mul_64x64_to_128MACH (P128, C1, ten2mk64[ind - 1]);
696       Cstar = P128.w[1];
697       fstar.w[1] = P128.w[1] & maskhigh128[ind - 1];
698       fstar.w[0] = P128.w[0];
699       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind].w[0], e.g.
700       // if x=1, T*=ten2mk128trunc[0].w[0]=0x1999999999999999
701       // C* = floor(C*) (logical right shift; C has p decimal digits,
702       //     correct by Property 1)
703       // n = C* * 10^(e+x)
704 
705       // shift right C* by Ex-64 = shiftright128[ind]
706       shift = shiftright128[ind - 1];	// 0 <= shift <= 39
707       Cstar = Cstar >> shift;
708       // determine inexactness of the rounding of C*
709       // if (0 < f* < 10^(-x)) then
710       //   the result is exact
711       // else // if (f* > T*) then
712       //   the result is inexact
713       if (ind - 1 <= 2) {	// fstar.w[1] is 0
714 	if (fstar.w[0] > ten2mk128trunc[ind - 1].w[1]) {
715 	  // ten2mk128trunc[ind -1].w[1] is identical to
716 	  // ten2mk128[ind -1].w[1]
717 	  if (x_sign) {	// negative and inexact
718 	    Cstar++;
719 	  }
720 	}	// else the result is exact
721       } else {	// if 3 <= ind - 1 <= 14
722 	if (fstar.w[1] || fstar.w[0] > ten2mk128trunc[ind - 1].w[1]) {
723 	  // ten2mk128trunc[ind -1].w[1] is identical to
724 	  // ten2mk128[ind -1].w[1]
725 	  if (x_sign) {	// negative and inexact
726 	    Cstar++;
727 	  }
728 	}	// else the result is exact
729       }
730 
731       if (x_sign)
732 	res = -Cstar;
733       else
734 	res = Cstar;
735     } else if (exp == 0) {
736       // 1 <= q <= 16
737       // res = +/-C (exact)
738       if (x_sign)
739 	res = -C1;
740       else
741 	res = C1;
742     } else {	// if (exp > 0) => 1 <= exp <= 18, 1 <= q <= 16, 2 <= q + exp <= 20
743       // (the upper limit of 20 on q + exp is due to the fact that
744       // +/-C * 10^exp is guaranteed to fit in 64 bits)
745       // res = +/-C * 10^exp (exact)
746       if (x_sign)
747 	res = -C1 * ten2k64[exp];
748       else
749 	res = C1 * ten2k64[exp];
750     }
751   }
752   BID_RETURN (res);
753 }
754 
755 /*****************************************************************************
756  *  BID64_to_int64_xfloor
757  ****************************************************************************/
758 
759 #if DECIMAL_CALL_BY_REFERENCE
760 void
761 bid64_to_int64_xfloor (SINT64 * pres, UINT64 * px
762 		       _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
763 		       _EXC_INFO_PARAM) {
764   UINT64 x = *px;
765 #else
766 SINT64
767 bid64_to_int64_xfloor (UINT64 x
768 		       _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
769 		       _EXC_INFO_PARAM) {
770 #endif
771   SINT64 res;
772   UINT64 x_sign;
773   UINT64 x_exp;
774   int exp;			// unbiased exponent
775   // Note: C1 represents x_significand (UINT64)
776   BID_UI64DOUBLE tmp1;
777   unsigned int x_nr_bits;
778   int q, ind, shift;
779   UINT64 C1;
780   UINT128 C;
781   UINT64 Cstar;			// C* represents up to 16 decimal digits ~ 54 bits
782   UINT128 fstar;
783   UINT128 P128;
784 
785   // check for NaN or Infinity
786   if ((x & MASK_NAN) == MASK_NAN || (x & MASK_INF) == MASK_INF) {
787     // set invalid flag
788     *pfpsf |= INVALID_EXCEPTION;
789     // return Integer Indefinite
790     res = 0x8000000000000000ull;
791     BID_RETURN (res);
792   }
793   // unpack x
794   x_sign = x & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
795   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
796   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
797     x_exp = (x & MASK_BINARY_EXPONENT2) >> 51;	// biased
798     C1 = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
799     if (C1 > 9999999999999999ull) {	// non-canonical
800       x_exp = 0;
801       C1 = 0;
802     }
803   } else {
804     x_exp = (x & MASK_BINARY_EXPONENT1) >> 53;	// biased
805     C1 = x & MASK_BINARY_SIG1;
806   }
807 
808   // check for zeros (possibly from non-canonical values)
809   if (C1 == 0x0ull) {
810     // x is 0
811     res = 0x0000000000000000ull;
812     BID_RETURN (res);
813   }
814   // x is not special and is not zero
815 
816   // q = nr. of decimal digits in x (1 <= q <= 54)
817   //  determine first the nr. of bits in x
818   if (C1 >= 0x0020000000000000ull) {	// x >= 2^53
819     // split the 64-bit value in two 32-bit halves to avoid rounding errors
820     if (C1 >= 0x0000000100000000ull) {	// x >= 2^32
821       tmp1.d = (double) (C1 >> 32);	// exact conversion
822       x_nr_bits =
823 	33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
824     } else {	// x < 2^32
825       tmp1.d = (double) C1;	// exact conversion
826       x_nr_bits =
827 	1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
828     }
829   } else {	// if x < 2^53
830     tmp1.d = (double) C1;	// exact conversion
831     x_nr_bits =
832       1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
833   }
834   q = nr_digits[x_nr_bits - 1].digits;
835   if (q == 0) {
836     q = nr_digits[x_nr_bits - 1].digits1;
837     if (C1 >= nr_digits[x_nr_bits - 1].threshold_lo)
838       q++;
839   }
840   exp = x_exp - 398;	// unbiased exponent
841 
842   if ((q + exp) > 19) {	// x >= 10^19 ~= 2^63.11... (cannot fit in SINT64)
843     // set invalid flag
844     *pfpsf |= INVALID_EXCEPTION;
845     // return Integer Indefinite
846     res = 0x8000000000000000ull;
847     BID_RETURN (res);
848   } else if ((q + exp) == 19) {	// x = c(0)c(1)...c(18).c(19)...c(q-1)
849     // in this case 2^63.11... ~= 10^19 <= x < 10^20 ~= 2^66.43...
850     // so x rounded to an integer may or may not fit in a signed 64-bit int
851     // the cases that do not fit are identified here; the ones that fit
852     // fall through and will be handled with other cases further,
853     // under '1 <= q + exp <= 19'
854     if (x_sign) {	// if n < 0 and q + exp = 19
855       // if n < -2^63 then n is too large
856       // too large if c(0)c(1)...c(18).c(19)...c(q-1) > 2^63
857       // <=> 0.c(0)c(1)...c(q-1) * 10^20 >= 5*2^64, 1<=q<=16
858       // <=> 0.c(0)c(1)...c(q-1) * 10^20 > 0x50000000000000000, 1<=q<=16
859       // <=> C * 10^(20-q) > 0x50000000000000000, 1<=q<=16
860       // 1 <= q <= 16 => 4 <= 20-q <= 19 => 10^(20-q) is 64-bit, and so is C1
861       __mul_64x64_to_128MACH (C, C1, ten2k64[20 - q]);
862       // Note: C1 * 10^(11-q) has 19 or 20 digits; 0x5000000000000000a, has 20
863       if (C.w[1] > 0x05ull || (C.w[1] == 0x05ull && C.w[0] != 0)) {
864 	// set invalid flag
865 	*pfpsf |= INVALID_EXCEPTION;
866 	// return Integer Indefinite
867 	res = 0x8000000000000000ull;
868 	BID_RETURN (res);
869       }
870       // else cases that can be rounded to a 64-bit int fall through
871       // to '1 <= q + exp <= 19'
872     } else {	// if n > 0 and q + exp = 19
873       // if n >= 2^63 then n is too large
874       // too large if c(0)c(1)...c(18).c(19)...c(q-1) >= 2^63
875       // <=> if 0.c(0)c(1)...c(q-1) * 10^20 >= 5*2^64, 1<=q<=16
876       // <=> if 0.c(0)c(1)...c(q-1) * 10^20 >= 0x50000000000000000, 1<=q<=16
877       // <=> if C * 10^(20-q) >= 0x50000000000000000, 1<=q<=16
878       C.w[1] = 0x0000000000000005ull;
879       C.w[0] = 0x0000000000000000ull;
880       // 1 <= q <= 16 => 4 <= 20-q <= 19 => 10^(20-q) is 64-bit, and so is C1
881       __mul_64x64_to_128MACH (C, C1, ten2k64[20 - q]);
882       if (C.w[1] >= 0x05ull) {
883 	// actually C.w[1] == 0x05ull && C.w[0] >= 0x0000000000000000ull) {
884 	// set invalid flag
885 	*pfpsf |= INVALID_EXCEPTION;
886 	// return Integer Indefinite
887 	res = 0x8000000000000000ull;
888 	BID_RETURN (res);
889       }
890       // else cases that can be rounded to a 64-bit int fall through
891       // to '1 <= q + exp <= 19'
892     }	// end else if n > 0 and q + exp = 19
893   }	// end else if ((q + exp) == 19)
894 
895   // n is not too large to be converted to int64: -2^63 <= n < 2^63
896   // Note: some of the cases tested for above fall through to this point
897   if ((q + exp) <= 0) {	// n = +/-0.0...c(0)c(1)...c(q-1)
898     // set inexact flag
899     *pfpsf |= INEXACT_EXCEPTION;
900     // return -1 or 0
901     if (x_sign)
902       res = 0xffffffffffffffffull;
903     else
904       res = 0x0000000000000000ull;
905     BID_RETURN (res);
906   } else {	// if (1 <= q + exp <= 19, 1 <= q <= 16, -15 <= exp <= 18)
907     // -2^63 <= x <= -1 or 1 <= x < 2^63 so x can be rounded
908     // to nearest to a 64-bit signed integer
909     if (exp < 0) {	// 2 <= q <= 16, -15 <= exp <= -1, 1 <= q + exp <= 19
910       ind = -exp;	// 1 <= ind <= 15; ind is a synonym for 'x'
911       // chop off ind digits from the lower part of C1
912       // C1 fits in 64 bits
913       // calculate C* and f*
914       // C* is actually floor(C*) in this case
915       // C* and f* need shifting and masking, as shown by
916       // shiftright128[] and maskhigh128[]
917       // 1 <= x <= 15
918       // kx = 10^(-x) = ten2mk64[ind - 1]
919       // C* = C1 * 10^(-x)
920       // the approximation of 10^(-x) was rounded up to 54 bits
921       __mul_64x64_to_128MACH (P128, C1, ten2mk64[ind - 1]);
922       Cstar = P128.w[1];
923       fstar.w[1] = P128.w[1] & maskhigh128[ind - 1];
924       fstar.w[0] = P128.w[0];
925       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind].w[0], e.g.
926       // if x=1, T*=ten2mk128trunc[0].w[0]=0x1999999999999999
927       // C* = floor(C*) (logical right shift; C has p decimal digits,
928       //     correct by Property 1)
929       // n = C* * 10^(e+x)
930 
931       // shift right C* by Ex-64 = shiftright128[ind]
932       shift = shiftright128[ind - 1];	// 0 <= shift <= 39
933       Cstar = Cstar >> shift;
934       // determine inexactness of the rounding of C*
935       // if (0 < f* < 10^(-x)) then
936       //   the result is exact
937       // else // if (f* > T*) then
938       //   the result is inexact
939       if (ind - 1 <= 2) {	// fstar.w[1] is 0
940 	if (fstar.w[0] > ten2mk128trunc[ind - 1].w[1]) {
941 	  // ten2mk128trunc[ind -1].w[1] is identical to
942 	  // ten2mk128[ind -1].w[1]
943 	  if (x_sign) {	// negative and inexact
944 	    Cstar++;
945 	  }
946 	  // set the inexact flag
947 	  *pfpsf |= INEXACT_EXCEPTION;
948 	}	// else the result is exact
949       } else {	// if 3 <= ind - 1 <= 14
950 	if (fstar.w[1] || fstar.w[0] > ten2mk128trunc[ind - 1].w[1]) {
951 	  // ten2mk128trunc[ind -1].w[1] is identical to
952 	  // ten2mk128[ind -1].w[1]
953 	  if (x_sign) {	// negative and inexact
954 	    Cstar++;
955 	  }
956 	  // set the inexact flag
957 	  *pfpsf |= INEXACT_EXCEPTION;
958 	}	// else the result is exact
959       }
960 
961       if (x_sign)
962 	res = -Cstar;
963       else
964 	res = Cstar;
965     } else if (exp == 0) {
966       // 1 <= q <= 16
967       // res = +/-C (exact)
968       if (x_sign)
969 	res = -C1;
970       else
971 	res = C1;
972     } else {	// if (exp > 0) => 1 <= exp <= 18, 1 <= q <= 16, 2 <= q + exp <= 20
973       // (the upper limit of 20 on q + exp is due to the fact that
974       // +/-C * 10^exp is guaranteed to fit in 64 bits)
975       // res = +/-C * 10^exp (exact)
976       if (x_sign)
977 	res = -C1 * ten2k64[exp];
978       else
979 	res = C1 * ten2k64[exp];
980     }
981   }
982   BID_RETURN (res);
983 }
984 
985 /*****************************************************************************
986  *  BID64_to_int64_ceil
987  ****************************************************************************/
988 
989 #if DECIMAL_CALL_BY_REFERENCE
990 void
991 bid64_to_int64_ceil (SINT64 * pres, UINT64 * px
992 		     _EXC_FLAGS_PARAM _EXC_MASKS_PARAM _EXC_INFO_PARAM)
993 {
994   UINT64 x = *px;
995 #else
996 SINT64
997 bid64_to_int64_ceil (UINT64 x
998 		     _EXC_FLAGS_PARAM _EXC_MASKS_PARAM _EXC_INFO_PARAM)
999 {
1000 #endif
1001   SINT64 res;
1002   UINT64 x_sign;
1003   UINT64 x_exp;
1004   int exp;			// unbiased exponent
1005   // Note: C1 represents x_significand (UINT64)
1006   BID_UI64DOUBLE tmp1;
1007   unsigned int x_nr_bits;
1008   int q, ind, shift;
1009   UINT64 C1;
1010   UINT128 C;
1011   UINT64 Cstar;			// C* represents up to 16 decimal digits ~ 54 bits
1012   UINT128 fstar;
1013   UINT128 P128;
1014 
1015   // check for NaN or Infinity
1016   if ((x & MASK_NAN) == MASK_NAN || (x & MASK_INF) == MASK_INF) {
1017     // set invalid flag
1018     *pfpsf |= INVALID_EXCEPTION;
1019     // return Integer Indefinite
1020     res = 0x8000000000000000ull;
1021     BID_RETURN (res);
1022   }
1023   // unpack x
1024   x_sign = x & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
1025   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
1026   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
1027     x_exp = (x & MASK_BINARY_EXPONENT2) >> 51;	// biased
1028     C1 = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
1029     if (C1 > 9999999999999999ull) {	// non-canonical
1030       x_exp = 0;
1031       C1 = 0;
1032     }
1033   } else {
1034     x_exp = (x & MASK_BINARY_EXPONENT1) >> 53;	// biased
1035     C1 = x & MASK_BINARY_SIG1;
1036   }
1037 
1038   // check for zeros (possibly from non-canonical values)
1039   if (C1 == 0x0ull) {
1040     // x is 0
1041     res = 0x00000000;
1042     BID_RETURN (res);
1043   }
1044   // x is not special and is not zero
1045 
1046   // q = nr. of decimal digits in x (1 <= q <= 54)
1047   //  determine first the nr. of bits in x
1048   if (C1 >= 0x0020000000000000ull) {	// x >= 2^53
1049     // split the 64-bit value in two 32-bit halves to avoid rounding errors
1050     if (C1 >= 0x0000000100000000ull) {	// x >= 2^32
1051       tmp1.d = (double) (C1 >> 32);	// exact conversion
1052       x_nr_bits =
1053 	33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
1054     } else {	// x < 2^32
1055       tmp1.d = (double) C1;	// exact conversion
1056       x_nr_bits =
1057 	1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
1058     }
1059   } else {	// if x < 2^53
1060     tmp1.d = (double) C1;	// exact conversion
1061     x_nr_bits =
1062       1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
1063   }
1064   q = nr_digits[x_nr_bits - 1].digits;
1065   if (q == 0) {
1066     q = nr_digits[x_nr_bits - 1].digits1;
1067     if (C1 >= nr_digits[x_nr_bits - 1].threshold_lo)
1068       q++;
1069   }
1070   exp = x_exp - 398;	// unbiased exponent
1071 
1072   if ((q + exp) > 19) {	// x >= 10^19 ~= 2^63.11... (cannot fit in SINT64)
1073     // set invalid flag
1074     *pfpsf |= INVALID_EXCEPTION;
1075     // return Integer Indefinite
1076     res = 0x8000000000000000ull;
1077     BID_RETURN (res);
1078   } else if ((q + exp) == 19) {	// x = c(0)c(1)...c(18).c(19)...c(q-1)
1079     // in this case 2^63.11... ~= 10^19 <= x < 10^20 ~= 2^66.43...
1080     // so x rounded to an integer may or may not fit in a signed 64-bit int
1081     // the cases that do not fit are identified here; the ones that fit
1082     // fall through and will be handled with other cases further,
1083     // under '1 <= q + exp <= 19'
1084     if (x_sign) {	// if n < 0 and q + exp = 19
1085       // if n <= -2^63 - 1 then n is too large
1086       // too large if c(0)c(1)...c(18).c(19)...c(q-1) >= 2^63+1
1087       // <=> 0.c(0)c(1)...c(q-1) * 10^20 >= 5*(2^64+2), 1<=q<=16
1088       // <=> 0.c(0)c(1)...c(q-1) * 10^20 >= 0x5000000000000000a, 1<=q<=16
1089       // <=> C * 10^(20-q) >= 0x5000000000000000a, 1<=q<=16
1090       // 1 <= q <= 16 => 4 <= 20-q <= 19 => 10^(20-q) is 64-bit, and so is C1
1091       __mul_64x64_to_128MACH (C, C1, ten2k64[20 - q]);
1092       // Note: C1 * 10^(11-q) has 19 or 20 digits; 0x5000000000000000a, has 20
1093       if (C.w[1] > 0x05ull || (C.w[1] == 0x05ull && C.w[0] >= 0x0aull)) {
1094 	// set invalid flag
1095 	*pfpsf |= INVALID_EXCEPTION;
1096 	// return Integer Indefinite
1097 	res = 0x8000000000000000ull;
1098 	BID_RETURN (res);
1099       }
1100       // else cases that can be rounded to a 64-bit int fall through
1101       // to '1 <= q + exp <= 19'
1102     } else {	// if n > 0 and q + exp = 19
1103       // if n > 2^63 - 1 then n is too large
1104       // too large if c(0)c(1)...c(18).c(19)...c(q-1) > 2^63 - 1
1105       // <=> if 0.c(0)c(1)...c(q-1) * 10^20 > 5*(2^64-2), 1<=q<=16
1106       // <=> if 0.c(0)c(1)...c(q-1) * 10^20 > 0x4fffffffffffffff6, 1<=q<=16
1107       // <=> if C * 10^(20-q) > 0x4fffffffffffffff6, 1<=q<=16
1108       C.w[1] = 0x0000000000000004ull;
1109       C.w[0] = 0xfffffffffffffff6ull;
1110       // 1 <= q <= 16 => 4 <= 20-q <= 19 => 10^(20-q) is 64-bit, and so is C1
1111       __mul_64x64_to_128MACH (C, C1, ten2k64[20 - q]);
1112       if (C.w[1] > 0x04ull ||
1113 	  (C.w[1] == 0x04ull && C.w[0] > 0xfffffffffffffff6ull)) {
1114 	// set invalid flag
1115 	*pfpsf |= INVALID_EXCEPTION;
1116 	// return Integer Indefinite
1117 	res = 0x8000000000000000ull;
1118 	BID_RETURN (res);
1119       }
1120       // else cases that can be rounded to a 64-bit int fall through
1121       // to '1 <= q + exp <= 19'
1122     }	// end else if n > 0 and q + exp = 19
1123   }	// end else if ((q + exp) == 19)
1124 
1125   // n is not too large to be converted to int64: -2^63-1 < n < 2^63
1126   // Note: some of the cases tested for above fall through to this point
1127   if ((q + exp) <= 0) {	// n = +/-0.0...c(0)c(1)...c(q-1)
1128     // return 0 or 1
1129     if (x_sign)
1130       res = 0x00000000;
1131     else
1132       res = 0x00000001;
1133     BID_RETURN (res);
1134   } else {	// if (1 <= q + exp <= 19, 1 <= q <= 16, -15 <= exp <= 18)
1135     // -2^63-1 < x <= -1 or 1 <= x <= 2^63 - 1 so x can be rounded
1136     // to nearest to a 64-bit signed integer
1137     if (exp < 0) {	// 2 <= q <= 16, -15 <= exp <= -1, 1 <= q + exp <= 19
1138       ind = -exp;	// 1 <= ind <= 15; ind is a synonym for 'x'
1139       // chop off ind digits from the lower part of C1
1140       // C1 fits in 64 bits
1141       // calculate C* and f*
1142       // C* is actually floor(C*) in this case
1143       // C* and f* need shifting and masking, as shown by
1144       // shiftright128[] and maskhigh128[]
1145       // 1 <= x <= 15
1146       // kx = 10^(-x) = ten2mk64[ind - 1]
1147       // C* = C1 * 10^(-x)
1148       // the approximation of 10^(-x) was rounded up to 54 bits
1149       __mul_64x64_to_128MACH (P128, C1, ten2mk64[ind - 1]);
1150       Cstar = P128.w[1];
1151       fstar.w[1] = P128.w[1] & maskhigh128[ind - 1];
1152       fstar.w[0] = P128.w[0];
1153       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind].w[0], e.g.
1154       // if x=1, T*=ten2mk128trunc[0].w[0]=0x1999999999999999
1155       // C* = floor(C*) (logical right shift; C has p decimal digits,
1156       //     correct by Property 1)
1157       // n = C* * 10^(e+x)
1158 
1159       // shift right C* by Ex-64 = shiftright128[ind]
1160       shift = shiftright128[ind - 1];	// 0 <= shift <= 39
1161       Cstar = Cstar >> shift;
1162       // determine inexactness of the rounding of C*
1163       // if (0 < f* < 10^(-x)) then
1164       //   the result is exact
1165       // else // if (f* > T*) then
1166       //   the result is inexact
1167       if (ind - 1 <= 2) {	// fstar.w[1] is 0
1168 	if (fstar.w[0] > ten2mk128trunc[ind - 1].w[1]) {
1169 	  // ten2mk128trunc[ind -1].w[1] is identical to
1170 	  // ten2mk128[ind -1].w[1]
1171 	  if (!x_sign) {	// positive and inexact
1172 	    Cstar++;
1173 	  }
1174 	}	// else the result is exact
1175       } else {	// if 3 <= ind - 1 <= 14
1176 	if (fstar.w[1] || fstar.w[0] > ten2mk128trunc[ind - 1].w[1]) {
1177 	  // ten2mk128trunc[ind -1].w[1] is identical to
1178 	  // ten2mk128[ind -1].w[1]
1179 	  if (!x_sign) {	// positive and inexact
1180 	    Cstar++;
1181 	  }
1182 	}	// else the result is exact
1183       }
1184 
1185       if (x_sign)
1186 	res = -Cstar;
1187       else
1188 	res = Cstar;
1189     } else if (exp == 0) {
1190       // 1 <= q <= 16
1191       // res = +/-C (exact)
1192       if (x_sign)
1193 	res = -C1;
1194       else
1195 	res = C1;
1196     } else {	// if (exp > 0) => 1 <= exp <= 18, 1 <= q <= 16, 2 <= q + exp <= 20
1197       // (the upper limit of 20 on q + exp is due to the fact that
1198       // +/-C * 10^exp is guaranteed to fit in 64 bits)
1199       // res = +/-C * 10^exp (exact)
1200       if (x_sign)
1201 	res = -C1 * ten2k64[exp];
1202       else
1203 	res = C1 * ten2k64[exp];
1204     }
1205   }
1206   BID_RETURN (res);
1207 }
1208 
1209 /*****************************************************************************
1210  *  BID64_to_int64_xceil
1211  ****************************************************************************/
1212 
1213 #if DECIMAL_CALL_BY_REFERENCE
1214 void
1215 bid64_to_int64_xceil (SINT64 * pres, UINT64 * px
1216 		      _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
1217 		      _EXC_INFO_PARAM) {
1218   UINT64 x = *px;
1219 #else
1220 SINT64
1221 bid64_to_int64_xceil (UINT64 x
1222 		      _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
1223 		      _EXC_INFO_PARAM) {
1224 #endif
1225   SINT64 res;
1226   UINT64 x_sign;
1227   UINT64 x_exp;
1228   int exp;			// unbiased exponent
1229   // Note: C1 represents x_significand (UINT64)
1230   BID_UI64DOUBLE tmp1;
1231   unsigned int x_nr_bits;
1232   int q, ind, shift;
1233   UINT64 C1;
1234   UINT128 C;
1235   UINT64 Cstar;			// C* represents up to 16 decimal digits ~ 54 bits
1236   UINT128 fstar;
1237   UINT128 P128;
1238 
1239   // check for NaN or Infinity
1240   if ((x & MASK_NAN) == MASK_NAN || (x & MASK_INF) == MASK_INF) {
1241     // set invalid flag
1242     *pfpsf |= INVALID_EXCEPTION;
1243     // return Integer Indefinite
1244     res = 0x8000000000000000ull;
1245     BID_RETURN (res);
1246   }
1247   // unpack x
1248   x_sign = x & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
1249   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
1250   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
1251     x_exp = (x & MASK_BINARY_EXPONENT2) >> 51;	// biased
1252     C1 = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
1253     if (C1 > 9999999999999999ull) {	// non-canonical
1254       x_exp = 0;
1255       C1 = 0;
1256     }
1257   } else {
1258     x_exp = (x & MASK_BINARY_EXPONENT1) >> 53;	// biased
1259     C1 = x & MASK_BINARY_SIG1;
1260   }
1261 
1262   // check for zeros (possibly from non-canonical values)
1263   if (C1 == 0x0ull) {
1264     // x is 0
1265     res = 0x00000000;
1266     BID_RETURN (res);
1267   }
1268   // x is not special and is not zero
1269 
1270   // q = nr. of decimal digits in x (1 <= q <= 54)
1271   //  determine first the nr. of bits in x
1272   if (C1 >= 0x0020000000000000ull) {	// x >= 2^53
1273     // split the 64-bit value in two 32-bit halves to avoid rounding errors
1274     if (C1 >= 0x0000000100000000ull) {	// x >= 2^32
1275       tmp1.d = (double) (C1 >> 32);	// exact conversion
1276       x_nr_bits =
1277 	33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
1278     } else {	// x < 2^32
1279       tmp1.d = (double) C1;	// exact conversion
1280       x_nr_bits =
1281 	1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
1282     }
1283   } else {	// if x < 2^53
1284     tmp1.d = (double) C1;	// exact conversion
1285     x_nr_bits =
1286       1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
1287   }
1288   q = nr_digits[x_nr_bits - 1].digits;
1289   if (q == 0) {
1290     q = nr_digits[x_nr_bits - 1].digits1;
1291     if (C1 >= nr_digits[x_nr_bits - 1].threshold_lo)
1292       q++;
1293   }
1294   exp = x_exp - 398;	// unbiased exponent
1295 
1296   if ((q + exp) > 19) {	// x >= 10^19 ~= 2^63.11... (cannot fit in SINT64)
1297     // set invalid flag
1298     *pfpsf |= INVALID_EXCEPTION;
1299     // return Integer Indefinite
1300     res = 0x8000000000000000ull;
1301     BID_RETURN (res);
1302   } else if ((q + exp) == 19) {	// x = c(0)c(1)...c(18).c(19)...c(q-1)
1303     // in this case 2^63.11... ~= 10^19 <= x < 10^20 ~= 2^66.43...
1304     // so x rounded to an integer may or may not fit in a signed 64-bit int
1305     // the cases that do not fit are identified here; the ones that fit
1306     // fall through and will be handled with other cases further,
1307     // under '1 <= q + exp <= 19'
1308     if (x_sign) {	// if n < 0 and q + exp = 19
1309       // if n <= -2^63 - 1 then n is too large
1310       // too large if c(0)c(1)...c(18).c(19)...c(q-1) >= 2^63+1
1311       // <=> 0.c(0)c(1)...c(q-1) * 10^20 >= 5*(2^64+2), 1<=q<=16
1312       // <=> 0.c(0)c(1)...c(q-1) * 10^20 >= 0x5000000000000000a, 1<=q<=16
1313       // <=> C * 10^(20-q) >= 0x5000000000000000a, 1<=q<=16
1314       // 1 <= q <= 16 => 4 <= 20-q <= 19 => 10^(20-q) is 64-bit, and so is C1
1315       __mul_64x64_to_128MACH (C, C1, ten2k64[20 - q]);
1316       // Note: C1 * 10^(11-q) has 19 or 20 digits; 0x5000000000000000a, has 20
1317       if (C.w[1] > 0x05ull || (C.w[1] == 0x05ull && C.w[0] >= 0x0aull)) {
1318 	// set invalid flag
1319 	*pfpsf |= INVALID_EXCEPTION;
1320 	// return Integer Indefinite
1321 	res = 0x8000000000000000ull;
1322 	BID_RETURN (res);
1323       }
1324       // else cases that can be rounded to a 64-bit int fall through
1325       // to '1 <= q + exp <= 19'
1326     } else {	// if n > 0 and q + exp = 19
1327       // if n > 2^63 - 1 then n is too large
1328       // too large if c(0)c(1)...c(18).c(19)...c(q-1) > 2^63 - 1
1329       // <=> if 0.c(0)c(1)...c(q-1) * 10^20 > 5*(2^64-2), 1<=q<=16
1330       // <=> if 0.c(0)c(1)...c(q-1) * 10^20 > 0x4fffffffffffffff6, 1<=q<=16
1331       // <=> if C * 10^(20-q) > 0x4fffffffffffffff6, 1<=q<=16
1332       C.w[1] = 0x0000000000000004ull;
1333       C.w[0] = 0xfffffffffffffff6ull;
1334       // 1 <= q <= 16 => 4 <= 20-q <= 19 => 10^(20-q) is 64-bit, and so is C1
1335       __mul_64x64_to_128MACH (C, C1, ten2k64[20 - q]);
1336       if (C.w[1] > 0x04ull ||
1337 	  (C.w[1] == 0x04ull && C.w[0] > 0xfffffffffffffff6ull)) {
1338 	// set invalid flag
1339 	*pfpsf |= INVALID_EXCEPTION;
1340 	// return Integer Indefinite
1341 	res = 0x8000000000000000ull;
1342 	BID_RETURN (res);
1343       }
1344       // else cases that can be rounded to a 64-bit int fall through
1345       // to '1 <= q + exp <= 19'
1346     }	// end else if n > 0 and q + exp = 19
1347   }	// end else if ((q + exp) == 19)
1348 
1349   // n is not too large to be converted to int64: -2^63-1 < n < 2^63
1350   // Note: some of the cases tested for above fall through to this point
1351   if ((q + exp) <= 0) {	// n = +/-0.0...c(0)c(1)...c(q-1)
1352     // set inexact flag
1353     *pfpsf |= INEXACT_EXCEPTION;
1354     // return 0 or 1
1355     if (x_sign)
1356       res = 0x00000000;
1357     else
1358       res = 0x00000001;
1359     BID_RETURN (res);
1360   } else {	// if (1 <= q + exp <= 19, 1 <= q <= 16, -15 <= exp <= 18)
1361     // -2^63-1 < x <= -1 or 1 <= x <= 2^63 - 1 so x can be rounded
1362     // to nearest to a 64-bit signed integer
1363     if (exp < 0) {	// 2 <= q <= 16, -15 <= exp <= -1, 1 <= q + exp <= 19
1364       ind = -exp;	// 1 <= ind <= 15; ind is a synonym for 'x'
1365       // chop off ind digits from the lower part of C1
1366       // C1 fits in 64 bits
1367       // calculate C* and f*
1368       // C* is actually floor(C*) in this case
1369       // C* and f* need shifting and masking, as shown by
1370       // shiftright128[] and maskhigh128[]
1371       // 1 <= x <= 15
1372       // kx = 10^(-x) = ten2mk64[ind - 1]
1373       // C* = C1 * 10^(-x)
1374       // the approximation of 10^(-x) was rounded up to 54 bits
1375       __mul_64x64_to_128MACH (P128, C1, ten2mk64[ind - 1]);
1376       Cstar = P128.w[1];
1377       fstar.w[1] = P128.w[1] & maskhigh128[ind - 1];
1378       fstar.w[0] = P128.w[0];
1379       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind].w[0], e.g.
1380       // if x=1, T*=ten2mk128trunc[0].w[0]=0x1999999999999999
1381       // C* = floor(C*) (logical right shift; C has p decimal digits,
1382       //     correct by Property 1)
1383       // n = C* * 10^(e+x)
1384 
1385       // shift right C* by Ex-64 = shiftright128[ind]
1386       shift = shiftright128[ind - 1];	// 0 <= shift <= 39
1387       Cstar = Cstar >> shift;
1388       // determine inexactness of the rounding of C*
1389       // if (0 < f* < 10^(-x)) then
1390       //   the result is exact
1391       // else // if (f* > T*) then
1392       //   the result is inexact
1393       if (ind - 1 <= 2) {	// fstar.w[1] is 0
1394 	if (fstar.w[0] > ten2mk128trunc[ind - 1].w[1]) {
1395 	  // ten2mk128trunc[ind -1].w[1] is identical to
1396 	  // ten2mk128[ind -1].w[1]
1397 	  if (!x_sign) {	// positive and inexact
1398 	    Cstar++;
1399 	  }
1400 	  // set the inexact flag
1401 	  *pfpsf |= INEXACT_EXCEPTION;
1402 	}	// else the result is exact
1403       } else {	// if 3 <= ind - 1 <= 14
1404 	if (fstar.w[1] || fstar.w[0] > ten2mk128trunc[ind - 1].w[1]) {
1405 	  // ten2mk128trunc[ind -1].w[1] is identical to
1406 	  // ten2mk128[ind -1].w[1]
1407 	  if (!x_sign) {	// positive and inexact
1408 	    Cstar++;
1409 	  }
1410 	  // set the inexact flag
1411 	  *pfpsf |= INEXACT_EXCEPTION;
1412 	}	// else the result is exact
1413       }
1414 
1415       if (x_sign)
1416 	res = -Cstar;
1417       else
1418 	res = Cstar;
1419     } else if (exp == 0) {
1420       // 1 <= q <= 16
1421       // res = +/-C (exact)
1422       if (x_sign)
1423 	res = -C1;
1424       else
1425 	res = C1;
1426     } else {	// if (exp > 0) => 1 <= exp <= 18, 1 <= q <= 16, 2 <= q + exp <= 20
1427       // (the upper limit of 20 on q + exp is due to the fact that
1428       // +/-C * 10^exp is guaranteed to fit in 64 bits)
1429       // res = +/-C * 10^exp (exact)
1430       if (x_sign)
1431 	res = -C1 * ten2k64[exp];
1432       else
1433 	res = C1 * ten2k64[exp];
1434     }
1435   }
1436   BID_RETURN (res);
1437 }
1438 
1439 /*****************************************************************************
1440  *  BID64_to_int64_int
1441  ****************************************************************************/
1442 
1443 #if DECIMAL_CALL_BY_REFERENCE
1444 void
1445 bid64_to_int64_int (SINT64 * pres, UINT64 * px
1446 		    _EXC_FLAGS_PARAM _EXC_MASKS_PARAM _EXC_INFO_PARAM) {
1447   UINT64 x = *px;
1448 #else
1449 SINT64
1450 bid64_to_int64_int (UINT64 x
1451 		    _EXC_FLAGS_PARAM _EXC_MASKS_PARAM _EXC_INFO_PARAM) {
1452 #endif
1453   SINT64 res;
1454   UINT64 x_sign;
1455   UINT64 x_exp;
1456   int exp;			// unbiased exponent
1457   // Note: C1 represents x_significand (UINT64)
1458   BID_UI64DOUBLE tmp1;
1459   unsigned int x_nr_bits;
1460   int q, ind, shift;
1461   UINT64 C1;
1462   UINT128 C;
1463   UINT64 Cstar;			// C* represents up to 16 decimal digits ~ 54 bits
1464   UINT128 P128;
1465 
1466   // check for NaN or Infinity
1467   if ((x & MASK_NAN) == MASK_NAN || (x & MASK_INF) == MASK_INF) {
1468     // set invalid flag
1469     *pfpsf |= INVALID_EXCEPTION;
1470     // return Integer Indefinite
1471     res = 0x8000000000000000ull;
1472     BID_RETURN (res);
1473   }
1474   // unpack x
1475   x_sign = x & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
1476   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
1477   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
1478     x_exp = (x & MASK_BINARY_EXPONENT2) >> 51;	// biased
1479     C1 = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
1480     if (C1 > 9999999999999999ull) {	// non-canonical
1481       x_exp = 0;
1482       C1 = 0;
1483     }
1484   } else {
1485     x_exp = (x & MASK_BINARY_EXPONENT1) >> 53;	// biased
1486     C1 = x & MASK_BINARY_SIG1;
1487   }
1488 
1489   // check for zeros (possibly from non-canonical values)
1490   if (C1 == 0x0ull) {
1491     // x is 0
1492     res = 0x00000000;
1493     BID_RETURN (res);
1494   }
1495   // x is not special and is not zero
1496 
1497   // q = nr. of decimal digits in x (1 <= q <= 54)
1498   //  determine first the nr. of bits in x
1499   if (C1 >= 0x0020000000000000ull) {	// x >= 2^53
1500     // split the 64-bit value in two 32-bit halves to avoid rounding errors
1501     if (C1 >= 0x0000000100000000ull) {	// x >= 2^32
1502       tmp1.d = (double) (C1 >> 32);	// exact conversion
1503       x_nr_bits =
1504 	33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
1505     } else {	// x < 2^32
1506       tmp1.d = (double) C1;	// exact conversion
1507       x_nr_bits =
1508 	1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
1509     }
1510   } else {	// if x < 2^53
1511     tmp1.d = (double) C1;	// exact conversion
1512     x_nr_bits =
1513       1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
1514   }
1515   q = nr_digits[x_nr_bits - 1].digits;
1516   if (q == 0) {
1517     q = nr_digits[x_nr_bits - 1].digits1;
1518     if (C1 >= nr_digits[x_nr_bits - 1].threshold_lo)
1519       q++;
1520   }
1521   exp = x_exp - 398;	// unbiased exponent
1522 
1523   if ((q + exp) > 19) {	// x >= 10^19 ~= 2^63.11... (cannot fit in SINT64)
1524     // set invalid flag
1525     *pfpsf |= INVALID_EXCEPTION;
1526     // return Integer Indefinite
1527     res = 0x8000000000000000ull;
1528     BID_RETURN (res);
1529   } else if ((q + exp) == 19) {	// x = c(0)c(1)...c(18).c(19)...c(q-1)
1530     // in this case 2^63.11... ~= 10^19 <= x < 10^20 ~= 2^66.43...
1531     // so x rounded to an integer may or may not fit in a signed 64-bit int
1532     // the cases that do not fit are identified here; the ones that fit
1533     // fall through and will be handled with other cases further,
1534     // under '1 <= q + exp <= 19'
1535     if (x_sign) {	// if n < 0 and q + exp = 19
1536       // if n <= -2^63 - 1 then n is too large
1537       // too large if c(0)c(1)...c(18).c(19)...c(q-1) >= 2^63+1
1538       // <=> 0.c(0)c(1)...c(q-1) * 10^20 >= 5*(2^64+2), 1<=q<=16
1539       // <=> 0.c(0)c(1)...c(q-1) * 10^20 >= 0x5000000000000000a, 1<=q<=16
1540       // <=> C * 10^(20-q) >= 0x5000000000000000a, 1<=q<=16
1541       // 1 <= q <= 16 => 4 <= 20-q <= 19 => 10^(20-q) is 64-bit, and so is C1
1542       __mul_64x64_to_128MACH (C, C1, ten2k64[20 - q]);
1543       // Note: C1 * 10^(11-q) has 19 or 20 digits; 0x5000000000000000a, has 20
1544       if (C.w[1] > 0x05ull || (C.w[1] == 0x05ull && C.w[0] >= 0x0aull)) {
1545 	// set invalid flag
1546 	*pfpsf |= INVALID_EXCEPTION;
1547 	// return Integer Indefinite
1548 	res = 0x8000000000000000ull;
1549 	BID_RETURN (res);
1550       }
1551       // else cases that can be rounded to a 64-bit int fall through
1552       // to '1 <= q + exp <= 19'
1553     } else {	// if n > 0 and q + exp = 19
1554       // if n >= 2^63 then n is too large
1555       // too large if c(0)c(1)...c(18).c(19)...c(q-1) >= 2^63
1556       // <=> if 0.c(0)c(1)...c(q-1) * 10^20 >= 5*2^64, 1<=q<=16
1557       // <=> if 0.c(0)c(1)...c(q-1) * 10^20 >= 0x50000000000000000, 1<=q<=16
1558       // <=> if C * 10^(20-q) >= 0x50000000000000000, 1<=q<=16
1559       C.w[1] = 0x0000000000000005ull;
1560       C.w[0] = 0x0000000000000000ull;
1561       // 1 <= q <= 16 => 4 <= 20-q <= 19 => 10^(20-q) is 64-bit, and so is C1
1562       __mul_64x64_to_128MACH (C, C1, ten2k64[20 - q]);
1563       if (C.w[1] >= 0x05ull) {
1564 	// actually C.w[1] == 0x05ull && C.w[0] >= 0x0000000000000000ull) {
1565 	// set invalid flag
1566 	*pfpsf |= INVALID_EXCEPTION;
1567 	// return Integer Indefinite
1568 	res = 0x8000000000000000ull;
1569 	BID_RETURN (res);
1570       }
1571       // else cases that can be rounded to a 64-bit int fall through
1572       // to '1 <= q + exp <= 19'
1573     }	// end else if n > 0 and q + exp = 19
1574   }	// end else if ((q + exp) == 19)
1575 
1576   // n is not too large to be converted to int64: -2^63-1 < n < 2^63
1577   // Note: some of the cases tested for above fall through to this point
1578   if ((q + exp) <= 0) {	// n = +/-0.0...c(0)c(1)...c(q-1)
1579     // return 0
1580     res = 0x0000000000000000ull;
1581     BID_RETURN (res);
1582   } else {	// if (1 <= q + exp <= 19, 1 <= q <= 16, -15 <= exp <= 18)
1583     // -2^63-1 < x <= -1 or 1 <= x < 2^63 so x can be rounded
1584     // to nearest to a 64-bit signed integer
1585     if (exp < 0) {	// 2 <= q <= 16, -15 <= exp <= -1, 1 <= q + exp <= 19
1586       ind = -exp;	// 1 <= ind <= 15; ind is a synonym for 'x'
1587       // chop off ind digits from the lower part of C1
1588       // C1 fits in 64 bits
1589       // calculate C* and f*
1590       // C* is actually floor(C*) in this case
1591       // C* and f* need shifting and masking, as shown by
1592       // shiftright128[] and maskhigh128[]
1593       // 1 <= x <= 15
1594       // kx = 10^(-x) = ten2mk64[ind - 1]
1595       // C* = C1 * 10^(-x)
1596       // the approximation of 10^(-x) was rounded up to 54 bits
1597       __mul_64x64_to_128MACH (P128, C1, ten2mk64[ind - 1]);
1598       Cstar = P128.w[1];
1599       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind].w[0], e.g.
1600       // if x=1, T*=ten2mk128trunc[0].w[0]=0x1999999999999999
1601       // C* = floor(C*) (logical right shift; C has p decimal digits,
1602       //     correct by Property 1)
1603       // n = C* * 10^(e+x)
1604 
1605       // shift right C* by Ex-64 = shiftright128[ind]
1606       shift = shiftright128[ind - 1];	// 0 <= shift <= 39
1607       Cstar = Cstar >> shift;
1608 
1609       if (x_sign)
1610 	res = -Cstar;
1611       else
1612 	res = Cstar;
1613     } else if (exp == 0) {
1614       // 1 <= q <= 16
1615       // res = +/-C (exact)
1616       if (x_sign)
1617 	res = -C1;
1618       else
1619 	res = C1;
1620     } else {	// if (exp > 0) => 1 <= exp <= 18, 1 <= q <= 16, 2 <= q + exp <= 20
1621       // (the upper limit of 20 on q + exp is due to the fact that
1622       // +/-C * 10^exp is guaranteed to fit in 64 bits)
1623       // res = +/-C * 10^exp (exact)
1624       if (x_sign)
1625 	res = -C1 * ten2k64[exp];
1626       else
1627 	res = C1 * ten2k64[exp];
1628     }
1629   }
1630   BID_RETURN (res);
1631 }
1632 
1633 /*****************************************************************************
1634  *  BID64_to_int64_xint
1635  ****************************************************************************/
1636 
1637 #if DECIMAL_CALL_BY_REFERENCE
1638 void
1639 bid64_to_int64_xint (SINT64 * pres, UINT64 * px
1640 		     _EXC_FLAGS_PARAM _EXC_MASKS_PARAM _EXC_INFO_PARAM)
1641 {
1642   UINT64 x = *px;
1643 #else
1644 SINT64
1645 bid64_to_int64_xint (UINT64 x
1646 		     _EXC_FLAGS_PARAM _EXC_MASKS_PARAM _EXC_INFO_PARAM)
1647 {
1648 #endif
1649   SINT64 res;
1650   UINT64 x_sign;
1651   UINT64 x_exp;
1652   int exp;			// unbiased exponent
1653   // Note: C1 represents x_significand (UINT64)
1654   BID_UI64DOUBLE tmp1;
1655   unsigned int x_nr_bits;
1656   int q, ind, shift;
1657   UINT64 C1;
1658   UINT128 C;
1659   UINT64 Cstar;			// C* represents up to 16 decimal digits ~ 54 bits
1660   UINT128 fstar;
1661   UINT128 P128;
1662 
1663   // check for NaN or Infinity
1664   if ((x & MASK_NAN) == MASK_NAN || (x & MASK_INF) == MASK_INF) {
1665     // set invalid flag
1666     *pfpsf |= INVALID_EXCEPTION;
1667     // return Integer Indefinite
1668     res = 0x8000000000000000ull;
1669     BID_RETURN (res);
1670   }
1671   // unpack x
1672   x_sign = x & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
1673   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
1674   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
1675     x_exp = (x & MASK_BINARY_EXPONENT2) >> 51;	// biased
1676     C1 = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
1677     if (C1 > 9999999999999999ull) {	// non-canonical
1678       x_exp = 0;
1679       C1 = 0;
1680     }
1681   } else {
1682     x_exp = (x & MASK_BINARY_EXPONENT1) >> 53;	// biased
1683     C1 = x & MASK_BINARY_SIG1;
1684   }
1685 
1686   // check for zeros (possibly from non-canonical values)
1687   if (C1 == 0x0ull) {
1688     // x is 0
1689     res = 0x00000000;
1690     BID_RETURN (res);
1691   }
1692   // x is not special and is not zero
1693 
1694   // q = nr. of decimal digits in x (1 <= q <= 54)
1695   //  determine first the nr. of bits in x
1696   if (C1 >= 0x0020000000000000ull) {	// x >= 2^53
1697     // split the 64-bit value in two 32-bit halves to avoid rounding errors
1698     if (C1 >= 0x0000000100000000ull) {	// x >= 2^32
1699       tmp1.d = (double) (C1 >> 32);	// exact conversion
1700       x_nr_bits =
1701 	33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
1702     } else {	// x < 2^32
1703       tmp1.d = (double) C1;	// exact conversion
1704       x_nr_bits =
1705 	1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
1706     }
1707   } else {	// if x < 2^53
1708     tmp1.d = (double) C1;	// exact conversion
1709     x_nr_bits =
1710       1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
1711   }
1712   q = nr_digits[x_nr_bits - 1].digits;
1713   if (q == 0) {
1714     q = nr_digits[x_nr_bits - 1].digits1;
1715     if (C1 >= nr_digits[x_nr_bits - 1].threshold_lo)
1716       q++;
1717   }
1718   exp = x_exp - 398;	// unbiased exponent
1719 
1720   if ((q + exp) > 19) {	// x >= 10^19 ~= 2^63.11... (cannot fit in SINT64)
1721     // set invalid flag
1722     *pfpsf |= INVALID_EXCEPTION;
1723     // return Integer Indefinite
1724     res = 0x8000000000000000ull;
1725     BID_RETURN (res);
1726   } else if ((q + exp) == 19) {	// x = c(0)c(1)...c(18).c(19)...c(q-1)
1727     // in this case 2^63.11... ~= 10^19 <= x < 10^20 ~= 2^66.43...
1728     // so x rounded to an integer may or may not fit in a signed 64-bit int
1729     // the cases that do not fit are identified here; the ones that fit
1730     // fall through and will be handled with other cases further,
1731     // under '1 <= q + exp <= 19'
1732     if (x_sign) {	// if n < 0 and q + exp = 19
1733       // if n <= -2^63 - 1 then n is too large
1734       // too large if c(0)c(1)...c(18).c(19)...c(q-1) >= 2^63+1
1735       // <=> 0.c(0)c(1)...c(q-1) * 10^20 >= 5*(2^64+2), 1<=q<=16
1736       // <=> 0.c(0)c(1)...c(q-1) * 10^20 >= 0x5000000000000000a, 1<=q<=16
1737       // <=> C * 10^(20-q) >= 0x5000000000000000a, 1<=q<=16
1738       // 1 <= q <= 16 => 4 <= 20-q <= 19 => 10^(20-q) is 64-bit, and so is C1
1739       __mul_64x64_to_128MACH (C, C1, ten2k64[20 - q]);
1740       // Note: C1 * 10^(11-q) has 19 or 20 digits; 0x5000000000000000a, has 20
1741       if (C.w[1] > 0x05ull || (C.w[1] == 0x05ull && C.w[0] >= 0x0aull)) {
1742 	// set invalid flag
1743 	*pfpsf |= INVALID_EXCEPTION;
1744 	// return Integer Indefinite
1745 	res = 0x8000000000000000ull;
1746 	BID_RETURN (res);
1747       }
1748       // else cases that can be rounded to a 64-bit int fall through
1749       // to '1 <= q + exp <= 19'
1750     } else {	// if n > 0 and q + exp = 19
1751       // if n >= 2^63 then n is too large
1752       // too large if c(0)c(1)...c(18).c(19)...c(q-1) >= 2^63
1753       // <=> if 0.c(0)c(1)...c(q-1) * 10^20 >= 5*2^64, 1<=q<=16
1754       // <=> if 0.c(0)c(1)...c(q-1) * 10^20 >= 0x50000000000000000, 1<=q<=16
1755       // <=> if C * 10^(20-q) >= 0x50000000000000000, 1<=q<=16
1756       C.w[1] = 0x0000000000000005ull;
1757       C.w[0] = 0x0000000000000000ull;
1758       // 1 <= q <= 16 => 4 <= 20-q <= 19 => 10^(20-q) is 64-bit, and so is C1
1759       __mul_64x64_to_128MACH (C, C1, ten2k64[20 - q]);
1760       if (C.w[1] >= 0x05ull) {
1761 	// actually C.w[1] == 0x05ull && C.w[0] >= 0x0000000000000000ull) {
1762 	// set invalid flag
1763 	*pfpsf |= INVALID_EXCEPTION;
1764 	// return Integer Indefinite
1765 	res = 0x8000000000000000ull;
1766 	BID_RETURN (res);
1767       }
1768       // else cases that can be rounded to a 64-bit int fall through
1769       // to '1 <= q + exp <= 19'
1770     }	// end else if n > 0 and q + exp = 19
1771   }	// end else if ((q + exp) == 19)
1772 
1773   // n is not too large to be converted to int64: -2^63-1 < n < 2^63
1774   // Note: some of the cases tested for above fall through to this point
1775   if ((q + exp) <= 0) {	// n = +/-0.0...c(0)c(1)...c(q-1)
1776     // set inexact flag
1777     *pfpsf |= INEXACT_EXCEPTION;
1778     // return 0
1779     res = 0x0000000000000000ull;
1780     BID_RETURN (res);
1781   } else {	// if (1 <= q + exp <= 19, 1 <= q <= 16, -15 <= exp <= 18)
1782     // -2^63-1 < x <= -1 or 1 <= x < 2^63 so x can be rounded
1783     // to nearest to a 64-bit signed integer
1784     if (exp < 0) {	// 2 <= q <= 16, -15 <= exp <= -1, 1 <= q + exp <= 19
1785       ind = -exp;	// 1 <= ind <= 15; ind is a synonym for 'x'
1786       // chop off ind digits from the lower part of C1
1787       // C1 fits in 64 bits
1788       // calculate C* and f*
1789       // C* is actually floor(C*) in this case
1790       // C* and f* need shifting and masking, as shown by
1791       // shiftright128[] and maskhigh128[]
1792       // 1 <= x <= 15
1793       // kx = 10^(-x) = ten2mk64[ind - 1]
1794       // C* = C1 * 10^(-x)
1795       // the approximation of 10^(-x) was rounded up to 54 bits
1796       __mul_64x64_to_128MACH (P128, C1, ten2mk64[ind - 1]);
1797       Cstar = P128.w[1];
1798       fstar.w[1] = P128.w[1] & maskhigh128[ind - 1];
1799       fstar.w[0] = P128.w[0];
1800       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind].w[0], e.g.
1801       // if x=1, T*=ten2mk128trunc[0].w[0]=0x1999999999999999
1802       // C* = floor(C*) (logical right shift; C has p decimal digits,
1803       //     correct by Property 1)
1804       // n = C* * 10^(e+x)
1805 
1806       // shift right C* by Ex-64 = shiftright128[ind]
1807       shift = shiftright128[ind - 1];	// 0 <= shift <= 39
1808       Cstar = Cstar >> shift;
1809       // determine inexactness of the rounding of C*
1810       // if (0 < f* < 10^(-x)) then
1811       //   the result is exact
1812       // else // if (f* > T*) then
1813       //   the result is inexact
1814       if (ind - 1 <= 2) {	// fstar.w[1] is 0
1815 	if (fstar.w[0] > ten2mk128trunc[ind - 1].w[1]) {
1816 	  // ten2mk128trunc[ind -1].w[1] is identical to
1817 	  // ten2mk128[ind -1].w[1]
1818 	  // set the inexact flag
1819 	  *pfpsf |= INEXACT_EXCEPTION;
1820 	}	// else the result is exact
1821       } else {	// if 3 <= ind - 1 <= 14
1822 	if (fstar.w[1] || fstar.w[0] > ten2mk128trunc[ind - 1].w[1]) {
1823 	  // ten2mk128trunc[ind -1].w[1] is identical to
1824 	  // ten2mk128[ind -1].w[1]
1825 	  // set the inexact flag
1826 	  *pfpsf |= INEXACT_EXCEPTION;
1827 	}	// else the result is exact
1828       }
1829       if (x_sign)
1830 	res = -Cstar;
1831       else
1832 	res = Cstar;
1833     } else if (exp == 0) {
1834       // 1 <= q <= 16
1835       // res = +/-C (exact)
1836       if (x_sign)
1837 	res = -C1;
1838       else
1839 	res = C1;
1840     } else {	// if (exp > 0) => 1 <= exp <= 18, 1 <= q <= 16, 2 <= q + exp <= 20
1841       // (the upper limit of 20 on q + exp is due to the fact that
1842       // +/-C * 10^exp is guaranteed to fit in 64 bits)
1843       // res = +/-C * 10^exp (exact)
1844       if (x_sign)
1845 	res = -C1 * ten2k64[exp];
1846       else
1847 	res = C1 * ten2k64[exp];
1848     }
1849   }
1850   BID_RETURN (res);
1851 }
1852 
1853 /*****************************************************************************
1854  *  BID64_to_int64_rninta
1855  ****************************************************************************/
1856 
1857 #if DECIMAL_CALL_BY_REFERENCE
1858 void
1859 bid64_to_int64_rninta (SINT64 * pres, UINT64 * px
1860 		       _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
1861 		       _EXC_INFO_PARAM) {
1862   UINT64 x = *px;
1863 #else
1864 SINT64
1865 bid64_to_int64_rninta (UINT64 x
1866 		       _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
1867 		       _EXC_INFO_PARAM) {
1868 #endif
1869   SINT64 res;
1870   UINT64 x_sign;
1871   UINT64 x_exp;
1872   int exp;			// unbiased exponent
1873   // Note: C1 represents x_significand (UINT64)
1874   BID_UI64DOUBLE tmp1;
1875   unsigned int x_nr_bits;
1876   int q, ind, shift;
1877   UINT64 C1;
1878   UINT128 C;
1879   UINT64 Cstar;			// C* represents up to 16 decimal digits ~ 54 bits
1880   UINT128 P128;
1881 
1882   // check for NaN or Infinity
1883   if ((x & MASK_NAN) == MASK_NAN || (x & MASK_INF) == MASK_INF) {
1884     // set invalid flag
1885     *pfpsf |= INVALID_EXCEPTION;
1886     // return Integer Indefinite
1887     res = 0x8000000000000000ull;
1888     BID_RETURN (res);
1889   }
1890   // unpack x
1891   x_sign = x & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
1892   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
1893   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
1894     x_exp = (x & MASK_BINARY_EXPONENT2) >> 51;	// biased
1895     C1 = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
1896     if (C1 > 9999999999999999ull) {	// non-canonical
1897       x_exp = 0;
1898       C1 = 0;
1899     }
1900   } else {
1901     x_exp = (x & MASK_BINARY_EXPONENT1) >> 53;	// biased
1902     C1 = x & MASK_BINARY_SIG1;
1903   }
1904 
1905   // check for zeros (possibly from non-canonical values)
1906   if (C1 == 0x0ull) {
1907     // x is 0
1908     res = 0x00000000;
1909     BID_RETURN (res);
1910   }
1911   // x is not special and is not zero
1912 
1913   // q = nr. of decimal digits in x (1 <= q <= 54)
1914   //  determine first the nr. of bits in x
1915   if (C1 >= 0x0020000000000000ull) {	// x >= 2^53
1916     // split the 64-bit value in two 32-bit halves to avoid rounding errors
1917     if (C1 >= 0x0000000100000000ull) {	// x >= 2^32
1918       tmp1.d = (double) (C1 >> 32);	// exact conversion
1919       x_nr_bits =
1920 	33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
1921     } else {	// x < 2^32
1922       tmp1.d = (double) C1;	// exact conversion
1923       x_nr_bits =
1924 	1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
1925     }
1926   } else {	// if x < 2^53
1927     tmp1.d = (double) C1;	// exact conversion
1928     x_nr_bits =
1929       1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
1930   }
1931   q = nr_digits[x_nr_bits - 1].digits;
1932   if (q == 0) {
1933     q = nr_digits[x_nr_bits - 1].digits1;
1934     if (C1 >= nr_digits[x_nr_bits - 1].threshold_lo)
1935       q++;
1936   }
1937   exp = x_exp - 398;	// unbiased exponent
1938 
1939   if ((q + exp) > 19) {	// x >= 10^19 ~= 2^63.11... (cannot fit in SINT64)
1940     // set invalid flag
1941     *pfpsf |= INVALID_EXCEPTION;
1942     // return Integer Indefinite
1943     res = 0x8000000000000000ull;
1944     BID_RETURN (res);
1945   } else if ((q + exp) == 19) {	// x = c(0)c(1)...c(18).c(19)...c(q-1)
1946     // in this case 2^63.11... ~= 10^19 <= x < 10^20 ~= 2^66.43...
1947     // so x rounded to an integer may or may not fit in a signed 64-bit int
1948     // the cases that do not fit are identified here; the ones that fit
1949     // fall through and will be handled with other cases further,
1950     // under '1 <= q + exp <= 19'
1951     if (x_sign) {	// if n < 0 and q + exp = 19
1952       // if n <= -2^63 - 1/2 then n is too large
1953       // too large if c(0)c(1)...c(18).c(19)...c(q-1) >= 2^63+1/2
1954       // <=> 0.c(0)c(1)...c(q-1) * 10^20 >= 5*(2^64+1), 1<=q<=16
1955       // <=> 0.c(0)c(1)...c(q-1) * 10^20 >= 0x50000000000000005, 1<=q<=16
1956       // <=> C * 10^(20-q) >= 0x50000000000000005, 1<=q<=16
1957       // 1 <= q <= 16 => 4 <= 20-q <= 19 => 10^(20-q) is 64-bit, and so is C1
1958       __mul_64x64_to_128MACH (C, C1, ten2k64[20 - q]);
1959       // Note: C1 * 10^(11-q) has 19 or 20 digits; 0x50000000000000005, has 20
1960       if (C.w[1] > 0x05ull || (C.w[1] == 0x05ull && C.w[0] >= 0x05ull)) {
1961 	// set invalid flag
1962 	*pfpsf |= INVALID_EXCEPTION;
1963 	// return Integer Indefinite
1964 	res = 0x8000000000000000ull;
1965 	BID_RETURN (res);
1966       }
1967       // else cases that can be rounded to a 64-bit int fall through
1968       // to '1 <= q + exp <= 19'
1969     } else {	// if n > 0 and q + exp = 19
1970       // if n >= 2^63 - 1/2 then n is too large
1971       // too large if c(0)c(1)...c(18).c(19)...c(q-1) >= 2^63-1/2
1972       // <=> if 0.c(0)c(1)...c(q-1) * 10^20 >= 5*(2^64-1), 1<=q<=16
1973       // <=> if 0.c(0)c(1)...c(q-1) * 10^20 >= 0x4fffffffffffffffb, 1<=q<=16
1974       // <=> if C * 10^(20-q) >= 0x4fffffffffffffffb, 1<=q<=16
1975       C.w[1] = 0x0000000000000004ull;
1976       C.w[0] = 0xfffffffffffffffbull;
1977       // 1 <= q <= 16 => 4 <= 20-q <= 19 => 10^(20-q) is 64-bit, and so is C1
1978       __mul_64x64_to_128MACH (C, C1, ten2k64[20 - q]);
1979       if (C.w[1] > 0x04ull ||
1980 	  (C.w[1] == 0x04ull && C.w[0] >= 0xfffffffffffffffbull)) {
1981 	// set invalid flag
1982 	*pfpsf |= INVALID_EXCEPTION;
1983 	// return Integer Indefinite
1984 	res = 0x8000000000000000ull;
1985 	BID_RETURN (res);
1986       }
1987       // else cases that can be rounded to a 64-bit int fall through
1988       // to '1 <= q + exp <= 19'
1989     }	// end else if n > 0 and q + exp = 19
1990   }	// end else if ((q + exp) == 19)
1991 
1992   // n is not too large to be converted to int64: -2^63-1/2 < n < 2^63-1/2
1993   // Note: some of the cases tested for above fall through to this point
1994   if ((q + exp) < 0) {	// n = +/-0.0...c(0)c(1)...c(q-1)
1995     // return 0
1996     res = 0x0000000000000000ull;
1997     BID_RETURN (res);
1998   } else if ((q + exp) == 0) {	// n = +/-0.c(0)c(1)...c(q-1)
1999     // if 0.c(0)c(1)...c(q-1) <= 0.5 <=> c(0)c(1)...c(q-1) <= 5 * 10^(q-1)
2000     //   res = 0
2001     // else
2002     //   res = +/-1
2003     ind = q - 1;	// 0 <= ind <= 15
2004     if (C1 < midpoint64[ind]) {
2005       res = 0x0000000000000000ull;	// return 0
2006     } else if (x_sign) {	// n < 0
2007       res = 0xffffffffffffffffull;	// return -1
2008     } else {	// n > 0
2009       res = 0x0000000000000001ull;	// return +1
2010     }
2011   } else {	// if (1 <= q + exp <= 19, 1 <= q <= 16, -15 <= exp <= 18)
2012     // -2^63-1/2 < x <= -1 or 1 <= x < 2^63-1/2 so x can be rounded
2013     // to nearest to a 64-bit signed integer
2014     if (exp < 0) {	// 2 <= q <= 16, -15 <= exp <= -1, 1 <= q + exp <= 19
2015       ind = -exp;	// 1 <= ind <= 15; ind is a synonym for 'x'
2016       // chop off ind digits from the lower part of C1
2017       // C1 = C1 + 1/2 * 10^ind where the result C1 fits in 64 bits
2018       C1 = C1 + midpoint64[ind - 1];
2019       // calculate C* and f*
2020       // C* is actually floor(C*) in this case
2021       // C* and f* need shifting and masking, as shown by
2022       // shiftright128[] and maskhigh128[]
2023       // 1 <= x <= 15
2024       // kx = 10^(-x) = ten2mk64[ind - 1]
2025       // C* = (C1 + 1/2 * 10^x) * 10^(-x)
2026       // the approximation of 10^(-x) was rounded up to 54 bits
2027       __mul_64x64_to_128MACH (P128, C1, ten2mk64[ind - 1]);
2028       Cstar = P128.w[1];
2029       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind].w[0], e.g.
2030       // if x=1, T*=ten2mk128trunc[0].w[0]=0x1999999999999999
2031       // if (0 < f* < 10^(-x)) then the result is a midpoint
2032       //   if floor(C*) is even then C* = floor(C*) - logical right
2033       //       shift; C* has p decimal digits, correct by Prop. 1)
2034       //   else if floor(C*) is odd C* = floor(C*)-1 (logical right
2035       //       shift; C* has p decimal digits, correct by Pr. 1)
2036       // else
2037       //   C* = floor(C*) (logical right shift; C has p decimal digits,
2038       //       correct by Property 1)
2039       // n = C* * 10^(e+x)
2040 
2041       // shift right C* by Ex-64 = shiftright128[ind]
2042       shift = shiftright128[ind - 1];	// 0 <= shift <= 39
2043       Cstar = Cstar >> shift;
2044 
2045       // if the result was a midpoint it was rounded away from zero
2046       if (x_sign)
2047 	res = -Cstar;
2048       else
2049 	res = Cstar;
2050     } else if (exp == 0) {
2051       // 1 <= q <= 16
2052       // res = +/-C (exact)
2053       if (x_sign)
2054 	res = -C1;
2055       else
2056 	res = C1;
2057     } else {	// if (exp > 0) => 1 <= exp <= 18, 1 <= q <= 16, 2 <= q + exp <= 20
2058       // (the upper limit of 20 on q + exp is due to the fact that
2059       // +/-C * 10^exp is guaranteed to fit in 64 bits)
2060       // res = +/-C * 10^exp (exact)
2061       if (x_sign)
2062 	res = -C1 * ten2k64[exp];
2063       else
2064 	res = C1 * ten2k64[exp];
2065     }
2066   }
2067   BID_RETURN (res);
2068 }
2069 
2070 /*****************************************************************************
2071  *  BID64_to_int64_xrninta
2072  ****************************************************************************/
2073 
2074 #if DECIMAL_CALL_BY_REFERENCE
2075 void
2076 bid64_to_int64_xrninta (SINT64 * pres, UINT64 * px
2077 			_EXC_FLAGS_PARAM _EXC_MASKS_PARAM
2078 			_EXC_INFO_PARAM) {
2079   UINT64 x = *px;
2080 #else
2081 SINT64
2082 bid64_to_int64_xrninta (UINT64 x
2083 			_EXC_FLAGS_PARAM _EXC_MASKS_PARAM
2084 			_EXC_INFO_PARAM) {
2085 #endif
2086   SINT64 res;
2087   UINT64 x_sign;
2088   UINT64 x_exp;
2089   int exp;			// unbiased exponent
2090   // Note: C1 represents x_significand (UINT64)
2091   UINT64 tmp64;
2092   BID_UI64DOUBLE tmp1;
2093   unsigned int x_nr_bits;
2094   int q, ind, shift;
2095   UINT64 C1;
2096   UINT128 C;
2097   UINT64 Cstar;			// C* represents up to 16 decimal digits ~ 54 bits
2098   UINT128 fstar;
2099   UINT128 P128;
2100 
2101   // check for NaN or Infinity
2102   if ((x & MASK_NAN) == MASK_NAN || (x & MASK_INF) == MASK_INF) {
2103     // set invalid flag
2104     *pfpsf |= INVALID_EXCEPTION;
2105     // return Integer Indefinite
2106     res = 0x8000000000000000ull;
2107     BID_RETURN (res);
2108   }
2109   // unpack x
2110   x_sign = x & MASK_SIGN;	// 0 for positive, MASK_SIGN for negative
2111   // if steering bits are 11 (condition will be 0), then exponent is G[0:w+1] =>
2112   if ((x & MASK_STEERING_BITS) == MASK_STEERING_BITS) {
2113     x_exp = (x & MASK_BINARY_EXPONENT2) >> 51;	// biased
2114     C1 = (x & MASK_BINARY_SIG2) | MASK_BINARY_OR2;
2115     if (C1 > 9999999999999999ull) {	// non-canonical
2116       x_exp = 0;
2117       C1 = 0;
2118     }
2119   } else {
2120     x_exp = (x & MASK_BINARY_EXPONENT1) >> 53;	// biased
2121     C1 = x & MASK_BINARY_SIG1;
2122   }
2123 
2124   // check for zeros (possibly from non-canonical values)
2125   if (C1 == 0x0ull) {
2126     // x is 0
2127     res = 0x00000000;
2128     BID_RETURN (res);
2129   }
2130   // x is not special and is not zero
2131 
2132   // q = nr. of decimal digits in x (1 <= q <= 54)
2133   //  determine first the nr. of bits in x
2134   if (C1 >= 0x0020000000000000ull) {	// x >= 2^53
2135     // split the 64-bit value in two 32-bit halves to avoid rounding errors
2136     if (C1 >= 0x0000000100000000ull) {	// x >= 2^32
2137       tmp1.d = (double) (C1 >> 32);	// exact conversion
2138       x_nr_bits =
2139 	33 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
2140     } else {	// x < 2^32
2141       tmp1.d = (double) C1;	// exact conversion
2142       x_nr_bits =
2143 	1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
2144     }
2145   } else {	// if x < 2^53
2146     tmp1.d = (double) C1;	// exact conversion
2147     x_nr_bits =
2148       1 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
2149   }
2150   q = nr_digits[x_nr_bits - 1].digits;
2151   if (q == 0) {
2152     q = nr_digits[x_nr_bits - 1].digits1;
2153     if (C1 >= nr_digits[x_nr_bits - 1].threshold_lo)
2154       q++;
2155   }
2156   exp = x_exp - 398;	// unbiased exponent
2157 
2158   if ((q + exp) > 19) {	// x >= 10^19 ~= 2^63.11... (cannot fit in SINT64)
2159     // set invalid flag
2160     *pfpsf |= INVALID_EXCEPTION;
2161     // return Integer Indefinite
2162     res = 0x8000000000000000ull;
2163     BID_RETURN (res);
2164   } else if ((q + exp) == 19) {	// x = c(0)c(1)...c(18).c(19)...c(q-1)
2165     // in this case 2^63.11... ~= 10^19 <= x < 10^20 ~= 2^66.43...
2166     // so x rounded to an integer may or may not fit in a signed 64-bit int
2167     // the cases that do not fit are identified here; the ones that fit
2168     // fall through and will be handled with other cases further,
2169     // under '1 <= q + exp <= 19'
2170     if (x_sign) {	// if n < 0 and q + exp = 19
2171       // if n <= -2^63 - 1/2 then n is too large
2172       // too large if c(0)c(1)...c(18).c(19)...c(q-1) >= 2^63+1/2
2173       // <=> 0.c(0)c(1)...c(q-1) * 10^20 >= 5*(2^64+1), 1<=q<=16
2174       // <=> 0.c(0)c(1)...c(q-1) * 10^20 >= 0x50000000000000005, 1<=q<=16
2175       // <=> C * 10^(20-q) >= 0x50000000000000005, 1<=q<=16
2176       // 1 <= q <= 16 => 4 <= 20-q <= 19 => 10^(20-q) is 64-bit, and so is C1
2177       __mul_64x64_to_128MACH (C, C1, ten2k64[20 - q]);
2178       // Note: C1 * 10^(11-q) has 19 or 20 digits; 0x50000000000000005, has 20
2179       if (C.w[1] > 0x05ull || (C.w[1] == 0x05ull && C.w[0] >= 0x05ull)) {
2180 	// set invalid flag
2181 	*pfpsf |= INVALID_EXCEPTION;
2182 	// return Integer Indefinite
2183 	res = 0x8000000000000000ull;
2184 	BID_RETURN (res);
2185       }
2186       // else cases that can be rounded to a 64-bit int fall through
2187       // to '1 <= q + exp <= 19'
2188     } else {	// if n > 0 and q + exp = 19
2189       // if n >= 2^63 - 1/2 then n is too large
2190       // too large if c(0)c(1)...c(18).c(19)...c(q-1) >= 2^63-1/2
2191       // <=> if 0.c(0)c(1)...c(q-1) * 10^20 >= 5*(2^64-1), 1<=q<=16
2192       // <=> if 0.c(0)c(1)...c(q-1) * 10^20 >= 0x4fffffffffffffffb, 1<=q<=16
2193       // <=> if C * 10^(20-q) >= 0x4fffffffffffffffb, 1<=q<=16
2194       C.w[1] = 0x0000000000000004ull;
2195       C.w[0] = 0xfffffffffffffffbull;
2196       // 1 <= q <= 16 => 4 <= 20-q <= 19 => 10^(20-q) is 64-bit, and so is C1
2197       __mul_64x64_to_128MACH (C, C1, ten2k64[20 - q]);
2198       if (C.w[1] > 0x04ull ||
2199 	  (C.w[1] == 0x04ull && C.w[0] >= 0xfffffffffffffffbull)) {
2200 	// set invalid flag
2201 	*pfpsf |= INVALID_EXCEPTION;
2202 	// return Integer Indefinite
2203 	res = 0x8000000000000000ull;
2204 	BID_RETURN (res);
2205       }
2206       // else cases that can be rounded to a 64-bit int fall through
2207       // to '1 <= q + exp <= 19'
2208     }	// end else if n > 0 and q + exp = 19
2209   }	// end else if ((q + exp) == 19)
2210 
2211   // n is not too large to be converted to int64: -2^63-1/2 < n < 2^63-1/2
2212   // Note: some of the cases tested for above fall through to this point
2213   if ((q + exp) < 0) {	// n = +/-0.0...c(0)c(1)...c(q-1)
2214     // set inexact flag
2215     *pfpsf |= INEXACT_EXCEPTION;
2216     // return 0
2217     res = 0x0000000000000000ull;
2218     BID_RETURN (res);
2219   } else if ((q + exp) == 0) {	// n = +/-0.c(0)c(1)...c(q-1)
2220     // if 0.c(0)c(1)...c(q-1) <= 0.5 <=> c(0)c(1)...c(q-1) <= 5 * 10^(q-1)
2221     //   res = 0
2222     // else
2223     //   res = +/-1
2224     ind = q - 1;	// 0 <= ind <= 15
2225     if (C1 < midpoint64[ind]) {
2226       res = 0x0000000000000000ull;	// return 0
2227     } else if (x_sign) {	// n < 0
2228       res = 0xffffffffffffffffull;	// return -1
2229     } else {	// n > 0
2230       res = 0x0000000000000001ull;	// return +1
2231     }
2232     // set inexact flag
2233     *pfpsf |= INEXACT_EXCEPTION;
2234   } else {	// if (1 <= q + exp <= 19, 1 <= q <= 16, -15 <= exp <= 18)
2235     // -2^63-1/2 < x <= -1 or 1 <= x < 2^63-1/2 so x can be rounded
2236     // to nearest to a 64-bit signed integer
2237     if (exp < 0) {	// 2 <= q <= 16, -15 <= exp <= -1, 1 <= q + exp <= 19
2238       ind = -exp;	// 1 <= ind <= 15; ind is a synonym for 'x'
2239       // chop off ind digits from the lower part of C1
2240       // C1 = C1 + 1/2 * 10^ind where the result C1 fits in 64 bits
2241       C1 = C1 + midpoint64[ind - 1];
2242       // calculate C* and f*
2243       // C* is actually floor(C*) in this case
2244       // C* and f* need shifting and masking, as shown by
2245       // shiftright128[] and maskhigh128[]
2246       // 1 <= x <= 15
2247       // kx = 10^(-x) = ten2mk64[ind - 1]
2248       // C* = (C1 + 1/2 * 10^x) * 10^(-x)
2249       // the approximation of 10^(-x) was rounded up to 54 bits
2250       __mul_64x64_to_128MACH (P128, C1, ten2mk64[ind - 1]);
2251       Cstar = P128.w[1];
2252       fstar.w[1] = P128.w[1] & maskhigh128[ind - 1];
2253       fstar.w[0] = P128.w[0];
2254       // the top Ex bits of 10^(-x) are T* = ten2mk128trunc[ind].w[0], e.g.
2255       // if x=1, T*=ten2mk128trunc[0].w[0]=0x1999999999999999
2256       // if (0 < f* < 10^(-x)) then the result is a midpoint
2257       //   if floor(C*) is even then C* = floor(C*) - logical right
2258       //       shift; C* has p decimal digits, correct by Prop. 1)
2259       //   else if floor(C*) is odd C* = floor(C*)-1 (logical right
2260       //       shift; C* has p decimal digits, correct by Pr. 1)
2261       // else
2262       //   C* = floor(C*) (logical right shift; C has p decimal digits,
2263       //       correct by Property 1)
2264       // n = C* * 10^(e+x)
2265 
2266       // shift right C* by Ex-64 = shiftright128[ind]
2267       shift = shiftright128[ind - 1];	// 0 <= shift <= 39
2268       Cstar = Cstar >> shift;
2269       // determine inexactness of the rounding of C*
2270       // if (0 < f* - 1/2 < 10^(-x)) then
2271       //   the result is exact
2272       // else // if (f* - 1/2 > T*) then
2273       //   the result is inexact
2274       if (ind - 1 <= 2) {
2275 	if (fstar.w[0] > 0x8000000000000000ull) {
2276 	  // f* > 1/2 and the result may be exact
2277 	  tmp64 = fstar.w[0] - 0x8000000000000000ull;	// f* - 1/2
2278 	  if ((tmp64 > ten2mk128trunc[ind - 1].w[1])) {
2279 	    // ten2mk128trunc[ind -1].w[1] is identical to
2280 	    // ten2mk128[ind -1].w[1]
2281 	    // set the inexact flag
2282 	    *pfpsf |= INEXACT_EXCEPTION;
2283 	  }	// else the result is exact
2284 	} else {	// the result is inexact; f2* <= 1/2
2285 	  // set the inexact flag
2286 	  *pfpsf |= INEXACT_EXCEPTION;
2287 	}
2288       } else {	// if 3 <= ind - 1 <= 14
2289 	if (fstar.w[1] > onehalf128[ind - 1] ||
2290 	    (fstar.w[1] == onehalf128[ind - 1] && fstar.w[0])) {
2291 	  // f2* > 1/2 and the result may be exact
2292 	  // Calculate f2* - 1/2
2293 	  tmp64 = fstar.w[1] - onehalf128[ind - 1];
2294 	  if (tmp64 || fstar.w[0] > ten2mk128trunc[ind - 1].w[1]) {
2295 	    // ten2mk128trunc[ind -1].w[1] is identical to
2296 	    // ten2mk128[ind -1].w[1]
2297 	    // set the inexact flag
2298 	    *pfpsf |= INEXACT_EXCEPTION;
2299 	  }	// else the result is exact
2300 	} else {	// the result is inexact; f2* <= 1/2
2301 	  // set the inexact flag
2302 	  *pfpsf |= INEXACT_EXCEPTION;
2303 	}
2304       }
2305 
2306       // if the result was a midpoint it was rounded away from zero
2307       if (x_sign)
2308 	res = -Cstar;
2309       else
2310 	res = Cstar;
2311     } else if (exp == 0) {
2312       // 1 <= q <= 16
2313       // res = +/-C (exact)
2314       if (x_sign)
2315 	res = -C1;
2316       else
2317 	res = C1;
2318     } else {	// if (exp > 0) => 1 <= exp <= 18, 1 <= q <= 16, 2 <= q + exp <= 20
2319       // (the upper limit of 20 on q + exp is due to the fact that
2320       // +/-C * 10^exp is guaranteed to fit in 64 bits)
2321       // res = +/-C * 10^exp (exact)
2322       if (x_sign)
2323 	res = -C1 * ten2k64[exp];
2324       else
2325 	res = C1 * ten2k64[exp];
2326     }
2327   }
2328   BID_RETURN (res);
2329 }
2330