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