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