xref: /aosp_15_r20/external/llvm-libc/test/src/math/smoke/FromfpxTest.h (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1 //===-- Utility class to test different flavors of fromfpx ------*- 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_FROMFPXTEST_H
10 #define LIBC_TEST_SRC_MATH_SMOKE_FROMFPXTEST_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 FromfpxTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest {
18 
19   DECLARE_SPECIAL_CONSTANTS(T)
20 
21 public:
22   typedef T (*FromfpxFunc)(T, int, unsigned int);
23 
testSpecialNumbersNonzeroWidth(FromfpxFunc func)24   void testSpecialNumbersNonzeroWidth(FromfpxFunc 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(FromfpxFunc func)36   void testSpecialNumbersZeroWidth(FromfpxFunc 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(FromfpxFunc func)48   void testRoundedNumbersWithinRange(FromfpxFunc func) {
49     for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN) {
50       EXPECT_FP_EQ(T(1.0), func(T(1.0), rnd, 2U));
51       EXPECT_FP_EQ(T(-1.0), func(T(-1.0), rnd, 1U));
52       EXPECT_FP_EQ(T(10.0), func(T(10.0), rnd, 5U));
53       EXPECT_FP_EQ(T(-10.0), func(T(-10.0), rnd, 5U));
54       EXPECT_FP_EQ(T(1234.0), func(T(1234.0), rnd, 12U));
55       EXPECT_FP_EQ(T(-1234.0), func(T(-1234.0), rnd, 12U));
56       EXPECT_FP_EQ(T(1234.0), func(T(1234.0), rnd, 65U));
57       EXPECT_FP_EQ(T(-1234.0), func(T(-1234.0), rnd, 65U));
58     }
59   }
60 
testRoundedNumbersOutsideRange(FromfpxFunc func)61   void testRoundedNumbersOutsideRange(FromfpxFunc func) {
62     for (int rnd : MATH_ROUNDING_DIRECTIONS_INCLUDING_UNKNOWN) {
63       EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.0), rnd, 1U), FE_INVALID);
64       EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.0), rnd, 4U), FE_INVALID);
65       EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.0), rnd, 4U), FE_INVALID);
66       EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1234.0), rnd, 11U), FE_INVALID);
67       EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1234.0), rnd, 11U), FE_INVALID);
68     }
69   }
70 
testFractionsUpwardWithinRange(FromfpxFunc func)71   void testFractionsUpwardWithinRange(FromfpxFunc func) {
72     EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(0.5), FP_INT_UPWARD, 2U),
73                                 FE_INEXACT);
74     EXPECT_FP_EQ_WITH_EXCEPTION(T(-0.0), func(T(-0.5), FP_INT_UPWARD, 1U),
75                                 FE_INEXACT);
76     EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(0.115), FP_INT_UPWARD, 2U),
77                                 FE_INEXACT);
78     EXPECT_FP_EQ_WITH_EXCEPTION(T(-0.0), func(T(-0.115), FP_INT_UPWARD, 1U),
79                                 FE_INEXACT);
80     EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(0.715), FP_INT_UPWARD, 2U),
81                                 FE_INEXACT);
82     EXPECT_FP_EQ_WITH_EXCEPTION(T(-0.0), func(T(-0.715), FP_INT_UPWARD, 1U),
83                                 FE_INEXACT);
84     EXPECT_FP_EQ_WITH_EXCEPTION(T(2.0), func(T(1.3), FP_INT_UPWARD, 3U),
85                                 FE_INEXACT);
86     EXPECT_FP_EQ_WITH_EXCEPTION(T(-1.0), func(T(-1.3), FP_INT_UPWARD, 1U),
87                                 FE_INEXACT);
88     EXPECT_FP_EQ_WITH_EXCEPTION(T(2.0), func(T(1.5), FP_INT_UPWARD, 3U),
89                                 FE_INEXACT);
90     EXPECT_FP_EQ_WITH_EXCEPTION(T(-1.0), func(T(-1.5), FP_INT_UPWARD, 1U),
91                                 FE_INEXACT);
92     EXPECT_FP_EQ_WITH_EXCEPTION(T(2.0), func(T(1.75), FP_INT_UPWARD, 3U),
93                                 FE_INEXACT);
94     EXPECT_FP_EQ_WITH_EXCEPTION(T(-1.0), func(T(-1.75), FP_INT_UPWARD, 1U),
95                                 FE_INEXACT);
96     EXPECT_FP_EQ_WITH_EXCEPTION(T(11.0), func(T(10.32), FP_INT_UPWARD, 5U),
97                                 FE_INEXACT);
98     EXPECT_FP_EQ_WITH_EXCEPTION(T(-10.0), func(T(-10.32), FP_INT_UPWARD, 5U),
99                                 FE_INEXACT);
100     EXPECT_FP_EQ_WITH_EXCEPTION(T(11.0), func(T(10.65), FP_INT_UPWARD, 5U),
101                                 FE_INEXACT);
102     EXPECT_FP_EQ_WITH_EXCEPTION(T(-10.0), func(T(-10.65), FP_INT_UPWARD, 5U),
103                                 FE_INEXACT);
104     EXPECT_FP_EQ_WITH_EXCEPTION(T(124.0), func(T(123.38), FP_INT_UPWARD, 8U),
105                                 FE_INEXACT);
106     EXPECT_FP_EQ_WITH_EXCEPTION(T(-123.0), func(T(-123.38), FP_INT_UPWARD, 8U),
107                                 FE_INEXACT);
108     EXPECT_FP_EQ_WITH_EXCEPTION(T(124.0), func(T(123.96), FP_INT_UPWARD, 8U),
109                                 FE_INEXACT);
110     EXPECT_FP_EQ_WITH_EXCEPTION(T(-123.0), func(T(-123.96), FP_INT_UPWARD, 8U),
111                                 FE_INEXACT);
112   }
113 
testFractionsUpwardOutsideRange(FromfpxFunc func)114   void testFractionsUpwardOutsideRange(FromfpxFunc func) {
115     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(0.5), FP_INT_UPWARD, 1U),
116                                 FE_INVALID);
117     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(0.115), FP_INT_UPWARD, 1U),
118                                 FE_INVALID);
119     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(0.715), FP_INT_UPWARD, 1U),
120                                 FE_INVALID);
121     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.3), FP_INT_UPWARD, 2U),
122                                 FE_INVALID);
123     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.5), FP_INT_UPWARD, 2U),
124                                 FE_INVALID);
125     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.75), FP_INT_UPWARD, 2U),
126                                 FE_INVALID);
127     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_UPWARD, 4U),
128                                 FE_INVALID);
129     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_UPWARD, 4U),
130                                 FE_INVALID);
131     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_UPWARD, 4U),
132                                 FE_INVALID);
133     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_UPWARD, 4U),
134                                 FE_INVALID);
135     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.38), FP_INT_UPWARD, 7U),
136                                 FE_INVALID);
137     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.38), FP_INT_UPWARD, 7U),
138                                 FE_INVALID);
139     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.96), FP_INT_UPWARD, 7U),
140                                 FE_INVALID);
141     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.96), FP_INT_UPWARD, 7U),
142                                 FE_INVALID);
143   }
144 
testFractionsDownwardWithinRange(FromfpxFunc func)145   void testFractionsDownwardWithinRange(FromfpxFunc func) {
146     EXPECT_FP_EQ_WITH_EXCEPTION(T(0.0), func(T(0.5), FP_INT_DOWNWARD, 1U),
147                                 FE_INEXACT);
148     EXPECT_FP_EQ_WITH_EXCEPTION(T(-1.0), func(T(-0.5), FP_INT_DOWNWARD, 1U),
149                                 FE_INEXACT);
150     EXPECT_FP_EQ_WITH_EXCEPTION(T(0.0), func(T(0.115), FP_INT_DOWNWARD, 1U),
151                                 FE_INEXACT);
152     EXPECT_FP_EQ_WITH_EXCEPTION(T(-1.0), func(T(-0.115), FP_INT_DOWNWARD, 1U),
153                                 FE_INEXACT);
154     EXPECT_FP_EQ_WITH_EXCEPTION(T(0.0), func(T(0.715), FP_INT_DOWNWARD, 1U),
155                                 FE_INEXACT);
156     EXPECT_FP_EQ_WITH_EXCEPTION(T(-1.0), func(T(-0.715), FP_INT_DOWNWARD, 1U),
157                                 FE_INEXACT);
158     EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(1.3), FP_INT_DOWNWARD, 2U),
159                                 FE_INEXACT);
160     EXPECT_FP_EQ_WITH_EXCEPTION(T(-2.0), func(T(-1.3), FP_INT_DOWNWARD, 2U),
161                                 FE_INEXACT);
162     EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(1.5), FP_INT_DOWNWARD, 2U),
163                                 FE_INEXACT);
164     EXPECT_FP_EQ_WITH_EXCEPTION(T(-2.0), func(T(-1.5), FP_INT_DOWNWARD, 2U),
165                                 FE_INEXACT);
166     EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(1.75), FP_INT_DOWNWARD, 2U),
167                                 FE_INEXACT);
168     EXPECT_FP_EQ_WITH_EXCEPTION(T(-2.0), func(T(-1.75), FP_INT_DOWNWARD, 2U),
169                                 FE_INEXACT);
170     EXPECT_FP_EQ_WITH_EXCEPTION(T(10.0), func(T(10.32), FP_INT_DOWNWARD, 5U),
171                                 FE_INEXACT);
172     EXPECT_FP_EQ_WITH_EXCEPTION(T(-11.0), func(T(-10.32), FP_INT_DOWNWARD, 5U),
173                                 FE_INEXACT);
174     EXPECT_FP_EQ_WITH_EXCEPTION(T(10.0), func(T(10.65), FP_INT_DOWNWARD, 5U),
175                                 FE_INEXACT);
176     EXPECT_FP_EQ_WITH_EXCEPTION(T(-11.0), func(T(-10.65), FP_INT_DOWNWARD, 5U),
177                                 FE_INEXACT);
178     EXPECT_FP_EQ_WITH_EXCEPTION(T(123.0), func(T(123.38), FP_INT_DOWNWARD, 8U),
179                                 FE_INEXACT);
180     EXPECT_FP_EQ_WITH_EXCEPTION(
181         T(-124.0), func(T(-123.38), FP_INT_DOWNWARD, 8U), FE_INEXACT);
182     EXPECT_FP_EQ_WITH_EXCEPTION(T(123.0), func(T(123.96), FP_INT_DOWNWARD, 8U),
183                                 FE_INEXACT);
184     EXPECT_FP_EQ_WITH_EXCEPTION(
185         T(-124.0), func(T(-123.96), FP_INT_DOWNWARD, 8U), FE_INEXACT);
186   }
187 
testFractionsDownwardOutsideRange(FromfpxFunc func)188   void testFractionsDownwardOutsideRange(FromfpxFunc func) {
189     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.3), FP_INT_DOWNWARD, 1U),
190                                 FE_INVALID);
191     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.3), FP_INT_DOWNWARD, 1U),
192                                 FE_INVALID);
193     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.5), FP_INT_DOWNWARD, 1U),
194                                 FE_INVALID);
195     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_DOWNWARD, 1U),
196                                 FE_INVALID);
197     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.75), FP_INT_DOWNWARD, 1U),
198                                 FE_INVALID);
199     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_DOWNWARD, 1U),
200                                 FE_INVALID);
201     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_DOWNWARD, 4U),
202                                 FE_INVALID);
203     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_DOWNWARD, 4U),
204                                 FE_INVALID);
205     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_DOWNWARD, 4U),
206                                 FE_INVALID);
207     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_DOWNWARD, 4U),
208                                 FE_INVALID);
209     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.38), FP_INT_DOWNWARD, 7U),
210                                 FE_INVALID);
211     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.38), FP_INT_DOWNWARD, 7U),
212                                 FE_INVALID);
213     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.96), FP_INT_DOWNWARD, 7U),
214                                 FE_INVALID);
215     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.96), FP_INT_DOWNWARD, 7U),
216                                 FE_INVALID);
217   }
218 
testFractionsTowardZeroWithinRange(FromfpxFunc func)219   void testFractionsTowardZeroWithinRange(FromfpxFunc func) {
220     EXPECT_FP_EQ_WITH_EXCEPTION(T(0.0), func(T(0.5), FP_INT_TOWARDZERO, 1U),
221                                 FE_INEXACT);
222     EXPECT_FP_EQ_WITH_EXCEPTION(T(-0.0), func(T(-0.5), FP_INT_TOWARDZERO, 1U),
223                                 FE_INEXACT);
224     EXPECT_FP_EQ_WITH_EXCEPTION(T(0.0), func(T(0.115), FP_INT_TOWARDZERO, 1U),
225                                 FE_INEXACT);
226     EXPECT_FP_EQ_WITH_EXCEPTION(T(-0.0), func(T(-0.115), FP_INT_TOWARDZERO, 1U),
227                                 FE_INEXACT);
228     EXPECT_FP_EQ_WITH_EXCEPTION(T(0.0), func(T(0.715), FP_INT_TOWARDZERO, 1U),
229                                 FE_INEXACT);
230     EXPECT_FP_EQ_WITH_EXCEPTION(T(-0.0), func(T(-0.715), FP_INT_TOWARDZERO, 1U),
231                                 FE_INEXACT);
232     EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(1.3), FP_INT_TOWARDZERO, 2U),
233                                 FE_INEXACT);
234     EXPECT_FP_EQ_WITH_EXCEPTION(T(-1.0), func(T(-1.3), FP_INT_TOWARDZERO, 1U),
235                                 FE_INEXACT);
236     EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(1.5), FP_INT_TOWARDZERO, 2U),
237                                 FE_INEXACT);
238     EXPECT_FP_EQ_WITH_EXCEPTION(T(-1.0), func(T(-1.5), FP_INT_TOWARDZERO, 1U),
239                                 FE_INEXACT);
240     EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(1.75), FP_INT_TOWARDZERO, 2U),
241                                 FE_INEXACT);
242     EXPECT_FP_EQ_WITH_EXCEPTION(T(-1.0), func(T(-1.75), FP_INT_TOWARDZERO, 1U),
243                                 FE_INEXACT);
244     EXPECT_FP_EQ_WITH_EXCEPTION(T(10.0), func(T(10.32), FP_INT_TOWARDZERO, 5U),
245                                 FE_INEXACT);
246     EXPECT_FP_EQ_WITH_EXCEPTION(
247         T(-10.0), func(T(-10.32), FP_INT_TOWARDZERO, 5U), FE_INEXACT);
248     EXPECT_FP_EQ_WITH_EXCEPTION(T(10.0), func(T(10.65), FP_INT_TOWARDZERO, 5U),
249                                 FE_INEXACT);
250     EXPECT_FP_EQ_WITH_EXCEPTION(
251         T(-10.0), func(T(-10.65), FP_INT_TOWARDZERO, 5U), FE_INEXACT);
252     EXPECT_FP_EQ_WITH_EXCEPTION(
253         T(123.0), func(T(123.38), FP_INT_TOWARDZERO, 8U), FE_INEXACT);
254     EXPECT_FP_EQ_WITH_EXCEPTION(
255         T(-123.0), func(T(-123.38), FP_INT_TOWARDZERO, 8U), FE_INEXACT);
256     EXPECT_FP_EQ_WITH_EXCEPTION(
257         T(123.0), func(T(123.96), FP_INT_TOWARDZERO, 8U), FE_INEXACT);
258     EXPECT_FP_EQ_WITH_EXCEPTION(
259         T(-123.0), func(T(-123.96), FP_INT_TOWARDZERO, 8U), FE_INEXACT);
260   }
261 
testFractionsTowardZeroOutsideRange(FromfpxFunc func)262   void testFractionsTowardZeroOutsideRange(FromfpxFunc func) {
263     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.3), FP_INT_TOWARDZERO, 1U),
264                                 FE_INVALID);
265     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.5), FP_INT_TOWARDZERO, 1U),
266                                 FE_INVALID);
267     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.75), FP_INT_TOWARDZERO, 1U),
268                                 FE_INVALID);
269     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_TOWARDZERO, 4U),
270                                 FE_INVALID);
271     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_TOWARDZERO, 4U),
272                                 FE_INVALID);
273     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_TOWARDZERO, 4U),
274                                 FE_INVALID);
275     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_TOWARDZERO, 4U),
276                                 FE_INVALID);
277     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.38), FP_INT_TOWARDZERO, 7U),
278                                 FE_INVALID);
279     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.38), FP_INT_TOWARDZERO, 7U),
280                                 FE_INVALID);
281     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.96), FP_INT_TOWARDZERO, 7U),
282                                 FE_INVALID);
283     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.96), FP_INT_TOWARDZERO, 7U),
284                                 FE_INVALID);
285   }
286 
testFractionsToNearestFromZeroWithinRange(FromfpxFunc func)287   void testFractionsToNearestFromZeroWithinRange(FromfpxFunc func) {
288     EXPECT_FP_EQ_WITH_EXCEPTION(
289         T(1.0), func(T(0.5), FP_INT_TONEARESTFROMZERO, 2U), FE_INEXACT);
290     EXPECT_FP_EQ_WITH_EXCEPTION(
291         T(-1.0), func(T(-0.5), FP_INT_TONEARESTFROMZERO, 1U), FE_INEXACT);
292     EXPECT_FP_EQ_WITH_EXCEPTION(
293         T(0.0), func(T(0.115), FP_INT_TONEARESTFROMZERO, 1U), FE_INEXACT);
294     EXPECT_FP_EQ_WITH_EXCEPTION(
295         T(-0.0), func(T(-0.115), FP_INT_TONEARESTFROMZERO, 1U), FE_INEXACT);
296     EXPECT_FP_EQ_WITH_EXCEPTION(
297         T(1.0), func(T(0.715), FP_INT_TONEARESTFROMZERO, 2U), FE_INEXACT);
298     EXPECT_FP_EQ_WITH_EXCEPTION(
299         T(-1.0), func(T(-0.715), FP_INT_TONEARESTFROMZERO, 1U), FE_INEXACT);
300     EXPECT_FP_EQ_WITH_EXCEPTION(
301         T(1.0), func(T(1.3), FP_INT_TONEARESTFROMZERO, 2U), FE_INEXACT);
302     EXPECT_FP_EQ_WITH_EXCEPTION(
303         T(-1.0), func(T(-1.3), FP_INT_TONEARESTFROMZERO, 1U), FE_INEXACT);
304     EXPECT_FP_EQ_WITH_EXCEPTION(
305         T(2.0), func(T(1.5), FP_INT_TONEARESTFROMZERO, 3U), FE_INEXACT);
306     EXPECT_FP_EQ_WITH_EXCEPTION(
307         T(-2.0), func(T(-1.5), FP_INT_TONEARESTFROMZERO, 2U), FE_INEXACT);
308     EXPECT_FP_EQ_WITH_EXCEPTION(
309         T(2.0), func(T(1.75), FP_INT_TONEARESTFROMZERO, 3U), FE_INEXACT);
310     EXPECT_FP_EQ_WITH_EXCEPTION(
311         T(-2.0), func(T(-1.75), FP_INT_TONEARESTFROMZERO, 2U), FE_INEXACT);
312     EXPECT_FP_EQ_WITH_EXCEPTION(
313         T(10.0), func(T(10.32), FP_INT_TONEARESTFROMZERO, 5U), FE_INEXACT);
314     EXPECT_FP_EQ_WITH_EXCEPTION(
315         T(-10.0), func(T(-10.32), FP_INT_TONEARESTFROMZERO, 5U), FE_INEXACT);
316     EXPECT_FP_EQ_WITH_EXCEPTION(
317         T(11.0), func(T(10.65), FP_INT_TONEARESTFROMZERO, 5U), FE_INEXACT);
318     EXPECT_FP_EQ_WITH_EXCEPTION(
319         T(-11.0), func(T(-10.65), FP_INT_TONEARESTFROMZERO, 5U), FE_INEXACT);
320     EXPECT_FP_EQ_WITH_EXCEPTION(
321         T(123.0), func(T(123.38), FP_INT_TONEARESTFROMZERO, 8U), FE_INEXACT);
322     EXPECT_FP_EQ_WITH_EXCEPTION(
323         T(-123.0), func(T(-123.38), FP_INT_TONEARESTFROMZERO, 8U), FE_INEXACT);
324     EXPECT_FP_EQ_WITH_EXCEPTION(
325         T(124.0), func(T(123.96), FP_INT_TONEARESTFROMZERO, 8U), FE_INEXACT);
326     EXPECT_FP_EQ_WITH_EXCEPTION(
327         T(-124.0), func(T(-123.96), FP_INT_TONEARESTFROMZERO, 8U), FE_INEXACT);
328   }
329 
testFractionsToNearestFromZeroOutsideRange(FromfpxFunc func)330   void testFractionsToNearestFromZeroOutsideRange(FromfpxFunc func) {
331     EXPECT_FP_EQ_WITH_EXCEPTION(
332         aNaN, func(T(0.5), FP_INT_TONEARESTFROMZERO, 1U), FE_INVALID);
333     EXPECT_FP_EQ_WITH_EXCEPTION(
334         aNaN, func(T(0.715), FP_INT_TONEARESTFROMZERO, 1U), FE_INVALID);
335     EXPECT_FP_EQ_WITH_EXCEPTION(
336         aNaN, func(T(1.3), FP_INT_TONEARESTFROMZERO, 1U), FE_INVALID);
337     EXPECT_FP_EQ_WITH_EXCEPTION(
338         aNaN, func(T(1.5), FP_INT_TONEARESTFROMZERO, 2U), FE_INVALID);
339     EXPECT_FP_EQ_WITH_EXCEPTION(
340         aNaN, func(T(-1.5), FP_INT_TONEARESTFROMZERO, 1U), FE_INVALID);
341     EXPECT_FP_EQ_WITH_EXCEPTION(
342         aNaN, func(T(1.75), FP_INT_TONEARESTFROMZERO, 2U), FE_INVALID);
343     EXPECT_FP_EQ_WITH_EXCEPTION(
344         aNaN, func(T(-1.75), FP_INT_TONEARESTFROMZERO, 1U), FE_INVALID);
345     EXPECT_FP_EQ_WITH_EXCEPTION(
346         aNaN, func(T(10.32), FP_INT_TONEARESTFROMZERO, 4U), FE_INVALID);
347     EXPECT_FP_EQ_WITH_EXCEPTION(
348         aNaN, func(T(-10.32), FP_INT_TONEARESTFROMZERO, 4U), FE_INVALID);
349     EXPECT_FP_EQ_WITH_EXCEPTION(
350         aNaN, func(T(10.65), FP_INT_TONEARESTFROMZERO, 4U), FE_INVALID);
351     EXPECT_FP_EQ_WITH_EXCEPTION(
352         aNaN, func(T(-10.65), FP_INT_TONEARESTFROMZERO, 4U), FE_INVALID);
353     EXPECT_FP_EQ_WITH_EXCEPTION(
354         aNaN, func(T(123.38), FP_INT_TONEARESTFROMZERO, 7U), FE_INVALID);
355     EXPECT_FP_EQ_WITH_EXCEPTION(
356         aNaN, func(T(-123.38), FP_INT_TONEARESTFROMZERO, 7U), FE_INVALID);
357     EXPECT_FP_EQ_WITH_EXCEPTION(
358         aNaN, func(T(123.96), FP_INT_TONEARESTFROMZERO, 7U), FE_INVALID);
359     EXPECT_FP_EQ_WITH_EXCEPTION(
360         aNaN, func(T(-123.96), FP_INT_TONEARESTFROMZERO, 7U), FE_INVALID);
361   }
362 
testFractionsToNearestWithinRange(FromfpxFunc func)363   void testFractionsToNearestWithinRange(FromfpxFunc func) {
364     EXPECT_FP_EQ_WITH_EXCEPTION(T(0.0), func(T(0.5), FP_INT_TONEAREST, 1U),
365                                 FE_INEXACT);
366     EXPECT_FP_EQ_WITH_EXCEPTION(T(-0.0), func(T(-0.5), FP_INT_TONEAREST, 1U),
367                                 FE_INEXACT);
368     EXPECT_FP_EQ_WITH_EXCEPTION(T(0.0), func(T(0.115), FP_INT_TONEAREST, 1U),
369                                 FE_INEXACT);
370     EXPECT_FP_EQ_WITH_EXCEPTION(T(-0.0), func(T(-0.115), FP_INT_TONEAREST, 1U),
371                                 FE_INEXACT);
372     EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(0.715), FP_INT_TONEAREST, 2U),
373                                 FE_INEXACT);
374     EXPECT_FP_EQ_WITH_EXCEPTION(T(-1.0), func(T(-0.715), FP_INT_TONEAREST, 1U),
375                                 FE_INEXACT);
376     EXPECT_FP_EQ_WITH_EXCEPTION(T(1.0), func(T(1.3), FP_INT_TONEAREST, 2U),
377                                 FE_INEXACT);
378     EXPECT_FP_EQ_WITH_EXCEPTION(T(-1.0), func(T(-1.3), FP_INT_TONEAREST, 1U),
379                                 FE_INEXACT);
380     EXPECT_FP_EQ_WITH_EXCEPTION(T(2.0), func(T(1.5), FP_INT_TONEAREST, 3U),
381                                 FE_INEXACT);
382     EXPECT_FP_EQ_WITH_EXCEPTION(T(-2.0), func(T(-1.5), FP_INT_TONEAREST, 2U),
383                                 FE_INEXACT);
384     EXPECT_FP_EQ_WITH_EXCEPTION(T(2.0), func(T(1.75), FP_INT_TONEAREST, 3U),
385                                 FE_INEXACT);
386     EXPECT_FP_EQ_WITH_EXCEPTION(T(-2.0), func(T(-1.75), FP_INT_TONEAREST, 2U),
387                                 FE_INEXACT);
388     EXPECT_FP_EQ_WITH_EXCEPTION(T(10.0), func(T(10.32), FP_INT_TONEAREST, 5U),
389                                 FE_INEXACT);
390     EXPECT_FP_EQ_WITH_EXCEPTION(T(-10.0), func(T(-10.32), FP_INT_TONEAREST, 5U),
391                                 FE_INEXACT);
392     EXPECT_FP_EQ_WITH_EXCEPTION(T(11.0), func(T(10.65), FP_INT_TONEAREST, 5U),
393                                 FE_INEXACT);
394     EXPECT_FP_EQ_WITH_EXCEPTION(T(-11.0), func(T(-10.65), FP_INT_TONEAREST, 5U),
395                                 FE_INEXACT);
396     EXPECT_FP_EQ_WITH_EXCEPTION(T(123.0), func(T(123.38), FP_INT_TONEAREST, 8U),
397                                 FE_INEXACT);
398     EXPECT_FP_EQ_WITH_EXCEPTION(
399         T(-123.0), func(T(-123.38), FP_INT_TONEAREST, 8U), FE_INEXACT);
400     EXPECT_FP_EQ_WITH_EXCEPTION(T(124.0), func(T(123.96), FP_INT_TONEAREST, 8U),
401                                 FE_INEXACT);
402     EXPECT_FP_EQ_WITH_EXCEPTION(
403         T(-124.0), func(T(-123.96), FP_INT_TONEAREST, 8U), FE_INEXACT);
404 
405     EXPECT_FP_EQ_WITH_EXCEPTION(T(2.0), func(T(2.3), FP_INT_TONEAREST, 3U),
406                                 FE_INEXACT);
407     EXPECT_FP_EQ_WITH_EXCEPTION(T(-2.0), func(T(-2.3), FP_INT_TONEAREST, 2U),
408                                 FE_INEXACT);
409     EXPECT_FP_EQ_WITH_EXCEPTION(T(2.0), func(T(2.5), FP_INT_TONEAREST, 3U),
410                                 FE_INEXACT);
411     EXPECT_FP_EQ_WITH_EXCEPTION(T(-2.0), func(T(-2.5), FP_INT_TONEAREST, 2U),
412                                 FE_INEXACT);
413     EXPECT_FP_EQ_WITH_EXCEPTION(T(3.0), func(T(2.75), FP_INT_TONEAREST, 3U),
414                                 FE_INEXACT);
415     EXPECT_FP_EQ_WITH_EXCEPTION(T(-3.0), func(T(-2.75), FP_INT_TONEAREST, 3U),
416                                 FE_INEXACT);
417     EXPECT_FP_EQ_WITH_EXCEPTION(T(5.0), func(T(5.3), FP_INT_TONEAREST, 4U),
418                                 FE_INEXACT);
419     EXPECT_FP_EQ_WITH_EXCEPTION(T(-5.0), func(T(-5.3), FP_INT_TONEAREST, 4U),
420                                 FE_INEXACT);
421     EXPECT_FP_EQ_WITH_EXCEPTION(T(6.0), func(T(5.5), FP_INT_TONEAREST, 4U),
422                                 FE_INEXACT);
423     EXPECT_FP_EQ_WITH_EXCEPTION(T(-6.0), func(T(-5.5), FP_INT_TONEAREST, 4U),
424                                 FE_INEXACT);
425     EXPECT_FP_EQ_WITH_EXCEPTION(T(6.0), func(T(5.75), FP_INT_TONEAREST, 4U),
426                                 FE_INEXACT);
427     EXPECT_FP_EQ_WITH_EXCEPTION(T(-6.0), func(T(-5.75), FP_INT_TONEAREST, 4U),
428                                 FE_INEXACT);
429   }
430 
testFractionsToNearestOutsideRange(FromfpxFunc func)431   void testFractionsToNearestOutsideRange(FromfpxFunc func) {
432     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(0.715), FP_INT_TONEAREST, 1U),
433                                 FE_INVALID);
434     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.3), FP_INT_TONEAREST, 1U),
435                                 FE_INVALID);
436     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.5), FP_INT_TONEAREST, 2U),
437                                 FE_INVALID);
438     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.5), FP_INT_TONEAREST, 1U),
439                                 FE_INVALID);
440     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(1.75), FP_INT_TONEAREST, 2U),
441                                 FE_INVALID);
442     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-1.75), FP_INT_TONEAREST, 1U),
443                                 FE_INVALID);
444     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.32), FP_INT_TONEAREST, 4U),
445                                 FE_INVALID);
446     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.32), FP_INT_TONEAREST, 4U),
447                                 FE_INVALID);
448     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(10.65), FP_INT_TONEAREST, 4U),
449                                 FE_INVALID);
450     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-10.65), FP_INT_TONEAREST, 4U),
451                                 FE_INVALID);
452     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.38), FP_INT_TONEAREST, 7U),
453                                 FE_INVALID);
454     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.38), FP_INT_TONEAREST, 7U),
455                                 FE_INVALID);
456     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(123.96), FP_INT_TONEAREST, 7U),
457                                 FE_INVALID);
458     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-123.96), FP_INT_TONEAREST, 7U),
459                                 FE_INVALID);
460 
461     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(2.3), FP_INT_TONEAREST, 2U),
462                                 FE_INVALID);
463     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-2.3), FP_INT_TONEAREST, 1U),
464                                 FE_INVALID);
465     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(2.5), FP_INT_TONEAREST, 2U),
466                                 FE_INVALID);
467     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-2.5), FP_INT_TONEAREST, 1U),
468                                 FE_INVALID);
469     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(2.75), FP_INT_TONEAREST, 2U),
470                                 FE_INVALID);
471     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-2.75), FP_INT_TONEAREST, 2U),
472                                 FE_INVALID);
473     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(5.3), FP_INT_TONEAREST, 3U),
474                                 FE_INVALID);
475     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-5.3), FP_INT_TONEAREST, 3U),
476                                 FE_INVALID);
477     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(5.5), FP_INT_TONEAREST, 3U),
478                                 FE_INVALID);
479     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-5.5), FP_INT_TONEAREST, 3U),
480                                 FE_INVALID);
481     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(5.75), FP_INT_TONEAREST, 3U),
482                                 FE_INVALID);
483     EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, func(T(-5.75), FP_INT_TONEAREST, 3U),
484                                 FE_INVALID);
485   }
486 
testFractionsToNearestFallbackWithinRange(FromfpxFunc func)487   void testFractionsToNearestFallbackWithinRange(FromfpxFunc func) {
488     EXPECT_FP_EQ_WITH_EXCEPTION(
489         T(0.0), func(T(0.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INEXACT);
490     EXPECT_FP_EQ_WITH_EXCEPTION(
491         T(-0.0), func(T(-0.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U),
492         FE_INEXACT);
493     EXPECT_FP_EQ_WITH_EXCEPTION(
494         T(0.0), func(T(0.115), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U),
495         FE_INEXACT);
496     EXPECT_FP_EQ_WITH_EXCEPTION(
497         T(-0.0), func(T(-0.115), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U),
498         FE_INEXACT);
499     EXPECT_FP_EQ_WITH_EXCEPTION(
500         T(1.0), func(T(0.715), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U),
501         FE_INEXACT);
502     EXPECT_FP_EQ_WITH_EXCEPTION(
503         T(-1.0), func(T(-0.715), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U),
504         FE_INEXACT);
505     EXPECT_FP_EQ_WITH_EXCEPTION(
506         T(1.0), func(T(1.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INEXACT);
507     EXPECT_FP_EQ_WITH_EXCEPTION(
508         T(-1.0), func(T(-1.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U),
509         FE_INEXACT);
510     EXPECT_FP_EQ_WITH_EXCEPTION(
511         T(2.0), func(T(1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INEXACT);
512     EXPECT_FP_EQ_WITH_EXCEPTION(
513         T(-2.0), func(T(-1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U),
514         FE_INEXACT);
515     EXPECT_FP_EQ_WITH_EXCEPTION(
516         T(2.0), func(T(1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INEXACT);
517     EXPECT_FP_EQ_WITH_EXCEPTION(
518         T(-2.0), func(T(-1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U),
519         FE_INEXACT);
520     EXPECT_FP_EQ_WITH_EXCEPTION(
521         T(10.0), func(T(10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 5U),
522         FE_INEXACT);
523     EXPECT_FP_EQ_WITH_EXCEPTION(
524         T(-10.0), func(T(-10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 5U),
525         FE_INEXACT);
526     EXPECT_FP_EQ_WITH_EXCEPTION(
527         T(11.0), func(T(10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 5U),
528         FE_INEXACT);
529     EXPECT_FP_EQ_WITH_EXCEPTION(
530         T(-11.0), func(T(-10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 5U),
531         FE_INEXACT);
532     EXPECT_FP_EQ_WITH_EXCEPTION(
533         T(123.0), func(T(123.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 8U),
534         FE_INEXACT);
535     EXPECT_FP_EQ_WITH_EXCEPTION(
536         T(-123.0), func(T(-123.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 8U),
537         FE_INEXACT);
538     EXPECT_FP_EQ_WITH_EXCEPTION(
539         T(124.0), func(T(123.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 8U),
540         FE_INEXACT);
541     EXPECT_FP_EQ_WITH_EXCEPTION(
542         T(-124.0), func(T(-123.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 8U),
543         FE_INEXACT);
544 
545     EXPECT_FP_EQ_WITH_EXCEPTION(
546         T(2.0), func(T(2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INEXACT);
547     EXPECT_FP_EQ_WITH_EXCEPTION(
548         T(-2.0), func(T(-2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U),
549         FE_INEXACT);
550     EXPECT_FP_EQ_WITH_EXCEPTION(
551         T(2.0), func(T(2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INEXACT);
552     EXPECT_FP_EQ_WITH_EXCEPTION(
553         T(-2.0), func(T(-2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U),
554         FE_INEXACT);
555     EXPECT_FP_EQ_WITH_EXCEPTION(
556         T(3.0), func(T(2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INEXACT);
557     EXPECT_FP_EQ_WITH_EXCEPTION(
558         T(-3.0), func(T(-2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U),
559         FE_INEXACT);
560     EXPECT_FP_EQ_WITH_EXCEPTION(
561         T(5.0), func(T(5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U), FE_INEXACT);
562     EXPECT_FP_EQ_WITH_EXCEPTION(
563         T(-5.0), func(T(-5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U),
564         FE_INEXACT);
565     EXPECT_FP_EQ_WITH_EXCEPTION(
566         T(6.0), func(T(5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U), FE_INEXACT);
567     EXPECT_FP_EQ_WITH_EXCEPTION(
568         T(-6.0), func(T(-5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U),
569         FE_INEXACT);
570     EXPECT_FP_EQ_WITH_EXCEPTION(
571         T(6.0), func(T(5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U), FE_INEXACT);
572     EXPECT_FP_EQ_WITH_EXCEPTION(
573         T(-6.0), func(T(-5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U),
574         FE_INEXACT);
575   }
576 
testFractionsToNearestFallbackOutsideRange(FromfpxFunc func)577   void testFractionsToNearestFallbackOutsideRange(FromfpxFunc func) {
578     EXPECT_FP_EQ_WITH_EXCEPTION(
579         aNaN, func(T(0.715), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID);
580     EXPECT_FP_EQ_WITH_EXCEPTION(
581         aNaN, func(T(1.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID);
582     EXPECT_FP_EQ_WITH_EXCEPTION(
583         aNaN, func(T(1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID);
584     EXPECT_FP_EQ_WITH_EXCEPTION(
585         aNaN, func(T(-1.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID);
586     EXPECT_FP_EQ_WITH_EXCEPTION(
587         aNaN, func(T(1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID);
588     EXPECT_FP_EQ_WITH_EXCEPTION(
589         aNaN, func(T(-1.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID);
590     EXPECT_FP_EQ_WITH_EXCEPTION(
591         aNaN, func(T(10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U), FE_INVALID);
592     EXPECT_FP_EQ_WITH_EXCEPTION(
593         aNaN, func(T(-10.32), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U), FE_INVALID);
594     EXPECT_FP_EQ_WITH_EXCEPTION(
595         aNaN, func(T(10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U), FE_INVALID);
596     EXPECT_FP_EQ_WITH_EXCEPTION(
597         aNaN, func(T(-10.65), UNKNOWN_MATH_ROUNDING_DIRECTION, 4U), FE_INVALID);
598     EXPECT_FP_EQ_WITH_EXCEPTION(
599         aNaN, func(T(123.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 7U), FE_INVALID);
600     EXPECT_FP_EQ_WITH_EXCEPTION(
601         aNaN, func(T(-123.38), UNKNOWN_MATH_ROUNDING_DIRECTION, 7U),
602         FE_INVALID);
603     EXPECT_FP_EQ_WITH_EXCEPTION(
604         aNaN, func(T(123.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 7U), FE_INVALID);
605     EXPECT_FP_EQ_WITH_EXCEPTION(
606         aNaN, func(T(-123.96), UNKNOWN_MATH_ROUNDING_DIRECTION, 7U),
607         FE_INVALID);
608 
609     EXPECT_FP_EQ_WITH_EXCEPTION(
610         aNaN, func(T(2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID);
611     EXPECT_FP_EQ_WITH_EXCEPTION(
612         aNaN, func(T(-2.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID);
613     EXPECT_FP_EQ_WITH_EXCEPTION(
614         aNaN, func(T(2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID);
615     EXPECT_FP_EQ_WITH_EXCEPTION(
616         aNaN, func(T(-2.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 1U), FE_INVALID);
617     EXPECT_FP_EQ_WITH_EXCEPTION(
618         aNaN, func(T(2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID);
619     EXPECT_FP_EQ_WITH_EXCEPTION(
620         aNaN, func(T(-2.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 2U), FE_INVALID);
621     EXPECT_FP_EQ_WITH_EXCEPTION(
622         aNaN, func(T(5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID);
623     EXPECT_FP_EQ_WITH_EXCEPTION(
624         aNaN, func(T(-5.3), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID);
625     EXPECT_FP_EQ_WITH_EXCEPTION(
626         aNaN, func(T(5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID);
627     EXPECT_FP_EQ_WITH_EXCEPTION(
628         aNaN, func(T(-5.5), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID);
629     EXPECT_FP_EQ_WITH_EXCEPTION(
630         aNaN, func(T(5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID);
631     EXPECT_FP_EQ_WITH_EXCEPTION(
632         aNaN, func(T(-5.75), UNKNOWN_MATH_ROUNDING_DIRECTION, 3U), FE_INVALID);
633   }
634 };
635 
636 #define LIST_FROMFPX_TESTS(T, func)                                            \
637   using LlvmLibcFromfpxTest = FromfpxTestTemplate<T>;                          \
638   TEST_F(LlvmLibcFromfpxTest, SpecialNumbersNonzeroWidth) {                    \
639     testSpecialNumbersNonzeroWidth(&func);                                     \
640   }                                                                            \
641   TEST_F(LlvmLibcFromfpxTest, SpecialNumbersZeroWidth) {                       \
642     testSpecialNumbersZeroWidth(&func);                                        \
643   }                                                                            \
644   TEST_F(LlvmLibcFromfpxTest, RoundedNumbersWithinRange) {                     \
645     testRoundedNumbersWithinRange(&func);                                      \
646   }                                                                            \
647   TEST_F(LlvmLibcFromfpxTest, RoundedNumbersOutsideRange) {                    \
648     testRoundedNumbersOutsideRange(&func);                                     \
649   }                                                                            \
650   TEST_F(LlvmLibcFromfpxTest, FractionsUpwardWithinRange) {                    \
651     testFractionsUpwardWithinRange(&func);                                     \
652   }                                                                            \
653   TEST_F(LlvmLibcFromfpxTest, FractionsUpwardOutsideRange) {                   \
654     testFractionsUpwardOutsideRange(&func);                                    \
655   }                                                                            \
656   TEST_F(LlvmLibcFromfpxTest, FractionsDownwardWithinRange) {                  \
657     testFractionsDownwardWithinRange(&func);                                   \
658   }                                                                            \
659   TEST_F(LlvmLibcFromfpxTest, FractionsDownwardOutsideRange) {                 \
660     testFractionsDownwardOutsideRange(&func);                                  \
661   }                                                                            \
662   TEST_F(LlvmLibcFromfpxTest, FractionsTowardZeroWithinRange) {                \
663     testFractionsTowardZeroWithinRange(&func);                                 \
664   }                                                                            \
665   TEST_F(LlvmLibcFromfpxTest, FractionsTowardZeroOutsideRange) {               \
666     testFractionsTowardZeroOutsideRange(&func);                                \
667   }                                                                            \
668   TEST_F(LlvmLibcFromfpxTest, FractionsToNearestFromZeroWithinRange) {         \
669     testFractionsToNearestFromZeroWithinRange(&func);                          \
670   }                                                                            \
671   TEST_F(LlvmLibcFromfpxTest, FractionsToNearestFromZeroOutsideRange) {        \
672     testFractionsToNearestFromZeroOutsideRange(&func);                         \
673   }                                                                            \
674   TEST_F(LlvmLibcFromfpxTest, FractionsToNearestWithinRange) {                 \
675     testFractionsToNearestWithinRange(&func);                                  \
676   }                                                                            \
677   TEST_F(LlvmLibcFromfpxTest, FractionsToNearestOutsideRange) {                \
678     testFractionsToNearestOutsideRange(&func);                                 \
679   }                                                                            \
680   TEST_F(LlvmLibcFromfpxTest, FractionsToNearestFallbackWithinRange) {         \
681     testFractionsToNearestFallbackWithinRange(&func);                          \
682   }                                                                            \
683   TEST_F(LlvmLibcFromfpxTest, FractionsToNearestFallbackOutsideRange) {        \
684     testFractionsToNearestFallbackOutsideRange(&func);                         \
685   }
686 
687 #endif // LIBC_TEST_SRC_MATH_SMOKE_FROMFPXTEST_H
688