1*71db0c75SAndroid Build Coastguard Worker //===-- Unittests for strtold ---------------------------------------------===//
2*71db0c75SAndroid Build Coastguard Worker //
3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information.
5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*71db0c75SAndroid Build Coastguard Worker //
7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
8*71db0c75SAndroid Build Coastguard Worker
9*71db0c75SAndroid Build Coastguard Worker #include "src/__support/FPUtil/FPBits.h"
10*71db0c75SAndroid Build Coastguard Worker #include "src/__support/uint128.h"
11*71db0c75SAndroid Build Coastguard Worker #include "src/errno/libc_errno.h"
12*71db0c75SAndroid Build Coastguard Worker #include "src/stdlib/strtold.h"
13*71db0c75SAndroid Build Coastguard Worker
14*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/Test.h"
15*71db0c75SAndroid Build Coastguard Worker
16*71db0c75SAndroid Build Coastguard Worker #include <stddef.h>
17*71db0c75SAndroid Build Coastguard Worker
18*71db0c75SAndroid Build Coastguard Worker #if defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64)
19*71db0c75SAndroid Build Coastguard Worker #define SELECT_CONST(val, _, __) val
20*71db0c75SAndroid Build Coastguard Worker #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_X86_FLOAT80)
21*71db0c75SAndroid Build Coastguard Worker #define SELECT_CONST(_, val, __) val
22*71db0c75SAndroid Build Coastguard Worker #elif defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT128)
23*71db0c75SAndroid Build Coastguard Worker #define SELECT_CONST(_, __, val) val
24*71db0c75SAndroid Build Coastguard Worker #else
25*71db0c75SAndroid Build Coastguard Worker #error "Unknown long double type"
26*71db0c75SAndroid Build Coastguard Worker #endif
27*71db0c75SAndroid Build Coastguard Worker
28*71db0c75SAndroid Build Coastguard Worker class LlvmLibcStrToLDTest : public LIBC_NAMESPACE::testing::Test {
29*71db0c75SAndroid Build Coastguard Worker public:
30*71db0c75SAndroid Build Coastguard Worker #if defined(LIBC_TYPES_LONG_DOUBLE_IS_FLOAT64)
run_test(const char * inputString,const ptrdiff_t expectedStrLen,const uint64_t expectedRawData,const int expectedErrno=0)31*71db0c75SAndroid Build Coastguard Worker void run_test(const char *inputString, const ptrdiff_t expectedStrLen,
32*71db0c75SAndroid Build Coastguard Worker const uint64_t expectedRawData, const int expectedErrno = 0)
33*71db0c75SAndroid Build Coastguard Worker #else
34*71db0c75SAndroid Build Coastguard Worker void run_test(const char *inputString, const ptrdiff_t expectedStrLen,
35*71db0c75SAndroid Build Coastguard Worker const UInt128 expectedRawData, const int expectedErrno = 0)
36*71db0c75SAndroid Build Coastguard Worker #endif
37*71db0c75SAndroid Build Coastguard Worker {
38*71db0c75SAndroid Build Coastguard Worker // expectedRawData64 is the expected long double result as a uint64_t,
39*71db0c75SAndroid Build Coastguard Worker // organized according to the IEEE754 double precision format:
40*71db0c75SAndroid Build Coastguard Worker //
41*71db0c75SAndroid Build Coastguard Worker // +-- 1 Sign Bit +-- 52 Mantissa bits
42*71db0c75SAndroid Build Coastguard Worker // | |
43*71db0c75SAndroid Build Coastguard Worker // | +-------------------------+------------------------+
44*71db0c75SAndroid Build Coastguard Worker // | | |
45*71db0c75SAndroid Build Coastguard Worker // SEEEEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
46*71db0c75SAndroid Build Coastguard Worker // | |
47*71db0c75SAndroid Build Coastguard Worker // +----+----+
48*71db0c75SAndroid Build Coastguard Worker // |
49*71db0c75SAndroid Build Coastguard Worker // +-- 11 Exponent Bits
50*71db0c75SAndroid Build Coastguard Worker
51*71db0c75SAndroid Build Coastguard Worker // expectedRawData80 is the expected long double result as a UInt128,
52*71db0c75SAndroid Build Coastguard Worker // organized according to the x86 extended precision format:
53*71db0c75SAndroid Build Coastguard Worker //
54*71db0c75SAndroid Build Coastguard Worker // +-- 1 Sign Bit
55*71db0c75SAndroid Build Coastguard Worker // |
56*71db0c75SAndroid Build Coastguard Worker // | +-- 1 Integer part bit (1 unless this is a subnormal)
57*71db0c75SAndroid Build Coastguard Worker // | |
58*71db0c75SAndroid Build Coastguard Worker // SEEEEEEEEEEEEEEEIMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM...M
59*71db0c75SAndroid Build Coastguard Worker // | | | |
60*71db0c75SAndroid Build Coastguard Worker // +------+------+ +---------------------------+--------------------------+
61*71db0c75SAndroid Build Coastguard Worker // | |
62*71db0c75SAndroid Build Coastguard Worker // +-- 15 Exponent Bits +-- 63 Mantissa bits
63*71db0c75SAndroid Build Coastguard Worker
64*71db0c75SAndroid Build Coastguard Worker // expectedRawData128 is the expected long double result as a UInt128,
65*71db0c75SAndroid Build Coastguard Worker // organized according to IEEE754 quadruple precision format:
66*71db0c75SAndroid Build Coastguard Worker //
67*71db0c75SAndroid Build Coastguard Worker // +-- 1 Sign Bit +-- 112 Mantissa bits
68*71db0c75SAndroid Build Coastguard Worker // | |
69*71db0c75SAndroid Build Coastguard Worker // | +----------------------------+--------------------------+
70*71db0c75SAndroid Build Coastguard Worker // | | |
71*71db0c75SAndroid Build Coastguard Worker // SEEEEEEEEEEEEEEEMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM...M
72*71db0c75SAndroid Build Coastguard Worker // | |
73*71db0c75SAndroid Build Coastguard Worker // +------+------+
74*71db0c75SAndroid Build Coastguard Worker // |
75*71db0c75SAndroid Build Coastguard Worker // +-- 15 Exponent Bits
76*71db0c75SAndroid Build Coastguard Worker char *str_end = nullptr;
77*71db0c75SAndroid Build Coastguard Worker
78*71db0c75SAndroid Build Coastguard Worker using FPBits = LIBC_NAMESPACE::fputil::FPBits<long double>;
79*71db0c75SAndroid Build Coastguard Worker FPBits expected_fp =
80*71db0c75SAndroid Build Coastguard Worker FPBits(static_cast<FPBits::StorageType>(expectedRawData));
81*71db0c75SAndroid Build Coastguard Worker const int expected_errno = expectedErrno;
82*71db0c75SAndroid Build Coastguard Worker
83*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::libc_errno = 0;
84*71db0c75SAndroid Build Coastguard Worker long double result = LIBC_NAMESPACE::strtold(inputString, &str_end);
85*71db0c75SAndroid Build Coastguard Worker
86*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::fputil::FPBits<long double> actual_fp =
87*71db0c75SAndroid Build Coastguard Worker LIBC_NAMESPACE::fputil::FPBits<long double>();
88*71db0c75SAndroid Build Coastguard Worker actual_fp = LIBC_NAMESPACE::fputil::FPBits<long double>(result);
89*71db0c75SAndroid Build Coastguard Worker
90*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(str_end - inputString, expectedStrLen);
91*71db0c75SAndroid Build Coastguard Worker
92*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(actual_fp.uintval(), expected_fp.uintval());
93*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(actual_fp.is_neg(), expected_fp.is_neg());
94*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(actual_fp.get_exponent(), expected_fp.get_exponent());
95*71db0c75SAndroid Build Coastguard Worker EXPECT_EQ(actual_fp.get_mantissa(), expected_fp.get_mantissa());
96*71db0c75SAndroid Build Coastguard Worker ASSERT_ERRNO_EQ(expected_errno);
97*71db0c75SAndroid Build Coastguard Worker }
98*71db0c75SAndroid Build Coastguard Worker };
99*71db0c75SAndroid Build Coastguard Worker
TEST_F(LlvmLibcStrToLDTest,SimpleTest)100*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcStrToLDTest, SimpleTest) {
101*71db0c75SAndroid Build Coastguard Worker run_test("123", 3,
102*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(uint64_t(0x405ec00000000000),
103*71db0c75SAndroid Build Coastguard Worker UInt128(0x4005f60000) << 40,
104*71db0c75SAndroid Build Coastguard Worker UInt128(0x4005ec0000000000) << 64));
105*71db0c75SAndroid Build Coastguard Worker
106*71db0c75SAndroid Build Coastguard Worker // This should fail on Eisel-Lemire, forcing a fallback to simple decimal
107*71db0c75SAndroid Build Coastguard Worker // conversion.
108*71db0c75SAndroid Build Coastguard Worker run_test("12345678901234549760", 20,
109*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(uint64_t(0x43e56a95319d63d8),
110*71db0c75SAndroid Build Coastguard Worker (UInt128(0x403eab54a9) << 40) + UInt128(0x8ceb1ec400),
111*71db0c75SAndroid Build Coastguard Worker (UInt128(0x403e56a95319d63d) << 64) +
112*71db0c75SAndroid Build Coastguard Worker UInt128(0x8800000000000000)));
113*71db0c75SAndroid Build Coastguard Worker
114*71db0c75SAndroid Build Coastguard Worker // Found while looking for difficult test cases here:
115*71db0c75SAndroid Build Coastguard Worker // https://github.com/nigeltao/parse-number-fxx-test-data/blob/main/more-test-cases/golang-org-issue-36657.txt
116*71db0c75SAndroid Build Coastguard Worker run_test("1090544144181609348835077142190", 31,
117*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(uint64_t(0x462b8779f2474dfb),
118*71db0c75SAndroid Build Coastguard Worker (UInt128(0x4062dc3bcf) << 40) + UInt128(0x923a6fd402),
119*71db0c75SAndroid Build Coastguard Worker (UInt128(0x4062b8779f2474df) << 64) +
120*71db0c75SAndroid Build Coastguard Worker UInt128(0xa804bfd8c6d5c000)));
121*71db0c75SAndroid Build Coastguard Worker
122*71db0c75SAndroid Build Coastguard Worker run_test("0x123", 5,
123*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(uint64_t(0x4072300000000000),
124*71db0c75SAndroid Build Coastguard Worker (UInt128(0x4007918000) << 40),
125*71db0c75SAndroid Build Coastguard Worker (UInt128(0x4007230000000000) << 64)));
126*71db0c75SAndroid Build Coastguard Worker }
127*71db0c75SAndroid Build Coastguard Worker
128*71db0c75SAndroid Build Coastguard Worker // These are tests that have caused problems for doubles in the past.
TEST_F(LlvmLibcStrToLDTest,Float64SpecificFailures)129*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcStrToLDTest, Float64SpecificFailures) {
130*71db0c75SAndroid Build Coastguard Worker run_test("3E70000000000000", 16,
131*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(uint64_t(0x7FF0000000000000),
132*71db0c75SAndroid Build Coastguard Worker (UInt128(0x7fff800000) << 40),
133*71db0c75SAndroid Build Coastguard Worker (UInt128(0x7fff000000000000) << 64)),
134*71db0c75SAndroid Build Coastguard Worker ERANGE);
135*71db0c75SAndroid Build Coastguard Worker run_test("358416272e-33", 13,
136*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(uint64_t(0x3adbbb2a68c9d0b9),
137*71db0c75SAndroid Build Coastguard Worker (UInt128(0x3fadddd953) << 40) + UInt128(0x464e85c400),
138*71db0c75SAndroid Build Coastguard Worker (UInt128(0x3fadbbb2a68c9d0b) << 64) +
139*71db0c75SAndroid Build Coastguard Worker UInt128(0x8800e7969e1c5fc8)));
140*71db0c75SAndroid Build Coastguard Worker run_test("2.16656806400000023841857910156251e9", 36,
141*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(uint64_t(0x41e0246690000001),
142*71db0c75SAndroid Build Coastguard Worker (UInt128(0x401e812334) << 40) + UInt128(0x8000000400),
143*71db0c75SAndroid Build Coastguard Worker (UInt128(0x401e024669000000) << 64) +
144*71db0c75SAndroid Build Coastguard Worker UInt128(0x800000000000018)));
145*71db0c75SAndroid Build Coastguard Worker run_test("27949676547093071875", 20,
146*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(uint64_t(0x43f83e132bc608c9),
147*71db0c75SAndroid Build Coastguard Worker (UInt128(0x403fc1f099) << 40) + UInt128(0x5e30464402),
148*71db0c75SAndroid Build Coastguard Worker (UInt128(0x403f83e132bc608c) << 64) +
149*71db0c75SAndroid Build Coastguard Worker UInt128(0x8803000000000000)));
150*71db0c75SAndroid Build Coastguard Worker }
151*71db0c75SAndroid Build Coastguard Worker
TEST_F(LlvmLibcStrToLDTest,Float80SpecificFailures)152*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcStrToLDTest, Float80SpecificFailures) {
153*71db0c75SAndroid Build Coastguard Worker run_test("7777777777777777777777777777777777777777777777777777777777777777777"
154*71db0c75SAndroid Build Coastguard Worker "777777777777777777777777777777777",
155*71db0c75SAndroid Build Coastguard Worker 100,
156*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(uint64_t(0x54ac729b8fcaf734),
157*71db0c75SAndroid Build Coastguard Worker (UInt128(0x414ae394dc) << 40) + UInt128(0x7e57b9a0c2),
158*71db0c75SAndroid Build Coastguard Worker (UInt128(0x414ac729b8fcaf73) << 64) +
159*71db0c75SAndroid Build Coastguard Worker UInt128(0x4184a3d793224129)));
160*71db0c75SAndroid Build Coastguard Worker }
161*71db0c75SAndroid Build Coastguard Worker
TEST_F(LlvmLibcStrToLDTest,MaxSizeNumbers)162*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcStrToLDTest, MaxSizeNumbers) {
163*71db0c75SAndroid Build Coastguard Worker run_test("1.1897314953572317650e4932", 26,
164*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(uint64_t(0x7FF0000000000000),
165*71db0c75SAndroid Build Coastguard Worker (UInt128(0x7ffeffffff) << 40) + UInt128(0xffffffffff),
166*71db0c75SAndroid Build Coastguard Worker (UInt128(0x7ffeffffffffffff) << 64) +
167*71db0c75SAndroid Build Coastguard Worker UInt128(0xfffd57322e3f8675)),
168*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(ERANGE, 0, 0));
169*71db0c75SAndroid Build Coastguard Worker run_test("1.18973149535723176508e4932", 27,
170*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(uint64_t(0x7FF0000000000000),
171*71db0c75SAndroid Build Coastguard Worker (UInt128(0x7fff800000) << 40),
172*71db0c75SAndroid Build Coastguard Worker (UInt128(0x7ffeffffffffffff) << 64) +
173*71db0c75SAndroid Build Coastguard Worker UInt128(0xffffd2478338036c)),
174*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(ERANGE, ERANGE, 0));
175*71db0c75SAndroid Build Coastguard Worker }
176*71db0c75SAndroid Build Coastguard Worker
177*71db0c75SAndroid Build Coastguard Worker // These tests check subnormal behavior for 80 bit and 128 bit floats. They will
178*71db0c75SAndroid Build Coastguard Worker // be too small for 64 bit floats.
TEST_F(LlvmLibcStrToLDTest,SubnormalTests)179*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcStrToLDTest, SubnormalTests) {
180*71db0c75SAndroid Build Coastguard Worker run_test("1e-4950", 7,
181*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(uint64_t(0), (UInt128(0x00000000000000000003)),
182*71db0c75SAndroid Build Coastguard Worker (UInt128(0x000000000000000000057c9647e1a018))),
183*71db0c75SAndroid Build Coastguard Worker ERANGE);
184*71db0c75SAndroid Build Coastguard Worker run_test("1.89e-4951", 10,
185*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(uint64_t(0), (UInt128(0x00000000000000000001)),
186*71db0c75SAndroid Build Coastguard Worker (UInt128(0x0000000000000000000109778a006738))),
187*71db0c75SAndroid Build Coastguard Worker ERANGE);
188*71db0c75SAndroid Build Coastguard Worker run_test("4e-4966", 7,
189*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(uint64_t(0), (UInt128(0)),
190*71db0c75SAndroid Build Coastguard Worker (UInt128(0x00000000000000000000000000000001))),
191*71db0c75SAndroid Build Coastguard Worker ERANGE);
192*71db0c75SAndroid Build Coastguard Worker }
193*71db0c75SAndroid Build Coastguard Worker
TEST_F(LlvmLibcStrToLDTest,SmallNormalTests)194*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcStrToLDTest, SmallNormalTests) {
195*71db0c75SAndroid Build Coastguard Worker run_test("3.37e-4932", 10,
196*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(
197*71db0c75SAndroid Build Coastguard Worker uint64_t(0), (UInt128(0x1804cf7) << 40) + UInt128(0x908850712),
198*71db0c75SAndroid Build Coastguard Worker (UInt128(0x10099ee12110a) << 64) + UInt128(0xe24b75c0f50dc0c)),
199*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(ERANGE, 0, 0));
200*71db0c75SAndroid Build Coastguard Worker }
201*71db0c75SAndroid Build Coastguard Worker
TEST_F(LlvmLibcStrToLDTest,ComplexHexadecimalTests)202*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcStrToLDTest, ComplexHexadecimalTests) {
203*71db0c75SAndroid Build Coastguard Worker run_test("0x1p16383", 9,
204*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(0x7ff0000000000000, (UInt128(0x7ffe800000) << 40),
205*71db0c75SAndroid Build Coastguard Worker (UInt128(0x7ffe000000000000) << 64)),
206*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(ERANGE, 0, 0));
207*71db0c75SAndroid Build Coastguard Worker run_test("0x123456789abcdef", 17,
208*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(0x43723456789abcdf,
209*71db0c75SAndroid Build Coastguard Worker (UInt128(0x403791a2b3) << 40) + UInt128(0xc4d5e6f780),
210*71db0c75SAndroid Build Coastguard Worker (UInt128(0x403723456789abcd) << 64) +
211*71db0c75SAndroid Build Coastguard Worker UInt128(0xef00000000000000)));
212*71db0c75SAndroid Build Coastguard Worker run_test("0x123456789abcdef0123456789ABCDEF", 33,
213*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(0x47723456789abcdf,
214*71db0c75SAndroid Build Coastguard Worker (UInt128(0x407791a2b3) << 40) + UInt128(0xc4d5e6f781),
215*71db0c75SAndroid Build Coastguard Worker (UInt128(0x407723456789abcd) << 64) +
216*71db0c75SAndroid Build Coastguard Worker UInt128(0xef0123456789abce)));
217*71db0c75SAndroid Build Coastguard Worker }
218*71db0c75SAndroid Build Coastguard Worker
TEST_F(LlvmLibcStrToLDTest,InfTests)219*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcStrToLDTest, InfTests) {
220*71db0c75SAndroid Build Coastguard Worker run_test("INF", 3,
221*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(0x7ff0000000000000, (UInt128(0x7fff800000) << 40),
222*71db0c75SAndroid Build Coastguard Worker (UInt128(0x7fff000000000000) << 64)));
223*71db0c75SAndroid Build Coastguard Worker run_test("INFinity", 8,
224*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(0x7ff0000000000000, (UInt128(0x7fff800000) << 40),
225*71db0c75SAndroid Build Coastguard Worker (UInt128(0x7fff000000000000) << 64)));
226*71db0c75SAndroid Build Coastguard Worker run_test("-inf", 4,
227*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(0xfff0000000000000, (UInt128(0xffff800000) << 40),
228*71db0c75SAndroid Build Coastguard Worker (UInt128(0xffff000000000000) << 64)));
229*71db0c75SAndroid Build Coastguard Worker }
230*71db0c75SAndroid Build Coastguard Worker
TEST_F(LlvmLibcStrToLDTest,NaNTests)231*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcStrToLDTest, NaNTests) {
232*71db0c75SAndroid Build Coastguard Worker run_test("NaN", 3,
233*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(0x7ff8000000000000, (UInt128(0x7fffc00000) << 40),
234*71db0c75SAndroid Build Coastguard Worker (UInt128(0x7fff800000000000) << 64)));
235*71db0c75SAndroid Build Coastguard Worker run_test("-nAn", 4,
236*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(0xfff8000000000000, (UInt128(0xffffc00000) << 40),
237*71db0c75SAndroid Build Coastguard Worker (UInt128(0xffff800000000000) << 64)));
238*71db0c75SAndroid Build Coastguard Worker run_test("NaN()", 5,
239*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(0x7ff8000000000000, (UInt128(0x7fffc00000) << 40),
240*71db0c75SAndroid Build Coastguard Worker (UInt128(0x7fff800000000000) << 64)));
241*71db0c75SAndroid Build Coastguard Worker run_test("NaN(1234)", 9,
242*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(0x7ff80000000004d2,
243*71db0c75SAndroid Build Coastguard Worker (UInt128(0x7fffc00000) << 40) + UInt128(0x4d2),
244*71db0c75SAndroid Build Coastguard Worker (UInt128(0x7fff800000000000) << 64) + UInt128(0x4d2)));
245*71db0c75SAndroid Build Coastguard Worker run_test("NaN(0xffffffffffff)", 19,
246*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(0x7ff8ffffffffffff,
247*71db0c75SAndroid Build Coastguard Worker (UInt128(0x7fffc000ff) << 40) + UInt128(0xffffffffff),
248*71db0c75SAndroid Build Coastguard Worker (UInt128(0x7fff800000000000) << 64) +
249*71db0c75SAndroid Build Coastguard Worker UInt128(0xffffffffffff)));
250*71db0c75SAndroid Build Coastguard Worker run_test("NaN(0xfffffffffffff)", 20,
251*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(0x7fffffffffffffff,
252*71db0c75SAndroid Build Coastguard Worker (UInt128(0x7fffc00fff) << 40) + UInt128(0xffffffffff),
253*71db0c75SAndroid Build Coastguard Worker (UInt128(0x7fff800000000000) << 64) +
254*71db0c75SAndroid Build Coastguard Worker UInt128(0xfffffffffffff)));
255*71db0c75SAndroid Build Coastguard Worker run_test("NaN(0xffffffffffffffff)", 23,
256*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(0x7fffffffffffffff,
257*71db0c75SAndroid Build Coastguard Worker (UInt128(0x7fffffffff) << 40) + UInt128(0xffffffffff),
258*71db0c75SAndroid Build Coastguard Worker (UInt128(0x7fff800000000000) << 64) +
259*71db0c75SAndroid Build Coastguard Worker UInt128(0xffffffffffffffff)));
260*71db0c75SAndroid Build Coastguard Worker run_test("NaN( 1234)", 3,
261*71db0c75SAndroid Build Coastguard Worker SELECT_CONST(0x7ff8000000000000, (UInt128(0x7fffc00000) << 40),
262*71db0c75SAndroid Build Coastguard Worker (UInt128(0x7fff800000000000) << 64)));
263*71db0c75SAndroid Build Coastguard Worker }
264