1 //===-- Range reduction for double precision sin/cos/tan w/ FMA -*- 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_MATH_GENERIC_RANGE_REDUCTION_DOUBLE_FMA_H
10 #define LLVM_LIBC_SRC_MATH_GENERIC_RANGE_REDUCTION_DOUBLE_FMA_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/math/generic/range_reduction_double_common.h"
20
21 namespace LIBC_NAMESPACE_DECL {
22
23 using LIBC_NAMESPACE::fputil::DoubleDouble;
24
fast(double x,DoubleDouble & u)25 LIBC_INLINE unsigned LargeRangeReduction::fast(double x, DoubleDouble &u) {
26 using FPBits = typename fputil::FPBits<double>;
27 FPBits xbits(x);
28
29 int x_e_m62 = xbits.get_biased_exponent() - (FPBits::EXP_BIAS + 62);
30 idx = static_cast<unsigned>((x_e_m62 >> 4) + 3);
31 // Scale x down by 2^(-(16 * (idx - 3))
32 xbits.set_biased_exponent((x_e_m62 & 15) + FPBits::EXP_BIAS + 62);
33 // 2^62 <= |x_reduced| < 2^(62 + 16) = 2^78
34 x_reduced = xbits.get_val();
35 // x * c_hi = ph.hi + ph.lo exactly.
36 DoubleDouble ph =
37 fputil::exact_mult<SPLIT>(x_reduced, ONE_TWENTY_EIGHT_OVER_PI[idx][0]);
38 // x * c_mid = pm.hi + pm.lo exactly.
39 DoubleDouble pm =
40 fputil::exact_mult<SPLIT>(x_reduced, ONE_TWENTY_EIGHT_OVER_PI[idx][1]);
41 // x * c_lo = pl.hi + pl.lo exactly.
42 DoubleDouble pl =
43 fputil::exact_mult<SPLIT>(x_reduced, ONE_TWENTY_EIGHT_OVER_PI[idx][2]);
44 // Extract integral parts and fractional parts of (ph.lo + pm.hi).
45 double sum_hi = ph.lo + pm.hi;
46 double kd = fputil::nearest_integer(sum_hi);
47
48 // x * 128/pi mod 1 ~ y_hi + y_mid + y_lo
49 y_hi = (ph.lo - kd) + pm.hi; // Exact
50 y_mid = fputil::exact_add(pm.lo, pl.hi);
51 y_lo = pl.lo;
52
53 // y_l = x * c_lo_2 + pl.lo
54 double y_l =
55 fputil::multiply_add(x_reduced, ONE_TWENTY_EIGHT_OVER_PI[idx][3], y_lo);
56 DoubleDouble y = fputil::exact_add(y_hi, y_mid.hi);
57 y.lo += (y_mid.lo + y_l);
58
59 // Digits of pi/128, generated by Sollya with:
60 // > a = round(pi/128, D, RN);
61 // > b = round(pi/128 - a, D, RN);
62 constexpr DoubleDouble PI_OVER_128_DD = {0x1.1a62633145c07p-60,
63 0x1.921fb54442d18p-6};
64
65 // Error bound: with {a} denote the fractional part of a, i.e.:
66 // {a} = a - round(a)
67 // Then,
68 // | {x * 128/pi} - (y_hi + y_lo) | <= ulp(ulp(y_hi)) <= 2^-105
69 // | {x mod pi/128} - (u.hi + u.lo) | < 2 * 2^-6 * 2^-105 = 2^-110
70 u = fputil::quick_mult<SPLIT>(y, PI_OVER_128_DD);
71
72 return static_cast<unsigned>(static_cast<int64_t>(kd));
73 }
74
75 // Lookup table for sin(k * pi / 128) with k = 0, ..., 255.
76 // Table is generated with Sollya as follow:
77 // > display = hexadecimal;
78 // > for k from 0 to 255 do {
79 // a = D(sin(k * pi/128)); };
80 // b = D(sin(k * pi/128) - a);
81 // print("{", b, ",", a, "},");
82 // };
83 LIBC_INLINE constexpr DoubleDouble SIN_K_PI_OVER_128[256] = {
84 {0, 0},
85 {-0x1.b1d63091a013p-64, 0x1.92155f7a3667ep-6},
86 {-0x1.912bd0d569a9p-61, 0x1.91f65f10dd814p-5},
87 {-0x1.9a088a8bf6b2cp-59, 0x1.2d52092ce19f6p-4},
88 {-0x1.e2718d26ed688p-60, 0x1.917a6bc29b42cp-4},
89 {0x1.a2704729ae56dp-59, 0x1.f564e56a9730ep-4},
90 {0x1.13000a89a11ep-58, 0x1.2c8106e8e613ap-3},
91 {0x1.531ff779ddac6p-57, 0x1.5e214448b3fc6p-3},
92 {-0x1.26d19b9ff8d82p-57, 0x1.8f8b83c69a60bp-3},
93 {-0x1.af1439e521935p-62, 0x1.c0b826a7e4f63p-3},
94 {-0x1.42deef11da2c4p-57, 0x1.f19f97b215f1bp-3},
95 {0x1.824c20ab7aa9ap-56, 0x1.111d262b1f677p-2},
96 {-0x1.5d28da2c4612dp-56, 0x1.294062ed59f06p-2},
97 {0x1.0c97c4afa2518p-56, 0x1.4135c94176601p-2},
98 {-0x1.efdc0d58cf62p-62, 0x1.58f9a75ab1fddp-2},
99 {-0x1.44b19e0864c5dp-56, 0x1.7088530fa459fp-2},
100 {-0x1.72cedd3d5a61p-57, 0x1.87de2a6aea963p-2},
101 {0x1.6da81290bdbabp-57, 0x1.9ef7943a8ed8ap-2},
102 {0x1.5b362cb974183p-57, 0x1.b5d1009e15ccp-2},
103 {0x1.6850e59c37f8fp-58, 0x1.cc66e9931c45ep-2},
104 {0x1.e0d891d3c6841p-58, 0x1.e2b5d3806f63bp-2},
105 {-0x1.2ec1fc1b776b8p-60, 0x1.f8ba4dbf89abap-2},
106 {-0x1.a5a014347406cp-55, 0x1.073879922ffeep-1},
107 {-0x1.ef23b69abe4f1p-55, 0x1.11eb3541b4b23p-1},
108 {0x1.b25dd267f66p-55, 0x1.1c73b39ae68c8p-1},
109 {-0x1.5da743ef3770cp-55, 0x1.26d054cdd12dfp-1},
110 {-0x1.efcc626f74a6fp-57, 0x1.30ff7fce17035p-1},
111 {0x1.e3e25e3954964p-56, 0x1.3affa292050b9p-1},
112 {0x1.8076a2cfdc6b3p-57, 0x1.44cf325091dd6p-1},
113 {0x1.3c293edceb327p-57, 0x1.4e6cabbe3e5e9p-1},
114 {-0x1.75720992bfbb2p-55, 0x1.57d69348cecap-1},
115 {-0x1.251b352ff2a37p-56, 0x1.610b7551d2cdfp-1},
116 {-0x1.bdd3413b26456p-55, 0x1.6a09e667f3bcdp-1},
117 {0x1.0d4ef0f1d915cp-55, 0x1.72d0837efff96p-1},
118 {-0x1.0f537acdf0ad7p-56, 0x1.7b5df226aafafp-1},
119 {-0x1.6f420f8ea3475p-56, 0x1.83b0e0bff976ep-1},
120 {-0x1.2c5e12ed1336dp-55, 0x1.8bc806b151741p-1},
121 {0x1.3d419a920df0bp-55, 0x1.93a22499263fbp-1},
122 {-0x1.30ee286712474p-55, 0x1.9b3e047f38741p-1},
123 {-0x1.128bb015df175p-56, 0x1.a29a7a0462782p-1},
124 {0x1.9f630e8b6dac8p-60, 0x1.a9b66290ea1a3p-1},
125 {-0x1.926da300ffccep-55, 0x1.b090a581502p-1},
126 {-0x1.bc69f324e6d61p-55, 0x1.b728345196e3ep-1},
127 {-0x1.825a732ac700ap-55, 0x1.bd7c0ac6f952ap-1},
128 {-0x1.6e0b1757c8d07p-56, 0x1.c38b2f180bdb1p-1},
129 {-0x1.2fb761e946603p-58, 0x1.c954b213411f5p-1},
130 {-0x1.e7b6bb5ab58aep-58, 0x1.ced7af43cc773p-1},
131 {-0x1.4ef5295d25af2p-55, 0x1.d4134d14dc93ap-1},
132 {0x1.457e610231ac2p-56, 0x1.d906bcf328d46p-1},
133 {0x1.83c37c6107db3p-55, 0x1.ddb13b6ccc23cp-1},
134 {-0x1.014c76c126527p-55, 0x1.e212104f686e5p-1},
135 {-0x1.16b56f2847754p-57, 0x1.e6288ec48e112p-1},
136 {0x1.760b1e2e3f81ep-55, 0x1.e9f4156c62ddap-1},
137 {0x1.e82c791f59cc2p-56, 0x1.ed740e7684963p-1},
138 {0x1.52c7adc6b4989p-56, 0x1.f0a7efb9230d7p-1},
139 {-0x1.d7bafb51f72e6p-56, 0x1.f38f3ac64e589p-1},
140 {0x1.562172a361fd3p-56, 0x1.f6297cff75cbp-1},
141 {0x1.ab256778ffcb6p-56, 0x1.f8764fa714ba9p-1},
142 {-0x1.7a0a8ca13571fp-55, 0x1.fa7557f08a517p-1},
143 {0x1.1ec8668ecaceep-55, 0x1.fc26470e19fd3p-1},
144 {-0x1.87df6378811c7p-55, 0x1.fd88da3d12526p-1},
145 {0x1.521ecd0c67e35p-57, 0x1.fe9cdad01883ap-1},
146 {-0x1.c57bc2e24aa15p-57, 0x1.ff621e3796d7ep-1},
147 {-0x1.1354d4556e4cbp-55, 0x1.ffd886084cd0dp-1},
148 {0, 1},
149 #ifndef LIBC_MATH_HAS_SMALL_TABLES
150 {-0x1.1354d4556e4cbp-55, 0x1.ffd886084cd0dp-1},
151 {-0x1.c57bc2e24aa15p-57, 0x1.ff621e3796d7ep-1},
152 {0x1.521ecd0c67e35p-57, 0x1.fe9cdad01883ap-1},
153 {-0x1.87df6378811c7p-55, 0x1.fd88da3d12526p-1},
154 {0x1.1ec8668ecaceep-55, 0x1.fc26470e19fd3p-1},
155 {-0x1.7a0a8ca13571fp-55, 0x1.fa7557f08a517p-1},
156 {0x1.ab256778ffcb6p-56, 0x1.f8764fa714ba9p-1},
157 {0x1.562172a361fd3p-56, 0x1.f6297cff75cbp-1},
158 {-0x1.d7bafb51f72e6p-56, 0x1.f38f3ac64e589p-1},
159 {0x1.52c7adc6b4989p-56, 0x1.f0a7efb9230d7p-1},
160 {0x1.e82c791f59cc2p-56, 0x1.ed740e7684963p-1},
161 {0x1.760b1e2e3f81ep-55, 0x1.e9f4156c62ddap-1},
162 {-0x1.16b56f2847754p-57, 0x1.e6288ec48e112p-1},
163 {-0x1.014c76c126527p-55, 0x1.e212104f686e5p-1},
164 {0x1.83c37c6107db3p-55, 0x1.ddb13b6ccc23cp-1},
165 {0x1.457e610231ac2p-56, 0x1.d906bcf328d46p-1},
166 {-0x1.4ef5295d25af2p-55, 0x1.d4134d14dc93ap-1},
167 {-0x1.e7b6bb5ab58aep-58, 0x1.ced7af43cc773p-1},
168 {-0x1.2fb761e946603p-58, 0x1.c954b213411f5p-1},
169 {-0x1.6e0b1757c8d07p-56, 0x1.c38b2f180bdb1p-1},
170 {-0x1.825a732ac700ap-55, 0x1.bd7c0ac6f952ap-1},
171 {-0x1.bc69f324e6d61p-55, 0x1.b728345196e3ep-1},
172 {-0x1.926da300ffccep-55, 0x1.b090a581502p-1},
173 {0x1.9f630e8b6dac8p-60, 0x1.a9b66290ea1a3p-1},
174 {-0x1.128bb015df175p-56, 0x1.a29a7a0462782p-1},
175 {-0x1.30ee286712474p-55, 0x1.9b3e047f38741p-1},
176 {0x1.3d419a920df0bp-55, 0x1.93a22499263fbp-1},
177 {-0x1.2c5e12ed1336dp-55, 0x1.8bc806b151741p-1},
178 {-0x1.6f420f8ea3475p-56, 0x1.83b0e0bff976ep-1},
179 {-0x1.0f537acdf0ad7p-56, 0x1.7b5df226aafafp-1},
180 {0x1.0d4ef0f1d915cp-55, 0x1.72d0837efff96p-1},
181 {-0x1.bdd3413b26456p-55, 0x1.6a09e667f3bcdp-1},
182 {-0x1.251b352ff2a37p-56, 0x1.610b7551d2cdfp-1},
183 {-0x1.75720992bfbb2p-55, 0x1.57d69348cecap-1},
184 {0x1.3c293edceb327p-57, 0x1.4e6cabbe3e5e9p-1},
185 {0x1.8076a2cfdc6b3p-57, 0x1.44cf325091dd6p-1},
186 {0x1.e3e25e3954964p-56, 0x1.3affa292050b9p-1},
187 {-0x1.efcc626f74a6fp-57, 0x1.30ff7fce17035p-1},
188 {-0x1.5da743ef3770cp-55, 0x1.26d054cdd12dfp-1},
189 {0x1.b25dd267f66p-55, 0x1.1c73b39ae68c8p-1},
190 {-0x1.ef23b69abe4f1p-55, 0x1.11eb3541b4b23p-1},
191 {-0x1.a5a014347406cp-55, 0x1.073879922ffeep-1},
192 {-0x1.2ec1fc1b776b8p-60, 0x1.f8ba4dbf89abap-2},
193 {0x1.e0d891d3c6841p-58, 0x1.e2b5d3806f63bp-2},
194 {0x1.6850e59c37f8fp-58, 0x1.cc66e9931c45ep-2},
195 {0x1.5b362cb974183p-57, 0x1.b5d1009e15ccp-2},
196 {0x1.6da81290bdbabp-57, 0x1.9ef7943a8ed8ap-2},
197 {-0x1.72cedd3d5a61p-57, 0x1.87de2a6aea963p-2},
198 {-0x1.44b19e0864c5dp-56, 0x1.7088530fa459fp-2},
199 {-0x1.efdc0d58cf62p-62, 0x1.58f9a75ab1fddp-2},
200 {0x1.0c97c4afa2518p-56, 0x1.4135c94176601p-2},
201 {-0x1.5d28da2c4612dp-56, 0x1.294062ed59f06p-2},
202 {0x1.824c20ab7aa9ap-56, 0x1.111d262b1f677p-2},
203 {-0x1.42deef11da2c4p-57, 0x1.f19f97b215f1bp-3},
204 {-0x1.af1439e521935p-62, 0x1.c0b826a7e4f63p-3},
205 {-0x1.26d19b9ff8d82p-57, 0x1.8f8b83c69a60bp-3},
206 {0x1.531ff779ddac6p-57, 0x1.5e214448b3fc6p-3},
207 {0x1.13000a89a11ep-58, 0x1.2c8106e8e613ap-3},
208 {0x1.a2704729ae56dp-59, 0x1.f564e56a9730ep-4},
209 {-0x1.e2718d26ed688p-60, 0x1.917a6bc29b42cp-4},
210 {-0x1.9a088a8bf6b2cp-59, 0x1.2d52092ce19f6p-4},
211 {-0x1.912bd0d569a9p-61, 0x1.91f65f10dd814p-5},
212 {-0x1.b1d63091a013p-64, 0x1.92155f7a3667ep-6},
213 {0, 0},
214 {0x1.b1d63091a013p-64, -0x1.92155f7a3667ep-6},
215 {0x1.912bd0d569a9p-61, -0x1.91f65f10dd814p-5},
216 {0x1.9a088a8bf6b2cp-59, -0x1.2d52092ce19f6p-4},
217 {0x1.e2718d26ed688p-60, -0x1.917a6bc29b42cp-4},
218 {-0x1.a2704729ae56dp-59, -0x1.f564e56a9730ep-4},
219 {-0x1.13000a89a11ep-58, -0x1.2c8106e8e613ap-3},
220 {-0x1.531ff779ddac6p-57, -0x1.5e214448b3fc6p-3},
221 {0x1.26d19b9ff8d82p-57, -0x1.8f8b83c69a60bp-3},
222 {0x1.af1439e521935p-62, -0x1.c0b826a7e4f63p-3},
223 {0x1.42deef11da2c4p-57, -0x1.f19f97b215f1bp-3},
224 {-0x1.824c20ab7aa9ap-56, -0x1.111d262b1f677p-2},
225 {0x1.5d28da2c4612dp-56, -0x1.294062ed59f06p-2},
226 {-0x1.0c97c4afa2518p-56, -0x1.4135c94176601p-2},
227 {0x1.efdc0d58cf62p-62, -0x1.58f9a75ab1fddp-2},
228 {0x1.44b19e0864c5dp-56, -0x1.7088530fa459fp-2},
229 {0x1.72cedd3d5a61p-57, -0x1.87de2a6aea963p-2},
230 {-0x1.6da81290bdbabp-57, -0x1.9ef7943a8ed8ap-2},
231 {-0x1.5b362cb974183p-57, -0x1.b5d1009e15ccp-2},
232 {-0x1.6850e59c37f8fp-58, -0x1.cc66e9931c45ep-2},
233 {-0x1.e0d891d3c6841p-58, -0x1.e2b5d3806f63bp-2},
234 {0x1.2ec1fc1b776b8p-60, -0x1.f8ba4dbf89abap-2},
235 {0x1.a5a014347406cp-55, -0x1.073879922ffeep-1},
236 {0x1.ef23b69abe4f1p-55, -0x1.11eb3541b4b23p-1},
237 {-0x1.b25dd267f66p-55, -0x1.1c73b39ae68c8p-1},
238 {0x1.5da743ef3770cp-55, -0x1.26d054cdd12dfp-1},
239 {0x1.efcc626f74a6fp-57, -0x1.30ff7fce17035p-1},
240 {-0x1.e3e25e3954964p-56, -0x1.3affa292050b9p-1},
241 {-0x1.8076a2cfdc6b3p-57, -0x1.44cf325091dd6p-1},
242 {-0x1.3c293edceb327p-57, -0x1.4e6cabbe3e5e9p-1},
243 {0x1.75720992bfbb2p-55, -0x1.57d69348cecap-1},
244 {0x1.251b352ff2a37p-56, -0x1.610b7551d2cdfp-1},
245 {0x1.bdd3413b26456p-55, -0x1.6a09e667f3bcdp-1},
246 {-0x1.0d4ef0f1d915cp-55, -0x1.72d0837efff96p-1},
247 {0x1.0f537acdf0ad7p-56, -0x1.7b5df226aafafp-1},
248 {0x1.6f420f8ea3475p-56, -0x1.83b0e0bff976ep-1},
249 {0x1.2c5e12ed1336dp-55, -0x1.8bc806b151741p-1},
250 {-0x1.3d419a920df0bp-55, -0x1.93a22499263fbp-1},
251 {0x1.30ee286712474p-55, -0x1.9b3e047f38741p-1},
252 {0x1.128bb015df175p-56, -0x1.a29a7a0462782p-1},
253 {-0x1.9f630e8b6dac8p-60, -0x1.a9b66290ea1a3p-1},
254 {0x1.926da300ffccep-55, -0x1.b090a581502p-1},
255 {0x1.bc69f324e6d61p-55, -0x1.b728345196e3ep-1},
256 {0x1.825a732ac700ap-55, -0x1.bd7c0ac6f952ap-1},
257 {0x1.6e0b1757c8d07p-56, -0x1.c38b2f180bdb1p-1},
258 {0x1.2fb761e946603p-58, -0x1.c954b213411f5p-1},
259 {0x1.e7b6bb5ab58aep-58, -0x1.ced7af43cc773p-1},
260 {0x1.4ef5295d25af2p-55, -0x1.d4134d14dc93ap-1},
261 {-0x1.457e610231ac2p-56, -0x1.d906bcf328d46p-1},
262 {-0x1.83c37c6107db3p-55, -0x1.ddb13b6ccc23cp-1},
263 {0x1.014c76c126527p-55, -0x1.e212104f686e5p-1},
264 {0x1.16b56f2847754p-57, -0x1.e6288ec48e112p-1},
265 {-0x1.760b1e2e3f81ep-55, -0x1.e9f4156c62ddap-1},
266 {-0x1.e82c791f59cc2p-56, -0x1.ed740e7684963p-1},
267 {-0x1.52c7adc6b4989p-56, -0x1.f0a7efb9230d7p-1},
268 {0x1.d7bafb51f72e6p-56, -0x1.f38f3ac64e589p-1},
269 {-0x1.562172a361fd3p-56, -0x1.f6297cff75cbp-1},
270 {-0x1.ab256778ffcb6p-56, -0x1.f8764fa714ba9p-1},
271 {0x1.7a0a8ca13571fp-55, -0x1.fa7557f08a517p-1},
272 {-0x1.1ec8668ecaceep-55, -0x1.fc26470e19fd3p-1},
273 {0x1.87df6378811c7p-55, -0x1.fd88da3d12526p-1},
274 {-0x1.521ecd0c67e35p-57, -0x1.fe9cdad01883ap-1},
275 {0x1.c57bc2e24aa15p-57, -0x1.ff621e3796d7ep-1},
276 {0x1.1354d4556e4cbp-55, -0x1.ffd886084cd0dp-1},
277 {0, -1},
278 {0x1.1354d4556e4cbp-55, -0x1.ffd886084cd0dp-1},
279 {0x1.c57bc2e24aa15p-57, -0x1.ff621e3796d7ep-1},
280 {-0x1.521ecd0c67e35p-57, -0x1.fe9cdad01883ap-1},
281 {0x1.87df6378811c7p-55, -0x1.fd88da3d12526p-1},
282 {-0x1.1ec8668ecaceep-55, -0x1.fc26470e19fd3p-1},
283 {0x1.7a0a8ca13571fp-55, -0x1.fa7557f08a517p-1},
284 {-0x1.ab256778ffcb6p-56, -0x1.f8764fa714ba9p-1},
285 {-0x1.562172a361fd3p-56, -0x1.f6297cff75cbp-1},
286 {0x1.d7bafb51f72e6p-56, -0x1.f38f3ac64e589p-1},
287 {-0x1.52c7adc6b4989p-56, -0x1.f0a7efb9230d7p-1},
288 {-0x1.e82c791f59cc2p-56, -0x1.ed740e7684963p-1},
289 {-0x1.760b1e2e3f81ep-55, -0x1.e9f4156c62ddap-1},
290 {0x1.16b56f2847754p-57, -0x1.e6288ec48e112p-1},
291 {0x1.014c76c126527p-55, -0x1.e212104f686e5p-1},
292 {-0x1.83c37c6107db3p-55, -0x1.ddb13b6ccc23cp-1},
293 {-0x1.457e610231ac2p-56, -0x1.d906bcf328d46p-1},
294 {0x1.4ef5295d25af2p-55, -0x1.d4134d14dc93ap-1},
295 {0x1.e7b6bb5ab58aep-58, -0x1.ced7af43cc773p-1},
296 {0x1.2fb761e946603p-58, -0x1.c954b213411f5p-1},
297 {0x1.6e0b1757c8d07p-56, -0x1.c38b2f180bdb1p-1},
298 {0x1.825a732ac700ap-55, -0x1.bd7c0ac6f952ap-1},
299 {0x1.bc69f324e6d61p-55, -0x1.b728345196e3ep-1},
300 {0x1.926da300ffccep-55, -0x1.b090a581502p-1},
301 {-0x1.9f630e8b6dac8p-60, -0x1.a9b66290ea1a3p-1},
302 {0x1.128bb015df175p-56, -0x1.a29a7a0462782p-1},
303 {0x1.30ee286712474p-55, -0x1.9b3e047f38741p-1},
304 {-0x1.3d419a920df0bp-55, -0x1.93a22499263fbp-1},
305 {0x1.2c5e12ed1336dp-55, -0x1.8bc806b151741p-1},
306 {0x1.6f420f8ea3475p-56, -0x1.83b0e0bff976ep-1},
307 {0x1.0f537acdf0ad7p-56, -0x1.7b5df226aafafp-1},
308 {-0x1.0d4ef0f1d915cp-55, -0x1.72d0837efff96p-1},
309 {0x1.bdd3413b26456p-55, -0x1.6a09e667f3bcdp-1},
310 {0x1.251b352ff2a37p-56, -0x1.610b7551d2cdfp-1},
311 {0x1.75720992bfbb2p-55, -0x1.57d69348cecap-1},
312 {-0x1.3c293edceb327p-57, -0x1.4e6cabbe3e5e9p-1},
313 {-0x1.8076a2cfdc6b3p-57, -0x1.44cf325091dd6p-1},
314 {-0x1.e3e25e3954964p-56, -0x1.3affa292050b9p-1},
315 {0x1.efcc626f74a6fp-57, -0x1.30ff7fce17035p-1},
316 {0x1.5da743ef3770cp-55, -0x1.26d054cdd12dfp-1},
317 {-0x1.b25dd267f66p-55, -0x1.1c73b39ae68c8p-1},
318 {0x1.ef23b69abe4f1p-55, -0x1.11eb3541b4b23p-1},
319 {0x1.a5a014347406cp-55, -0x1.073879922ffeep-1},
320 {0x1.2ec1fc1b776b8p-60, -0x1.f8ba4dbf89abap-2},
321 {-0x1.e0d891d3c6841p-58, -0x1.e2b5d3806f63bp-2},
322 {-0x1.6850e59c37f8fp-58, -0x1.cc66e9931c45ep-2},
323 {-0x1.5b362cb974183p-57, -0x1.b5d1009e15ccp-2},
324 {-0x1.6da81290bdbabp-57, -0x1.9ef7943a8ed8ap-2},
325 {0x1.72cedd3d5a61p-57, -0x1.87de2a6aea963p-2},
326 {0x1.44b19e0864c5dp-56, -0x1.7088530fa459fp-2},
327 {0x1.efdc0d58cf62p-62, -0x1.58f9a75ab1fddp-2},
328 {-0x1.0c97c4afa2518p-56, -0x1.4135c94176601p-2},
329 {0x1.5d28da2c4612dp-56, -0x1.294062ed59f06p-2},
330 {-0x1.824c20ab7aa9ap-56, -0x1.111d262b1f677p-2},
331 {0x1.42deef11da2c4p-57, -0x1.f19f97b215f1bp-3},
332 {0x1.af1439e521935p-62, -0x1.c0b826a7e4f63p-3},
333 {0x1.26d19b9ff8d82p-57, -0x1.8f8b83c69a60bp-3},
334 {-0x1.531ff779ddac6p-57, -0x1.5e214448b3fc6p-3},
335 {-0x1.13000a89a11ep-58, -0x1.2c8106e8e613ap-3},
336 {-0x1.a2704729ae56dp-59, -0x1.f564e56a9730ep-4},
337 {0x1.e2718d26ed688p-60, -0x1.917a6bc29b42cp-4},
338 {0x1.9a088a8bf6b2cp-59, -0x1.2d52092ce19f6p-4},
339 {0x1.912bd0d569a9p-61, -0x1.91f65f10dd814p-5},
340 {0x1.b1d63091a013p-64, -0x1.92155f7a3667ep-6},
341 #endif // !LIBC_MATH_HAS_SMALL_TABLES
342 };
343
344 } // namespace LIBC_NAMESPACE_DECL
345
346 #endif // LLVM_LIBC_SRC_MATH_GENERIC_RANGE_REDUCTION_DOUBLE_FMA_H
347