1 #pragma once 2 // ieee754.hpp: Oracle Solaris Studio specific manipulation functions for IEEE-754 native types 3 // 4 // Copyright (C) 2017-2021 Stillwater Supercomputing, Inc. 5 // 6 // This file is part of the universal numbers project, which is released under an MIT Open Source license. 7 8 #if defined(__SUNPRO_C) || defined(__SUNPRO_CC) 9 /* Oracle Solaris Studio. ----------------------------------- */ 10 11 namespace sw::universal { 12 13 // specializations for IEEE-754 parameters Oracle Solaris Studio 14 template<> 15 class ieee754_parameter<float> { 16 public: 17 static constexpr int nbits = 32; 18 static constexpr uint64_t smask = 0x8000'0000ull; 19 static constexpr int ebits = 8; 20 static constexpr int bias = 127; 21 static constexpr uint64_t emask = 0x7F80'0000ull; 22 static constexpr uint64_t eallset = 0xFFull; 23 static constexpr int fbits = 23; 24 static constexpr uint64_t hmask = 0x0080'0000ull; 25 static constexpr uint64_t fmask = 0x007F'FFFFull; 26 static constexpr uint64_t hfmask = 0x00FF'FFFFull; 27 static constexpr uint64_t fmsb = 0x0040'0000ull; 28 static constexpr uint64_t qnanmask = 0x7FC0'0000ull; 29 static constexpr uint64_t snanmask = 0x7FC0'0001ull; 30 }; 31 template<> 32 class ieee754_parameter<double> { 33 public: 34 static constexpr int nbits = 64; 35 static constexpr uint64_t smask = 0x8000'0000'0000'0000ull; 36 static constexpr int ebits = 11; 37 static constexpr int bias = 1023; 38 static constexpr uint64_t emask = 0x7FF0'0000'0000'0000ull; 39 static constexpr uint64_t eallset = 0x7FF; 40 static constexpr int fbits = 52; 41 static constexpr uint64_t hmask = 0x0010'0000'0000'0000ull; 42 static constexpr uint64_t fmask = 0x000F'FFFF'FFFF'FFFFull; 43 static constexpr uint64_t hfmask = 0x001F'FFFF'FFFF'FFFFull; 44 static constexpr uint64_t fmsb = 0x0008'0000'0000'0000ull; 45 static constexpr uint64_t qnanmask = 0x7FF8'0000'0000'0000ull; 46 static constexpr uint64_t snanmask = 0x7FF0'0000'0000'0001ull; 47 }; 48 49 // MSVC long double = double precision 50 // IEEE-754 parameter constexpressions for long double 51 template<> 52 class ieee754_parameter<long double> { 53 public: 54 static constexpr int nbits = 64; 55 static constexpr uint64_t smask = 0x8000'0000'0000'0000ull; 56 static constexpr int ebits = 11; 57 static constexpr int bias = 1023; 58 static constexpr uint64_t emask = 0x7FF0'0000'0000'0000ull; 59 static constexpr uint64_t eallset = 0x7FF; 60 static constexpr int fbits = 52; 61 static constexpr uint64_t hmask = 0x0010'0000'0000'0000ull; 62 static constexpr uint64_t fmask = 0x000F'FFFF'FFFF'FFFFull; 63 static constexpr uint64_t hfmask = 0x001F'FFFF'FFFF'FFFFull; 64 static constexpr uint64_t fmsb = 0x0008'0000'0000'0000ull; 65 static constexpr uint64_t qnanmask = 0x7FF8'0000'0000'0000ull; 66 static constexpr uint64_t snanmask = 0x7FF0'0000'0000'0001ull; 67 }; 68 69 70 } // namespace sw::universal 71 72 #endif // Oracle Solaris Studio 73 74