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