OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libgcc/] [config/] [libbid/] [bid64_to_uint32.c] - Blame information for rev 741

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.