10a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant//===----------------------------------------------------------------------===// 20a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant// 30a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant// The LLVM Compiler Infrastructure 40a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant// 50a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 60a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant// Source Licenses. See LICENSE.TXT for details. 70a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant// 80a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant//===----------------------------------------------------------------------===// 90a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant 100a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant// Define a hexfloat literal emulator since we can't depend on being able to 110a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant// for hexfloat literals 120a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant 130a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant// 0x10.F5p-10 == hexfloat<double>(0x10, 0xF5, -10) 140a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant 150a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant#ifndef HEXFLOAT_H 160a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant#define HEXFLOAT_H 170a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant 180a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant#include <algorithm> 190a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant#include <cmath> 200a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant#include <climits> 210a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant 220a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnanttemplate <class T> 230a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnantclass hexfloat 240a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant{ 250a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant T value_; 260a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnantpublic: 27e80c36e27b3f8870bf44afa396aaff63c6e40b5bHoward Hinnant hexfloat(long long m1, unsigned long long m0, int exp) 280a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant { 290a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant const std::size_t n = sizeof(unsigned long long) * CHAR_BIT; 30e80c36e27b3f8870bf44afa396aaff63c6e40b5bHoward Hinnant int s = m1 < 0 ? -1 : 1; 31e80c36e27b3f8870bf44afa396aaff63c6e40b5bHoward Hinnant value_ = std::ldexp(m1 + s * std::ldexp(T(m0), -static_cast<int>(n - 32e80c36e27b3f8870bf44afa396aaff63c6e40b5bHoward Hinnant std::__clz(m0)/4*4)), exp); 330a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant } 340a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant 350a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant operator T() const {return value_;} 360a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant}; 370a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant 380a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant#endif 39