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)
26 static int CountLeadingZeros(unsigned long long n
) {
27 const std::size_t Digits
= sizeof(unsigned long long) * CHAR_BIT
;
28 const unsigned long long TopBit
= 1ull << (Digits
- 1);
29 if (n
== 0) return Digits
;
31 while ((n
& TopBit
) == 0) {
39 hexfloat(long long m1
, unsigned long long m0
, int exp
)
41 const std::size_t Digits
= sizeof(unsigned long long) * CHAR_BIT
;
42 int s
= m1
< 0 ? -1 : 1;
43 int exp2
= -static_cast<int>(Digits
- CountLeadingZeros(m0
)/4*4);
44 value_
= std::ldexp(m1
+ s
* std::ldexp(T(m0
), exp2
), exp
);
47 operator T() const {return value_
;}