xref: /aosp_15_r20/external/llvm-libc/test/src/math/smoke/UfromfpTest.h (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1 //===-- Utility class to test different flavors of ufromfp ------*- 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 LIBC_TEST_SRC_MATH_SMOKE_UFROMFPTEST_H
10 #define LIBC_TEST_SRC_MATH_SMOKE_UFROMFPTEST_H
11 
12 #include "test/UnitTest/FEnvSafeTest.h"
13 #include "test/UnitTest/FPMatcher.h"
14 #include "test/UnitTest/Test.h"
15 
16 template <typename T>
17 class UfromfpTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest {
18 
19   DECLARE_SPECIAL_CONSTANTS(T)
20 
21 public:
22   typedef T (*UfromfpFunc)(T, int, unsigned int);
23 
testSpecialNumbersNonzeroWidth(UfromfpFunc func)24   void testSpecialNumbersNonzeroWidth(UfromfpFunc func) {
25     for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN) {
26       EXPECT_FP_EQ(zero, func(zero, rnd, 32U));
27       EXPECT_FP_EQ(neg_zero, func(neg_zero, rnd, 32U));
28 
29       EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(inf, rnd, 32U), FE_INVALID);
30       EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(neg_inf, rnd, 32U), FE_INVALID);
31 
32       EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(aNaN, rnd, 32U), FE_INVALID);
33     }
34   }
35 
testSpecialNumbersZeroWidth(UfromfpFunc func)36   void testSpecialNumbersZeroWidth(UfromfpFunc func) {
37     for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN) {
38       EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(zero, rnd, 0U), FE_INVALID);
39       EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(neg_zero, rnd, 0U), FE_INVALID);
40 
41       EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(inf, rnd, 0U), FE_INVALID);
42       EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(neg_inf, rnd, 0U), FE_INVALID);
43 
44       EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(aNaN, rnd, 0U), FE_INVALID);
45     }
46   }
47 
testRoundedNumbersWithinRange(UfromfpFunc func)48   void testRoundedNumbersWithinRange(UfromfpFunc func) {
49     for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN) {
50       EXPECT_FP_EQ(T(1.0), func(T(1.0), rnd, 1U));
51       EXPECT_FP_EQ(T(10.0), func(T(10.0), rnd, 4U));
52       EXPECT_FP_EQ(T(1234.0), func(T(1234.0), rnd, 11U));
53       EXPECT_FP_EQ(T(1234.0), func(T(1234.0), rnd, 64U));
54     }
55   }
56 
testRoundedNumbersOutsideRange(UfromfpFunc func)57   void testRoundedNumbersOutsideRange(UfromfpFunc func) {
58     for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN) {
59       EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.0), rnd, 32U), FE_INVALID);
60       EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.0), rnd, 3U), FE_INVALID);
61       EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.0), rnd, 32U), FE_INVALID);
62       EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.0), rnd, 10U), FE_INVALID);
63       EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.0), rnd, 32U), FE_INVALID);
64     }
65   }
66 
testFractionsUpwardWithinRange(UfromfpFunc func)67   void testFractionsUpwardWithinRange(UfromfpFunc func) {
68     EXPECT_FP_EQ(T(1.0), func(T(0.5), FP_INT_UPWARD, 1U));
69     EXPECT_FP_EQ(T(-0.0), func(T(-0.5), FP_INT_UPWARD, 1U));
70     EXPECT_FP_EQ(T(1.0), func(T(0.115), FP_INT_UPWARD, 1U));
71     EXPECT_FP_EQ(T(-0.0), func(T(-0.115), FP_INT_UPWARD, 1U));
72     EXPECT_FP_EQ(T(1.0), func(T(0.715), FP_INT_UPWARD, 1U));
73     EXPECT_FP_EQ(T(-0.0), func(T(-0.715), FP_INT_UPWARD, 1U));
74     EXPECT_FP_EQ(T(2.0), func(T(1.3), FP_INT_UPWARD, 2U));
75     EXPECT_FP_EQ(T(2.0), func(T(1.5), FP_INT_UPWARD, 2U));
76     EXPECT_FP_EQ(T(2.0), func(T(1.75), FP_INT_UPWARD, 2U));
77     EXPECT_FP_EQ(T(11.0), func(T(10.32), FP_INT_UPWARD, 4U));
78     EXPECT_FP_EQ(T(11.0), func(T(10.65), FP_INT_UPWARD, 4U));
79     EXPECT_FP_EQ(T(124.0), func(T(123.38), FP_INT_UPWARD, 7U));
80     EXPECT_FP_EQ(T(124.0), func(T(123.96), FP_INT_UPWARD, 7U));
81   }
82 
testFractionsUpwardOutsideRange(UfromfpFunc func)83   void testFractionsUpwardOutsideRange(UfromfpFunc func) {
84     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.3), FP_INT_UPWARD, 1U),
85                                 FE_INVALID);
86     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.3), FP_INT_UPWARD, 32U),
87                                 FE_INVALID);
88     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.5), FP_INT_UPWARD, 1U),
89                                 FE_INVALID);
90     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_UPWARD, 32U),
91                                 FE_INVALID);
92     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.75), FP_INT_UPWARD, 1U),
93                                 FE_INVALID);
94     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_UPWARD, 32U),
95                                 FE_INVALID);
96     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_UPWARD, 3U),
97                                 FE_INVALID);
98     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_UPWARD, 32U),
99                                 FE_INVALID);
100     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_UPWARD, 3U),
101                                 FE_INVALID);
102     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_UPWARD, 3U),
103                                 FE_INVALID);
104     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.38), FP_INT_UPWARD, 6U),
105                                 FE_INVALID);
106     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.38), FP_INT_UPWARD, 32U),
107                                 FE_INVALID);
108     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.96), FP_INT_UPWARD, 6U),
109                                 FE_INVALID);
110     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.96), FP_INT_UPWARD, 32U),
111                                 FE_INVALID);
112   }
113 
testFractionsDownwardWithinRange(UfromfpFunc func)114   void testFractionsDownwardWithinRange(UfromfpFunc func) {
115     EXPECT_FP_EQ(T(0.0), func(T(0.5), FP_INT_DOWNWARD, 1U));
116     EXPECT_FP_EQ(T(0.0), func(T(0.115), FP_INT_DOWNWARD, 1U));
117     EXPECT_FP_EQ(T(0.0), func(T(0.715), FP_INT_DOWNWARD, 1U));
118     EXPECT_FP_EQ(T(1.0), func(T(1.3), FP_INT_DOWNWARD, 1U));
119     EXPECT_FP_EQ(T(1.0), func(T(1.5), FP_INT_DOWNWARD, 1U));
120     EXPECT_FP_EQ(T(1.0), func(T(1.75), FP_INT_DOWNWARD, 1U));
121     EXPECT_FP_EQ(T(10.0), func(T(10.32), FP_INT_DOWNWARD, 4U));
122     EXPECT_FP_EQ(T(10.0), func(T(10.65), FP_INT_DOWNWARD, 4U));
123     EXPECT_FP_EQ(T(123.0), func(T(123.38), FP_INT_DOWNWARD, 7U));
124     EXPECT_FP_EQ(T(123.0), func(T(123.96), FP_INT_DOWNWARD, 7U));
125   }
126 
testFractionsDownwardOutsideRange(UfromfpFunc func)127   void testFractionsDownwardOutsideRange(UfromfpFunc func) {
128     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-0.5), FP_INT_DOWNWARD, 32U),
129                                 FE_INVALID);
130     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-0.115), FP_INT_DOWNWARD, 32U),
131                                 FE_INVALID);
132     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-0.715), FP_INT_DOWNWARD, 32U),
133                                 FE_INVALID);
134     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.3), FP_INT_DOWNWARD, 32U),
135                                 FE_INVALID);
136     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_DOWNWARD, 32U),
137                                 FE_INVALID);
138     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_DOWNWARD, 32U),
139                                 FE_INVALID);
140     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_DOWNWARD, 3U),
141                                 FE_INVALID);
142     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_DOWNWARD, 32U),
143                                 FE_INVALID);
144     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_DOWNWARD, 3U),
145                                 FE_INVALID);
146     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_DOWNWARD, 32U),
147                                 FE_INVALID);
148     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.38), FP_INT_DOWNWARD, 6U),
149                                 FE_INVALID);
150     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.38), FP_INT_DOWNWARD, 32U),
151                                 FE_INVALID);
152     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.96), FP_INT_DOWNWARD, 6U),
153                                 FE_INVALID);
154     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.96), FP_INT_DOWNWARD, 32U),
155                                 FE_INVALID);
156   }
157 
testFractionsTowardZeroWithinRange(UfromfpFunc func)158   void testFractionsTowardZeroWithinRange(UfromfpFunc func) {
159     EXPECT_FP_EQ(T(0.0), func(T(0.5), FP_INT_TOWARDZERO, 1U));
160     EXPECT_FP_EQ(T(-0.0), func(T(-0.5), FP_INT_TOWARDZERO, 1U));
161     EXPECT_FP_EQ(T(0.0), func(T(0.115), FP_INT_TOWARDZERO, 1U));
162     EXPECT_FP_EQ(T(-0.0), func(T(-0.115), FP_INT_TOWARDZERO, 1U));
163     EXPECT_FP_EQ(T(0.0), func(T(0.715), FP_INT_TOWARDZERO, 1U));
164     EXPECT_FP_EQ(T(-0.0), func(T(-0.715), FP_INT_TOWARDZERO, 1U));
165     EXPECT_FP_EQ(T(1.0), func(T(1.3), FP_INT_TOWARDZERO, 1U));
166     EXPECT_FP_EQ(T(1.0), func(T(1.5), FP_INT_TOWARDZERO, 1U));
167     EXPECT_FP_EQ(T(1.0), func(T(1.75), FP_INT_TOWARDZERO, 1U));
168     EXPECT_FP_EQ(T(10.0), func(T(10.32), FP_INT_TOWARDZERO, 4U));
169     EXPECT_FP_EQ(T(10.0), func(T(10.65), FP_INT_TOWARDZERO, 4U));
170     EXPECT_FP_EQ(T(123.0), func(T(123.38), FP_INT_TOWARDZERO, 7U));
171     EXPECT_FP_EQ(T(123.0), func(T(123.96), FP_INT_TOWARDZERO, 7U));
172   }
173 
testFractionsTowardZeroOutsideRange(UfromfpFunc func)174   void testFractionsTowardZeroOutsideRange(UfromfpFunc func) {
175     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.3), FP_INT_TOWARDZERO, 32U),
176                                 FE_INVALID);
177     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_TOWARDZERO, 32U),
178                                 FE_INVALID);
179     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_TOWARDZERO, 32U),
180                                 FE_INVALID);
181     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_TOWARDZERO, 3U),
182                                 FE_INVALID);
183     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_TOWARDZERO, 32U),
184                                 FE_INVALID);
185     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_TOWARDZERO, 3U),
186                                 FE_INVALID);
187     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_TOWARDZERO, 32U),
188                                 FE_INVALID);
189     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.38), FP_INT_TOWARDZERO, 6U),
190                                 FE_INVALID);
191     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.38), FP_INT_TOWARDZERO, 32U),
192                                 FE_INVALID);
193     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.96), FP_INT_TOWARDZERO, 6U),
194                                 FE_INVALID);
195     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.96), FP_INT_TOWARDZERO, 32U),
196                                 FE_INVALID);
197   }
198 
testFractionsToNearestFromZeroWithinRange(UfromfpFunc func)199   void testFractionsToNearestFromZeroWithinRange(UfromfpFunc func) {
200     EXPECT_FP_EQ(T(1.0), func(T(0.5), FP_INT_TONEARESTFROMZERO, 1U));
201     EXPECT_FP_EQ(T(0.0), func(T(0.115), FP_INT_TONEARESTFROMZERO, 1U));
202     EXPECT_FP_EQ(T(-0.0), func(T(-0.115), FP_INT_TONEARESTFROMZERO, 1U));
203     EXPECT_FP_EQ(T(1.0), func(T(0.715), FP_INT_TONEARESTFROMZERO, 1U));
204     EXPECT_FP_EQ(T(1.0), func(T(1.3), FP_INT_TONEARESTFROMZERO, 1U));
205     EXPECT_FP_EQ(T(2.0), func(T(1.5), FP_INT_TONEARESTFROMZERO, 2U));
206     EXPECT_FP_EQ(T(2.0), func(T(1.75), FP_INT_TONEARESTFROMZERO, 2U));
207     EXPECT_FP_EQ(T(10.0), func(T(10.32), FP_INT_TONEARESTFROMZERO, 4U));
208     EXPECT_FP_EQ(T(11.0), func(T(10.65), FP_INT_TONEARESTFROMZERO, 4U));
209     EXPECT_FP_EQ(T(123.0), func(T(123.38), FP_INT_TONEARESTFROMZERO, 7U));
210     EXPECT_FP_EQ(T(124.0), func(T(123.96), FP_INT_TONEARESTFROMZERO, 7U));
211   }
212 
testFractionsToNearestFromZeroOutsideRange(UfromfpFunc func)213   void testFractionsToNearestFromZeroOutsideRange(UfromfpFunc func) {
214     EXPECT_FP_EQ_WITH_EXCEPTION(
215         aNaN, func(T(-0.5), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID);
216     EXPECT_FP_EQ_WITH_EXCEPTION(
217         aNaN, func(T(-0.715), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID);
218     EXPECT_FP_EQ_WITH_EXCEPTION(
219         aNaN, func(T(-1.3), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID);
220     EXPECT_FP_EQ_WITH_EXCEPTION(
221         aNaN, func(T(1.5), FP_INT_TONEARESTFROMZERO, 1U), FE_INVALID);
222     EXPECT_FP_EQ_WITH_EXCEPTION(
223         aNaN, func(T(-1.5), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID);
224     EXPECT_FP_EQ_WITH_EXCEPTION(
225         aNaN, func(T(1.75), FP_INT_TONEARESTFROMZERO, 1U), FE_INVALID);
226     EXPECT_FP_EQ_WITH_EXCEPTION(
227         aNaN, func(T(-1.75), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID);
228     EXPECT_FP_EQ_WITH_EXCEPTION(
229         aNaN, func(T(10.32), FP_INT_TONEARESTFROMZERO, 3U), FE_INVALID);
230     EXPECT_FP_EQ_WITH_EXCEPTION(
231         aNaN, func(T(-10.32), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID);
232     EXPECT_FP_EQ_WITH_EXCEPTION(
233         aNaN, func(T(10.65), FP_INT_TONEARESTFROMZERO, 3U), FE_INVALID);
234     EXPECT_FP_EQ_WITH_EXCEPTION(
235         aNaN, func(T(-10.65), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID);
236     EXPECT_FP_EQ_WITH_EXCEPTION(
237         aNaN, func(T(123.38), FP_INT_TONEARESTFROMZERO, 6U), FE_INVALID);
238     EXPECT_FP_EQ_WITH_EXCEPTION(
239         aNaN, func(T(-123.38), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID);
240     EXPECT_FP_EQ_WITH_EXCEPTION(
241         aNaN, func(T(123.96), FP_INT_TONEARESTFROMZERO, 6U), FE_INVALID);
242     EXPECT_FP_EQ_WITH_EXCEPTION(
243         aNaN, func(T(-123.96), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID);
244   }
245 
testFractionsToNearestWithinRange(UfromfpFunc func)246   void testFractionsToNearestWithinRange(UfromfpFunc func) {
247     EXPECT_FP_EQ(T(0.0), func(T(0.5), FP_INT_TONEAREST, 1U));
248     EXPECT_FP_EQ(T(-0.0), func(T(-0.5), FP_INT_TONEAREST, 1U));
249     EXPECT_FP_EQ(T(0.0), func(T(0.115), FP_INT_TONEAREST, 1U));
250     EXPECT_FP_EQ(T(-0.0), func(T(-0.115), FP_INT_TONEAREST, 1U));
251     EXPECT_FP_EQ(T(1.0), func(T(0.715), FP_INT_TONEAREST, 1U));
252     EXPECT_FP_EQ(T(1.0), func(T(1.3), FP_INT_TONEAREST, 1U));
253     EXPECT_FP_EQ(T(2.0), func(T(1.5), FP_INT_TONEAREST, 2U));
254     EXPECT_FP_EQ(T(2.0), func(T(1.75), FP_INT_TONEAREST, 2U));
255     EXPECT_FP_EQ(T(10.0), func(T(10.32), FP_INT_TONEAREST, 4U));
256     EXPECT_FP_EQ(T(11.0), func(T(10.65), FP_INT_TONEAREST, 4U));
257     EXPECT_FP_EQ(T(123.0), func(T(123.38), FP_INT_TONEAREST, 7U));
258     EXPECT_FP_EQ(T(124.0), func(T(123.96), FP_INT_TONEAREST, 7U));
259 
260     EXPECT_FP_EQ(T(2.0), func(T(2.3), FP_INT_TONEAREST, 2U));
261     EXPECT_FP_EQ(T(2.0), func(T(2.5), FP_INT_TONEAREST, 2U));
262     EXPECT_FP_EQ(T(3.0), func(T(2.75), FP_INT_TONEAREST, 2U));
263     EXPECT_FP_EQ(T(5.0), func(T(5.3), FP_INT_TONEAREST, 3U));
264     EXPECT_FP_EQ(T(6.0), func(T(5.5), FP_INT_TONEAREST, 3U));
265     EXPECT_FP_EQ(T(6.0), func(T(5.75), FP_INT_TONEAREST, 3U));
266   }
267 
testFractionsToNearestOutsideRange(UfromfpFunc func)268   void testFractionsToNearestOutsideRange(UfromfpFunc func) {
269     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-0.715), FP_INT_TONEAREST, 32U),
270                                 FE_INVALID);
271     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.3), FP_INT_TONEAREST, 32U),
272                                 FE_INVALID);
273     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.5), FP_INT_TONEAREST, 1U),
274                                 FE_INVALID);
275     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_TONEAREST, 32U),
276                                 FE_INVALID);
277     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.75), FP_INT_TONEAREST, 1U),
278                                 FE_INVALID);
279     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_TONEAREST, 32U),
280                                 FE_INVALID);
281     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_TONEAREST, 3U),
282                                 FE_INVALID);
283     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_TONEAREST, 32U),
284                                 FE_INVALID);
285     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_TONEAREST, 3U),
286                                 FE_INVALID);
287     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_TONEAREST, 32U),
288                                 FE_INVALID);
289     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.38), FP_INT_TONEAREST, 6U),
290                                 FE_INVALID);
291     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.38), FP_INT_TONEAREST, 32U),
292                                 FE_INVALID);
293     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.96), FP_INT_TONEAREST, 6U),
294                                 FE_INVALID);
295     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.96), FP_INT_TONEAREST, 32U),
296                                 FE_INVALID);
297 
298     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(2.3), FP_INT_TONEAREST, 1U),
299                                 FE_INVALID);
300     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-2.3), FP_INT_TONEAREST, 32U),
301                                 FE_INVALID);
302     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(2.5), FP_INT_TONEAREST, 1U),
303                                 FE_INVALID);
304     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-2.5), FP_INT_TONEAREST, 32U),
305                                 FE_INVALID);
306     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(2.75), FP_INT_TONEAREST, 1U),
307                                 FE_INVALID);
308     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-2.75), FP_INT_TONEAREST, 32U),
309                                 FE_INVALID);
310     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(5.3), FP_INT_TONEAREST, 2U),
311                                 FE_INVALID);
312     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-5.3), FP_INT_TONEAREST, 32U),
313                                 FE_INVALID);
314     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(5.5), FP_INT_TONEAREST, 2U),
315                                 FE_INVALID);
316     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-5.5), FP_INT_TONEAREST, 32U),
317                                 FE_INVALID);
318     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(5.75), FP_INT_TONEAREST, 2U),
319                                 FE_INVALID);
320     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-5.75), FP_INT_TONEAREST, 32U),
321                                 FE_INVALID);
322   }
323 
testFractionsToNearestFallbackWithinRange(UfromfpFunc func)324   void testFractionsToNearestFallbackWithinRange(UfromfpFunc func) {
325     EXPECT_FP_EQ(T(0.0), func(T(0.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));
326     EXPECT_FP_EQ(T(-0.0), func(T(-0.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));
327     EXPECT_FP_EQ(T(0.0), func(T(0.115), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));
328     EXPECT_FP_EQ(T(-0.0), func(T(-0.115), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));
329     EXPECT_FP_EQ(T(1.0), func(T(0.715), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));
330     EXPECT_FP_EQ(T(1.0), func(T(1.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U));
331     EXPECT_FP_EQ(T(2.0), func(T(1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));
332     EXPECT_FP_EQ(T(2.0), func(T(1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));
333     EXPECT_FP_EQ(T(10.0), func(T(10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U));
334     EXPECT_FP_EQ(T(11.0), func(T(10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U));
335     EXPECT_FP_EQ(T(123.0),
336                  func(T(123.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 7U));
337     EXPECT_FP_EQ(T(124.0),
338                  func(T(123.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 7U));
339 
340     EXPECT_FP_EQ(T(2.0), func(T(2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));
341     EXPECT_FP_EQ(T(2.0), func(T(2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));
342     EXPECT_FP_EQ(T(3.0), func(T(2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U));
343     EXPECT_FP_EQ(T(5.0), func(T(5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U));
344     EXPECT_FP_EQ(T(6.0), func(T(5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U));
345     EXPECT_FP_EQ(T(6.0), func(T(5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U));
346   }
347 
testFractionsToNearestFallbackOutsideRange(UfromfpFunc func)348   void testFractionsToNearestFallbackOutsideRange(UfromfpFunc func) {
349     EXPECT_FP_EQ_WITH_EXCEPTION(
350         aNaN, func(T(-0.715), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U),
351         FE_INVALID);
352     EXPECT_FP_EQ_WITH_EXCEPTION(
353         aNaN, func(T(-1.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID);
354     EXPECT_FP_EQ_WITH_EXCEPTION(
355         aNaN, func(T(1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID);
356     EXPECT_FP_EQ_WITH_EXCEPTION(
357         aNaN, func(T(-1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID);
358     EXPECT_FP_EQ_WITH_EXCEPTION(
359         aNaN, func(T(1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID);
360     EXPECT_FP_EQ_WITH_EXCEPTION(
361         aNaN, func(T(-1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID);
362     EXPECT_FP_EQ_WITH_EXCEPTION(
363         aNaN, func(T(10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID);
364     EXPECT_FP_EQ_WITH_EXCEPTION(
365         aNaN, func(T(-10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U),
366         FE_INVALID);
367     EXPECT_FP_EQ_WITH_EXCEPTION(
368         aNaN, func(T(10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID);
369     EXPECT_FP_EQ_WITH_EXCEPTION(
370         aNaN, func(T(-10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U),
371         FE_INVALID);
372     EXPECT_FP_EQ_WITH_EXCEPTION(
373         aNaN, func(T(123.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 6U), FE_INVALID);
374     EXPECT_FP_EQ_WITH_EXCEPTION(
375         aNaN, func(T(-123.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U),
376         FE_INVALID);
377     EXPECT_FP_EQ_WITH_EXCEPTION(
378         aNaN, func(T(123.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 6U), FE_INVALID);
379     EXPECT_FP_EQ_WITH_EXCEPTION(
380         aNaN, func(T(-123.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U),
381         FE_INVALID);
382 
383     EXPECT_FP_EQ_WITH_EXCEPTION(
384         aNaN, func(T(2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID);
385     EXPECT_FP_EQ_WITH_EXCEPTION(
386         aNaN, func(T(-2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID);
387     EXPECT_FP_EQ_WITH_EXCEPTION(
388         aNaN, func(T(2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID);
389     EXPECT_FP_EQ_WITH_EXCEPTION(
390         aNaN, func(T(-2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID);
391     EXPECT_FP_EQ_WITH_EXCEPTION(
392         aNaN, func(T(2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID);
393     EXPECT_FP_EQ_WITH_EXCEPTION(
394         aNaN, func(T(-2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID);
395     EXPECT_FP_EQ_WITH_EXCEPTION(
396         aNaN, func(T(5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID);
397     EXPECT_FP_EQ_WITH_EXCEPTION(
398         aNaN, func(T(-5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID);
399     EXPECT_FP_EQ_WITH_EXCEPTION(
400         aNaN, func(T(5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID);
401     EXPECT_FP_EQ_WITH_EXCEPTION(
402         aNaN, func(T(-5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID);
403     EXPECT_FP_EQ_WITH_EXCEPTION(
404         aNaN, func(T(5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID);
405     EXPECT_FP_EQ_WITH_EXCEPTION(
406         aNaN, func(T(-5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID);
407   }
408 };
409 
410 #define LIST_UFROMFP_TESTS(T, func)                                            \
411   using LlvmLibcUfromfpTest = UfromfpTestTemplate<T>;                          \
412   TEST_F(LlvmLibcUfromfpTest, SpecialNumbersNonzeroWidth) {                    \
413     testSpecialNumbersNonzeroWidth(&func);                                     \
414   }                                                                            \
415   TEST_F(LlvmLibcUfromfpTest, SpecialNumbersZeroWidth) {                       \
416     testSpecialNumbersZeroWidth(&func);                                        \
417   }                                                                            \
418   TEST_F(LlvmLibcUfromfpTest, RoundedNumbersWithinRange) {                     \
419     testRoundedNumbersWithinRange(&func);                                      \
420   }                                                                            \
421   TEST_F(LlvmLibcUfromfpTest, RoundedNumbersOutsideRange) {                    \
422     testRoundedNumbersOutsideRange(&func);                                     \
423   }                                                                            \
424   TEST_F(LlvmLibcUfromfpTest, FractionsUpwardWithinRange) {                    \
425     testFractionsUpwardWithinRange(&func);                                     \
426   }                                                                            \
427   TEST_F(LlvmLibcUfromfpTest, FractionsUpwardOutsideRange) {                   \
428     testFractionsUpwardOutsideRange(&func);                                    \
429   }                                                                            \
430   TEST_F(LlvmLibcUfromfpTest, FractionsDownwardWithinRange) {                  \
431     testFractionsDownwardWithinRange(&func);                                   \
432   }                                                                            \
433   TEST_F(LlvmLibcUfromfpTest, FractionsDownwardOutsideRange) {                 \
434     testFractionsDownwardOutsideRange(&func);                                  \
435   }                                                                            \
436   TEST_F(LlvmLibcUfromfpTest, FractionsTowardZeroWithinRange) {                \
437     testFractionsTowardZeroWithinRange(&func);                                 \
438   }                                                                            \
439   TEST_F(LlvmLibcUfromfpTest, FractionsTowardZeroOutsideRange) {               \
440     testFractionsTowardZeroOutsideRange(&func);                                \
441   }                                                                            \
442   TEST_F(LlvmLibcUfromfpTest, FractionsToNearestFromZeroWithinRange) {         \
443     testFractionsToNearestFromZeroWithinRange(&func);                          \
444   }                                                                            \
445   TEST_F(LlvmLibcUfromfpTest, FractionsToNearestFromZeroOutsideRange) {        \
446     testFractionsToNearestFromZeroOutsideRange(&func);                         \
447   }                                                                            \
448   TEST_F(LlvmLibcUfromfpTest, FractionsToNearestWithinRange) {                 \
449     testFractionsToNearestWithinRange(&func);                                  \
450   }                                                                            \
451   TEST_F(LlvmLibcUfromfpTest, FractionsToNearestOutsideRange) {                \
452     testFractionsToNearestOutsideRange(&func);                                 \
453   }                                                                            \
454   TEST_F(LlvmLibcUfromfpTest, FractionsToNearestFallbackWithinRange) {         \
455     testFractionsToNearestFallbackWithinRange(&func);                          \
456   }                                                                            \
457   TEST_F(LlvmLibcUfromfpTest, FractionsToNearestFallbackOutsideRange) {        \
458     testFractionsToNearestFallbackOutsideRange(&func);                         \
459   }
460 
461 #endif // LIBC_TEST_SRC_MATH_SMOKE_UFROMFPTEST_H
462