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