1//===-- Range reduction for double precision sin/cos/tan --------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_LIBC_SRC___SUPPORT_MATH_RANGE_REDUCTION_DOUBLE_NOFMA_H
10#define LLVM_LIBC_SRC___SUPPORT_MATH_RANGE_REDUCTION_DOUBLE_NOFMA_H
11
12#include "src/__support/FPUtil/FPBits.h"
13#include "src/__support/FPUtil/double_double.h"
14#include "src/__support/FPUtil/multiply_add.h"
15#include "src/__support/FPUtil/nearest_integer.h"
16#include "src/__support/common.h"
17#include "src/__support/macros/config.h"
18#include "src/__support/macros/optimization.h"
19#include "src/__support/math/range_reduction_double_common.h"
20
21namespace LIBC_NAMESPACE_DECL {
22
23namespace math {
24
25namespace range_reduction_double_internal {
26
27using fputil::DoubleDouble;
28
29LIBC_INLINE unsigned LargeRangeReduction::fast(double x, DoubleDouble &u) {
30 using FPBits = typename fputil::FPBits<double>;
31 FPBits xbits(x);
32
33 int x_e_m62 = xbits.get_biased_exponent() - (FPBits::EXP_BIAS + 62);
34 idx = static_cast<unsigned>((x_e_m62 >> 4) + 3);
35 // Scale x down by 2^(-(16 * (idx - 3))
36 xbits.set_biased_exponent((x_e_m62 & 15) + FPBits::EXP_BIAS + 62);
37 // 2^62 <= |x_reduced| < 2^(62 + 16) = 2^78
38 x_reduced = xbits.get_val();
39 // x * c_hi = ph.hi + ph.lo exactly.
40 DoubleDouble x_split = fputil::split(a: x_reduced);
41 DoubleDouble ph = fputil::exact_mult<double, SPLIT>(
42 as: x_split, a: x_reduced, b: ONE_TWENTY_EIGHT_OVER_PI[idx][0]);
43 // x * c_mid = pm.hi + pm.lo exactly.
44 DoubleDouble pm = fputil::exact_mult<double, SPLIT>(
45 as: x_split, a: x_reduced, b: ONE_TWENTY_EIGHT_OVER_PI[idx][1]);
46 // x * c_lo = pl.hi + pl.lo exactly.
47 DoubleDouble pl = fputil::exact_mult<double, SPLIT>(
48 as: x_split, a: x_reduced, b: ONE_TWENTY_EIGHT_OVER_PI[idx][2]);
49 // Extract integral parts and fractional parts of (ph.lo + pm.hi).
50 double sum_hi = ph.lo + pm.hi;
51 double kd = fputil::nearest_integer(x: sum_hi);
52
53 // x * 128/pi mod 1 ~ y_hi + y_mid + y_lo
54 y_hi = (ph.lo - kd) + pm.hi; // Exact
55 y_mid = fputil::exact_add(a: pm.lo, b: pl.hi);
56 y_lo = pl.lo;
57
58 // y_l = x * c_lo_2 + pl.lo
59 double y_l =
60 fputil::multiply_add(x: x_reduced, y: ONE_TWENTY_EIGHT_OVER_PI[idx][3], z: y_lo);
61 DoubleDouble y = fputil::exact_add(a: y_hi, b: y_mid.hi);
62 y.lo += (y_mid.lo + y_l);
63
64 // Digits of pi/128, generated by Sollya with:
65 // > a = round(pi/128, D, RN);
66 // > b = round(pi/128 - a, D, RN);
67 constexpr DoubleDouble PI_OVER_128_DD = {.lo: 0x1.1a62633145c07p-60,
68 .hi: 0x1.921fb54442d18p-6};
69
70 // Error bound: with {a} denote the fractional part of a, i.e.:
71 // {a} = a - round(a)
72 // Then,
73 // | {x * 128/pi} - (y_hi + y_lo) | <= ulp(ulp(y_hi)) <= 2^-105
74 // | {x mod pi/128} - (u.hi + u.lo) | < 2 * 2^-6 * 2^-105 = 2^-110
75 u = fputil::quick_mult<SPLIT>(a: y, b: PI_OVER_128_DD);
76
77 return static_cast<unsigned>(static_cast<int64_t>(kd));
78}
79
80// Lookup table for sin(k * pi / 128) with k = 0, ..., 255.
81// Table is generated with Sollya as follow:
82// > display = hexadecimal;
83// > for k from 0 to 255 do {
84// a = round(sin(k * pi/128), 51, RN);
85// b = round(sin(k * pi/128) - a, D, RN);
86// print("{", b, ",", a, "},");
87// };
88LIBC_INLINE_VAR constexpr DoubleDouble SIN_K_PI_OVER_128[] = {
89 {.lo: 0, .hi: 0},
90 {.lo: 0x1.f938a73db97fbp-58, .hi: 0x1.92155f7a3667cp-6},
91 {.lo: -0x1.912bd0d569a9p-61, .hi: 0x1.91f65f10dd814p-5},
92 {.lo: 0x1.ccbeeeae8129ap-56, .hi: 0x1.2d52092ce19f4p-4},
93 {.lo: -0x1.e2718d26ed688p-60, .hi: 0x1.917a6bc29b42cp-4},
94 {.lo: -0x1.cbb1f71aca352p-56, .hi: 0x1.f564e56a9731p-4},
95 {.lo: -0x1.dd9ffeaecbdc4p-55, .hi: 0x1.2c8106e8e613cp-3},
96 {.lo: -0x1.ab3802218894fp-55, .hi: 0x1.5e214448b3fc8p-3},
97 {.lo: -0x1.49b466e7fe36p-55, .hi: 0x1.8f8b83c69a60cp-3},
98 {.lo: -0x1.035e2873ca432p-55, .hi: 0x1.c0b826a7e4f64p-3},
99 {.lo: -0x1.50b7bbc4768b1p-55, .hi: 0x1.f19f97b215f1cp-3},
100 {.lo: -0x1.3ed9efaa42ab3p-55, .hi: 0x1.111d262b1f678p-2},
101 {.lo: 0x1.a8b5c974ee7b5p-54, .hi: 0x1.294062ed59f04p-2},
102 {.lo: 0x1.4325f12be8946p-54, .hi: 0x1.4135c941766p-2},
103 {.lo: 0x1.fc2047e54e614p-55, .hi: 0x1.58f9a75ab1fdcp-2},
104 {.lo: -0x1.512c678219317p-54, .hi: 0x1.7088530fa45ap-2},
105 {.lo: -0x1.2e59dba7ab4c2p-54, .hi: 0x1.87de2a6aea964p-2},
106 {.lo: -0x1.d24afdade848bp-54, .hi: 0x1.9ef7943a8ed8cp-2},
107 {.lo: 0x1.5b362cb974183p-57, .hi: 0x1.b5d1009e15ccp-2},
108 {.lo: -0x1.e97af1a63c807p-54, .hi: 0x1.cc66e9931c46p-2},
109 {.lo: -0x1.c3e4edc5872f8p-55, .hi: 0x1.e2b5d3806f63cp-2},
110 {.lo: 0x1.fb44f80f92225p-54, .hi: 0x1.f8ba4dbf89ab8p-2},
111 {.lo: 0x1.9697faf2e2fe5p-53, .hi: 0x1.073879922ffecp-1},
112 {.lo: -0x1.7bc8eda6af93cp-53, .hi: 0x1.11eb3541b4b24p-1},
113 {.lo: 0x1.b25dd267f66p-55, .hi: 0x1.1c73b39ae68c8p-1},
114 {.lo: -0x1.5769d0fbcddc3p-53, .hi: 0x1.26d054cdd12ep-1},
115 {.lo: 0x1.c20673b2116b2p-54, .hi: 0x1.30ff7fce17034p-1},
116 {.lo: 0x1.3c7c4bc72a92cp-53, .hi: 0x1.3affa292050b8p-1},
117 {.lo: -0x1.e7f895d302395p-53, .hi: 0x1.44cf325091dd8p-1},
118 {.lo: 0x1.13c293edceb32p-53, .hi: 0x1.4e6cabbe3e5e8p-1},
119 {.lo: -0x1.75720992bfbb2p-55, .hi: 0x1.57d69348cecap-1},
120 {.lo: -0x1.24a366a5fe547p-53, .hi: 0x1.610b7551d2cep-1},
121 {.lo: 0x1.21165f626cdd5p-54, .hi: 0x1.6a09e667f3bccp-1},
122 {.lo: -0x1.bcac43c389ba9p-53, .hi: 0x1.72d0837efff98p-1},
123 {.lo: -0x1.21ea6f59be15bp-53, .hi: 0x1.7b5df226aafbp-1},
124 {.lo: 0x1.d217be0e2b971p-53, .hi: 0x1.83b0e0bff976cp-1},
125 {.lo: 0x1.69d0f6897664ap-54, .hi: 0x1.8bc806b15174p-1},
126 {.lo: -0x1.615f32b6f907ap-54, .hi: 0x1.93a22499263fcp-1},
127 {.lo: 0x1.6788ebcc76dc6p-54, .hi: 0x1.9b3e047f3874p-1},
128 {.lo: 0x1.ddae89fd441d1p-53, .hi: 0x1.a29a7a046278p-1},
129 {.lo: -0x1.f98273c5d2495p-54, .hi: 0x1.a9b66290ea1a4p-1},
130 {.lo: -0x1.926da300ffccep-55, .hi: 0x1.b090a581502p-1},
131 {.lo: 0x1.90e58336c64a8p-53, .hi: 0x1.b728345196e3cp-1},
132 {.lo: 0x1.9f6963354e3fep-53, .hi: 0x1.bd7c0ac6f9528p-1},
133 {.lo: 0x1.a47d3a2a0dcbep-54, .hi: 0x1.c38b2f180bdbp-1},
134 {.lo: 0x1.ed0489e16b9ap-54, .hi: 0x1.c954b213411f4p-1},
135 {.lo: -0x1.0f3db5dad5ac5p-53, .hi: 0x1.ced7af43cc774p-1},
136 {.lo: 0x1.ac42b5a8b6943p-53, .hi: 0x1.d4134d14dc938p-1},
137 {.lo: -0x1.d75033dfb9ca8p-53, .hi: 0x1.d906bcf328d48p-1},
138 {.lo: 0x1.83c37c6107db3p-55, .hi: 0x1.ddb13b6ccc23cp-1},
139 {.lo: 0x1.7f59c49f6cd6dp-54, .hi: 0x1.e212104f686e4p-1},
140 {.lo: 0x1.ee94a90d7b88bp-53, .hi: 0x1.e6288ec48e11p-1},
141 {.lo: -0x1.a27d3874701f9p-53, .hi: 0x1.e9f4156c62ddcp-1},
142 {.lo: -0x1.85f4e1b8298dp-54, .hi: 0x1.ed740e7684964p-1},
143 {.lo: -0x1.ab4e148e52d9ep-54, .hi: 0x1.f0a7efb9230d8p-1},
144 {.lo: 0x1.8a11412b82346p-54, .hi: 0x1.f38f3ac64e588p-1},
145 {.lo: 0x1.562172a361fd3p-56, .hi: 0x1.f6297cff75cbp-1},
146 {.lo: 0x1.3564acef1ff97p-53, .hi: 0x1.f8764fa714ba8p-1},
147 {.lo: -0x1.5e82a3284d5c8p-53, .hi: 0x1.fa7557f08a518p-1},
148 {.lo: -0x1.709bccb89a989p-54, .hi: 0x1.fc26470e19fd4p-1},
149 {.lo: 0x1.9e082721dfb8ep-53, .hi: 0x1.fd88da3d12524p-1},
150 {.lo: -0x1.eade132f3981dp-53, .hi: 0x1.fe9cdad01883cp-1},
151 {.lo: 0x1.e3a843d1db55fp-53, .hi: 0x1.ff621e3796d7cp-1},
152 {.lo: 0x1.765595d548d9ap-54, .hi: 0x1.ffd886084cd0cp-1},
153 {.lo: 0, .hi: 1},
154#ifndef LIBC_MATH_HAS_SMALL_TABLES
155 {.lo: 0x1.765595d548d9ap-54, .hi: 0x1.ffd886084cd0cp-1},
156 {.lo: 0x1.e3a843d1db55fp-53, .hi: 0x1.ff621e3796d7cp-1},
157 {.lo: -0x1.eade132f3981dp-53, .hi: 0x1.fe9cdad01883cp-1},
158 {.lo: 0x1.9e082721dfb8ep-53, .hi: 0x1.fd88da3d12524p-1},
159 {.lo: -0x1.709bccb89a989p-54, .hi: 0x1.fc26470e19fd4p-1},
160 {.lo: -0x1.5e82a3284d5c8p-53, .hi: 0x1.fa7557f08a518p-1},
161 {.lo: 0x1.3564acef1ff97p-53, .hi: 0x1.f8764fa714ba8p-1},
162 {.lo: 0x1.562172a361fd3p-56, .hi: 0x1.f6297cff75cbp-1},
163 {.lo: 0x1.8a11412b82346p-54, .hi: 0x1.f38f3ac64e588p-1},
164 {.lo: -0x1.ab4e148e52d9ep-54, .hi: 0x1.f0a7efb9230d8p-1},
165 {.lo: -0x1.85f4e1b8298dp-54, .hi: 0x1.ed740e7684964p-1},
166 {.lo: -0x1.a27d3874701f9p-53, .hi: 0x1.e9f4156c62ddcp-1},
167 {.lo: 0x1.ee94a90d7b88bp-53, .hi: 0x1.e6288ec48e11p-1},
168 {.lo: 0x1.7f59c49f6cd6dp-54, .hi: 0x1.e212104f686e4p-1},
169 {.lo: 0x1.83c37c6107db3p-55, .hi: 0x1.ddb13b6ccc23cp-1},
170 {.lo: -0x1.d75033dfb9ca8p-53, .hi: 0x1.d906bcf328d48p-1},
171 {.lo: 0x1.ac42b5a8b6943p-53, .hi: 0x1.d4134d14dc938p-1},
172 {.lo: -0x1.0f3db5dad5ac5p-53, .hi: 0x1.ced7af43cc774p-1},
173 {.lo: 0x1.ed0489e16b9ap-54, .hi: 0x1.c954b213411f4p-1},
174 {.lo: 0x1.a47d3a2a0dcbep-54, .hi: 0x1.c38b2f180bdbp-1},
175 {.lo: 0x1.9f6963354e3fep-53, .hi: 0x1.bd7c0ac6f9528p-1},
176 {.lo: 0x1.90e58336c64a8p-53, .hi: 0x1.b728345196e3cp-1},
177 {.lo: -0x1.926da300ffccep-55, .hi: 0x1.b090a581502p-1},
178 {.lo: -0x1.f98273c5d2495p-54, .hi: 0x1.a9b66290ea1a4p-1},
179 {.lo: 0x1.ddae89fd441d1p-53, .hi: 0x1.a29a7a046278p-1},
180 {.lo: 0x1.6788ebcc76dc6p-54, .hi: 0x1.9b3e047f3874p-1},
181 {.lo: -0x1.615f32b6f907ap-54, .hi: 0x1.93a22499263fcp-1},
182 {.lo: 0x1.69d0f6897664ap-54, .hi: 0x1.8bc806b15174p-1},
183 {.lo: 0x1.d217be0e2b971p-53, .hi: 0x1.83b0e0bff976cp-1},
184 {.lo: -0x1.21ea6f59be15bp-53, .hi: 0x1.7b5df226aafbp-1},
185 {.lo: -0x1.bcac43c389ba9p-53, .hi: 0x1.72d0837efff98p-1},
186 {.lo: 0x1.21165f626cdd5p-54, .hi: 0x1.6a09e667f3bccp-1},
187 {.lo: -0x1.24a366a5fe547p-53, .hi: 0x1.610b7551d2cep-1},
188 {.lo: -0x1.75720992bfbb2p-55, .hi: 0x1.57d69348cecap-1},
189 {.lo: 0x1.13c293edceb32p-53, .hi: 0x1.4e6cabbe3e5e8p-1},
190 {.lo: -0x1.e7f895d302395p-53, .hi: 0x1.44cf325091dd8p-1},
191 {.lo: 0x1.3c7c4bc72a92cp-53, .hi: 0x1.3affa292050b8p-1},
192 {.lo: 0x1.c20673b2116b2p-54, .hi: 0x1.30ff7fce17034p-1},
193 {.lo: -0x1.5769d0fbcddc3p-53, .hi: 0x1.26d054cdd12ep-1},
194 {.lo: 0x1.b25dd267f66p-55, .hi: 0x1.1c73b39ae68c8p-1},
195 {.lo: -0x1.7bc8eda6af93cp-53, .hi: 0x1.11eb3541b4b24p-1},
196 {.lo: 0x1.9697faf2e2fe5p-53, .hi: 0x1.073879922ffecp-1},
197 {.lo: 0x1.fb44f80f92225p-54, .hi: 0x1.f8ba4dbf89ab8p-2},
198 {.lo: -0x1.c3e4edc5872f8p-55, .hi: 0x1.e2b5d3806f63cp-2},
199 {.lo: -0x1.e97af1a63c807p-54, .hi: 0x1.cc66e9931c46p-2},
200 {.lo: 0x1.5b362cb974183p-57, .hi: 0x1.b5d1009e15ccp-2},
201 {.lo: -0x1.d24afdade848bp-54, .hi: 0x1.9ef7943a8ed8cp-2},
202 {.lo: -0x1.2e59dba7ab4c2p-54, .hi: 0x1.87de2a6aea964p-2},
203 {.lo: -0x1.512c678219317p-54, .hi: 0x1.7088530fa45ap-2},
204 {.lo: 0x1.fc2047e54e614p-55, .hi: 0x1.58f9a75ab1fdcp-2},
205 {.lo: 0x1.4325f12be8946p-54, .hi: 0x1.4135c941766p-2},
206 {.lo: 0x1.a8b5c974ee7b5p-54, .hi: 0x1.294062ed59f04p-2},
207 {.lo: -0x1.3ed9efaa42ab3p-55, .hi: 0x1.111d262b1f678p-2},
208 {.lo: -0x1.50b7bbc4768b1p-55, .hi: 0x1.f19f97b215f1cp-3},
209 {.lo: -0x1.035e2873ca432p-55, .hi: 0x1.c0b826a7e4f64p-3},
210 {.lo: -0x1.49b466e7fe36p-55, .hi: 0x1.8f8b83c69a60cp-3},
211 {.lo: -0x1.ab3802218894fp-55, .hi: 0x1.5e214448b3fc8p-3},
212 {.lo: -0x1.dd9ffeaecbdc4p-55, .hi: 0x1.2c8106e8e613cp-3},
213 {.lo: -0x1.cbb1f71aca352p-56, .hi: 0x1.f564e56a9731p-4},
214 {.lo: -0x1.e2718d26ed688p-60, .hi: 0x1.917a6bc29b42cp-4},
215 {.lo: 0x1.ccbeeeae8129ap-56, .hi: 0x1.2d52092ce19f4p-4},
216 {.lo: -0x1.912bd0d569a9p-61, .hi: 0x1.91f65f10dd814p-5},
217 {.lo: 0x1.f938a73db97fbp-58, .hi: 0x1.92155f7a3667cp-6},
218 {.lo: 0, .hi: 0},
219 {.lo: -0x1.f938a73db97fbp-58, .hi: -0x1.92155f7a3667cp-6},
220 {.lo: 0x1.912bd0d569a9p-61, .hi: -0x1.91f65f10dd814p-5},
221 {.lo: -0x1.ccbeeeae8129ap-56, .hi: -0x1.2d52092ce19f4p-4},
222 {.lo: 0x1.e2718d26ed688p-60, .hi: -0x1.917a6bc29b42cp-4},
223 {.lo: 0x1.cbb1f71aca352p-56, .hi: -0x1.f564e56a9731p-4},
224 {.lo: 0x1.dd9ffeaecbdc4p-55, .hi: -0x1.2c8106e8e613cp-3},
225 {.lo: 0x1.ab3802218894fp-55, .hi: -0x1.5e214448b3fc8p-3},
226 {.lo: 0x1.49b466e7fe36p-55, .hi: -0x1.8f8b83c69a60cp-3},
227 {.lo: 0x1.035e2873ca432p-55, .hi: -0x1.c0b826a7e4f64p-3},
228 {.lo: 0x1.50b7bbc4768b1p-55, .hi: -0x1.f19f97b215f1cp-3},
229 {.lo: 0x1.3ed9efaa42ab3p-55, .hi: -0x1.111d262b1f678p-2},
230 {.lo: -0x1.a8b5c974ee7b5p-54, .hi: -0x1.294062ed59f04p-2},
231 {.lo: -0x1.4325f12be8946p-54, .hi: -0x1.4135c941766p-2},
232 {.lo: -0x1.fc2047e54e614p-55, .hi: -0x1.58f9a75ab1fdcp-2},
233 {.lo: 0x1.512c678219317p-54, .hi: -0x1.7088530fa45ap-2},
234 {.lo: 0x1.2e59dba7ab4c2p-54, .hi: -0x1.87de2a6aea964p-2},
235 {.lo: 0x1.d24afdade848bp-54, .hi: -0x1.9ef7943a8ed8cp-2},
236 {.lo: -0x1.5b362cb974183p-57, .hi: -0x1.b5d1009e15ccp-2},
237 {.lo: 0x1.e97af1a63c807p-54, .hi: -0x1.cc66e9931c46p-2},
238 {.lo: 0x1.c3e4edc5872f8p-55, .hi: -0x1.e2b5d3806f63cp-2},
239 {.lo: -0x1.fb44f80f92225p-54, .hi: -0x1.f8ba4dbf89ab8p-2},
240 {.lo: -0x1.9697faf2e2fe5p-53, .hi: -0x1.073879922ffecp-1},
241 {.lo: 0x1.7bc8eda6af93cp-53, .hi: -0x1.11eb3541b4b24p-1},
242 {.lo: -0x1.b25dd267f66p-55, .hi: -0x1.1c73b39ae68c8p-1},
243 {.lo: 0x1.5769d0fbcddc3p-53, .hi: -0x1.26d054cdd12ep-1},
244 {.lo: -0x1.c20673b2116b2p-54, .hi: -0x1.30ff7fce17034p-1},
245 {.lo: -0x1.3c7c4bc72a92cp-53, .hi: -0x1.3affa292050b8p-1},
246 {.lo: 0x1.e7f895d302395p-53, .hi: -0x1.44cf325091dd8p-1},
247 {.lo: -0x1.13c293edceb32p-53, .hi: -0x1.4e6cabbe3e5e8p-1},
248 {.lo: 0x1.75720992bfbb2p-55, .hi: -0x1.57d69348cecap-1},
249 {.lo: 0x1.24a366a5fe547p-53, .hi: -0x1.610b7551d2cep-1},
250 {.lo: -0x1.21165f626cdd5p-54, .hi: -0x1.6a09e667f3bccp-1},
251 {.lo: 0x1.bcac43c389ba9p-53, .hi: -0x1.72d0837efff98p-1},
252 {.lo: 0x1.21ea6f59be15bp-53, .hi: -0x1.7b5df226aafbp-1},
253 {.lo: -0x1.d217be0e2b971p-53, .hi: -0x1.83b0e0bff976cp-1},
254 {.lo: -0x1.69d0f6897664ap-54, .hi: -0x1.8bc806b15174p-1},
255 {.lo: 0x1.615f32b6f907ap-54, .hi: -0x1.93a22499263fcp-1},
256 {.lo: -0x1.6788ebcc76dc6p-54, .hi: -0x1.9b3e047f3874p-1},
257 {.lo: -0x1.ddae89fd441d1p-53, .hi: -0x1.a29a7a046278p-1},
258 {.lo: 0x1.f98273c5d2495p-54, .hi: -0x1.a9b66290ea1a4p-1},
259 {.lo: 0x1.926da300ffccep-55, .hi: -0x1.b090a581502p-1},
260 {.lo: -0x1.90e58336c64a8p-53, .hi: -0x1.b728345196e3cp-1},
261 {.lo: -0x1.9f6963354e3fep-53, .hi: -0x1.bd7c0ac6f9528p-1},
262 {.lo: -0x1.a47d3a2a0dcbep-54, .hi: -0x1.c38b2f180bdbp-1},
263 {.lo: -0x1.ed0489e16b9ap-54, .hi: -0x1.c954b213411f4p-1},
264 {.lo: 0x1.0f3db5dad5ac5p-53, .hi: -0x1.ced7af43cc774p-1},
265 {.lo: -0x1.ac42b5a8b6943p-53, .hi: -0x1.d4134d14dc938p-1},
266 {.lo: 0x1.d75033dfb9ca8p-53, .hi: -0x1.d906bcf328d48p-1},
267 {.lo: -0x1.83c37c6107db3p-55, .hi: -0x1.ddb13b6ccc23cp-1},
268 {.lo: -0x1.7f59c49f6cd6dp-54, .hi: -0x1.e212104f686e4p-1},
269 {.lo: -0x1.ee94a90d7b88bp-53, .hi: -0x1.e6288ec48e11p-1},
270 {.lo: 0x1.a27d3874701f9p-53, .hi: -0x1.e9f4156c62ddcp-1},
271 {.lo: 0x1.85f4e1b8298dp-54, .hi: -0x1.ed740e7684964p-1},
272 {.lo: 0x1.ab4e148e52d9ep-54, .hi: -0x1.f0a7efb9230d8p-1},
273 {.lo: -0x1.8a11412b82346p-54, .hi: -0x1.f38f3ac64e588p-1},
274 {.lo: -0x1.562172a361fd3p-56, .hi: -0x1.f6297cff75cbp-1},
275 {.lo: -0x1.3564acef1ff97p-53, .hi: -0x1.f8764fa714ba8p-1},
276 {.lo: 0x1.5e82a3284d5c8p-53, .hi: -0x1.fa7557f08a518p-1},
277 {.lo: 0x1.709bccb89a989p-54, .hi: -0x1.fc26470e19fd4p-1},
278 {.lo: -0x1.9e082721dfb8ep-53, .hi: -0x1.fd88da3d12524p-1},
279 {.lo: 0x1.eade132f3981dp-53, .hi: -0x1.fe9cdad01883cp-1},
280 {.lo: -0x1.e3a843d1db55fp-53, .hi: -0x1.ff621e3796d7cp-1},
281 {.lo: -0x1.765595d548d9ap-54, .hi: -0x1.ffd886084cd0cp-1},
282 {.lo: 0, .hi: -1},
283 {.lo: -0x1.765595d548d9ap-54, .hi: -0x1.ffd886084cd0cp-1},
284 {.lo: -0x1.e3a843d1db55fp-53, .hi: -0x1.ff621e3796d7cp-1},
285 {.lo: 0x1.eade132f3981dp-53, .hi: -0x1.fe9cdad01883cp-1},
286 {.lo: -0x1.9e082721dfb8ep-53, .hi: -0x1.fd88da3d12524p-1},
287 {.lo: 0x1.709bccb89a989p-54, .hi: -0x1.fc26470e19fd4p-1},
288 {.lo: 0x1.5e82a3284d5c8p-53, .hi: -0x1.fa7557f08a518p-1},
289 {.lo: -0x1.3564acef1ff97p-53, .hi: -0x1.f8764fa714ba8p-1},
290 {.lo: -0x1.562172a361fd3p-56, .hi: -0x1.f6297cff75cbp-1},
291 {.lo: -0x1.8a11412b82346p-54, .hi: -0x1.f38f3ac64e588p-1},
292 {.lo: 0x1.ab4e148e52d9ep-54, .hi: -0x1.f0a7efb9230d8p-1},
293 {.lo: 0x1.85f4e1b8298dp-54, .hi: -0x1.ed740e7684964p-1},
294 {.lo: 0x1.a27d3874701f9p-53, .hi: -0x1.e9f4156c62ddcp-1},
295 {.lo: -0x1.ee94a90d7b88bp-53, .hi: -0x1.e6288ec48e11p-1},
296 {.lo: -0x1.7f59c49f6cd6dp-54, .hi: -0x1.e212104f686e4p-1},
297 {.lo: -0x1.83c37c6107db3p-55, .hi: -0x1.ddb13b6ccc23cp-1},
298 {.lo: 0x1.d75033dfb9ca8p-53, .hi: -0x1.d906bcf328d48p-1},
299 {.lo: -0x1.ac42b5a8b6943p-53, .hi: -0x1.d4134d14dc938p-1},
300 {.lo: 0x1.0f3db5dad5ac5p-53, .hi: -0x1.ced7af43cc774p-1},
301 {.lo: -0x1.ed0489e16b9ap-54, .hi: -0x1.c954b213411f4p-1},
302 {.lo: -0x1.a47d3a2a0dcbep-54, .hi: -0x1.c38b2f180bdbp-1},
303 {.lo: -0x1.9f6963354e3fep-53, .hi: -0x1.bd7c0ac6f9528p-1},
304 {.lo: -0x1.90e58336c64a8p-53, .hi: -0x1.b728345196e3cp-1},
305 {.lo: 0x1.926da300ffccep-55, .hi: -0x1.b090a581502p-1},
306 {.lo: 0x1.f98273c5d2495p-54, .hi: -0x1.a9b66290ea1a4p-1},
307 {.lo: -0x1.ddae89fd441d1p-53, .hi: -0x1.a29a7a046278p-1},
308 {.lo: -0x1.6788ebcc76dc6p-54, .hi: -0x1.9b3e047f3874p-1},
309 {.lo: 0x1.615f32b6f907ap-54, .hi: -0x1.93a22499263fcp-1},
310 {.lo: -0x1.69d0f6897664ap-54, .hi: -0x1.8bc806b15174p-1},
311 {.lo: -0x1.d217be0e2b971p-53, .hi: -0x1.83b0e0bff976cp-1},
312 {.lo: 0x1.21ea6f59be15bp-53, .hi: -0x1.7b5df226aafbp-1},
313 {.lo: 0x1.bcac43c389ba9p-53, .hi: -0x1.72d0837efff98p-1},
314 {.lo: -0x1.21165f626cdd5p-54, .hi: -0x1.6a09e667f3bccp-1},
315 {.lo: 0x1.24a366a5fe547p-53, .hi: -0x1.610b7551d2cep-1},
316 {.lo: 0x1.75720992bfbb2p-55, .hi: -0x1.57d69348cecap-1},
317 {.lo: -0x1.13c293edceb32p-53, .hi: -0x1.4e6cabbe3e5e8p-1},
318 {.lo: 0x1.e7f895d302395p-53, .hi: -0x1.44cf325091dd8p-1},
319 {.lo: -0x1.3c7c4bc72a92cp-53, .hi: -0x1.3affa292050b8p-1},
320 {.lo: -0x1.c20673b2116b2p-54, .hi: -0x1.30ff7fce17034p-1},
321 {.lo: 0x1.5769d0fbcddc3p-53, .hi: -0x1.26d054cdd12ep-1},
322 {.lo: -0x1.b25dd267f66p-55, .hi: -0x1.1c73b39ae68c8p-1},
323 {.lo: 0x1.7bc8eda6af93cp-53, .hi: -0x1.11eb3541b4b24p-1},
324 {.lo: -0x1.9697faf2e2fe5p-53, .hi: -0x1.073879922ffecp-1},
325 {.lo: -0x1.fb44f80f92225p-54, .hi: -0x1.f8ba4dbf89ab8p-2},
326 {.lo: 0x1.c3e4edc5872f8p-55, .hi: -0x1.e2b5d3806f63cp-2},
327 {.lo: 0x1.e97af1a63c807p-54, .hi: -0x1.cc66e9931c46p-2},
328 {.lo: -0x1.5b362cb974183p-57, .hi: -0x1.b5d1009e15ccp-2},
329 {.lo: 0x1.d24afdade848bp-54, .hi: -0x1.9ef7943a8ed8cp-2},
330 {.lo: 0x1.2e59dba7ab4c2p-54, .hi: -0x1.87de2a6aea964p-2},
331 {.lo: 0x1.512c678219317p-54, .hi: -0x1.7088530fa45ap-2},
332 {.lo: -0x1.fc2047e54e614p-55, .hi: -0x1.58f9a75ab1fdcp-2},
333 {.lo: -0x1.4325f12be8946p-54, .hi: -0x1.4135c941766p-2},
334 {.lo: -0x1.a8b5c974ee7b5p-54, .hi: -0x1.294062ed59f04p-2},
335 {.lo: 0x1.3ed9efaa42ab3p-55, .hi: -0x1.111d262b1f678p-2},
336 {.lo: 0x1.50b7bbc4768b1p-55, .hi: -0x1.f19f97b215f1cp-3},
337 {.lo: 0x1.035e2873ca432p-55, .hi: -0x1.c0b826a7e4f64p-3},
338 {.lo: 0x1.49b466e7fe36p-55, .hi: -0x1.8f8b83c69a60cp-3},
339 {.lo: 0x1.ab3802218894fp-55, .hi: -0x1.5e214448b3fc8p-3},
340 {.lo: 0x1.dd9ffeaecbdc4p-55, .hi: -0x1.2c8106e8e613cp-3},
341 {.lo: 0x1.cbb1f71aca352p-56, .hi: -0x1.f564e56a9731p-4},
342 {.lo: 0x1.e2718d26ed688p-60, .hi: -0x1.917a6bc29b42cp-4},
343 {.lo: -0x1.ccbeeeae8129ap-56, .hi: -0x1.2d52092ce19f4p-4},
344 {.lo: 0x1.912bd0d569a9p-61, .hi: -0x1.91f65f10dd814p-5},
345 {.lo: -0x1.f938a73db97fbp-58, .hi: -0x1.92155f7a3667cp-6},
346#endif // !LIBC_MATH_HAS_SMALL_TABLES
347};
348
349} // namespace range_reduction_double_internal
350
351} // namespace math
352
353} // namespace LIBC_NAMESPACE_DECL
354
355#endif // LLVM_LIBC_SRC___SUPPORT_MATH_RANGE_REDUCTION_DOUBLE_NOFMA_H
356