1 /* Copyright (C) 2007 Free Software Foundation, Inc.
3 This file is part of GCC.
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 2, or (at your option) any later
10 In addition to the permissions in the GNU General Public License, the
11 Free Software Foundation gives you unlimited permission to link the
12 compiled version of this file into combinations with other programs,
13 and to distribute those combinations without any restriction coming
14 from the use of this file. (The General Public License restrictions
15 do apply in other respects; for example, they cover modification of
16 the file, and distribution when not linked into a combine
19 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
20 WARRANTY; without even the implied warranty of MERCHANTABILITY or
21 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
24 You should have received a copy of the GNU General Public License
25 along with GCC; see the file COPYING. If not, write to the Free
26 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
32 /* get full 64x64bit product */
33 #define __mul_64x64_to_128(P, CX, CY) \
35 UINT64 CXH, CXL, CYH,CYL,PL,PH,PM,PM2; \
46 PM = (UINT64)((UINT32)PM)+PM2+(PL>>32); \
48 (P).w[1] = PH + (PM>>32); \
49 (P).w[0] = (PM<<32)+(UINT32)PL; \
52 /* add 64-bit value to 128-bit */
53 #define __add_128_64(R128, A128, B64) \
57 (R128).w[0] = (B64) + (A128).w[0]; \
58 if((R128).w[0] < (B64)) R64H ++; \
62 /* add 128-bit value to 128-bit (assume no carry-out) */
63 #define __add_128_128(R128, A128, B128) \
66 Q128.w[1] = (A128).w[1]+(B128).w[1]; \
67 Q128.w[0] = (B128).w[0] + (A128).w[0]; \
68 if(Q128.w[0] < (B128).w[0]) Q128.w[1] ++; \
69 (R128).w[1] = Q128.w[1]; \
70 (R128).w[0] = Q128.w[0]; \
73 #define __mul_128x128_high(Q, A, B) \
75 UINT128 ALBL, ALBH, AHBL, AHBH, QM, QM2; \
77 __mul_64x64_to_128(ALBH, (A).w[0], (B).w[1]); \
78 __mul_64x64_to_128(AHBL, (B).w[0], (A).w[1]); \
79 __mul_64x64_to_128(ALBL, (A).w[0], (B).w[0]); \
80 __mul_64x64_to_128(AHBH, (A).w[1],(B).w[1]); \
82 __add_128_128(QM, ALBH, AHBL); \
83 __add_128_64(QM2, QM, ALBL.w[1]); \
84 __add_128_64((Q), AHBH, QM2.w[1]); \
87 #include "bid2dpd_dpd2bid.h"
89 static const unsigned int dm103
[] =
90 { 0, 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000, 11000 };
92 void _bid_to_dpd32 (_Decimal32
*, _Decimal32
*);
95 _bid_to_dpd32 (_Decimal32
*pres
, _Decimal32
*px
) {
96 unsigned int sign
, coefficient_x
, exp
, dcoeff
;
97 unsigned int b2
, b1
, b0
, b01
, res
;
100 sign
= (x
& 0x80000000);
101 if ((x
& 0x60000000ul
) == 0x60000000ul
) {
102 /* special encodings */
103 if ((x
& 0x78000000ul
) == 0x78000000ul
) {
104 *pres
= x
; /* NaN or Infinity */
108 coefficient_x
= (x
& 0x001ffffful
) | 0x00800000ul
;
109 if (coefficient_x
>= 10000000) coefficient_x
= 0;
111 exp
= (x
>> 21) & 0xff;
113 exp
= (x
>> 23) & 0xff;
114 coefficient_x
= (x
& 0x007ffffful
);
116 b01
= coefficient_x
/ 1000;
117 b2
= coefficient_x
- 1000 * b01
;
119 b1
= b01
- 1000 * b0
;
120 dcoeff
= b2d
[b2
] | b2d2
[b1
];
121 if (b0
>= 8) { /* is b0 8 or 9? */
122 res
= sign
| ((0x600 | ((exp
>> 6) << 7) |
123 ((b0
& 1) << 6) | (exp
& 0x3f)) << 20) | dcoeff
;
124 } else { /* else b0 is 0..7 */
125 res
= sign
| ((((exp
>> 6) << 9) | (b0
<< 6) |
126 (exp
& 0x3f)) << 20) | dcoeff
;
131 void _dpd_to_bid32 (_Decimal32
*, _Decimal32
*);
134 _dpd_to_bid32 (_Decimal32
*pres
, _Decimal32
*px
) {
136 unsigned int sign
, exp
, bcoeff
;
138 unsigned int d0
, d1
, d2
;
141 sign
= (x
& 0x80000000);
142 trailing
= (x
& 0x000fffff);
143 if ((x
& 0x78000000) == 0x78000000) {
146 } else { /* normal number */
147 if ((x
& 0x60000000) == 0x60000000) { /* G0..G1 = 11 -> d0 = 8 + G4 */
148 d0
= d2b3
[((x
>> 26) & 1) | 8]; /* d0 = (comb & 0x0100 ? 9 : 8); */
149 exp
= (x
>> 27) & 3; /* exp leading bits are G2..G3 */
151 d0
= d2b3
[(x
>> 26) & 0x7];
152 exp
= (x
>> 29) & 3; /* exp loading bits are G0..G1 */
154 d1
= d2b2
[(trailing
>> 10) & 0x3ff];
155 d2
= d2b
[(trailing
) & 0x3ff];
156 bcoeff
= d2
+ d1
+ d0
;
157 exp
= (exp
<< 6) + ((x
>> 20) & 0x3f);
158 if (bcoeff
< (1 << 23)) {
161 r
|= (bcoeff
| sign
);
165 r
|= (sign
| 0x60000000ul
);
166 /* add coeff, without leading bits */
167 r
|= (((unsigned int) bcoeff
) & 0x1fffff);
173 void _bid_to_dpd64 (_Decimal64
*, _Decimal64
*);
176 _bid_to_dpd64 (_Decimal64
*pres
, _Decimal64
*px
) {
178 UINT64 sign
, comb
, exp
, B34
, B01
;
180 UINT64 b0
, b2
, b3
, b5
;
184 unsigned int yhi
, ylo
;
187 sign
= (x
& 0x8000000000000000ull
);
188 comb
= (x
& 0x7ffc000000000000ull
) >> 51;
189 if ((comb
& 0xf00) == 0xf00) {
192 } else { /* Normal number */
193 if ((comb
& 0xc00) == 0xc00) { /* G0..G1 = 11 -> exp is G2..G11 */
194 exp
= (comb
) & 0x3ff;
195 bcoeff
= (x
& 0x0007ffffffffffffull
) | 0x0020000000000000ull
;
197 exp
= (comb
>> 2) & 0x3ff;
198 bcoeff
= (x
& 0x001fffffffffffffull
);
200 D61
= 2305843009ull; /* Floor(2^61 / 10^9) */
201 /* Multiply the binary coefficient by ceil(2^64 / 1000), and take the upper
202 64-bits in order to compute a division by 1000. */
203 yhi
= (D61
* (UINT64
)(bcoeff
>> (UINT64
)27)) >> (UINT64
)34;
204 ylo
= bcoeff
- 1000000000ull * yhi
;
205 if (ylo
>= 1000000000) {
206 ylo
= ylo
- 1000000000;
210 B34
= ((UINT64
) ylo
* d103
) >> (32 + 8);
211 B01
= ((UINT64
) yhi
* d103
) >> (32 + 8);
212 b5
= ylo
- B34
* 1000;
213 b2
= yhi
- B01
* 1000;
214 b3
= ((UINT64
) B34
* d103
) >> (32 + 8);
215 b0
= ((UINT64
) B01
* d103
) >> (32 + 8);
216 b4
= (unsigned int) B34
- (unsigned int) b3
*1000;
217 b1
= (unsigned int) B01
- (unsigned int) dm103
[b0
];
218 dcoeff
= b2d
[b5
] | b2d2
[b4
] | b2d3
[b3
] | b2d4
[b2
] | b2d5
[b1
];
219 if (b0
>= 8) /* is b0 8 or 9? */
220 res
= sign
| ((0x1800 | ((exp
>> 8) << 9) | ((b0
& 1) << 8) |
221 (exp
& 0xff)) << 50) | dcoeff
;
222 else /* else b0 is 0..7 */
223 res
= sign
| ((((exp
>> 8) << 11) | (b0
<< 8) |
224 (exp
& 0xff)) << 50) | dcoeff
;
229 void _dpd_to_bid64 (_Decimal64
*, _Decimal64
*);
232 _dpd_to_bid64 (_Decimal64
*pres
, _Decimal64
*px
) {
234 UINT64 sign
, comb
, exp
;
237 unsigned int d3
, d4
, d5
;
241 sign
= (x
& 0x8000000000000000ull
);
242 comb
= (x
& 0x7ffc000000000000ull
) >> 50;
243 trailing
= (x
& 0x0003ffffffffffffull
);
244 if ((comb
& 0x1e00) == 0x1e00) {
245 if ((comb
& 0x1f00) == 0x1f00) { /* G0..G4 = 11111 -> NaN */
246 if (comb
& 0x0100) { /* G5 = 1 -> sNaN */
248 } else { /* G5 = 0 -> qNaN */
251 } else { /*if ((comb & 0x1e00) == 0x1e00); G0..G4 = 11110 -> INF */
255 } else { /* normal number */
256 if ((comb
& 0x1800) == 0x1800) { /* G0..G1 = 11 -> d0 = 8 + G4 */
257 d0
= d2b6
[((comb
>> 8) & 1) | 8]; /* d0 = (comb & 0x0100 ? 9 : 8); */
258 exp
= (comb
& 0x600) >> 1; /* exp = (comb & 0x0400 ? 1 : 0) * 0x200 +
259 (comb & 0x0200 ? 1 : 0) * 0x100; exp leading bits are G2..G3 */
261 d0
= d2b6
[(comb
>> 8) & 0x7];
262 exp
= (comb
& 0x1800) >> 3; /* exp = (comb & 0x1000 ? 1 : 0) * 0x200 +
263 (comb & 0x0800 ? 1 : 0) * 0x100; exp loading bits are G0..G1 */
265 d1
= d2b5
[(trailing
>> 40) & 0x3ff];
266 d2
= d2b4
[(trailing
>> 30) & 0x3ff];
267 d3
= d2b3
[(trailing
>> 20) & 0x3ff];
268 d4
= d2b2
[(trailing
>> 10) & 0x3ff];
269 d5
= d2b
[(trailing
) & 0x3ff];
270 bcoeff
= (d5
+ d4
+ d3
) + d2
+ d1
+ d0
;
271 exp
+= (comb
& 0xff);
274 if (bcoeff
< mask
) { /* check whether coefficient fits in 10*5+3 bits */
277 res
|= (bcoeff
| sign
);
282 res
= (exp
<< 51) | (sign
| 0x6000000000000000ull
);
283 /* add coeff, without leading bits */
284 mask
= (mask
>> 2) - 1;
291 void _bid_to_dpd128 (_Decimal128
*, _Decimal128
*);
294 _bid_to_dpd128 (_Decimal128
*pres
, _Decimal128
*px
) {
300 UINT128 BH
, d1018
, BT2
, BT1
;
301 UINT64 exp
, BL
, d109
;
303 UINT64 k1
, k2
, k4
, k5
, k7
, k8
, k10
, k11
;
304 unsigned int BHH32
, BLL32
, BHL32
, BLH32
, k0
, k3
, k6
, k9
, amount
;
307 sign
.w
[1] = (x
.w
[1] & 0x8000000000000000ull
);
309 comb
= (x
.w
[1] /*& 0x7fffc00000000000ull */ ) >> 46;
311 if ((comb
& 0x1e000) == 0x1e000) {
312 if ((comb
& 0x1f000) == 0x1f000) { /* G0..G4 = 11111 -> NaN */
313 if (comb
& 0x01000) { /* G5 = 1 -> sNaN */
315 } else { /* G5 = 0 -> qNaN */
318 } else { /* G0..G4 = 11110 -> INF */
321 } else { /* normal number */
322 exp
= ((x
.w
[1] & 0x7fff000000000000ull
) >> 49) & 0x3fff;
323 bcoeff
.w
[1] = (x
.w
[1] & 0x0001ffffffffffffull
);
324 bcoeff
.w
[0] = x
.w
[0];
325 d1018
= reciprocals10_128
[18];
326 __mul_128x128_high (BH
, bcoeff
, d1018
);
327 amount
= recip_scale
[18];
328 BH
.w
[0] = (BH
.w
[0] >> amount
) | (BH
.w
[1] << (64 - amount
));
329 BL
= bcoeff
.w
[0] - BH
.w
[0] * 1000000000000000000ull;
330 d109
= reciprocals10_64
[9];
331 __mul_64x64_to_128 (BT1
, BH
.w
[0], d109
);
332 BHH32
= (unsigned int) (BT1
.w
[1] >> short_recip_scale
[9]);
333 BHL32
= (unsigned int) BH
.w
[0] - BHH32
* 1000000000;
334 __mul_64x64_to_128 (BT2
, BL
, d109
);
335 BLH32
= (unsigned int) (BT2
.w
[1] >> short_recip_scale
[9]);
336 BLL32
= (unsigned int) BL
- BLH32
* 1000000000;
339 k0
= ((UINT64
) BHH32
* d106
) >> (32 + 18);
340 BHH32
-= (unsigned int) k0
*1000000;
341 k1
= ((UINT64
) BHH32
* d103
) >> (32 + 8);
342 k2
= BHH32
- (unsigned int) k1
*1000;
343 k3
= ((UINT64
) BHL32
* d106
) >> (32 + 18);
344 BHL32
-= (unsigned int) k3
*1000000;
345 k4
= ((UINT64
) BHL32
* d103
) >> (32 + 8);
346 k5
= BHL32
- (unsigned int) k4
*1000;
347 k6
= ((UINT64
) BLH32
* d106
) >> (32 + 18);
348 BLH32
-= (unsigned int) k6
*1000000;
349 k7
= ((UINT64
) BLH32
* d103
) >> (32 + 8);
350 k8
= BLH32
- (unsigned int) k7
*1000;
351 k9
= ((UINT64
) BLL32
* d106
) >> (32 + 18);
352 BLL32
-= (unsigned int) k9
*1000000;
353 k10
= ((UINT64
) BLL32
* d103
) >> (32 + 8);
354 k11
= BLL32
- (unsigned int) k10
*1000;
355 dcoeff
.w
[1] = (b2d
[k5
] >> 4) | (b2d
[k4
] << 6) | (b2d
[k3
] << 16) |
356 (b2d
[k2
] << 26) | (b2d
[k1
] << 36);
357 dcoeff
.w
[0] = b2d
[k11
] | (b2d
[k10
] << 10) | (b2d
[k9
] << 20) |
358 (b2d
[k8
] << 30) | (b2d
[k7
] << 40) | (b2d
[k6
] << 50) | (b2d
[k5
] << 60);
359 res
.w
[0] = dcoeff
.w
[0];
361 res
.w
[1] = sign
.w
[1] | ((0x18000 | ((exp
>> 12) << 13) |
362 ((k0
& 1) << 12) | (exp
& 0xfff)) << 46) | dcoeff
.w
[1];
364 res
.w
[1] = sign
.w
[1] | ((((exp
>> 12) << 15) | (k0
<< 12) |
365 (exp
& 0xfff)) << 46) | dcoeff
.w
[1];
371 void _dpd_to_bid128 (_Decimal128
*, _Decimal128
*);
374 _dpd_to_bid128 (_Decimal128
*pres
, _Decimal128
*px
) {
379 UINT64 d0
, d1
, d2
, d3
, d4
, d5
, d6
, d7
, d8
, d9
, d10
, d11
;
384 sign
.w
[1] = (x
.w
[1] & 0x8000000000000000ull
);
386 comb
= (x
.w
[1] & 0x7fffc00000000000ull
) >> 46;
387 trailing
.w
[1] = x
.w
[1];
388 trailing
.w
[0] = x
.w
[0];
389 if ((comb
& 0x1e000) == 0x1e000) {
390 if ((comb
& 0x1f000) == 0x1f000) { /* G0..G4 = 11111 -> NaN */
391 if (comb
& 0x01000) { /* G5 = 1 -> sNaN */
393 } else { /* G5 = 0 -> qNaN */
396 } else { /* G0..G4 = 11110 -> INF */
400 } else { /* Normal number */
401 if ((comb
& 0x18000) == 0x18000) { /* G0..G1 = 11 -> d0 = 8 + G4 */
402 d0
= d2b6
[8 + ((comb
& 0x01000) >> 12)];
403 exp
= (comb
& 0x06000) >> 1; /* exp leading bits are G2..G3 */
405 d0
= d2b6
[((comb
& 0x07000) >> 12)];
406 exp
= (comb
& 0x18000) >> 3; /* exp loading bits are G0..G1 */
408 d11
= d2b
[(trailing
.w
[0]) & 0x3ff];
409 d10
= d2b2
[(trailing
.w
[0] >> 10) & 0x3ff];
410 d9
= d2b3
[(trailing
.w
[0] >> 20) & 0x3ff];
411 d8
= d2b4
[(trailing
.w
[0] >> 30) & 0x3ff];
412 d7
= d2b5
[(trailing
.w
[0] >> 40) & 0x3ff];
413 d6
= d2b6
[(trailing
.w
[0] >> 50) & 0x3ff];
414 d5
= d2b
[(trailing
.w
[0] >> 60) | ((trailing
.w
[1] & 0x3f) << 4)];
415 d4
= d2b2
[(trailing
.w
[1] >> 6) & 0x3ff];
416 d3
= d2b3
[(trailing
.w
[1] >> 16) & 0x3ff];
417 d2
= d2b4
[(trailing
.w
[1] >> 26) & 0x3ff];
418 d1
= d2b5
[(trailing
.w
[1] >> 36) & 0x3ff];
419 tl
= d11
+ d10
+ d9
+ d8
+ d7
+ d6
;
420 th
= d5
+ d4
+ d3
+ d2
+ d1
+ d0
;
421 __mul_64x64_to_128 (bcoeff
, th
, 1000000000000000000ull);
422 __add_128_64 (bcoeff
, bcoeff
, tl
);
423 exp
+= (comb
& 0xfff);
424 res
.w
[0] = bcoeff
.w
[0];
425 res
.w
[1] = (exp
<< 49) | sign
.w
[1] | bcoeff
.w
[1];