1 /* Copyright (C) 2007, 2009 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 3, or (at your option) any later
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
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.
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/>. */
27 /* get full 64x64bit product */
28 #define __mul_64x64_to_128(P, CX, CY) \
30 UINT64 CXH, CXL, CYH,CYL,PL,PH,PM,PM2; \
41 PM = (UINT64)((UINT32)PM)+PM2+(PL>>32); \
43 (P).w[1] = PH + (PM>>32); \
44 (P).w[0] = (PM<<32)+(UINT32)PL; \
47 /* add 64-bit value to 128-bit */
48 #define __add_128_64(R128, A128, B64) \
52 (R128).w[0] = (B64) + (A128).w[0]; \
53 if((R128).w[0] < (B64)) R64H ++; \
57 /* add 128-bit value to 128-bit (assume no carry-out) */
58 #define __add_128_128(R128, A128, B128) \
61 Q128.w[1] = (A128).w[1]+(B128).w[1]; \
62 Q128.w[0] = (B128).w[0] + (A128).w[0]; \
63 if(Q128.w[0] < (B128).w[0]) Q128.w[1] ++; \
64 (R128).w[1] = Q128.w[1]; \
65 (R128).w[0] = Q128.w[0]; \
68 #define __mul_128x128_high(Q, A, B) \
70 UINT128 ALBL, ALBH, AHBL, AHBH, QM, QM2; \
72 __mul_64x64_to_128(ALBH, (A).w[0], (B).w[1]); \
73 __mul_64x64_to_128(AHBL, (B).w[0], (A).w[1]); \
74 __mul_64x64_to_128(ALBL, (A).w[0], (B).w[0]); \
75 __mul_64x64_to_128(AHBH, (A).w[1],(B).w[1]); \
77 __add_128_128(QM, ALBH, AHBL); \
78 __add_128_64(QM2, QM, ALBL.w[1]); \
79 __add_128_64((Q), AHBH, QM2.w[1]); \
82 #include "bid2dpd_dpd2bid.h"
84 static const unsigned int dm103
[] =
85 { 0, 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000, 11000 };
87 void _bid_to_dpd32 (_Decimal32
*, _Decimal32
*);
90 _bid_to_dpd32 (_Decimal32
*pres
, _Decimal32
*px
) {
91 unsigned int sign
, coefficient_x
, exp
, dcoeff
;
92 unsigned int b2
, b1
, b0
, b01
, res
;
95 sign
= (x
& 0x80000000);
96 if ((x
& 0x60000000ul
) == 0x60000000ul
) {
97 /* special encodings */
98 if ((x
& 0x78000000ul
) == 0x78000000ul
) {
99 *pres
= x
; /* NaN or Infinity */
103 coefficient_x
= (x
& 0x001ffffful
) | 0x00800000ul
;
104 if (coefficient_x
>= 10000000) coefficient_x
= 0;
106 exp
= (x
>> 21) & 0xff;
108 exp
= (x
>> 23) & 0xff;
109 coefficient_x
= (x
& 0x007ffffful
);
111 b01
= coefficient_x
/ 1000;
112 b2
= coefficient_x
- 1000 * b01
;
114 b1
= b01
- 1000 * b0
;
115 dcoeff
= b2d
[b2
] | b2d2
[b1
];
116 if (b0
>= 8) { /* is b0 8 or 9? */
117 res
= sign
| ((0x600 | ((exp
>> 6) << 7) |
118 ((b0
& 1) << 6) | (exp
& 0x3f)) << 20) | dcoeff
;
119 } else { /* else b0 is 0..7 */
120 res
= sign
| ((((exp
>> 6) << 9) | (b0
<< 6) |
121 (exp
& 0x3f)) << 20) | dcoeff
;
126 void _dpd_to_bid32 (_Decimal32
*, _Decimal32
*);
129 _dpd_to_bid32 (_Decimal32
*pres
, _Decimal32
*px
) {
131 unsigned int sign
, exp
, bcoeff
;
133 unsigned int d0
, d1
, d2
;
136 sign
= (x
& 0x80000000);
137 trailing
= (x
& 0x000fffff);
138 if ((x
& 0x78000000) == 0x78000000) {
141 } else { /* normal number */
142 if ((x
& 0x60000000) == 0x60000000) { /* G0..G1 = 11 -> d0 = 8 + G4 */
143 d0
= d2b3
[((x
>> 26) & 1) | 8]; /* d0 = (comb & 0x0100 ? 9 : 8); */
144 exp
= (x
>> 27) & 3; /* exp leading bits are G2..G3 */
146 d0
= d2b3
[(x
>> 26) & 0x7];
147 exp
= (x
>> 29) & 3; /* exp loading bits are G0..G1 */
149 d1
= d2b2
[(trailing
>> 10) & 0x3ff];
150 d2
= d2b
[(trailing
) & 0x3ff];
151 bcoeff
= d2
+ d1
+ d0
;
152 exp
= (exp
<< 6) + ((x
>> 20) & 0x3f);
153 if (bcoeff
< (1 << 23)) {
156 r
|= (bcoeff
| sign
);
160 r
|= (sign
| 0x60000000ul
);
161 /* add coeff, without leading bits */
162 r
|= (((unsigned int) bcoeff
) & 0x1fffff);
168 void _bid_to_dpd64 (_Decimal64
*, _Decimal64
*);
171 _bid_to_dpd64 (_Decimal64
*pres
, _Decimal64
*px
) {
173 UINT64 sign
, comb
, exp
, B34
, B01
;
175 UINT64 b0
, b2
, b3
, b5
;
179 unsigned int yhi
, ylo
;
182 sign
= (x
& 0x8000000000000000ull
);
183 comb
= (x
& 0x7ffc000000000000ull
) >> 51;
184 if ((comb
& 0xf00) == 0xf00) {
187 } else { /* Normal number */
188 if ((comb
& 0xc00) == 0xc00) { /* G0..G1 = 11 -> exp is G2..G11 */
189 exp
= (comb
) & 0x3ff;
190 bcoeff
= (x
& 0x0007ffffffffffffull
) | 0x0020000000000000ull
;
192 exp
= (comb
>> 2) & 0x3ff;
193 bcoeff
= (x
& 0x001fffffffffffffull
);
195 D61
= 2305843009ull; /* Floor(2^61 / 10^9) */
196 /* Multiply the binary coefficient by ceil(2^64 / 1000), and take the upper
197 64-bits in order to compute a division by 1000. */
198 yhi
= (D61
* (UINT64
)(bcoeff
>> (UINT64
)27)) >> (UINT64
)34;
199 ylo
= bcoeff
- 1000000000ull * yhi
;
200 if (ylo
>= 1000000000) {
201 ylo
= ylo
- 1000000000;
205 B34
= ((UINT64
) ylo
* d103
) >> (32 + 8);
206 B01
= ((UINT64
) yhi
* d103
) >> (32 + 8);
207 b5
= ylo
- B34
* 1000;
208 b2
= yhi
- B01
* 1000;
209 b3
= ((UINT64
) B34
* d103
) >> (32 + 8);
210 b0
= ((UINT64
) B01
* d103
) >> (32 + 8);
211 b4
= (unsigned int) B34
- (unsigned int) b3
*1000;
212 b1
= (unsigned int) B01
- (unsigned int) dm103
[b0
];
213 dcoeff
= b2d
[b5
] | b2d2
[b4
] | b2d3
[b3
] | b2d4
[b2
] | b2d5
[b1
];
214 if (b0
>= 8) /* is b0 8 or 9? */
215 res
= sign
| ((0x1800 | ((exp
>> 8) << 9) | ((b0
& 1) << 8) |
216 (exp
& 0xff)) << 50) | dcoeff
;
217 else /* else b0 is 0..7 */
218 res
= sign
| ((((exp
>> 8) << 11) | (b0
<< 8) |
219 (exp
& 0xff)) << 50) | dcoeff
;
224 void _dpd_to_bid64 (_Decimal64
*, _Decimal64
*);
227 _dpd_to_bid64 (_Decimal64
*pres
, _Decimal64
*px
) {
229 UINT64 sign
, comb
, exp
;
232 unsigned int d3
, d4
, d5
;
236 sign
= (x
& 0x8000000000000000ull
);
237 comb
= (x
& 0x7ffc000000000000ull
) >> 50;
238 trailing
= (x
& 0x0003ffffffffffffull
);
239 if ((comb
& 0x1e00) == 0x1e00) {
240 if ((comb
& 0x1f00) == 0x1f00) { /* G0..G4 = 11111 -> NaN */
241 if (comb
& 0x0100) { /* G5 = 1 -> sNaN */
243 } else { /* G5 = 0 -> qNaN */
246 } else { /*if ((comb & 0x1e00) == 0x1e00); G0..G4 = 11110 -> INF */
250 } else { /* normal number */
251 if ((comb
& 0x1800) == 0x1800) { /* G0..G1 = 11 -> d0 = 8 + G4 */
252 d0
= d2b6
[((comb
>> 8) & 1) | 8]; /* d0 = (comb & 0x0100 ? 9 : 8); */
253 exp
= (comb
& 0x600) >> 1; /* exp = (comb & 0x0400 ? 1 : 0) * 0x200 +
254 (comb & 0x0200 ? 1 : 0) * 0x100; exp leading bits are G2..G3 */
256 d0
= d2b6
[(comb
>> 8) & 0x7];
257 exp
= (comb
& 0x1800) >> 3; /* exp = (comb & 0x1000 ? 1 : 0) * 0x200 +
258 (comb & 0x0800 ? 1 : 0) * 0x100; exp loading bits are G0..G1 */
260 d1
= d2b5
[(trailing
>> 40) & 0x3ff];
261 d2
= d2b4
[(trailing
>> 30) & 0x3ff];
262 d3
= d2b3
[(trailing
>> 20) & 0x3ff];
263 d4
= d2b2
[(trailing
>> 10) & 0x3ff];
264 d5
= d2b
[(trailing
) & 0x3ff];
265 bcoeff
= (d5
+ d4
+ d3
) + d2
+ d1
+ d0
;
266 exp
+= (comb
& 0xff);
269 if (bcoeff
< mask
) { /* check whether coefficient fits in 10*5+3 bits */
272 res
|= (bcoeff
| sign
);
277 res
= (exp
<< 51) | (sign
| 0x6000000000000000ull
);
278 /* add coeff, without leading bits */
279 mask
= (mask
>> 2) - 1;
286 void _bid_to_dpd128 (_Decimal128
*, _Decimal128
*);
289 _bid_to_dpd128 (_Decimal128
*pres
, _Decimal128
*px
) {
295 UINT128 BH
, d1018
, BT2
, BT1
;
296 UINT64 exp
, BL
, d109
;
298 UINT64 k1
, k2
, k4
, k5
, k7
, k8
, k10
, k11
;
299 unsigned int BHH32
, BLL32
, BHL32
, BLH32
, k0
, k3
, k6
, k9
, amount
;
302 sign
.w
[1] = (x
.w
[1] & 0x8000000000000000ull
);
304 comb
= (x
.w
[1] /*& 0x7fffc00000000000ull */ ) >> 46;
306 if ((comb
& 0x1e000) == 0x1e000) {
307 if ((comb
& 0x1f000) == 0x1f000) { /* G0..G4 = 11111 -> NaN */
308 if (comb
& 0x01000) { /* G5 = 1 -> sNaN */
310 } else { /* G5 = 0 -> qNaN */
313 } else { /* G0..G4 = 11110 -> INF */
316 } else { /* normal number */
317 exp
= ((x
.w
[1] & 0x7fff000000000000ull
) >> 49) & 0x3fff;
318 bcoeff
.w
[1] = (x
.w
[1] & 0x0001ffffffffffffull
);
319 bcoeff
.w
[0] = x
.w
[0];
320 d1018
= reciprocals10_128
[18];
321 __mul_128x128_high (BH
, bcoeff
, d1018
);
322 amount
= recip_scale
[18];
323 BH
.w
[0] = (BH
.w
[0] >> amount
) | (BH
.w
[1] << (64 - amount
));
324 BL
= bcoeff
.w
[0] - BH
.w
[0] * 1000000000000000000ull;
325 d109
= reciprocals10_64
[9];
326 __mul_64x64_to_128 (BT1
, BH
.w
[0], d109
);
327 BHH32
= (unsigned int) (BT1
.w
[1] >> short_recip_scale
[9]);
328 BHL32
= (unsigned int) BH
.w
[0] - BHH32
* 1000000000;
329 __mul_64x64_to_128 (BT2
, BL
, d109
);
330 BLH32
= (unsigned int) (BT2
.w
[1] >> short_recip_scale
[9]);
331 BLL32
= (unsigned int) BL
- BLH32
* 1000000000;
334 k0
= ((UINT64
) BHH32
* d106
) >> (32 + 18);
335 BHH32
-= (unsigned int) k0
*1000000;
336 k1
= ((UINT64
) BHH32
* d103
) >> (32 + 8);
337 k2
= BHH32
- (unsigned int) k1
*1000;
338 k3
= ((UINT64
) BHL32
* d106
) >> (32 + 18);
339 BHL32
-= (unsigned int) k3
*1000000;
340 k4
= ((UINT64
) BHL32
* d103
) >> (32 + 8);
341 k5
= BHL32
- (unsigned int) k4
*1000;
342 k6
= ((UINT64
) BLH32
* d106
) >> (32 + 18);
343 BLH32
-= (unsigned int) k6
*1000000;
344 k7
= ((UINT64
) BLH32
* d103
) >> (32 + 8);
345 k8
= BLH32
- (unsigned int) k7
*1000;
346 k9
= ((UINT64
) BLL32
* d106
) >> (32 + 18);
347 BLL32
-= (unsigned int) k9
*1000000;
348 k10
= ((UINT64
) BLL32
* d103
) >> (32 + 8);
349 k11
= BLL32
- (unsigned int) k10
*1000;
350 dcoeff
.w
[1] = (b2d
[k5
] >> 4) | (b2d
[k4
] << 6) | (b2d
[k3
] << 16) |
351 (b2d
[k2
] << 26) | (b2d
[k1
] << 36);
352 dcoeff
.w
[0] = b2d
[k11
] | (b2d
[k10
] << 10) | (b2d
[k9
] << 20) |
353 (b2d
[k8
] << 30) | (b2d
[k7
] << 40) | (b2d
[k6
] << 50) | (b2d
[k5
] << 60);
354 res
.w
[0] = dcoeff
.w
[0];
356 res
.w
[1] = sign
.w
[1] | ((0x18000 | ((exp
>> 12) << 13) |
357 ((k0
& 1) << 12) | (exp
& 0xfff)) << 46) | dcoeff
.w
[1];
359 res
.w
[1] = sign
.w
[1] | ((((exp
>> 12) << 15) | (k0
<< 12) |
360 (exp
& 0xfff)) << 46) | dcoeff
.w
[1];
366 void _dpd_to_bid128 (_Decimal128
*, _Decimal128
*);
369 _dpd_to_bid128 (_Decimal128
*pres
, _Decimal128
*px
) {
374 UINT64 d0
, d1
, d2
, d3
, d4
, d5
, d6
, d7
, d8
, d9
, d10
, d11
;
379 sign
.w
[1] = (x
.w
[1] & 0x8000000000000000ull
);
381 comb
= (x
.w
[1] & 0x7fffc00000000000ull
) >> 46;
382 trailing
.w
[1] = x
.w
[1];
383 trailing
.w
[0] = x
.w
[0];
384 if ((comb
& 0x1e000) == 0x1e000) {
385 if ((comb
& 0x1f000) == 0x1f000) { /* G0..G4 = 11111 -> NaN */
386 if (comb
& 0x01000) { /* G5 = 1 -> sNaN */
388 } else { /* G5 = 0 -> qNaN */
391 } else { /* G0..G4 = 11110 -> INF */
395 } else { /* Normal number */
396 if ((comb
& 0x18000) == 0x18000) { /* G0..G1 = 11 -> d0 = 8 + G4 */
397 d0
= d2b6
[8 + ((comb
& 0x01000) >> 12)];
398 exp
= (comb
& 0x06000) >> 1; /* exp leading bits are G2..G3 */
400 d0
= d2b6
[((comb
& 0x07000) >> 12)];
401 exp
= (comb
& 0x18000) >> 3; /* exp loading bits are G0..G1 */
403 d11
= d2b
[(trailing
.w
[0]) & 0x3ff];
404 d10
= d2b2
[(trailing
.w
[0] >> 10) & 0x3ff];
405 d9
= d2b3
[(trailing
.w
[0] >> 20) & 0x3ff];
406 d8
= d2b4
[(trailing
.w
[0] >> 30) & 0x3ff];
407 d7
= d2b5
[(trailing
.w
[0] >> 40) & 0x3ff];
408 d6
= d2b6
[(trailing
.w
[0] >> 50) & 0x3ff];
409 d5
= d2b
[(trailing
.w
[0] >> 60) | ((trailing
.w
[1] & 0x3f) << 4)];
410 d4
= d2b2
[(trailing
.w
[1] >> 6) & 0x3ff];
411 d3
= d2b3
[(trailing
.w
[1] >> 16) & 0x3ff];
412 d2
= d2b4
[(trailing
.w
[1] >> 26) & 0x3ff];
413 d1
= d2b5
[(trailing
.w
[1] >> 36) & 0x3ff];
414 tl
= d11
+ d10
+ d9
+ d8
+ d7
+ d6
;
415 th
= d5
+ d4
+ d3
+ d2
+ d1
+ d0
;
416 __mul_64x64_to_128 (bcoeff
, th
, 1000000000000000000ull);
417 __add_128_64 (bcoeff
, bcoeff
, tl
);
418 exp
+= (comb
& 0xfff);
419 res
.w
[0] = bcoeff
.w
[0];
420 res
.w
[1] = (exp
<< 49) | sign
.w
[1] | bcoeff
.w
[1];