1 /* This file is distributed under the University of Illinois Open Source
2 * License. See LICENSE.TXT for details.
5 /* long double __floatditf(long long x); */
6 /* This file implements the PowerPC long long -> long double conversion */
10 long double __floatditf(int64_t a
) {
12 static const double twop32
= 0x1.0p32
;
13 static const double twop52
= 0x1.0p52
;
15 doublebits low
= { .d
= twop52
};
16 low
.x
|= a
& UINT64_C(0x00000000ffffffff); /* 0x1.0p52 + low 32 bits of a. */
18 const double high_addend
= (double)((int32_t)(a
>> 32))*twop32
- twop52
;
20 /* At this point, we have two double precision numbers
21 * high_addend and low.d, and we wish to return their sum
22 * as a canonicalized long double:
25 /* This implementation sets the inexact flag spuriously.
26 * This could be avoided, but at some substantial cost.
31 result
.s
.hi
= high_addend
+ low
.d
;
32 result
.s
.lo
= (high_addend
- result
.s
.hi
) + low
.d
;