19 #ifndef RAPIDJSON_DIYFP_H_
20 #define RAPIDJSON_DIYFP_H_
22 #include "../rapidjson.h"
26 #if defined(_MSC_VER) && defined(_M_AMD64) && !defined(__INTEL_COMPILER)
28 #if !defined(_ARM64EC_)
29 #pragma intrinsic(_umul128)
31 #pragma comment(lib,"softintrin")
40 RAPIDJSON_DIAG_OFF(effc++)
45 RAPIDJSON_DIAG_OFF(padded)
76 #if defined(_MSC_VER) && defined(_M_AMD64)
81 return DiyFp(h,
e + rhs.
e + 64);
82 #elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__)
83 __extension__
typedef unsigned __int128 uint128;
84 uint128 p =
static_cast<uint128
>(
f) *
static_cast<uint128
>(rhs.
f);
89 return DiyFp(h,
e + rhs.
e + 64);
100 uint64_t tmp = (bd >> 32) + (ad & M32) + (bc & M32);
102 return DiyFp(ac + (ad >> 32) + (bc >> 32) + (tmp >> 32),
e + rhs.
e + 64);
107 int s =
static_cast<int>(
clzll(
f));
123 DiyFp pl =
DiyFp((
f << 1) + 1,
e - 1).NormalizeBoundary();
125 mi.
f <<= mi.
e - pl.
e;
143 return std::numeric_limits<double>::infinity();
167 static const uint64_t kCachedPowers_F[] = {
213 static const int16_t kCachedPowers_E[] = {
214 -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980,
215 -954, -927, -901, -874, -847, -821, -794, -768, -741, -715,
216 -688, -661, -635, -608, -582, -555, -529, -502, -475, -449,
217 -422, -396, -369, -343, -316, -289, -263, -236, -210, -183,
218 -157, -130, -103, -77, -50, -24, 3, 30, 56, 83,
219 109, 136, 162, 189, 216, 242, 269, 295, 322, 348,
220 375, 402, 428, 455, 481, 508, 534, 561, 588, 614,
221 641, 667, 694, 720, 747, 774, 800, 827, 853, 880,
222 907, 933, 960, 986, 1013, 1039, 1066
225 return DiyFp(kCachedPowers_F[index], kCachedPowers_E[index]);
231 double dk = (-61 - e) * 0.30102999566398114 + 347;
232 int k =
static_cast<int>(dk);
236 unsigned index =
static_cast<unsigned>((k >> 3) + 1);
237 *K = -(-348 +
static_cast<int>(index << 3));
244 unsigned index =
static_cast<unsigned>(exp + 348) / 8u;
245 *outExp = -348 +
static_cast<int>(index) * 8;
255 RAPIDJSON_DIAG_OFF(padded)
261 #endif // RAPIDJSON_DIYFP_H_