xref: /aosp_15_r20/external/llvm-libc/test/src/math/smoke/RemQuoTest.h (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1*71db0c75SAndroid Build Coastguard Worker //===-- Utility class to test different flavors of remquo -------*- 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 LLVM_LIBC_TEST_SRC_MATH_REMQUOTEST_H
10*71db0c75SAndroid Build Coastguard Worker #define LLVM_LIBC_TEST_SRC_MATH_REMQUOTEST_H
11*71db0c75SAndroid Build Coastguard Worker 
12*71db0c75SAndroid Build Coastguard Worker #include "src/__support/FPUtil/FPBits.h"
13*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/FEnvSafeTest.h"
14*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/FPMatcher.h"
15*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/Test.h"
16*71db0c75SAndroid Build Coastguard Worker 
17*71db0c75SAndroid Build Coastguard Worker using LIBC_NAMESPACE::Sign;
18*71db0c75SAndroid Build Coastguard Worker 
19*71db0c75SAndroid Build Coastguard Worker template <typename T>
20*71db0c75SAndroid Build Coastguard Worker class RemQuoTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest {
21*71db0c75SAndroid Build Coastguard Worker   using FPBits = LIBC_NAMESPACE::fputil::FPBits<T>;
22*71db0c75SAndroid Build Coastguard Worker   using StorageType = typename FPBits::StorageType;
23*71db0c75SAndroid Build Coastguard Worker 
24*71db0c75SAndroid Build Coastguard Worker   const T inf = FPBits::inf(Sign::POS).get_val();
25*71db0c75SAndroid Build Coastguard Worker   const T neg_inf = FPBits::inf(Sign::NEG).get_val();
26*71db0c75SAndroid Build Coastguard Worker   const T zero = FPBits::zero(Sign::POS).get_val();
27*71db0c75SAndroid Build Coastguard Worker   const T neg_zero = FPBits::zero(Sign::NEG).get_val();
28*71db0c75SAndroid Build Coastguard Worker   const T nan = FPBits::quiet_nan().get_val();
29*71db0c75SAndroid Build Coastguard Worker 
30*71db0c75SAndroid Build Coastguard Worker public:
31*71db0c75SAndroid Build Coastguard Worker   typedef T (*RemQuoFunc)(T, T, int *);
32*71db0c75SAndroid Build Coastguard Worker 
testSpecialNumbers(RemQuoFunc func)33*71db0c75SAndroid Build Coastguard Worker   void testSpecialNumbers(RemQuoFunc func) {
34*71db0c75SAndroid Build Coastguard Worker     int quotient;
35*71db0c75SAndroid Build Coastguard Worker     T x, y;
36*71db0c75SAndroid Build Coastguard Worker 
37*71db0c75SAndroid Build Coastguard Worker     y = T(1.0);
38*71db0c75SAndroid Build Coastguard Worker     x = inf;
39*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(nan, func(x, y, &quotient));
40*71db0c75SAndroid Build Coastguard Worker     x = neg_inf;
41*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(nan, func(x, y, &quotient));
42*71db0c75SAndroid Build Coastguard Worker 
43*71db0c75SAndroid Build Coastguard Worker     x = T(1.0);
44*71db0c75SAndroid Build Coastguard Worker     y = zero;
45*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(nan, func(x, y, &quotient));
46*71db0c75SAndroid Build Coastguard Worker     y = neg_zero;
47*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(nan, func(x, y, &quotient));
48*71db0c75SAndroid Build Coastguard Worker 
49*71db0c75SAndroid Build Coastguard Worker     y = nan;
50*71db0c75SAndroid Build Coastguard Worker     x = T(1.0);
51*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(nan, func(x, y, &quotient));
52*71db0c75SAndroid Build Coastguard Worker 
53*71db0c75SAndroid Build Coastguard Worker     y = T(1.0);
54*71db0c75SAndroid Build Coastguard Worker     x = nan;
55*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(nan, func(x, y, &quotient));
56*71db0c75SAndroid Build Coastguard Worker 
57*71db0c75SAndroid Build Coastguard Worker     x = nan;
58*71db0c75SAndroid Build Coastguard Worker     y = nan;
59*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(nan, func(x, y, &quotient));
60*71db0c75SAndroid Build Coastguard Worker 
61*71db0c75SAndroid Build Coastguard Worker     x = zero;
62*71db0c75SAndroid Build Coastguard Worker     y = T(1.0);
63*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(func(x, y, &quotient), zero);
64*71db0c75SAndroid Build Coastguard Worker 
65*71db0c75SAndroid Build Coastguard Worker     x = neg_zero;
66*71db0c75SAndroid Build Coastguard Worker     y = T(1.0);
67*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(func(x, y, &quotient), neg_zero);
68*71db0c75SAndroid Build Coastguard Worker 
69*71db0c75SAndroid Build Coastguard Worker     x = T(1.125);
70*71db0c75SAndroid Build Coastguard Worker     y = inf;
71*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(func(x, y, &quotient), x);
72*71db0c75SAndroid Build Coastguard Worker     EXPECT_EQ(quotient, 0);
73*71db0c75SAndroid Build Coastguard Worker   }
74*71db0c75SAndroid Build Coastguard Worker 
testEqualNumeratorAndDenominator(RemQuoFunc func)75*71db0c75SAndroid Build Coastguard Worker   void testEqualNumeratorAndDenominator(RemQuoFunc func) {
76*71db0c75SAndroid Build Coastguard Worker     T x = T(1.125), y = T(1.125);
77*71db0c75SAndroid Build Coastguard Worker     int q;
78*71db0c75SAndroid Build Coastguard Worker 
79*71db0c75SAndroid Build Coastguard Worker     // When the remainder is zero, the standard requires it to
80*71db0c75SAndroid Build Coastguard Worker     // have the same sign as x.
81*71db0c75SAndroid Build Coastguard Worker 
82*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(func(x, y, &q), zero);
83*71db0c75SAndroid Build Coastguard Worker     EXPECT_EQ(q, 1);
84*71db0c75SAndroid Build Coastguard Worker 
85*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(func(x, -y, &q), zero);
86*71db0c75SAndroid Build Coastguard Worker     EXPECT_EQ(q, -1);
87*71db0c75SAndroid Build Coastguard Worker 
88*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(func(-x, y, &q), neg_zero);
89*71db0c75SAndroid Build Coastguard Worker     EXPECT_EQ(q, -1);
90*71db0c75SAndroid Build Coastguard Worker 
91*71db0c75SAndroid Build Coastguard Worker     EXPECT_FP_EQ(func(-x, -y, &q), neg_zero);
92*71db0c75SAndroid Build Coastguard Worker     EXPECT_EQ(q, 1);
93*71db0c75SAndroid Build Coastguard Worker   }
94*71db0c75SAndroid Build Coastguard Worker };
95*71db0c75SAndroid Build Coastguard Worker 
96*71db0c75SAndroid Build Coastguard Worker #define LIST_REMQUO_TESTS(T, func)                                             \
97*71db0c75SAndroid Build Coastguard Worker   using LlvmLibcRemQuoTest = RemQuoTestTemplate<T>;                            \
98*71db0c75SAndroid Build Coastguard Worker   TEST_F(LlvmLibcRemQuoTest, SpecialNumbers) { testSpecialNumbers(&func); }    \
99*71db0c75SAndroid Build Coastguard Worker   TEST_F(LlvmLibcRemQuoTest, EqualNumeratorAndDenominator) {                   \
100*71db0c75SAndroid Build Coastguard Worker     testEqualNumeratorAndDenominator(&func);                                   \
101*71db0c75SAndroid Build Coastguard Worker   }
102*71db0c75SAndroid Build Coastguard Worker 
103*71db0c75SAndroid Build Coastguard Worker #endif // LLVM_LIBC_TEST_SRC_MATH_REMQUOTEST_H
104