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