19 #ifndef RAPIDJSON_DIYFP_H_
20 #define RAPIDJSON_DIYFP_H_
22 #include "../rapidjson.h"
24 #if defined(_MSC_VER) && defined(_M_AMD64)
26 #pragma intrinsic(_BitScanReverse64)
27 #pragma intrinsic(_umul128)
35 RAPIDJSON_DIAG_OFF(effc++)
40 RAPIDJSON_DIAG_OFF(padded)
71 #if defined(_MSC_VER) && defined(_M_AMD64)
76 return DiyFp(h,
e + rhs.
e + 64);
77 #elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && defined(__x86_64__)
78 __extension__
typedef unsigned __int128 uint128;
79 uint128 p =
static_cast<uint128
>(
f) *
static_cast<uint128
>(rhs.
f);
84 return DiyFp(h,
e + rhs.
e + 64);
95 uint64_t tmp = (bd >> 32) + (ad & M32) + (bc & M32);
97 return DiyFp(ac + (ad >> 32) + (bc >> 32) + (tmp >> 32),
e + rhs.
e + 64);
102 #if defined(_MSC_VER) && defined(_M_AMD64)
104 _BitScanReverse64(&index,
f);
105 return DiyFp(
f << (63 - index),
e - (63 - index));
106 #elif defined(__GNUC__) && __GNUC__ >= 4
107 int s = __builtin_clzll(
f);
111 while (!(res.
f & (
static_cast<uint64_t>(1) << 63))) {
131 DiyFp pl =
DiyFp((
f << 1) + 1,
e - 1).NormalizeBoundary();
133 mi.
f <<= mi.
e - pl.
e;
166 static const uint64_t kCachedPowers_F[] = {
212 static const int16_t kCachedPowers_E[] = {
213 -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980,
214 -954, -927, -901, -874, -847, -821, -794, -768, -741, -715,
215 -688, -661, -635, -608, -582, -555, -529, -502, -475, -449,
216 -422, -396, -369, -343, -316, -289, -263, -236, -210, -183,
217 -157, -130, -103, -77, -50, -24, 3, 30, 56, 83,
218 109, 136, 162, 189, 216, 242, 269, 295, 322, 348,
219 375, 402, 428, 455, 481, 508, 534, 561, 588, 614,
220 641, 667, 694, 720, 747, 774, 800, 827, 853, 880,
221 907, 933, 960, 986, 1013, 1039, 1066
223 return DiyFp(kCachedPowers_F[index], kCachedPowers_E[index]);
229 double dk = (-61 - e) * 0.30102999566398114 + 347;
230 int k =
static_cast<int>(dk);
234 unsigned index =
static_cast<unsigned>((k >> 3) + 1);
235 *K = -(-348 +
static_cast<int>(index << 3));
241 unsigned index = (
static_cast<unsigned>(exp) + 348u) / 8u;
242 *outExp = -348 +
static_cast<int>(index) * 8;
252 RAPIDJSON_DIAG_OFF(padded)
258 #endif // RAPIDJSON_DIYFP_H_