xref: /aosp_15_r20/external/llvm-libc/test/src/math/smoke/UfromfpxTest.h (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1 //===-- Utility class to test different flavors of ufromfpx -----*- 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_UFROMFPXTEST_H
10 #define LIBC_TEST_SRC_MATH_SMOKE_UFROMFPXTEST_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 UfromfpxTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest {
18 
19   DECLARE_SPECIAL_CONSTANTS(T)
20 
21 public:
22   typedef T (*UfromfpxFunc)(T, int, unsigned int);
23 
testSpecialNumbersNonzeroWidth(UfromfpxFunc func)24   void testSpecialNumbersNonzeroWidth(UfromfpxFunc 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(UfromfpxFunc func)36   void testSpecialNumbersZeroWidth(UfromfpxFunc 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(UfromfpxFunc func)48   void testRoundedNumbersWithinRange(UfromfpxFunc 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(UfromfpxFunc func)57   void testRoundedNumbersOutsideRange(UfromfpxFunc 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(UfromfpxFunc func)67   void testFractionsUpwardWithinRange(UfromfpxFunc func) {
68     EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(0.5), FP_INT_UPWARD, 1U),
69                                 FE_INEXACT);
70     EXPECT_FP_EQ_WITH_EXCEPTION(T(-0.0), func(T(-0.5), FP_INT_UPWARD, 1U),
71                                 FE_INEXACT);
72     EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(0.115), FP_INT_UPWARD, 1U),
73                                 FE_INEXACT);
74     EXPECT_FP_EQ_WITH_EXCEPTION(T(-0.0), func(T(-0.115), FP_INT_UPWARD, 1U),
75                                 FE_INEXACT);
76     EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(0.715), FP_INT_UPWARD, 1U),
77                                 FE_INEXACT);
78     EXPECT_FP_EQ_WITH_EXCEPTION(T(-0.0), func(T(-0.715), FP_INT_UPWARD, 1U),
79                                 FE_INEXACT);
80     EXPECT_FP_EQ_WITH_EXCEPTION(T(2.0), func(T(1.3), FP_INT_UPWARD, 2U),
81                                 FE_INEXACT);
82     EXPECT_FP_EQ_WITH_EXCEPTION(T(2.0), func(T(1.5), FP_INT_UPWARD, 2U),
83                                 FE_INEXACT);
84     EXPECT_FP_EQ_WITH_EXCEPTION(T(2.0), func(T(1.75), FP_INT_UPWARD, 2U),
85                                 FE_INEXACT);
86     EXPECT_FP_EQ_WITH_EXCEPTION(T(11.0), func(T(10.32), FP_INT_UPWARD, 4U),
87                                 FE_INEXACT);
88     EXPECT_FP_EQ_WITH_EXCEPTION(T(11.0), func(T(10.65), FP_INT_UPWARD, 4U),
89                                 FE_INEXACT);
90     EXPECT_FP_EQ_WITH_EXCEPTION(T(124.0), func(T(123.38), FP_INT_UPWARD, 7U),
91                                 FE_INEXACT);
92     EXPECT_FP_EQ_WITH_EXCEPTION(T(124.0), func(T(123.96), FP_INT_UPWARD, 7U),
93                                 FE_INEXACT);
94   }
95 
testFractionsUpwardOutsideRange(UfromfpxFunc func)96   void testFractionsUpwardOutsideRange(UfromfpxFunc func) {
97     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.3), FP_INT_UPWARD, 1U),
98                                 FE_INVALID);
99     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.3), FP_INT_UPWARD, 32U),
100                                 FE_INVALID);
101     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.5), FP_INT_UPWARD, 1U),
102                                 FE_INVALID);
103     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_UPWARD, 32U),
104                                 FE_INVALID);
105     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.75), FP_INT_UPWARD, 1U),
106                                 FE_INVALID);
107     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_UPWARD, 32U),
108                                 FE_INVALID);
109     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_UPWARD, 3U),
110                                 FE_INVALID);
111     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_UPWARD, 32U),
112                                 FE_INVALID);
113     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_UPWARD, 3U),
114                                 FE_INVALID);
115     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_UPWARD, 3U),
116                                 FE_INVALID);
117     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.38), FP_INT_UPWARD, 6U),
118                                 FE_INVALID);
119     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.38), FP_INT_UPWARD, 32U),
120                                 FE_INVALID);
121     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.96), FP_INT_UPWARD, 6U),
122                                 FE_INVALID);
123     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.96), FP_INT_UPWARD, 32U),
124                                 FE_INVALID);
125   }
126 
testFractionsDownwardWithinRange(UfromfpxFunc func)127   void testFractionsDownwardWithinRange(UfromfpxFunc func) {
128     EXPECT_FP_EQ_WITH_EXCEPTION(T(0.0), func(T(0.5), FP_INT_DOWNWARD, 1U),
129                                 FE_INEXACT);
130     EXPECT_FP_EQ_WITH_EXCEPTION(T(0.0), func(T(0.115), FP_INT_DOWNWARD, 1U),
131                                 FE_INEXACT);
132     EXPECT_FP_EQ_WITH_EXCEPTION(T(0.0), func(T(0.715), FP_INT_DOWNWARD, 1U),
133                                 FE_INEXACT);
134     EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(1.3), FP_INT_DOWNWARD, 1U),
135                                 FE_INEXACT);
136     EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(1.5), FP_INT_DOWNWARD, 1U),
137                                 FE_INEXACT);
138     EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(1.75), FP_INT_DOWNWARD, 1U),
139                                 FE_INEXACT);
140     EXPECT_FP_EQ_WITH_EXCEPTION(T(10.0), func(T(10.32), FP_INT_DOWNWARD, 4U),
141                                 FE_INEXACT);
142     EXPECT_FP_EQ_WITH_EXCEPTION(T(10.0), func(T(10.65), FP_INT_DOWNWARD, 4U),
143                                 FE_INEXACT);
144     EXPECT_FP_EQ_WITH_EXCEPTION(T(123.0), func(T(123.38), FP_INT_DOWNWARD, 7U),
145                                 FE_INEXACT);
146     EXPECT_FP_EQ_WITH_EXCEPTION(T(123.0), func(T(123.96), FP_INT_DOWNWARD, 7U),
147                                 FE_INEXACT);
148   }
149 
testFractionsDownwardOutsideRange(UfromfpxFunc func)150   void testFractionsDownwardOutsideRange(UfromfpxFunc func) {
151     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-0.5), FP_INT_DOWNWARD, 32U),
152                                 FE_INVALID);
153     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-0.115), FP_INT_DOWNWARD, 32U),
154                                 FE_INVALID);
155     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-0.715), FP_INT_DOWNWARD, 32U),
156                                 FE_INVALID);
157     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.3), FP_INT_DOWNWARD, 32U),
158                                 FE_INVALID);
159     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_DOWNWARD, 32U),
160                                 FE_INVALID);
161     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_DOWNWARD, 32U),
162                                 FE_INVALID);
163     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_DOWNWARD, 3U),
164                                 FE_INVALID);
165     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_DOWNWARD, 32U),
166                                 FE_INVALID);
167     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_DOWNWARD, 3U),
168                                 FE_INVALID);
169     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_DOWNWARD, 32U),
170                                 FE_INVALID);
171     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.38), FP_INT_DOWNWARD, 6U),
172                                 FE_INVALID);
173     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.38), FP_INT_DOWNWARD, 32U),
174                                 FE_INVALID);
175     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.96), FP_INT_DOWNWARD, 6U),
176                                 FE_INVALID);
177     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.96), FP_INT_DOWNWARD, 32U),
178                                 FE_INVALID);
179   }
180 
testFractionsTowardZeroWithinRange(UfromfpxFunc func)181   void testFractionsTowardZeroWithinRange(UfromfpxFunc func) {
182     EXPECT_FP_EQ_WITH_EXCEPTION(T(0.0), func(T(0.5), FP_INT_TOWARDZERO, 1U),
183                                 FE_INEXACT);
184     EXPECT_FP_EQ_WITH_EXCEPTION(T(-0.0), func(T(-0.5), FP_INT_TOWARDZERO, 1U),
185                                 FE_INEXACT);
186     EXPECT_FP_EQ_WITH_EXCEPTION(T(0.0), func(T(0.115), FP_INT_TOWARDZERO, 1U),
187                                 FE_INEXACT);
188     EXPECT_FP_EQ_WITH_EXCEPTION(T(-0.0), func(T(-0.115), FP_INT_TOWARDZERO, 1U),
189                                 FE_INEXACT);
190     EXPECT_FP_EQ_WITH_EXCEPTION(T(0.0), func(T(0.715), FP_INT_TOWARDZERO, 1U),
191                                 FE_INEXACT);
192     EXPECT_FP_EQ_WITH_EXCEPTION(T(-0.0), func(T(-0.715), FP_INT_TOWARDZERO, 1U),
193                                 FE_INEXACT);
194     EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(1.3), FP_INT_TOWARDZERO, 1U),
195                                 FE_INEXACT);
196     EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(1.5), FP_INT_TOWARDZERO, 1U),
197                                 FE_INEXACT);
198     EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(1.75), FP_INT_TOWARDZERO, 1U),
199                                 FE_INEXACT);
200     EXPECT_FP_EQ_WITH_EXCEPTION(T(10.0), func(T(10.32), FP_INT_TOWARDZERO, 4U),
201                                 FE_INEXACT);
202     EXPECT_FP_EQ_WITH_EXCEPTION(T(10.0), func(T(10.65), FP_INT_TOWARDZERO, 4U),
203                                 FE_INEXACT);
204     EXPECT_FP_EQ_WITH_EXCEPTION(
205         T(123.0), func(T(123.38), FP_INT_TOWARDZERO, 7U), FE_INEXACT);
206     EXPECT_FP_EQ_WITH_EXCEPTION(
207         T(123.0), func(T(123.96), FP_INT_TOWARDZERO, 7U), FE_INEXACT);
208   }
209 
testFractionsTowardZeroOutsideRange(UfromfpxFunc func)210   void testFractionsTowardZeroOutsideRange(UfromfpxFunc func) {
211     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.3), FP_INT_TOWARDZERO, 32U),
212                                 FE_INVALID);
213     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_TOWARDZERO, 32U),
214                                 FE_INVALID);
215     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_TOWARDZERO, 32U),
216                                 FE_INVALID);
217     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_TOWARDZERO, 3U),
218                                 FE_INVALID);
219     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_TOWARDZERO, 32U),
220                                 FE_INVALID);
221     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_TOWARDZERO, 3U),
222                                 FE_INVALID);
223     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_TOWARDZERO, 32U),
224                                 FE_INVALID);
225     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.38), FP_INT_TOWARDZERO, 6U),
226                                 FE_INVALID);
227     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.38), FP_INT_TOWARDZERO, 32U),
228                                 FE_INVALID);
229     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.96), FP_INT_TOWARDZERO, 6U),
230                                 FE_INVALID);
231     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.96), FP_INT_TOWARDZERO, 32U),
232                                 FE_INVALID);
233   }
234 
testFractionsToNearestFromZeroWithinRange(UfromfpxFunc func)235   void testFractionsToNearestFromZeroWithinRange(UfromfpxFunc func) {
236     EXPECT_FP_EQ_WITH_EXCEPTION(
237         T(1.0), func(T(0.5), FP_INT_TONEARESTFROMZERO, 1U), FE_INEXACT);
238     EXPECT_FP_EQ_WITH_EXCEPTION(
239         T(0.0), func(T(0.115), FP_INT_TONEARESTFROMZERO, 1U), FE_INEXACT);
240     EXPECT_FP_EQ_WITH_EXCEPTION(
241         T(-0.0), func(T(-0.115), FP_INT_TONEARESTFROMZERO, 1U), FE_INEXACT);
242     EXPECT_FP_EQ_WITH_EXCEPTION(
243         T(1.0), func(T(0.715), FP_INT_TONEARESTFROMZERO, 1U), FE_INEXACT);
244     EXPECT_FP_EQ_WITH_EXCEPTION(
245         T(1.0), func(T(1.3), FP_INT_TONEARESTFROMZERO, 1U), FE_INEXACT);
246     EXPECT_FP_EQ_WITH_EXCEPTION(
247         T(2.0), func(T(1.5), FP_INT_TONEARESTFROMZERO, 2U), FE_INEXACT);
248     EXPECT_FP_EQ_WITH_EXCEPTION(
249         T(2.0), func(T(1.75), FP_INT_TONEARESTFROMZERO, 2U), FE_INEXACT);
250     EXPECT_FP_EQ_WITH_EXCEPTION(
251         T(10.0), func(T(10.32), FP_INT_TONEARESTFROMZERO, 4U), FE_INEXACT);
252     EXPECT_FP_EQ_WITH_EXCEPTION(
253         T(11.0), func(T(10.65), FP_INT_TONEARESTFROMZERO, 4U), FE_INEXACT);
254     EXPECT_FP_EQ_WITH_EXCEPTION(
255         T(123.0), func(T(123.38), FP_INT_TONEARESTFROMZERO, 7U), FE_INEXACT);
256     EXPECT_FP_EQ_WITH_EXCEPTION(
257         T(124.0), func(T(123.96), FP_INT_TONEARESTFROMZERO, 7U), FE_INEXACT);
258   }
259 
testFractionsToNearestFromZeroOutsideRange(UfromfpxFunc func)260   void testFractionsToNearestFromZeroOutsideRange(UfromfpxFunc func) {
261     EXPECT_FP_EQ_WITH_EXCEPTION(
262         aNaN, func(T(-0.5), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID);
263     EXPECT_FP_EQ_WITH_EXCEPTION(
264         aNaN, func(T(-0.715), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID);
265     EXPECT_FP_EQ_WITH_EXCEPTION(
266         aNaN, func(T(-1.3), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID);
267     EXPECT_FP_EQ_WITH_EXCEPTION(
268         aNaN, func(T(1.5), FP_INT_TONEARESTFROMZERO, 1U), FE_INVALID);
269     EXPECT_FP_EQ_WITH_EXCEPTION(
270         aNaN, func(T(-1.5), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID);
271     EXPECT_FP_EQ_WITH_EXCEPTION(
272         aNaN, func(T(1.75), FP_INT_TONEARESTFROMZERO, 1U), FE_INVALID);
273     EXPECT_FP_EQ_WITH_EXCEPTION(
274         aNaN, func(T(-1.75), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID);
275     EXPECT_FP_EQ_WITH_EXCEPTION(
276         aNaN, func(T(10.32), FP_INT_TONEARESTFROMZERO, 3U), FE_INVALID);
277     EXPECT_FP_EQ_WITH_EXCEPTION(
278         aNaN, func(T(-10.32), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID);
279     EXPECT_FP_EQ_WITH_EXCEPTION(
280         aNaN, func(T(10.65), FP_INT_TONEARESTFROMZERO, 3U), FE_INVALID);
281     EXPECT_FP_EQ_WITH_EXCEPTION(
282         aNaN, func(T(-10.65), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID);
283     EXPECT_FP_EQ_WITH_EXCEPTION(
284         aNaN, func(T(123.38), FP_INT_TONEARESTFROMZERO, 6U), FE_INVALID);
285     EXPECT_FP_EQ_WITH_EXCEPTION(
286         aNaN, func(T(-123.38), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID);
287     EXPECT_FP_EQ_WITH_EXCEPTION(
288         aNaN, func(T(123.96), FP_INT_TONEARESTFROMZERO, 6U), FE_INVALID);
289     EXPECT_FP_EQ_WITH_EXCEPTION(
290         aNaN, func(T(-123.96), FP_INT_TONEARESTFROMZERO, 32U), FE_INVALID);
291   }
292 
testFractionsToNearestWithinRange(UfromfpxFunc func)293   void testFractionsToNearestWithinRange(UfromfpxFunc func) {
294     EXPECT_FP_EQ_WITH_EXCEPTION(T(0.0), func(T(0.5), FP_INT_TONEAREST, 1U),
295                                 FE_INEXACT);
296     EXPECT_FP_EQ_WITH_EXCEPTION(T(-0.0), func(T(-0.5), FP_INT_TONEAREST, 1U),
297                                 FE_INEXACT);
298     EXPECT_FP_EQ_WITH_EXCEPTION(T(0.0), func(T(0.115), FP_INT_TONEAREST, 1U),
299                                 FE_INEXACT);
300     EXPECT_FP_EQ_WITH_EXCEPTION(T(-0.0), func(T(-0.115), FP_INT_TONEAREST, 1U),
301                                 FE_INEXACT);
302     EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(0.715), FP_INT_TONEAREST, 1U),
303                                 FE_INEXACT);
304     EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(1.3), FP_INT_TONEAREST, 1U),
305                                 FE_INEXACT);
306     EXPECT_FP_EQ_WITH_EXCEPTION(T(2.0), func(T(1.5), FP_INT_TONEAREST, 2U),
307                                 FE_INEXACT);
308     EXPECT_FP_EQ_WITH_EXCEPTION(T(2.0), func(T(1.75), FP_INT_TONEAREST, 2U),
309                                 FE_INEXACT);
310     EXPECT_FP_EQ_WITH_EXCEPTION(T(10.0), func(T(10.32), FP_INT_TONEAREST, 4U),
311                                 FE_INEXACT);
312     EXPECT_FP_EQ_WITH_EXCEPTION(T(11.0), func(T(10.65), FP_INT_TONEAREST, 4U),
313                                 FE_INEXACT);
314     EXPECT_FP_EQ_WITH_EXCEPTION(T(123.0), func(T(123.38), FP_INT_TONEAREST, 7U),
315                                 FE_INEXACT);
316     EXPECT_FP_EQ_WITH_EXCEPTION(T(124.0), func(T(123.96), FP_INT_TONEAREST, 7U),
317                                 FE_INEXACT);
318 
319     EXPECT_FP_EQ_WITH_EXCEPTION(T(2.0), func(T(2.3), FP_INT_TONEAREST, 2U),
320                                 FE_INEXACT);
321     EXPECT_FP_EQ_WITH_EXCEPTION(T(2.0), func(T(2.5), FP_INT_TONEAREST, 2U),
322                                 FE_INEXACT);
323     EXPECT_FP_EQ_WITH_EXCEPTION(T(3.0), func(T(2.75), FP_INT_TONEAREST, 2U),
324                                 FE_INEXACT);
325     EXPECT_FP_EQ_WITH_EXCEPTION(T(5.0), func(T(5.3), FP_INT_TONEAREST, 3U),
326                                 FE_INEXACT);
327     EXPECT_FP_EQ_WITH_EXCEPTION(T(6.0), func(T(5.5), FP_INT_TONEAREST, 3U),
328                                 FE_INEXACT);
329     EXPECT_FP_EQ_WITH_EXCEPTION(T(6.0), func(T(5.75), FP_INT_TONEAREST, 3U),
330                                 FE_INEXACT);
331   }
332 
testFractionsToNearestOutsideRange(UfromfpxFunc func)333   void testFractionsToNearestOutsideRange(UfromfpxFunc func) {
334     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-0.715), FP_INT_TONEAREST, 32U),
335                                 FE_INVALID);
336     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.3), FP_INT_TONEAREST, 32U),
337                                 FE_INVALID);
338     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.5), FP_INT_TONEAREST, 1U),
339                                 FE_INVALID);
340     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_TONEAREST, 32U),
341                                 FE_INVALID);
342     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.75), FP_INT_TONEAREST, 1U),
343                                 FE_INVALID);
344     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_TONEAREST, 32U),
345                                 FE_INVALID);
346     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_TONEAREST, 3U),
347                                 FE_INVALID);
348     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_TONEAREST, 32U),
349                                 FE_INVALID);
350     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_TONEAREST, 3U),
351                                 FE_INVALID);
352     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_TONEAREST, 32U),
353                                 FE_INVALID);
354     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.38), FP_INT_TONEAREST, 6U),
355                                 FE_INVALID);
356     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.38), FP_INT_TONEAREST, 32U),
357                                 FE_INVALID);
358     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.96), FP_INT_TONEAREST, 6U),
359                                 FE_INVALID);
360     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.96), FP_INT_TONEAREST, 32U),
361                                 FE_INVALID);
362 
363     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(2.3), FP_INT_TONEAREST, 1U),
364                                 FE_INVALID);
365     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-2.3), FP_INT_TONEAREST, 32U),
366                                 FE_INVALID);
367     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(2.5), FP_INT_TONEAREST, 1U),
368                                 FE_INVALID);
369     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-2.5), FP_INT_TONEAREST, 32U),
370                                 FE_INVALID);
371     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(2.75), FP_INT_TONEAREST, 1U),
372                                 FE_INVALID);
373     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-2.75), FP_INT_TONEAREST, 32U),
374                                 FE_INVALID);
375     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(5.3), FP_INT_TONEAREST, 2U),
376                                 FE_INVALID);
377     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-5.3), FP_INT_TONEAREST, 32U),
378                                 FE_INVALID);
379     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(5.5), FP_INT_TONEAREST, 2U),
380                                 FE_INVALID);
381     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-5.5), FP_INT_TONEAREST, 32U),
382                                 FE_INVALID);
383     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(5.75), FP_INT_TONEAREST, 2U),
384                                 FE_INVALID);
385     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-5.75), FP_INT_TONEAREST, 32U),
386                                 FE_INVALID);
387   }
388 
testFractionsToNearestFallbackWithinRange(UfromfpxFunc func)389   void testFractionsToNearestFallbackWithinRange(UfromfpxFunc func) {
390     EXPECT_FP_EQ_WITH_EXCEPTION(
391         T(0.0), func(T(0.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INEXACT);
392     EXPECT_FP_EQ_WITH_EXCEPTION(
393         T(-0.0), func(T(-0.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U),
394         FE_INEXACT);
395     EXPECT_FP_EQ_WITH_EXCEPTION(
396         T(0.0), func(T(0.115), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U),
397         FE_INEXACT);
398     EXPECT_FP_EQ_WITH_EXCEPTION(
399         T(-0.0), func(T(-0.115), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U),
400         FE_INEXACT);
401     EXPECT_FP_EQ_WITH_EXCEPTION(
402         T(1.0), func(T(0.715), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U),
403         FE_INEXACT);
404     EXPECT_FP_EQ_WITH_EXCEPTION(
405         T(1.0), func(T(1.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INEXACT);
406     EXPECT_FP_EQ_WITH_EXCEPTION(
407         T(2.0), func(T(1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INEXACT);
408     EXPECT_FP_EQ_WITH_EXCEPTION(
409         T(2.0), func(T(1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INEXACT);
410     EXPECT_FP_EQ_WITH_EXCEPTION(
411         T(10.0), func(T(10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U),
412         FE_INEXACT);
413     EXPECT_FP_EQ_WITH_EXCEPTION(
414         T(11.0), func(T(10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U),
415         FE_INEXACT);
416     EXPECT_FP_EQ_WITH_EXCEPTION(
417         T(123.0), func(T(123.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 7U),
418         FE_INEXACT);
419     EXPECT_FP_EQ_WITH_EXCEPTION(
420         T(124.0), func(T(123.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 7U),
421         FE_INEXACT);
422 
423     EXPECT_FP_EQ_WITH_EXCEPTION(
424         T(2.0), func(T(2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INEXACT);
425     EXPECT_FP_EQ_WITH_EXCEPTION(
426         T(2.0), func(T(2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INEXACT);
427     EXPECT_FP_EQ_WITH_EXCEPTION(
428         T(3.0), func(T(2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INEXACT);
429     EXPECT_FP_EQ_WITH_EXCEPTION(
430         T(5.0), func(T(5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INEXACT);
431     EXPECT_FP_EQ_WITH_EXCEPTION(
432         T(6.0), func(T(5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INEXACT);
433     EXPECT_FP_EQ_WITH_EXCEPTION(
434         T(6.0), func(T(5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INEXACT);
435   }
436 
testFractionsToNearestFallbackOutsideRange(UfromfpxFunc func)437   void testFractionsToNearestFallbackOutsideRange(UfromfpxFunc func) {
438     EXPECT_FP_EQ_WITH_EXCEPTION(
439         aNaN, func(T(-0.715), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U),
440         FE_INVALID);
441     EXPECT_FP_EQ_WITH_EXCEPTION(
442         aNaN, func(T(-1.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID);
443     EXPECT_FP_EQ_WITH_EXCEPTION(
444         aNaN, func(T(1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID);
445     EXPECT_FP_EQ_WITH_EXCEPTION(
446         aNaN, func(T(-1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID);
447     EXPECT_FP_EQ_WITH_EXCEPTION(
448         aNaN, func(T(1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID);
449     EXPECT_FP_EQ_WITH_EXCEPTION(
450         aNaN, func(T(-1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID);
451     EXPECT_FP_EQ_WITH_EXCEPTION(
452         aNaN, func(T(10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID);
453     EXPECT_FP_EQ_WITH_EXCEPTION(
454         aNaN, func(T(-10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U),
455         FE_INVALID);
456     EXPECT_FP_EQ_WITH_EXCEPTION(
457         aNaN, func(T(10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID);
458     EXPECT_FP_EQ_WITH_EXCEPTION(
459         aNaN, func(T(-10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U),
460         FE_INVALID);
461     EXPECT_FP_EQ_WITH_EXCEPTION(
462         aNaN, func(T(123.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 6U), FE_INVALID);
463     EXPECT_FP_EQ_WITH_EXCEPTION(
464         aNaN, func(T(-123.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U),
465         FE_INVALID);
466     EXPECT_FP_EQ_WITH_EXCEPTION(
467         aNaN, func(T(123.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 6U), FE_INVALID);
468     EXPECT_FP_EQ_WITH_EXCEPTION(
469         aNaN, func(T(-123.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U),
470         FE_INVALID);
471 
472     EXPECT_FP_EQ_WITH_EXCEPTION(
473         aNaN, func(T(2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID);
474     EXPECT_FP_EQ_WITH_EXCEPTION(
475         aNaN, func(T(-2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID);
476     EXPECT_FP_EQ_WITH_EXCEPTION(
477         aNaN, func(T(2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID);
478     EXPECT_FP_EQ_WITH_EXCEPTION(
479         aNaN, func(T(-2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID);
480     EXPECT_FP_EQ_WITH_EXCEPTION(
481         aNaN, func(T(2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID);
482     EXPECT_FP_EQ_WITH_EXCEPTION(
483         aNaN, func(T(-2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID);
484     EXPECT_FP_EQ_WITH_EXCEPTION(
485         aNaN, func(T(5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID);
486     EXPECT_FP_EQ_WITH_EXCEPTION(
487         aNaN, func(T(-5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID);
488     EXPECT_FP_EQ_WITH_EXCEPTION(
489         aNaN, func(T(5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID);
490     EXPECT_FP_EQ_WITH_EXCEPTION(
491         aNaN, func(T(-5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID);
492     EXPECT_FP_EQ_WITH_EXCEPTION(
493         aNaN, func(T(5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID);
494     EXPECT_FP_EQ_WITH_EXCEPTION(
495         aNaN, func(T(-5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 32U), FE_INVALID);
496   }
497 };
498 
499 #define LIST_UFROMFPX_TESTS(T, func)                                           \
500   using LlvmLibcUfromfpxTest = UfromfpxTestTemplate<T>;                        \
501   TEST_F(LlvmLibcUfromfpxTest, SpecialNumbersNonzeroWidth) {                   \
502     testSpecialNumbersNonzeroWidth(&func);                                     \
503   }                                                                            \
504   TEST_F(LlvmLibcUfromfpxTest, SpecialNumbersZeroWidth) {                      \
505     testSpecialNumbersZeroWidth(&func);                                        \
506   }                                                                            \
507   TEST_F(LlvmLibcUfromfpxTest, RoundedNumbersWithinRange) {                    \
508     testRoundedNumbersWithinRange(&func);                                      \
509   }                                                                            \
510   TEST_F(LlvmLibcUfromfpxTest, RoundedNumbersOutsideRange) {                   \
511     testRoundedNumbersOutsideRange(&func);                                     \
512   }                                                                            \
513   TEST_F(LlvmLibcUfromfpxTest, FractionsUpwardWithinRange) {                   \
514     testFractionsUpwardWithinRange(&func);                                     \
515   }                                                                            \
516   TEST_F(LlvmLibcUfromfpxTest, FractionsUpwardOutsideRange) {                  \
517     testFractionsUpwardOutsideRange(&func);                                    \
518   }                                                                            \
519   TEST_F(LlvmLibcUfromfpxTest, FractionsDownwardWithinRange) {                 \
520     testFractionsDownwardWithinRange(&func);                                   \
521   }                                                                            \
522   TEST_F(LlvmLibcUfromfpxTest, FractionsDownwardOutsideRange) {                \
523     testFractionsDownwardOutsideRange(&func);                                  \
524   }                                                                            \
525   TEST_F(LlvmLibcUfromfpxTest, FractionsTowardZeroWithinRange) {               \
526     testFractionsTowardZeroWithinRange(&func);                                 \
527   }                                                                            \
528   TEST_F(LlvmLibcUfromfpxTest, FractionsTowardZeroOutsideRange) {              \
529     testFractionsTowardZeroOutsideRange(&func);                                \
530   }                                                                            \
531   TEST_F(LlvmLibcUfromfpxTest, FractionsToNearestFromZeroWithinRange) {        \
532     testFractionsToNearestFromZeroWithinRange(&func);                          \
533   }                                                                            \
534   TEST_F(LlvmLibcUfromfpxTest, FractionsToNearestFromZeroOutsideRange) {       \
535     testFractionsToNearestFromZeroOutsideRange(&func);                         \
536   }                                                                            \
537   TEST_F(LlvmLibcUfromfpxTest, FractionsToNearestWithinRange) {                \
538     testFractionsToNearestWithinRange(&func);                                  \
539   }                                                                            \
540   TEST_F(LlvmLibcUfromfpxTest, FractionsToNearestOutsideRange) {               \
541     testFractionsToNearestOutsideRange(&func);                                 \
542   }                                                                            \
543   TEST_F(LlvmLibcUfromfpxTest, FractionsToNearestFallbackWithinRange) {        \
544     testFractionsToNearestFallbackWithinRange(&func);                          \
545   }                                                                            \
546   TEST_F(LlvmLibcUfromfpxTest, FractionsToNearestFallbackOutsideRange) {       \
547     testFractionsToNearestFallbackOutsideRange(&func);                         \
548   }
549 
550 #endif // LIBC_TEST_SRC_MATH_SMOKE_UFROMFPXTEST_H
551