1 /* This file is distributed under the University of Illinois Open Source
2 * License. See LICENSE.TXT for details.
5 /* long double __floatunditf(unsigned long long x); */
6 /* This file implements the PowerPC unsigned long long -> long double conversion */
10 long double __floatunditf(uint64_t a
) {
12 /* Begins with an exact copy of the code from __floatundidf */
14 static const double twop52
= 0x1.0p52
;
15 static const double twop84
= 0x1.0p84
;
16 static const double twop84_plus_twop52
= 0x1.00000001p84
;
18 doublebits high
= { .d
= twop84
};
19 doublebits low
= { .d
= twop52
};
21 high
.x
|= a
>> 32; /* 0x1.0p84 + high 32 bits of a */
22 low
.x
|= a
& UINT64_C(0x00000000ffffffff); /* 0x1.0p52 + low 32 bits of a */
24 const double high_addend
= high
.d
- twop84_plus_twop52
;
26 /* At this point, we have two double precision numbers
27 * high_addend and low.d, and we wish to return their sum
28 * as a canonicalized long double:
31 /* This implementation sets the inexact flag spuriously. */
32 /* This could be avoided, but at some substantial cost. */
36 result
.s
.hi
= high_addend
+ low
.d
;
37 result
.s
.lo
= (high_addend
- result
.s
.hi
) + low
.d
;