xref: /aosp_15_r20/external/llvm-libc/test/src/math/smoke/TotalOrderMagTest.h (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1*71db0c75SAndroid Build Coastguard Worker //===-- Utility class to test flavors of totalordermag ----------*- 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_TOTALORDERMAGTEST_H
10*71db0c75SAndroid Build Coastguard Worker #define LIBC_TEST_SRC_MATH_SMOKE_TOTALORDERMAGTEST_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 using LIBC_NAMESPACE::Sign;
17*71db0c75SAndroid Build Coastguard Worker 
18*71db0c75SAndroid Build Coastguard Worker template <typename T>
19*71db0c75SAndroid Build Coastguard Worker class TotalOrderMagTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest {
20*71db0c75SAndroid Build Coastguard Worker 
21*71db0c75SAndroid Build Coastguard Worker   DECLARE_SPECIAL_CONSTANTS(T)
22*71db0c75SAndroid Build Coastguard Worker 
23*71db0c75SAndroid Build Coastguard Worker public:
24*71db0c75SAndroid Build Coastguard Worker   typedef int (*TotalOrderMagFunc)(const T *, const T *);
25*71db0c75SAndroid Build Coastguard Worker 
funcWrapper(TotalOrderMagFunc func,T x,T y)26*71db0c75SAndroid Build Coastguard Worker   bool funcWrapper(TotalOrderMagFunc func, T x, T y) {
27*71db0c75SAndroid Build Coastguard Worker     return func(&x, &y) != 0;
28*71db0c75SAndroid Build Coastguard Worker   }
29*71db0c75SAndroid Build Coastguard Worker 
testXLesserThanY(TotalOrderMagFunc func)30*71db0c75SAndroid Build Coastguard Worker   void testXLesserThanY(TotalOrderMagFunc func) {
31*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, neg_inf, inf));
32*71db0c75SAndroid Build Coastguard Worker 
33*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(0.0), T(0.1)));
34*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(0.0), T(123.38)));
35*71db0c75SAndroid Build Coastguard Worker 
36*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, T(-0.1), T(0.0)));
37*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, T(-123.38), T(0.0)));
38*71db0c75SAndroid Build Coastguard Worker 
39*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(-0.1), T(0.1)));
40*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(-123.38), T(123.38)));
41*71db0c75SAndroid Build Coastguard Worker   }
42*71db0c75SAndroid Build Coastguard Worker 
testXGreaterThanY(TotalOrderMagFunc func)43*71db0c75SAndroid Build Coastguard Worker   void testXGreaterThanY(TotalOrderMagFunc func) {
44*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, inf, neg_inf));
45*71db0c75SAndroid Build Coastguard Worker 
46*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(0.0), T(-0.1)));
47*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(0.0), T(-123.38)));
48*71db0c75SAndroid Build Coastguard Worker 
49*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, T(0.1), T(0.0)));
50*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, T(123.38), T(0.0)));
51*71db0c75SAndroid Build Coastguard Worker 
52*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(0.1), T(-0.1)));
53*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(123.38), T(-123.38)));
54*71db0c75SAndroid Build Coastguard Worker   }
55*71db0c75SAndroid Build Coastguard Worker 
testXEqualToY(TotalOrderMagFunc func)56*71db0c75SAndroid Build Coastguard Worker   void testXEqualToY(TotalOrderMagFunc func) {
57*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, inf, inf));
58*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, neg_inf, neg_inf));
59*71db0c75SAndroid Build Coastguard Worker 
60*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(-0.0), T(0.0)));
61*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(0.0), T(-0.0)));
62*71db0c75SAndroid Build Coastguard Worker 
63*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(0.0), T(0.0)));
64*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(-0.0), T(-0.0)));
65*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(0.1), T(0.1)));
66*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(-0.1), T(-0.1)));
67*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(123.38), T(123.38)));
68*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(-123.38), T(-123.38)));
69*71db0c75SAndroid Build Coastguard Worker   }
70*71db0c75SAndroid Build Coastguard Worker 
testSingleNaN(TotalOrderMagFunc func)71*71db0c75SAndroid Build Coastguard Worker   void testSingleNaN(TotalOrderMagFunc func) {
72*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, neg_aNaN, T(0.0)));
73*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, neg_aNaN, T(0.1)));
74*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, neg_aNaN, T(123.38)));
75*71db0c75SAndroid Build Coastguard Worker 
76*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(0.0), neg_aNaN));
77*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(0.1), neg_aNaN));
78*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(123.38), neg_aNaN));
79*71db0c75SAndroid Build Coastguard Worker 
80*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(0.0), aNaN));
81*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(0.1), aNaN));
82*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, T(123.38), aNaN));
83*71db0c75SAndroid Build Coastguard Worker 
84*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, aNaN, T(0.0)));
85*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, aNaN, T(0.1)));
86*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, aNaN, T(123.38)));
87*71db0c75SAndroid Build Coastguard Worker   }
88*71db0c75SAndroid Build Coastguard Worker 
testNaNSigns(TotalOrderMagFunc func)89*71db0c75SAndroid Build Coastguard Worker   void testNaNSigns(TotalOrderMagFunc func) {
90*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, neg_aNaN, aNaN));
91*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, neg_aNaN, sNaN));
92*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, neg_sNaN, aNaN));
93*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, neg_sNaN, sNaN));
94*71db0c75SAndroid Build Coastguard Worker 
95*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, aNaN, neg_aNaN));
96*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, aNaN, neg_sNaN));
97*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, sNaN, neg_aNaN));
98*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, sNaN, neg_sNaN));
99*71db0c75SAndroid Build Coastguard Worker   }
100*71db0c75SAndroid Build Coastguard Worker 
testQuietVsSignalingNaN(TotalOrderMagFunc func)101*71db0c75SAndroid Build Coastguard Worker   void testQuietVsSignalingNaN(TotalOrderMagFunc func) {
102*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, neg_aNaN, neg_sNaN));
103*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, neg_sNaN, neg_aNaN));
104*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, sNaN, aNaN));
105*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, aNaN, sNaN));
106*71db0c75SAndroid Build Coastguard Worker   }
107*71db0c75SAndroid Build Coastguard Worker 
testNaNPayloads(TotalOrderMagFunc func)108*71db0c75SAndroid Build Coastguard Worker   void testNaNPayloads(TotalOrderMagFunc func) {
109*71db0c75SAndroid Build Coastguard Worker     T qnan_0x42 = FPBits::quiet_nan(Sign::POS, 0x42).get_val();
110*71db0c75SAndroid Build Coastguard Worker     T neg_qnan_0x42 = FPBits::quiet_nan(Sign::NEG, 0x42).get_val();
111*71db0c75SAndroid Build Coastguard Worker     T snan_0x42 = FPBits::signaling_nan(Sign::POS, 0x42).get_val();
112*71db0c75SAndroid Build Coastguard Worker     T neg_snan_0x42 = FPBits::signaling_nan(Sign::NEG, 0x42).get_val();
113*71db0c75SAndroid Build Coastguard Worker 
114*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, aNaN, aNaN));
115*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, sNaN, sNaN));
116*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, aNaN, qnan_0x42));
117*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, sNaN, snan_0x42));
118*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, qnan_0x42, aNaN));
119*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, snan_0x42, sNaN));
120*71db0c75SAndroid Build Coastguard Worker 
121*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, neg_aNaN, neg_aNaN));
122*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, neg_sNaN, neg_sNaN));
123*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, neg_aNaN, neg_qnan_0x42));
124*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, neg_sNaN, neg_snan_0x42));
125*71db0c75SAndroid Build Coastguard Worker     EXPECT_FALSE(funcWrapper(func, neg_qnan_0x42, neg_aNaN));
126*71db0c75SAndroid Build Coastguard Worker     EXPECT_TRUE(funcWrapper(func, neg_snan_0x42, neg_sNaN));
127*71db0c75SAndroid Build Coastguard Worker   }
128*71db0c75SAndroid Build Coastguard Worker };
129*71db0c75SAndroid Build Coastguard Worker 
130*71db0c75SAndroid Build Coastguard Worker #define LIST_TOTALORDERMAG_TESTS(T, func)                                      \
131*71db0c75SAndroid Build Coastguard Worker   using LlvmLibcTotalOrderMagTest = TotalOrderMagTestTemplate<T>;              \
132*71db0c75SAndroid Build Coastguard Worker   TEST_F(LlvmLibcTotalOrderMagTest, XLesserThanY) { testXLesserThanY(&func); } \
133*71db0c75SAndroid Build Coastguard Worker   TEST_F(LlvmLibcTotalOrderMagTest, XGreaterThanY) {                           \
134*71db0c75SAndroid Build Coastguard Worker     testXGreaterThanY(&func);                                                  \
135*71db0c75SAndroid Build Coastguard Worker   }                                                                            \
136*71db0c75SAndroid Build Coastguard Worker   TEST_F(LlvmLibcTotalOrderMagTest, XEqualToY) { testXEqualToY(&func); }       \
137*71db0c75SAndroid Build Coastguard Worker   TEST_F(LlvmLibcTotalOrderMagTest, SingleNaN) { testSingleNaN(&func); }       \
138*71db0c75SAndroid Build Coastguard Worker   TEST_F(LlvmLibcTotalOrderMagTest, NaNSigns) { testNaNSigns(&func); }         \
139*71db0c75SAndroid Build Coastguard Worker   TEST_F(LlvmLibcTotalOrderMagTest, QuietVsSignalingNaN) {                     \
140*71db0c75SAndroid Build Coastguard Worker     testQuietVsSignalingNaN(&func);                                            \
141*71db0c75SAndroid Build Coastguard Worker   }                                                                            \
142*71db0c75SAndroid Build Coastguard Worker   TEST_F(LlvmLibcTotalOrderMagTest, NaNPayloads) { testNaNPayloads(&func); }
143*71db0c75SAndroid Build Coastguard Worker 
144*71db0c75SAndroid Build Coastguard Worker #endif // LIBC_TEST_SRC_MATH_SMOKE_TOTALORDERMAGTEST_H
145