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