1*58b9f456SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 2*58b9f456SAndroid Build Coastguard Worker // 3*58b9f456SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*58b9f456SAndroid Build Coastguard Worker // 5*58b9f456SAndroid Build Coastguard Worker // This file is dual licensed under the MIT and the University of Illinois Open 6*58b9f456SAndroid Build Coastguard Worker // Source Licenses. See LICENSE.TXT for details. 7*58b9f456SAndroid Build Coastguard Worker // 8*58b9f456SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*58b9f456SAndroid Build Coastguard Worker 10*58b9f456SAndroid Build Coastguard Worker // Define a hexfloat literal emulator since we can't depend on being able to 11*58b9f456SAndroid Build Coastguard Worker // for hexfloat literals 12*58b9f456SAndroid Build Coastguard Worker 13*58b9f456SAndroid Build Coastguard Worker // 0x10.F5p-10 == hexfloat<double>(0x10, 0xF5, -10) 14*58b9f456SAndroid Build Coastguard Worker 15*58b9f456SAndroid Build Coastguard Worker #ifndef HEXFLOAT_H 16*58b9f456SAndroid Build Coastguard Worker #define HEXFLOAT_H 17*58b9f456SAndroid Build Coastguard Worker 18*58b9f456SAndroid Build Coastguard Worker #include <cmath> 19*58b9f456SAndroid Build Coastguard Worker #include <climits> 20*58b9f456SAndroid Build Coastguard Worker 21*58b9f456SAndroid Build Coastguard Worker template <class T> 22*58b9f456SAndroid Build Coastguard Worker class hexfloat 23*58b9f456SAndroid Build Coastguard Worker { 24*58b9f456SAndroid Build Coastguard Worker T value_; 25*58b9f456SAndroid Build Coastguard Worker CountLeadingZeros(unsigned long long n)26*58b9f456SAndroid Build Coastguard Worker static int CountLeadingZeros(unsigned long long n) { 27*58b9f456SAndroid Build Coastguard Worker const std::size_t Digits = sizeof(unsigned long long) * CHAR_BIT; 28*58b9f456SAndroid Build Coastguard Worker const unsigned long long TopBit = 1ull << (Digits - 1); 29*58b9f456SAndroid Build Coastguard Worker if (n == 0) return Digits; 30*58b9f456SAndroid Build Coastguard Worker int LeadingZeros = 0; 31*58b9f456SAndroid Build Coastguard Worker while ((n & TopBit) == 0) { 32*58b9f456SAndroid Build Coastguard Worker ++LeadingZeros; 33*58b9f456SAndroid Build Coastguard Worker n <<= 1; 34*58b9f456SAndroid Build Coastguard Worker } 35*58b9f456SAndroid Build Coastguard Worker return LeadingZeros; 36*58b9f456SAndroid Build Coastguard Worker } 37*58b9f456SAndroid Build Coastguard Worker 38*58b9f456SAndroid Build Coastguard Worker public: hexfloat(long long m1,unsigned long long m0,int exp)39*58b9f456SAndroid Build Coastguard Worker hexfloat(long long m1, unsigned long long m0, int exp) 40*58b9f456SAndroid Build Coastguard Worker { 41*58b9f456SAndroid Build Coastguard Worker const std::size_t Digits = sizeof(unsigned long long) * CHAR_BIT; 42*58b9f456SAndroid Build Coastguard Worker int s = m1 < 0 ? -1 : 1; 43*58b9f456SAndroid Build Coastguard Worker int exp2 = -static_cast<int>(Digits - CountLeadingZeros(m0)/4*4); 44*58b9f456SAndroid Build Coastguard Worker value_ = std::ldexp(m1 + s * std::ldexp(T(m0), exp2), exp); 45*58b9f456SAndroid Build Coastguard Worker } 46*58b9f456SAndroid Build Coastguard Worker T()47*58b9f456SAndroid Build Coastguard Worker operator T() const {return value_;} 48*58b9f456SAndroid Build Coastguard Worker }; 49*58b9f456SAndroid Build Coastguard Worker 50*58b9f456SAndroid Build Coastguard Worker #endif 51