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