1 //===----------------------------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // Define a hexfloat literal emulator since we can't depend on being able to
10 // for hexfloat literals
12 // 0x10.F5p-10 == hexfloat<double>(0x10, 0xF5, -10)
25 static int CountLeadingZeros(unsigned long long n
) {
26 const std::size_t Digits
= sizeof(unsigned long long) * CHAR_BIT
;
27 const unsigned long long TopBit
= 1ull << (Digits
- 1);
28 if (n
== 0) return Digits
;
30 while ((n
& TopBit
) == 0) {
38 hexfloat(long long m1
, unsigned long long m0
, int exp
)
40 const std::size_t Digits
= sizeof(unsigned long long) * CHAR_BIT
;
41 int s
= m1
< 0 ? -1 : 1;
42 int exp2
= -static_cast<int>(Digits
- CountLeadingZeros(m0
)/4*4);
43 value_
= std::ldexp(m1
+ s
* std::ldexp(T(m0
), exp2
), exp
);
46 operator T() const {return value_
;}