1 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
2 // See https://llvm.org/LICENSE.txt for license information.
3 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
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:
24 // This implementation sets the inexact flag spuriously.
25 // This could be avoided, but at some substantial cost.
29 result
.s
.hi
= high_addend
+ low
.d
;
30 result
.s
.lo
= (high_addend
- result
.s
.hi
) + low
.d
;