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