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

Subversion Repositories openrisc

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

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
#define  DECNUMDIGITS 34        // work with up to 34 digits
25
 
26
#include "bid_internal.h"
27
#include "bid_b2d.h"
28
 
29
UINT32
30
bid_to_bid32 (UINT32 ba) {
31
  UINT32 res;
32
  UINT32 sign, comb, exp;
33
  UINT32 trailing;
34
  UINT32 bcoeff;
35
 
36
  sign = (ba & 0x80000000ul);
37
  comb = (ba & 0x7ff00000ul) >> 20;
38
  trailing = (ba & 0x000ffffful);
39
 
40
  if ((comb & 0x780) == 0x780) {
41
    ba &= 0xfff0000ul;
42
    return ba;
43
  } else {
44
    if ((comb & 0x600) == 0x600) {      // G0..G1 = 11 -> exp is G2..G11
45
      exp = (comb >> 1) & 0xff;
46
      bcoeff = ((8 + (comb & 1)) << 20) | trailing;
47
    } else {
48
      exp = (comb >> 3) & 0xff;
49
      bcoeff = ((comb & 7) << 20) | trailing;
50
    }
51
    if (bcoeff >= 10000000)
52
      bcoeff = 0;
53
    res = very_fast_get_BID32 (sign, exp, bcoeff);
54
  }
55
  return res;
56
}
57
 
58
UINT64
59
bid_to_bid64 (UINT64 ba) {
60
  UINT64 res;
61
  UINT64 sign, comb, exp;
62
  UINT64 trailing;
63
  UINT64 bcoeff;
64
 
65
  sign = (ba & 0x8000000000000000ull);
66
  comb = (ba & 0x7ffc000000000000ull) >> 50;
67
  trailing = (ba & 0x0003ffffffffffffull);
68
 
69
  if ((comb & 0x1e00) == 0x1e00) {
70
    ba &= 0xfff000000000000ULL;
71
    return ba;
72
  } else {
73
    if ((comb & 0x1800) == 0x1800) {    // G0..G1 = 11 -> exp is G2..G11
74
      exp = (comb >> 1) & 0x3ff;
75
      bcoeff = ((8 + (comb & 1)) << 50) | trailing;
76
    } else {
77
      exp = (comb >> 3) & 0x3ff;
78
      bcoeff = ((comb & 7) << 50) | trailing;
79
    }
80
    if (bcoeff >= 10000000000000000ull)
81
      bcoeff = 0ull;
82
    res = very_fast_get_BID64 (sign, exp, bcoeff);
83
  }
84
  return res;
85
}
86
 
87
#if DECIMAL_CALL_BY_REFERENCE
88
void
89
bid_to_dpd32 (UINT32 * pres, UINT32 * pba) {
90
  UINT32 ba = *pba;
91
#else
92
UINT32
93
bid_to_dpd32 (UINT32 ba) {
94
#endif
95
  UINT32 res;
96
 
97
  UINT32 sign, comb, exp, trailing;
98
  UINT32 b0, b1, b2;
99
  UINT32 bcoeff, dcoeff;
100
  UINT32 nanb = 0;
101
 
102
  sign = (ba & 0x80000000);
103
  comb = (ba & 0x7ff00000) >> 20;
104
  trailing = (ba & 0xfffff);
105
 
106
  // Detect infinity, and return canonical infinity
107
  if ((comb & 0x7c0) == 0x780) {
108
    res = sign | 0x78000000;
109
    BID_RETURN (res);
110
    // Detect NaN, and canonicalize trailing
111
  } else if ((comb & 0x7c0) == 0x7c0) {
112
    if (trailing > 999999)
113
      trailing = 0;
114
    nanb = ba & 0xfe000000;
115
    exp = 0;
116
    bcoeff = trailing;
117
  } else {      // Normal number
118
    if ((comb & 0x600) == 0x600) {      // G0..G1 = 11 -> exp is G2..G11
119
      exp = (comb >> 1) & 0xff;
120
      bcoeff = ((8 + (comb & 1)) << 20) | trailing;
121
    } else {
122
      exp = (comb >> 3) & 0xff;
123
      bcoeff = ((comb & 7) << 20) | trailing;
124
    }
125
    // Zero the coefficient if non-canonical (>= 10^7)
126
    if (bcoeff >= 10000000)
127
      bcoeff = 0;
128
  }
129
 
130
  b0 = bcoeff / 1000000;
131
  b1 = (bcoeff / 1000) % 1000;
132
  b2 = bcoeff % 1000;
133
  dcoeff = (b2d[b1] << 10) | b2d[b2];
134
 
135
  if (b0 >= 8)  // is b0 8 or 9?
136
    res =
137
      sign |
138
      ((0x600 | ((exp >> 6) << 7) | ((b0 & 1) << 6) | (exp & 0x3f)) <<
139
       20) | dcoeff;
140
  else  // else b0 is 0..7
141
    res =
142
      sign | ((((exp >> 6) << 9) | (b0 << 6) | (exp & 0x3f)) << 20) |
143
      dcoeff;
144
 
145
  res |= nanb;
146
 
147
  BID_RETURN (res);
148
}
149
 
150
#if DECIMAL_CALL_BY_REFERENCE
151
void
152
bid_to_dpd64 (UINT64 * pres, UINT64 * pba) {
153
  UINT64 ba = *pba;
154
#else
155
UINT64
156
bid_to_dpd64 (UINT64 ba) {
157
#endif
158
  UINT64 res;
159
 
160
  UINT64 sign, comb, exp;
161
  UINT64 trailing;
162
  UINT32 b0, b1, b2, b3, b4, b5;
163
  UINT64 bcoeff;
164
  UINT64 dcoeff;
165
  UINT32 yhi, ylo;
166
  UINT64 nanb = 0;
167
 
168
//printf("arg bid "FMT_LLX16" \n", ba);
169
  sign = (ba & 0x8000000000000000ull);
170
  comb = (ba & 0x7ffc000000000000ull) >> 50;
171
  trailing = (ba & 0x0003ffffffffffffull);
172
 
173
  // Detect infinity, and return canonical infinity
174
  if ((comb & 0x1f00) == 0x1e00) {
175
    res = sign | 0x7800000000000000ull;
176
    BID_RETURN (res);
177
    // Detect NaN, and canonicalize trailing
178
  } else if ((comb & 0x1e00) == 0x1e00) {
179
    if (trailing > 999999999999999ull)
180
      trailing = 0;
181
    nanb = ba & 0xfe00000000000000ull;
182
    exp = 0;
183
    bcoeff = trailing;
184
  } else {      // Normal number
185
    if ((comb & 0x1800) == 0x1800) {    // G0..G1 = 11 -> exp is G2..G11
186
      exp = (comb >> 1) & 0x3ff;
187
      bcoeff = ((8 + (comb & 1)) << 50) | trailing;
188
    } else {
189
      exp = (comb >> 3) & 0x3ff;
190
      bcoeff = ((comb & 7) << 50) | trailing;
191
    }
192
 
193
    // Zero the coefficient if it is non-canonical (>= 10^16)
194
    if (bcoeff >= 10000000000000000ull)
195
      bcoeff = 0;
196
  }
197
 
198
// Floor(2^61 / 10^9)
199
#define D61 (2305843009ull)
200
 
201
// Multipy the binary coefficient by ceil(2^64 / 1000), and take the upper
202
// 64-bits in order to compute a division by 1000.
203
 
204
#if 1
205
  yhi =
206
    ((UINT64) D61 *
207
     (UINT64) (UINT32) (bcoeff >> (UINT64) 27)) >> (UINT64) 34;
208
  ylo = bcoeff - 1000000000ull * yhi;
209
  if (ylo >= 1000000000) {
210
    ylo = ylo - 1000000000;
211
    yhi = yhi + 1;
212
  }
213
#else
214
  yhi = bcoeff / 1000000000ull;
215
  ylo = bcoeff % 1000000000ull;
216
#endif
217
 
218
  // yhi = ABBBCCC ylo = DDDEEEFFF
219
  b5 = ylo % 1000;      // b5 = FFF
220
  b3 = ylo / 1000000;   // b3 = DDD
221
  b4 = (ylo / 1000) - (1000 * b3);      // b4 = EEE
222
  b2 = yhi % 1000;      // b2 = CCC
223
  b0 = yhi / 1000000;   // b0 = A
224
  b1 = (yhi / 1000) - (1000 * b0);      // b1 = BBB
225
 
226
  dcoeff = b2d[b5] | b2d2[b4] | b2d3[b3] | b2d4[b2] | b2d5[b1];
227
 
228
  if (b0 >= 8)  // is b0 8 or 9?
229
    res =
230
      sign |
231
      ((0x1800 | ((exp >> 8) << 9) | ((b0 & 1) << 8) | (exp & 0xff)) <<
232
       50) | dcoeff;
233
  else  // else b0 is 0..7
234
    res =
235
      sign | ((((exp >> 8) << 11) | (b0 << 8) | (exp & 0xff)) << 50) |
236
      dcoeff;
237
 
238
  res |= nanb;
239
 
240
  BID_RETURN (res);
241
}
242
 
243
#if DECIMAL_CALL_BY_REFERENCE
244
void
245
dpd_to_bid32 (UINT32 * pres, UINT32 * pda) {
246
  UINT32 da = *pda;
247
#else
248
UINT32
249
dpd_to_bid32 (UINT32 da) {
250
#endif
251
  UINT32 in = *(UINT32 *) & da;
252
  UINT32 res;
253
 
254
  UINT32 sign, comb, exp;
255
  UINT32 trailing;
256
  UINT32 d0 = 0, d1, d2;
257
  UINT64 bcoeff;
258
  UINT32 nanb = 0;
259
 
260
  sign = (in & 0x80000000);
261
  comb = (in & 0x7ff00000) >> 20;
262
  trailing = (in & 0x000fffff);
263
 
264
  if ((comb & 0x7e0) == 0x780) {        // G0..G4 = 1111 -> Inf
265
    res = in & 0xf8000000;
266
    BID_RETURN (res);
267
  } else if ((comb & 0x7c0) == 0x7c0) { // G0..G5 = 11111 -> NaN
268
    nanb = in & 0xfe000000;
269
    exp = 0;
270
  } else {      // Normal number
271
    if ((comb & 0x600) == 0x600) {      // G0..G1 = 11 -> d0 = 8 + G4
272
      d0 = ((comb >> 6) & 1) | 8;
273
      exp = ((comb & 0x180) >> 1) | (comb & 0x3f);
274
    } else {
275
      d0 = (comb >> 6) & 0x7;
276
      exp = ((comb & 0x600) >> 3) | (comb & 0x3f);
277
    }
278
  }
279
  d1 = d2b2[(trailing >> 10) & 0x3ff];
280
  d2 = d2b[(trailing) & 0x3ff];
281
 
282
  bcoeff = d2 + d1 + (1000000 * d0);
283
  if (bcoeff < 0x800000) {
284
    res = (exp << 23) | bcoeff | sign;
285
  } else {
286
    res = (exp << 21) | sign | 0x60000000 | (bcoeff & 0x1fffff);
287
  }
288
 
289
  res |= nanb;
290
 
291
  BID_RETURN (res);
292
}
293
 
294
#if DECIMAL_CALL_BY_REFERENCE
295
void
296
dpd_to_bid64 (UINT64 * pres, UINT64 * pda) {
297
  UINT64 da = *pda;
298
#else
299
UINT64
300
dpd_to_bid64 (UINT64 da) {
301
#endif
302
  UINT64 in = *(UINT64 *) & da;
303
  UINT64 res;
304
 
305
  UINT64 sign, comb, exp;
306
  UINT64 trailing;
307
  // UINT64 d0, d1, d2, d3, d4, d5;
308
 
309
  UINT64 d1, d2;
310
  UINT32 d0, d3, d4, d5;
311
  UINT64 bcoeff;
312
  UINT64 nanb = 0;
313
 
314
//printf("arg dpd "FMT_LLX16" \n", in);
315
  sign = (in & 0x8000000000000000ull);
316
  comb = (in & 0x7ffc000000000000ull) >> 50;
317
  trailing = (in & 0x0003ffffffffffffull);
318
 
319
  if ((comb & 0x1f00) == 0x1e00) {      // G0..G4 = 1111 -> Inf
320
    res = in & 0xf800000000000000ull;
321
    BID_RETURN (res);
322
  } else if ((comb & 0x1f00) == 0x1f00) {       // G0..G5 = 11111 -> NaN
323
    nanb = in & 0xfe00000000000000ull;
324
    exp = 0;
325
    d0 = 0;
326
  } else {      // Normal number
327
    if ((comb & 0x1800) == 0x1800) {    // G0..G1 = 11 -> d0 = 8 + G4
328
      d0 = ((comb >> 8) & 1) | 8;
329
      // d0 = (comb & 0x0100 ? 9 : 8);
330
      exp = (comb & 0x600) >> 1;
331
      // exp = (comb & 0x0400 ? 1 : 0) * 0x200 + (comb & 0x0200 ? 1 : 0) * 0x100; // exp leading bits are G2..G3
332
    } else {
333
      d0 = (comb >> 8) & 0x7;
334
      exp = (comb & 0x1800) >> 3;
335
      // exp = (comb & 0x1000 ? 1 : 0) * 0x200 + (comb & 0x0800 ? 1 : 0) * 0x100; // exp loading bits are G0..G1
336
    }
337
  }
338
  d1 = d2b5[(trailing >> 40) & 0x3ff];
339
  d2 = d2b4[(trailing >> 30) & 0x3ff];
340
  d3 = d2b3[(trailing >> 20) & 0x3ff];
341
  d4 = d2b2[(trailing >> 10) & 0x3ff];
342
  d5 = d2b[(trailing) & 0x3ff];
343
 
344
  bcoeff = (d5 + d4 + d3) + d2 + d1 + (1000000000000000ull * d0);
345
  exp += (comb & 0xff);
346
  res = very_fast_get_BID64 (sign, exp, bcoeff);
347
 
348
  res |= nanb;
349
 
350
  BID_RETURN (res);
351
}
352
 
353
#if DECIMAL_CALL_BY_REFERENCE
354
void
355
bid_to_dpd128 (UINT128 * pres, UINT128 * pba) {
356
  UINT128 ba = *pba;
357
#else
358
UINT128
359
bid_to_dpd128 (UINT128 ba) {
360
#endif
361
  UINT128 res;
362
 
363
  UINT128 sign;
364
  UINT32 comb, exp;
365
  UINT128 trailing;
366
  UINT128 d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11;
367
  UINT128 bcoeff;
368
  UINT128 dcoeff;
369
  UINT64 nanb = 0;
370
 
371
  sign.w[1] = (ba.w[HIGH_128W] & 0x8000000000000000ull);
372
  sign.w[0] = 0;
373
  comb = (ba.w[HIGH_128W] & 0x7fffc00000000000ull) >> 46;
374
  trailing.w[1] = (ba.w[HIGH_128W] & 0x00003fffffffffffull);
375
  trailing.w[0] = ba.w[LOW_128W];
376
  exp = 0;
377
 
378
  if ((comb & 0x1f000) == 0x1e000) {    // G0..G4 = 1111 -> Inf
379
    res.w[HIGH_128W] = ba.w[HIGH_128W] & 0xf800000000000000ull;
380
    res.w[LOW_128W] = 0;
381
    BID_RETURN (res);
382
    // Detect NaN, and canonicalize trailing
383
  } else if ((comb & 0x1f000) == 0x1f000) {
384
    if ((trailing.w[1] > 0x0000314dc6448d93ULL) ||      // significand is non-canonical
385
        ((trailing.w[1] == 0x0000314dc6448d93ULL)
386
         && (trailing.w[0] >= 0x38c15b0a00000000ULL))
387
        // significand is non-canonical
388
      ) {
389
      trailing.w[1] = trailing.w[0] = 0ull;
390
    }
391
    bcoeff.w[1] = trailing.w[1];
392
    bcoeff.w[0] = trailing.w[0];
393
    nanb = ba.w[HIGH_128W] & 0xfe00000000000000ull;
394
    exp = 0;
395
  } else {      // Normal number
396
    if ((comb & 0x18000) == 0x18000) {  // G0..G1 = 11 -> exp is G2..G11
397
      exp = (comb >> 1) & 0x3fff;
398
      bcoeff.w[1] =
399
        ((UINT64) (8 + (comb & 1)) << (UINT64) 46) | trailing.w[1];
400
      bcoeff.w[0] = trailing.w[0];
401
    } else {
402
      exp = (comb >> 3) & 0x3fff;
403
      bcoeff.w[1] =
404
        ((UINT64) (comb & 7) << (UINT64) 46) | trailing.w[1];
405
      bcoeff.w[0] = trailing.w[0];
406
    }
407
    // Zero the coefficient if non-canonical (>= 10^34)
408
    if (bcoeff.w[1] > 0x1ed09bead87c0ull ||
409
        (bcoeff.w[1] == 0x1ed09bead87c0ull
410
         && bcoeff.w[0] >= 0x378D8E6400000000ull)) {
411
      bcoeff.w[0] = bcoeff.w[1] = 0;
412
    }
413
  }
414
  // Constant 2^128 / 1000 + 1
415
  {
416
    UINT128 t;
417
    UINT64 t2;
418
    UINT128 d1000;
419
    UINT128 b11, b10, b9, b8, b7, b6, b5, b4, b3, b2, b1;
420
    d1000.w[1] = 0x4189374BC6A7EFull;
421
    d1000.w[0] = 0x9DB22D0E56041894ull;
422
    __mul_128x128_high (b11, bcoeff, d1000);
423
    __mul_128x128_high (b10, b11, d1000);
424
    __mul_128x128_high (b9, b10, d1000);
425
    __mul_128x128_high (b8, b9, d1000);
426
    __mul_128x128_high (b7, b8, d1000);
427
    __mul_128x128_high (b6, b7, d1000);
428
    __mul_128x128_high (b5, b6, d1000);
429
    __mul_128x128_high (b4, b5, d1000);
430
    __mul_128x128_high (b3, b4, d1000);
431
    __mul_128x128_high (b2, b3, d1000);
432
    __mul_128x128_high (b1, b2, d1000);
433
 
434
 
435
    __mul_64x128_full (t2, t, 1000ull, b11);
436
    __sub_128_128 (d11, bcoeff, t);
437
    __mul_64x128_full (t2, t, 1000ull, b10);
438
    __sub_128_128 (d10, b11, t);
439
    __mul_64x128_full (t2, t, 1000ull, b9);
440
    __sub_128_128 (d9, b10, t);
441
    __mul_64x128_full (t2, t, 1000ull, b8);
442
    __sub_128_128 (d8, b9, t);
443
    __mul_64x128_full (t2, t, 1000ull, b7);
444
    __sub_128_128 (d7, b8, t);
445
    __mul_64x128_full (t2, t, 1000ull, b6);
446
    __sub_128_128 (d6, b7, t);
447
    __mul_64x128_full (t2, t, 1000ull, b5);
448
    __sub_128_128 (d5, b6, t);
449
    __mul_64x128_full (t2, t, 1000ull, b4);
450
    __sub_128_128 (d4, b5, t);
451
    __mul_64x128_full (t2, t, 1000ull, b3);
452
    __sub_128_128 (d3, b4, t);
453
    __mul_64x128_full (t2, t, 1000ull, b2);
454
    __sub_128_128 (d2, b3, t);
455
    __mul_64x128_full (t2, t, 1000ull, b1);
456
    __sub_128_128 (d1, b2, t);
457
    d0 = b1;
458
 
459
  }
460
 
461
  dcoeff.w[0] = b2d[d11.w[0]] | (b2d[d10.w[0]] << 10) |
462
    (b2d[d9.w[0]] << 20) | (b2d[d8.w[0]] << 30) | (b2d[d7.w[0]] << 40) |
463
    (b2d[d6.w[0]] << 50) | (b2d[d5.w[0]] << 60);
464
  dcoeff.w[1] =
465
    (b2d[d5.w[0]] >> 4) | (b2d[d4.w[0]] << 6) | (b2d[d3.w[0]] << 16) |
466
    (b2d[d2.w[0]] << 26) | (b2d[d1.w[0]] << 36);
467
 
468
  res.w[0] = dcoeff.w[0];
469
  if (d0.w[0] >= 8) {
470
    res.w[1] =
471
      sign.
472
      w[1] |
473
      ((0x18000 | ((exp >> 12) << 13) | ((d0.w[0] & 1) << 12) |
474
        (exp & 0xfff)) << 46) | dcoeff.w[1];
475
  } else {
476
    res.w[1] =
477
      sign.
478
      w[1] | ((((exp >> 12) << 15) | (d0.w[0] << 12) | (exp & 0xfff))
479
              << 46) | dcoeff.w[1];
480
  }
481
 
482
  res.w[1] |= nanb;
483
 
484
  BID_SWAP128 (res);
485
  BID_RETURN (res);
486
}
487
 
488
#if DECIMAL_CALL_BY_REFERENCE
489
void
490
dpd_to_bid128 (UINT128 * pres, UINT128 * pda) {
491
  UINT128 da = *pda;
492
#else
493
UINT128
494
dpd_to_bid128 (UINT128 da) {
495
#endif
496
  UINT128 in = *(UINT128 *) & da;
497
  UINT128 res;
498
 
499
  UINT128 sign;
500
  UINT64 exp, comb;
501
  UINT128 trailing;
502
  UINT64 d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11;
503
  UINT128 bcoeff;
504
  UINT64 tl, th;
505
  UINT64 nanb = 0;
506
 
507
  sign.w[1] = (in.w[HIGH_128W] & 0x8000000000000000ull);
508
  sign.w[0] = 0;
509
  comb = (in.w[HIGH_128W] & 0x7fffc00000000000ull) >> 46;
510
  trailing.w[1] = (in.w[HIGH_128W] & 0x00003fffffffffffull);
511
  trailing.w[0] = in.w[LOW_128W];
512
  exp = 0;
513
 
514
  if ((comb & 0x1f000) == 0x1e000) {    // G0..G4 = 1111 -> Inf
515
    res.w[HIGH_128W] = in.w[HIGH_128W] & 0xf800000000000000ull;
516
    res.w[LOW_128W] = 0ull;
517
    BID_RETURN (res);
518
  } else if ((comb & 0x1f000) == 0x1f000) {     // G0..G4 = 11111 -> NaN
519
    nanb = in.w[HIGH_128W] & 0xfe00000000000000ull;
520
    exp = 0;
521
    d0 = 0;
522
  } else {      // Normal number
523
    if ((comb & 0x18000) == 0x18000) {  // G0..G1 = 11 -> d0 = 8 + G4
524
      d0 = 8 + (comb & 0x01000 ? 1 : 0);
525
      exp =
526
        (comb & 0x04000 ? 1 : 0) * 0x2000 +
527
        (comb & 0x02000 ? 1 : 0) * 0x1000;
528
      // exp leading bits are G2..G3
529
    } else {
530
      d0 =
531
        4 * (comb & 0x04000 ? 1 : 0) + 2 * (comb & 0x2000 ? 1 : 0) +
532
        (comb & 0x1000 ? 1 : 0);
533
      exp =
534
        (comb & 0x10000 ? 1 : 0) * 0x2000 +
535
        (comb & 0x08000 ? 1 : 0) * 0x1000;
536
      // exp loading bits are G0..G1
537
    }
538
  }
539
 
540
  d11 = d2b[(trailing.w[0]) & 0x3ff];
541
  d10 = d2b[(trailing.w[0] >> 10) & 0x3ff];
542
  d9 = d2b[(trailing.w[0] >> 20) & 0x3ff];
543
  d8 = d2b[(trailing.w[0] >> 30) & 0x3ff];
544
  d7 = d2b[(trailing.w[0] >> 40) & 0x3ff];
545
  d6 = d2b[(trailing.w[0] >> 50) & 0x3ff];
546
  d5 = d2b[(trailing.w[0] >> 60) | ((trailing.w[1] & 0x3f) << 4)];
547
  d4 = d2b[(trailing.w[1] >> 6) & 0x3ff];
548
  d3 = d2b[(trailing.w[1] >> 16) & 0x3ff];
549
  d2 = d2b[(trailing.w[1] >> 26) & 0x3ff];
550
  d1 = d2b[(trailing.w[1] >> 36) & 0x3ff];
551
 
552
  tl =
553
    d11 + (d10 * 1000ull) + (d9 * 1000000ull) + (d8 * 1000000000ull) +
554
    (d7 * 1000000000000ull) + (d6 * 1000000000000000ull);
555
  th =
556
    d5 + (d4 * 1000ull) + (d3 * 1000000ull) + (d2 * 1000000000ull) +
557
    (d1 * 1000000000000ull) + (d0 * 1000000000000000ull);
558
  __mul_64x64_to_128 (bcoeff, th, 1000000000000000000ull);
559
  __add_128_64 (bcoeff, bcoeff, tl);
560
 
561
  if (!nanb)
562
    exp += (comb & 0xfff);
563
 
564
  res.w[0] = bcoeff.w[0];
565
  res.w[1] = (exp << 49) | sign.w[1] | bcoeff.w[1];
566
 
567
  res.w[1] |= nanb;
568
 
569
  BID_SWAP128 (res);
570
  BID_RETURN (res);
571
}
572
 
573
UINT128
574
bid_to_bid128 (UINT128 bq) {
575
  UINT128 res;
576
  UINT64 sign, comb, exp;
577
  UINT64 trailing;
578
  UINT64 bcoeff;
579
 
580
  UINT128 rq;
581
  UINT128 qcoeff;
582
  UINT64 ba, bb;
583
 
584
  ba = *((UINT64 *) & bq + HIGH_128W);
585
  bb = *((UINT64 *) & bq + LOW_128W);
586
 
587
  sign = (ba & 0x8000000000000000ull);
588
  comb = (ba & 0x7fffc00000000000ull) >> 46;
589
  trailing = (ba & 0x00003fffffffffffull);
590
 
591
  if ((comb & 0x18000) == 0x18000) {    // G0..G1 = 11 -> exp is G2..G11
592
    exp = (comb >> 1) & 0x3fff;
593
    bcoeff = ((8 + (comb & 1)) << 46) | trailing;
594
  } else {
595
    exp = (comb >> 3) & 0x3fff;
596
    bcoeff = ((comb & 7) << 46) | trailing;
597
  }
598
 
599
  if ((comb & 0x1f000) == 0x1f000) {    //NaN
600
    ba &= 0xfe003fffffffffffULL;        // make exponent 0
601
    bcoeff &= 0x00003fffffffffffull;    // NaN payloat is only T.  
602
    if ((bcoeff > 0x0000314dc6448d93ULL) ||     // significand is non-canonical
603
        ((bcoeff == 0x0000314dc6448d93ULL)
604
         && (bb >= 0x38c15b0a00000000ULL))
605
        // significand is non-canonical
606
      ) {
607
      bcoeff = 0ull;
608
      ba &= ~0x00003fffffffffffull;
609
      bb = 0ull;
610
    }
611
    *((UINT64 *) & rq + HIGH_128W) = ba;
612
    *((UINT64 *) & rq + LOW_128W) = bb;
613
    return rq;
614
  } else if ((comb & 0x1e000) == 0x1e000) {     //Inf
615
    ba &= 0xf800000000000000ULL;        // make exponent and significand 0
616
    bb = 0;
617
    *((UINT64 *) & rq + HIGH_128W) = ba;
618
    *((UINT64 *) & rq + LOW_128W) = bb;
619
    return rq;
620
  }
621
 
622
  if ((bcoeff > 0x0001ed09bead87c0ull)
623
      || ((bcoeff == 0x0001ed09bead87c0ull)
624
          && (bb > 0x378d8e63ffffffffull))) {
625
    // significand is non-canonical
626
    bcoeff = 0ull;
627
    bb = 0ull;
628
  }
629
 
630
  *((UINT64 *) & qcoeff + 1) = bcoeff;
631
  *((UINT64 *) & qcoeff + 0) = bb;
632
 
633
  get_BID128_fast (&res, sign, exp, qcoeff);
634
 
635
  BID_SWAP128 (res);
636
  return res;
637
}
638
 
639
UINT32
640
bid32_canonize (UINT32 ba) {
641
  FPSC bidrnd;
642
  unsigned int rnd = 0;
643
 
644
  UINT32 res;
645
  UINT32 sign, comb, exp;
646
  UINT32 trailing;
647
  UINT32 bcoeff;
648
 
649
  sign = (ba & 0x80000000);
650
  comb = (ba & 0x7ff00000) >> 20;
651
  trailing = (ba & 0x000fffff);
652
 
653
  if ((comb & 0x600) == 0x600) {        // G0..G1 = 11 -> exp is G2..G11
654
    exp = (comb >> 1) & 0xff;
655
    bcoeff = ((8 + (comb & 1)) << 20) | trailing;
656
  } else {
657
    exp = (comb >> 3) & 0xff;
658
    bcoeff = ((comb & 7) << 20) | trailing;
659
  }
660
 
661
  if ((comb & 0x7c0) == 0x7c0) {        //NaN
662
    ba &= 0xfe0fffff;   // make exponent 0
663
    bcoeff &= 0x000fffff;       // NaN payloat is only T.     
664
    if (bcoeff >= 1000000)
665
      ba &= 0xfff00000; //treat non-canonical significand
666
    return ba;
667
  } else if ((comb & 0x780) == 0x780) { //Inf
668
    ba &= 0xf8000000;   // make exponent and significand 0
669
    return ba;
670
  }
671
 
672
  if (bcoeff >= 10000000)
673
    bcoeff = 0;
674
  rnd = bidrnd = ROUNDING_TO_NEAREST;
675
  res = get_BID32 (sign, exp, bcoeff, rnd, &bidrnd);
676
  return res;
677
}
678
 
679
UINT64
680
bid64_canonize (UINT64 ba) {
681
  UINT64 res;
682
  UINT64 sign, comb, exp;
683
  UINT64 trailing;
684
  UINT64 bcoeff;
685
 
686
  sign = (ba & 0x8000000000000000ull);
687
  comb = (ba & 0x7ffc000000000000ull) >> 50;
688
  trailing = (ba & 0x0003ffffffffffffull);
689
 
690
 
691
  if ((comb & 0x1800) == 0x1800) {      // G0..G1 = 11 -> exp is G2..G11
692
    exp = (comb >> 1) & 0x3ff;
693
    bcoeff = ((8 + (comb & 1)) << 50) | trailing;
694
  } else {
695
    exp = (comb >> 3) & 0x3ff;
696
    bcoeff = ((comb & 7) << 50) | trailing;
697
  }
698
 
699
  if ((comb & 0x1f00) == 0x1f00) {      //NaN
700
    ba &= 0xfe03ffffffffffffULL;        // make exponent 0
701
    bcoeff &= 0x0003ffffffffffffull;    // NaN payloat is only T.  
702
    if (bcoeff >= 1000000000000000ull)
703
      ba &= 0xfe00000000000000ull;      // treat non canonical significand and zero G6-G12
704
    return ba;
705
  } else if ((comb & 0x1e00) == 0x1e00) {       //Inf
706
    ba &= 0xf800000000000000ULL;        // make exponent and significand 0
707
    return ba;
708
  }
709
 
710
  if (bcoeff >= 10000000000000000ull) {
711
    bcoeff = 0ull;
712
  }
713
  res = very_fast_get_BID64 (sign, exp, bcoeff);
714
  return res;
715
}
716
 
717
UINT128
718
bid128_canonize (UINT128 bq) {
719
  UINT128 res;
720
  UINT64 sign, comb, exp;
721
  UINT64 trailing;
722
  UINT64 bcoeff;
723
 
724
  UINT128 rq;
725
  UINT128 qcoeff;
726
  UINT64 ba, bb;
727
 
728
  ba = *((UINT64 *) & bq + HIGH_128W);
729
  bb = *((UINT64 *) & bq + LOW_128W);
730
 
731
  sign = (ba & 0x8000000000000000ull);
732
  comb = (ba & 0x7fffc00000000000ull) >> 46;
733
  trailing = (ba & 0x00003fffffffffffull);
734
 
735
  if ((comb & 0x18000) == 0x18000) {    // G0..G1 = 11 -> exp is G2..G11
736
    exp = (comb >> 1) & 0x3fff;
737
    bcoeff = ((8 + (comb & 1)) << 46) | trailing;
738
  } else {
739
    exp = (comb >> 3) & 0x3fff;
740
    bcoeff = ((comb & 7) << 46) | trailing;
741
  }
742
 
743
  if ((comb & 0x1f000) == 0x1f000) {    //NaN
744
    ba &= 0xfe003fffffffffffULL;        // make exponent 0
745
    bcoeff &= 0x00003fffffffffffull;    // NaN payload is only T.  
746
 
747
    if ((bcoeff > 0x0000314dc6448d93ULL) ||     // significand is non-canonical
748
        ((bcoeff == 0x0000314dc6448d93ULL)
749
         && (bb >= 0x38c15b0a00000000ULL))
750
        // significand is non-canonical
751
      ) {
752
      bcoeff = 0ull;
753
      ba &= ~0x00003fffffffffffull;
754
      bb = 0ull;
755
    }
756
    *((UINT64 *) & rq + HIGH_128W) = ba;
757
    *((UINT64 *) & rq + LOW_128W) = bb;
758
    return rq;
759
  } else if ((comb & 0x1e000) == 0x1e000) {     //Inf
760
    ba &= 0xf800000000000000ULL;        // make exponent and significand 0
761
    bb = 0;
762
    *((UINT64 *) & rq + HIGH_128W) = ba;
763
    *((UINT64 *) & rq + LOW_128W) = bb;
764
    return rq;
765
  }
766
 
767
  if ((bcoeff > 0x0001ed09bead87c0ull) ||       // significand is non-canonical
768
      ((bcoeff == 0x0001ed09bead87c0ull)
769
       && (bb > 0x378d8e63ffffffffull))
770
      // significand is non-canonical
771
    ) {
772
    bcoeff = 0ull;
773
    bb = 0ull;
774
  }
775
 
776
  *((UINT64 *) & qcoeff + 1) = bcoeff;
777
  *((UINT64 *) & qcoeff + 0) = bb;
778
 
779
  get_BID128_fast (&res, sign, exp, qcoeff);
780
  BID_SWAP128 (res);
781
  return res;
782
}

powered by: WebSVN 2.1.0

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