1*b8e8012aSKirill Okhotnikov //===-- Utility class to test fmod special numbers ------------------------===//
2*b8e8012aSKirill Okhotnikov //
3*b8e8012aSKirill Okhotnikov // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*b8e8012aSKirill Okhotnikov // See https://llvm.org/LICENSE.txt for license information.
5*b8e8012aSKirill Okhotnikov // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*b8e8012aSKirill Okhotnikov //
7*b8e8012aSKirill Okhotnikov //===----------------------------------------------------------------------===//
8*b8e8012aSKirill Okhotnikov 
9*b8e8012aSKirill Okhotnikov #ifndef LLVM_LIBC_TEST_SRC_MATH_FMODTEST_H
10*b8e8012aSKirill Okhotnikov #define LLVM_LIBC_TEST_SRC_MATH_FMODTEST_H
11*b8e8012aSKirill Okhotnikov 
12*b8e8012aSKirill Okhotnikov #include "src/__support/FPUtil/BasicOperations.h"
13*b8e8012aSKirill Okhotnikov #include "src/__support/FPUtil/NearestIntegerOperations.h"
14*b8e8012aSKirill Okhotnikov #include "utils/UnitTest/FPMatcher.h"
15*b8e8012aSKirill Okhotnikov #include "utils/UnitTest/Test.h"
16*b8e8012aSKirill Okhotnikov 
17*b8e8012aSKirill Okhotnikov #include <limits>
18*b8e8012aSKirill Okhotnikov #include <math.h>
19*b8e8012aSKirill Okhotnikov 
20*b8e8012aSKirill Okhotnikov #define TEST_SPECIAL(x, y, expected, dom_err, expected_exception)              \
21*b8e8012aSKirill Okhotnikov   EXPECT_FP_EQ(expected, f(x, y));                                             \
22*b8e8012aSKirill Okhotnikov   EXPECT_MATH_ERRNO((dom_err) ? EDOM : 0);                                     \
23*b8e8012aSKirill Okhotnikov   EXPECT_FP_EXCEPTION(expected_exception);                                     \
24*b8e8012aSKirill Okhotnikov   __llvm_libc::fputil::clear_except(FE_ALL_EXCEPT)
25*b8e8012aSKirill Okhotnikov 
26*b8e8012aSKirill Okhotnikov #define TEST_REGULAR(x, y, expected) TEST_SPECIAL(x, y, expected, false, 0)
27*b8e8012aSKirill Okhotnikov 
28*b8e8012aSKirill Okhotnikov template <typename T> class FmodTest : public __llvm_libc::testing::Test {
29*b8e8012aSKirill Okhotnikov 
30*b8e8012aSKirill Okhotnikov   DECLARE_SPECIAL_CONSTANTS(T)
31*b8e8012aSKirill Okhotnikov 
32*b8e8012aSKirill Okhotnikov public:
33*b8e8012aSKirill Okhotnikov   typedef T (*FModFunc)(T, T);
34*b8e8012aSKirill Okhotnikov 
testSpecialNumbers(FModFunc f)35*b8e8012aSKirill Okhotnikov   void testSpecialNumbers(FModFunc f) {
36*b8e8012aSKirill Okhotnikov     using nl = std::numeric_limits<T>;
37*b8e8012aSKirill Okhotnikov 
38*b8e8012aSKirill Okhotnikov     // fmod (+0, y) == +0 for y != 0.
39*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(0.0, 3.0, 0.0, false, 0);
40*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(0.0, nl::denorm_min(), 0.0, false, 0);
41*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(0.0, -nl::denorm_min(), 0.0, false, 0);
42*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(0.0, nl::min(), 0.0, false, 0);
43*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(0.0, -nl::min(), 0.0, false, 0);
44*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(0.0, nl::max(), 0.0, false, 0);
45*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(0.0, -nl::max(), 0.0, false, 0);
46*b8e8012aSKirill Okhotnikov 
47*b8e8012aSKirill Okhotnikov     // fmod (-0, y) == -0 for y != 0.
48*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_zero, 3.0, neg_zero, false, 0);
49*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_zero, nl::denorm_min(), neg_zero, false, 0);
50*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_zero, -nl::denorm_min(), neg_zero, false, 0);
51*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_zero, nl::min(), neg_zero, false, 0);
52*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_zero, -nl::min(), neg_zero, false, 0);
53*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_zero, nl::max(), neg_zero, false, 0);
54*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_zero, -nl::max(), neg_zero, false, 0);
55*b8e8012aSKirill Okhotnikov 
56*b8e8012aSKirill Okhotnikov     // fmod (+inf, y) == nl::quiet_NaN() plus invalid exception.
57*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(inf, 3.0, nl::quiet_NaN(), true, FE_INVALID);
58*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(inf, -1.1L, nl::quiet_NaN(), true, FE_INVALID);
59*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(inf, 0.0, nl::quiet_NaN(), true, FE_INVALID);
60*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(inf, neg_zero, nl::quiet_NaN(), true, FE_INVALID);
61*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(inf, nl::denorm_min(), nl::quiet_NaN(), true, FE_INVALID);
62*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(inf, nl::min(), nl::quiet_NaN(), true, FE_INVALID);
63*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(inf, nl::max(), nl::quiet_NaN(), true, FE_INVALID);
64*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(inf, inf, nl::quiet_NaN(), true, FE_INVALID);
65*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(inf, neg_inf, nl::quiet_NaN(), true, FE_INVALID);
66*b8e8012aSKirill Okhotnikov 
67*b8e8012aSKirill Okhotnikov     // fmod (-inf, y) == nl::quiet_NaN() plus invalid exception.
68*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_inf, 3.0, nl::quiet_NaN(), true, FE_INVALID);
69*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_inf, -1.1L, nl::quiet_NaN(), true, FE_INVALID);
70*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_inf, 0.0, nl::quiet_NaN(), true, FE_INVALID);
71*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_inf, neg_zero, nl::quiet_NaN(), true, FE_INVALID);
72*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_inf, nl::denorm_min(), nl::quiet_NaN(), true, FE_INVALID);
73*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_inf, nl::min(), nl::quiet_NaN(), true, FE_INVALID);
74*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_inf, nl::max(), nl::quiet_NaN(), true, FE_INVALID);
75*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_inf, inf, nl::quiet_NaN(), true, FE_INVALID);
76*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_inf, neg_inf, nl::quiet_NaN(), true, FE_INVALID);
77*b8e8012aSKirill Okhotnikov 
78*b8e8012aSKirill Okhotnikov     // fmod (x, +0) == nl::quiet_NaN() plus invalid exception.
79*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(3.0, 0.0, nl::quiet_NaN(), true, FE_INVALID);
80*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-1.1L, 0.0, nl::quiet_NaN(), true, FE_INVALID);
81*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(0.0, 0.0, nl::quiet_NaN(), true, FE_INVALID);
82*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_zero, 0.0, nl::quiet_NaN(), true, FE_INVALID);
83*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::denorm_min(), 0.0, nl::quiet_NaN(), true, FE_INVALID);
84*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::min(), 0.0, nl::quiet_NaN(), true, FE_INVALID);
85*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::max(), 0.0, nl::quiet_NaN(), true, FE_INVALID);
86*b8e8012aSKirill Okhotnikov 
87*b8e8012aSKirill Okhotnikov     // fmod (x, -0) == nl::quiet_NaN() plus invalid exception.
88*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(3.0, neg_zero, nl::quiet_NaN(), true, FE_INVALID);
89*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-1.1L, neg_zero, nl::quiet_NaN(), true, FE_INVALID);
90*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(0.0, neg_zero, nl::quiet_NaN(), true, FE_INVALID);
91*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_zero, neg_zero, nl::quiet_NaN(), true, FE_INVALID);
92*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::denorm_min(), neg_zero, nl::quiet_NaN(), true, FE_INVALID);
93*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::min(), neg_zero, nl::quiet_NaN(), true, FE_INVALID);
94*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::max(), neg_zero, nl::quiet_NaN(), true, FE_INVALID);
95*b8e8012aSKirill Okhotnikov 
96*b8e8012aSKirill Okhotnikov     // fmod (x, +inf) == x for x not infinite.
97*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(0.0, inf, 0.0, false, 0);
98*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_zero, inf, neg_zero, false, 0);
99*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::denorm_min(), inf, nl::denorm_min(), false, 0);
100*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::min(), inf, nl::min(), false, 0);
101*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::max(), inf, nl::max(), false, 0);
102*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(3.0, inf, 3.0, false, 0);
103*b8e8012aSKirill Okhotnikov     // fmod (x, -inf) == x for x not infinite.
104*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(0.0, neg_inf, 0.0, false, 0);
105*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_zero, neg_inf, neg_zero, false, 0);
106*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::denorm_min(), neg_inf, nl::denorm_min(), false, 0);
107*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::min(), neg_inf, nl::min(), false, 0);
108*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::max(), neg_inf, nl::max(), false, 0);
109*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(3.0, neg_inf, 3.0, false, 0);
110*b8e8012aSKirill Okhotnikov 
111*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(0.0, nl::quiet_NaN(), nl::quiet_NaN(), false, 0);
112*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(0.0, -nl::quiet_NaN(), nl::quiet_NaN(), false, 0);
113*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_zero, nl::quiet_NaN(), nl::quiet_NaN(), false, 0);
114*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_zero, -nl::quiet_NaN(), nl::quiet_NaN(), false, 0);
115*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(1.0, nl::quiet_NaN(), nl::quiet_NaN(), false, 0);
116*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(1.0, -nl::quiet_NaN(), nl::quiet_NaN(), false, 0);
117*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(inf, nl::quiet_NaN(), nl::quiet_NaN(), false, 0);
118*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(inf, -nl::quiet_NaN(), nl::quiet_NaN(), false, 0);
119*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_inf, nl::quiet_NaN(), nl::quiet_NaN(), false, 0);
120*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_inf, -nl::quiet_NaN(), nl::quiet_NaN(), false, 0);
121*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(0.0, nl::signaling_NaN(), nl::quiet_NaN(), false, FE_INVALID);
122*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(0.0, -nl::signaling_NaN(), nl::quiet_NaN(), false, FE_INVALID);
123*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_zero, nl::signaling_NaN(), nl::quiet_NaN(), false,
124*b8e8012aSKirill Okhotnikov                  FE_INVALID);
125*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_zero, -nl::signaling_NaN(), nl::quiet_NaN(), false,
126*b8e8012aSKirill Okhotnikov                  FE_INVALID);
127*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(1.0, nl::signaling_NaN(), nl::quiet_NaN(), false, FE_INVALID);
128*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(1.0, -nl::signaling_NaN(), nl::quiet_NaN(), false, FE_INVALID);
129*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(inf, nl::signaling_NaN(), nl::quiet_NaN(), false, FE_INVALID);
130*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(inf, -nl::signaling_NaN(), nl::quiet_NaN(), false, FE_INVALID);
131*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_inf, nl::signaling_NaN(), nl::quiet_NaN(), false,
132*b8e8012aSKirill Okhotnikov                  FE_INVALID);
133*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(neg_inf, -nl::signaling_NaN(), nl::quiet_NaN(), false,
134*b8e8012aSKirill Okhotnikov                  FE_INVALID);
135*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::quiet_NaN(), 0.0, nl::quiet_NaN(), false, 0);
136*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::quiet_NaN(), 0.0, nl::quiet_NaN(), false, 0);
137*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::quiet_NaN(), neg_zero, nl::quiet_NaN(), false, 0);
138*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::quiet_NaN(), neg_zero, nl::quiet_NaN(), false, 0);
139*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::quiet_NaN(), 1.0, nl::quiet_NaN(), false, 0);
140*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::quiet_NaN(), 1.0, nl::quiet_NaN(), false, 0);
141*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::quiet_NaN(), inf, nl::quiet_NaN(), false, 0);
142*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::quiet_NaN(), inf, nl::quiet_NaN(), false, 0);
143*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::quiet_NaN(), neg_inf, nl::quiet_NaN(), false, 0);
144*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::quiet_NaN(), neg_inf, nl::quiet_NaN(), false, 0);
145*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::signaling_NaN(), 0.0, nl::quiet_NaN(), false, FE_INVALID);
146*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::signaling_NaN(), 0.0, nl::quiet_NaN(), false, FE_INVALID);
147*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::signaling_NaN(), neg_zero, nl::quiet_NaN(), false,
148*b8e8012aSKirill Okhotnikov                  FE_INVALID);
149*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::signaling_NaN(), neg_zero, nl::quiet_NaN(), false,
150*b8e8012aSKirill Okhotnikov                  FE_INVALID);
151*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::signaling_NaN(), 1.0, nl::quiet_NaN(), false, FE_INVALID);
152*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::signaling_NaN(), 1.0, nl::quiet_NaN(), false, FE_INVALID);
153*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::signaling_NaN(), inf, nl::quiet_NaN(), false, FE_INVALID);
154*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::signaling_NaN(), inf, nl::quiet_NaN(), false, FE_INVALID);
155*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::signaling_NaN(), neg_inf, nl::quiet_NaN(), false,
156*b8e8012aSKirill Okhotnikov                  FE_INVALID);
157*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::signaling_NaN(), neg_inf, nl::quiet_NaN(), false,
158*b8e8012aSKirill Okhotnikov                  FE_INVALID);
159*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::quiet_NaN(), nl::quiet_NaN(), nl::quiet_NaN(), false, 0);
160*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::quiet_NaN(), -nl::quiet_NaN(), nl::quiet_NaN(), false, 0);
161*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::quiet_NaN(), nl::quiet_NaN(), nl::quiet_NaN(), false, 0);
162*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::quiet_NaN(), -nl::quiet_NaN(), nl::quiet_NaN(), false, 0);
163*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::quiet_NaN(), nl::signaling_NaN(), nl::quiet_NaN(), false,
164*b8e8012aSKirill Okhotnikov                  FE_INVALID);
165*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::quiet_NaN(), -nl::signaling_NaN(), nl::quiet_NaN(), false,
166*b8e8012aSKirill Okhotnikov                  FE_INVALID);
167*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::quiet_NaN(), nl::signaling_NaN(), nl::quiet_NaN(), false,
168*b8e8012aSKirill Okhotnikov                  FE_INVALID);
169*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::quiet_NaN(), -nl::signaling_NaN(), nl::quiet_NaN(), false,
170*b8e8012aSKirill Okhotnikov                  FE_INVALID);
171*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::signaling_NaN(), nl::quiet_NaN(), nl::quiet_NaN(), false,
172*b8e8012aSKirill Okhotnikov                  FE_INVALID);
173*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::signaling_NaN(), -nl::quiet_NaN(), nl::quiet_NaN(), false,
174*b8e8012aSKirill Okhotnikov                  FE_INVALID);
175*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::signaling_NaN(), nl::quiet_NaN(), nl::quiet_NaN(), false,
176*b8e8012aSKirill Okhotnikov                  FE_INVALID);
177*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::signaling_NaN(), -nl::quiet_NaN(), nl::quiet_NaN(), false,
178*b8e8012aSKirill Okhotnikov                  FE_INVALID);
179*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::signaling_NaN(), nl::signaling_NaN(), nl::quiet_NaN(),
180*b8e8012aSKirill Okhotnikov                  false, FE_INVALID);
181*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::signaling_NaN(), -nl::signaling_NaN(), nl::quiet_NaN(),
182*b8e8012aSKirill Okhotnikov                  false, FE_INVALID);
183*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::signaling_NaN(), nl::signaling_NaN(), nl::quiet_NaN(),
184*b8e8012aSKirill Okhotnikov                  false, FE_INVALID);
185*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::signaling_NaN(), -nl::signaling_NaN(), nl::quiet_NaN(),
186*b8e8012aSKirill Okhotnikov                  false, FE_INVALID);
187*b8e8012aSKirill Okhotnikov 
188*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(6.5, 2.25L, 2.0L, false, 0);
189*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-6.5, 2.25L, -2.0L, false, 0);
190*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(6.5, -2.25L, 2.0L, false, 0);
191*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-6.5, -2.25L, -2.0L, false, 0);
192*b8e8012aSKirill Okhotnikov 
193*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::max(), nl::max(), 0.0, false, 0);
194*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::max(), -nl::max(), 0.0, false, 0);
195*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::max(), nl::min(), 0.0, false, 0);
196*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::max(), -nl::min(), 0.0, false, 0);
197*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::max(), nl::denorm_min(), 0.0, false, 0);
198*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::max(), -nl::denorm_min(), 0.0, false, 0);
199*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::max(), nl::max(), neg_zero, false, 0);
200*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::max(), -nl::max(), neg_zero, false, 0);
201*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::max(), nl::min(), neg_zero, false, 0);
202*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::max(), -nl::min(), neg_zero, false, 0);
203*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::max(), nl::denorm_min(), neg_zero, false, 0);
204*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::max(), -nl::denorm_min(), neg_zero, false, 0);
205*b8e8012aSKirill Okhotnikov 
206*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::min(), nl::max(), nl::min(), false, 0);
207*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::min(), -nl::max(), nl::min(), false, 0);
208*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::min(), nl::min(), 0.0, false, 0);
209*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::min(), -nl::min(), 0.0, false, 0);
210*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::min(), nl::denorm_min(), 0.0, false, 0);
211*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::min(), -nl::denorm_min(), 0.0, false, 0);
212*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::min(), nl::max(), -nl::min(), false, 0);
213*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::min(), -nl::max(), -nl::min(), false, 0);
214*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::min(), nl::min(), neg_zero, false, 0);
215*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::min(), -nl::min(), neg_zero, false, 0);
216*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::min(), nl::denorm_min(), neg_zero, false, 0);
217*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::min(), -nl::denorm_min(), neg_zero, false, 0);
218*b8e8012aSKirill Okhotnikov 
219*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::denorm_min(), nl::max(), nl::denorm_min(), false, 0);
220*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::denorm_min(), -nl::max(), nl::denorm_min(), false, 0);
221*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::denorm_min(), nl::min(), nl::denorm_min(), false, 0);
222*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::denorm_min(), -nl::min(), nl::denorm_min(), false, 0);
223*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::denorm_min(), nl::denorm_min(), 0.0, false, 0);
224*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(nl::denorm_min(), -nl::denorm_min(), 0.0, false, 0);
225*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::denorm_min(), nl::max(), -nl::denorm_min(), false, 0);
226*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::denorm_min(), -nl::max(), -nl::denorm_min(), false, 0);
227*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::denorm_min(), nl::min(), -nl::denorm_min(), false, 0);
228*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::denorm_min(), -nl::min(), -nl::denorm_min(), false, 0);
229*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::denorm_min(), nl::denorm_min(), neg_zero, false, 0);
230*b8e8012aSKirill Okhotnikov     TEST_SPECIAL(-nl::denorm_min(), -nl::denorm_min(), neg_zero, false, 0);
231*b8e8012aSKirill Okhotnikov   }
232*b8e8012aSKirill Okhotnikov 
testRegularExtreme(FModFunc f)233*b8e8012aSKirill Okhotnikov   void testRegularExtreme(FModFunc f) {
234*b8e8012aSKirill Okhotnikov 
235*b8e8012aSKirill Okhotnikov     TEST_REGULAR(0x1p127L, 0x3p-149L, 0x1p-149L);
236*b8e8012aSKirill Okhotnikov     TEST_REGULAR(0x1p127L, -0x3p-149L, 0x1p-149L);
237*b8e8012aSKirill Okhotnikov     TEST_REGULAR(0x1p127L, 0x3p-148L, 0x1p-147L);
238*b8e8012aSKirill Okhotnikov     TEST_REGULAR(0x1p127L, -0x3p-148L, 0x1p-147L);
239*b8e8012aSKirill Okhotnikov     TEST_REGULAR(0x1p127L, 0x3p-126L, 0x1p-125L);
240*b8e8012aSKirill Okhotnikov     TEST_REGULAR(0x1p127L, -0x3p-126L, 0x1p-125L);
241*b8e8012aSKirill Okhotnikov     TEST_REGULAR(-0x1p127L, 0x3p-149L, -0x1p-149L);
242*b8e8012aSKirill Okhotnikov     TEST_REGULAR(-0x1p127L, -0x3p-149L, -0x1p-149L);
243*b8e8012aSKirill Okhotnikov     TEST_REGULAR(-0x1p127L, 0x3p-148L, -0x1p-147L);
244*b8e8012aSKirill Okhotnikov     TEST_REGULAR(-0x1p127L, -0x3p-148L, -0x1p-147L);
245*b8e8012aSKirill Okhotnikov     TEST_REGULAR(-0x1p127L, 0x3p-126L, -0x1p-125L);
246*b8e8012aSKirill Okhotnikov     TEST_REGULAR(-0x1p127L, -0x3p-126L, -0x1p-125L);
247*b8e8012aSKirill Okhotnikov 
248*b8e8012aSKirill Okhotnikov     if constexpr (sizeof(T) >= sizeof(double)) {
249*b8e8012aSKirill Okhotnikov       TEST_REGULAR(0x1p1023L, 0x3p-1074L, 0x1p-1073L);
250*b8e8012aSKirill Okhotnikov       TEST_REGULAR(0x1p1023L, -0x3p-1074L, 0x1p-1073L);
251*b8e8012aSKirill Okhotnikov       TEST_REGULAR(0x1p1023L, 0x3p-1073L, 0x1p-1073L);
252*b8e8012aSKirill Okhotnikov       TEST_REGULAR(0x1p1023L, -0x3p-1073L, 0x1p-1073L);
253*b8e8012aSKirill Okhotnikov       TEST_REGULAR(0x1p1023L, 0x3p-1022L, 0x1p-1021L);
254*b8e8012aSKirill Okhotnikov       TEST_REGULAR(0x1p1023L, -0x3p-1022L, 0x1p-1021L);
255*b8e8012aSKirill Okhotnikov       TEST_REGULAR(-0x1p1023L, 0x3p-1074L, -0x1p-1073L);
256*b8e8012aSKirill Okhotnikov       TEST_REGULAR(-0x1p1023L, -0x3p-1074L, -0x1p-1073L);
257*b8e8012aSKirill Okhotnikov       TEST_REGULAR(-0x1p1023L, 0x3p-1073L, -0x1p-1073L);
258*b8e8012aSKirill Okhotnikov       TEST_REGULAR(-0x1p1023L, -0x3p-1073L, -0x1p-1073L);
259*b8e8012aSKirill Okhotnikov       TEST_REGULAR(-0x1p1023L, 0x3p-1022L, -0x1p-1021L);
260*b8e8012aSKirill Okhotnikov       TEST_REGULAR(-0x1p1023L, -0x3p-1022L, -0x1p-1021L);
261*b8e8012aSKirill Okhotnikov     }
262*b8e8012aSKirill Okhotnikov   }
263*b8e8012aSKirill Okhotnikov };
264*b8e8012aSKirill Okhotnikov 
265*b8e8012aSKirill Okhotnikov #define LIST_FMOD_TESTS(T, func)                                               \
266*b8e8012aSKirill Okhotnikov   using LlvmLibcFmodTest = FmodTest<T>;                                        \
267*b8e8012aSKirill Okhotnikov   TEST_F(LlvmLibcFmodTest, SpecialNumbers) { testSpecialNumbers(&func); }      \
268*b8e8012aSKirill Okhotnikov   TEST_F(LlvmLibcFmodTest, RegularExtreme) { testRegularExtreme(&func); }
269*b8e8012aSKirill Okhotnikov 
270*b8e8012aSKirill Okhotnikov #endif // LLVM_LIBC_TEST_SRC_MATH_FMODTEST_H
271