1*71db0c75SAndroid Build Coastguard Worker //===-- Utility class to test different flavors of nearbyint ----*- 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_NEARBYINTTEST_H 10*71db0c75SAndroid Build Coastguard Worker #define LLVM_LIBC_TEST_SRC_MATH_NEARBYINTTEST_H 11*71db0c75SAndroid Build Coastguard Worker 12*71db0c75SAndroid Build Coastguard Worker #include "hdr/fenv_macros.h" 13*71db0c75SAndroid Build Coastguard Worker #include "src/__support/FPUtil/FEnvImpl.h" 14*71db0c75SAndroid Build Coastguard Worker #include "src/__support/FPUtil/FPBits.h" 15*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/FPMatcher.h" 16*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/Test.h" 17*71db0c75SAndroid Build Coastguard Worker 18*71db0c75SAndroid Build Coastguard Worker using LIBC_NAMESPACE::Sign; 19*71db0c75SAndroid Build Coastguard Worker 20*71db0c75SAndroid Build Coastguard Worker static constexpr int ROUNDING_MODES[4] = {FE_UPWARD, FE_DOWNWARD, FE_TOWARDZERO, 21*71db0c75SAndroid Build Coastguard Worker FE_TONEAREST}; 22*71db0c75SAndroid Build Coastguard Worker 23*71db0c75SAndroid Build Coastguard Worker template <typename T> 24*71db0c75SAndroid Build Coastguard Worker class NearbyIntTestTemplate : public LIBC_NAMESPACE::testing::Test { 25*71db0c75SAndroid Build Coastguard Worker 26*71db0c75SAndroid Build Coastguard Worker DECLARE_SPECIAL_CONSTANTS(T) 27*71db0c75SAndroid Build Coastguard Worker 28*71db0c75SAndroid Build Coastguard Worker public: 29*71db0c75SAndroid Build Coastguard Worker typedef T (*NearbyIntFunc)(T); 30*71db0c75SAndroid Build Coastguard Worker testNaN(NearbyIntFunc func)31*71db0c75SAndroid Build Coastguard Worker void testNaN(NearbyIntFunc func) { 32*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_ALL_ROUNDING(func(aNaN), aNaN); 33*71db0c75SAndroid Build Coastguard Worker } 34*71db0c75SAndroid Build Coastguard Worker testInfinities(NearbyIntFunc func)35*71db0c75SAndroid Build Coastguard Worker void testInfinities(NearbyIntFunc func) { 36*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_ALL_ROUNDING(func(inf), inf); 37*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_ALL_ROUNDING(func(neg_inf), neg_inf); 38*71db0c75SAndroid Build Coastguard Worker } 39*71db0c75SAndroid Build Coastguard Worker testZeroes(NearbyIntFunc func)40*71db0c75SAndroid Build Coastguard Worker void testZeroes(NearbyIntFunc func) { 41*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_ALL_ROUNDING(func(zero), zero); 42*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_ALL_ROUNDING(func(neg_zero), neg_zero); 43*71db0c75SAndroid Build Coastguard Worker } 44*71db0c75SAndroid Build Coastguard Worker testIntegers(NearbyIntFunc func)45*71db0c75SAndroid Build Coastguard Worker void testIntegers(NearbyIntFunc func) { 46*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_ALL_ROUNDING(func(T(1.0)), T(1.0)); 47*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_ALL_ROUNDING(func(T(-1.0)), T(-1.0)); 48*71db0c75SAndroid Build Coastguard Worker 49*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_ALL_ROUNDING(func(T(1234.0)), T(1234.0)); 50*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_ALL_ROUNDING(func(T(-1234.0)), T(-1234.0)); 51*71db0c75SAndroid Build Coastguard Worker 52*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_ALL_ROUNDING(func(T(10.0)), T(10.0)); 53*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_ALL_ROUNDING(func(T(-10.0)), T(-10.0)); 54*71db0c75SAndroid Build Coastguard Worker 55*71db0c75SAndroid Build Coastguard Worker FPBits ints_start(T(0)); 56*71db0c75SAndroid Build Coastguard Worker ints_start.set_biased_exponent(FPBits::SIG_LEN + FPBits::EXP_BIAS); 57*71db0c75SAndroid Build Coastguard Worker T expected = ints_start.get_val(); 58*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_ALL_ROUNDING(func(expected), expected); 59*71db0c75SAndroid Build Coastguard Worker } 60*71db0c75SAndroid Build Coastguard Worker testSubnormalToNearest(NearbyIntFunc func)61*71db0c75SAndroid Build Coastguard Worker void testSubnormalToNearest(NearbyIntFunc func) { 62*71db0c75SAndroid Build Coastguard Worker ASSERT_FP_EQ(func(min_denormal), zero); 63*71db0c75SAndroid Build Coastguard Worker ASSERT_FP_EQ(func(-min_denormal), neg_zero); 64*71db0c75SAndroid Build Coastguard Worker } 65*71db0c75SAndroid Build Coastguard Worker testSubnormalTowardZero(NearbyIntFunc func)66*71db0c75SAndroid Build Coastguard Worker void testSubnormalTowardZero(NearbyIntFunc func) { 67*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_ROUNDING_TOWARD_ZERO(func(min_denormal), zero); 68*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_ROUNDING_TOWARD_ZERO(func(-min_denormal), neg_zero); 69*71db0c75SAndroid Build Coastguard Worker } 70*71db0c75SAndroid Build Coastguard Worker testSubnormalToPosInf(NearbyIntFunc func)71*71db0c75SAndroid Build Coastguard Worker void testSubnormalToPosInf(NearbyIntFunc func) { 72*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_ROUNDING_UPWARD(func(min_denormal), FPBits::one().get_val()); 73*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_ROUNDING_UPWARD(func(-min_denormal), neg_zero); 74*71db0c75SAndroid Build Coastguard Worker } 75*71db0c75SAndroid Build Coastguard Worker testSubnormalToNegInf(NearbyIntFunc func)76*71db0c75SAndroid Build Coastguard Worker void testSubnormalToNegInf(NearbyIntFunc func) { 77*71db0c75SAndroid Build Coastguard Worker T negative_one = FPBits::one(Sign::NEG).get_val(); 78*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_ROUNDING_DOWNWARD(func(min_denormal), zero); 79*71db0c75SAndroid Build Coastguard Worker EXPECT_FP_EQ_ROUNDING_DOWNWARD(func(-min_denormal), negative_one); 80*71db0c75SAndroid Build Coastguard Worker } 81*71db0c75SAndroid Build Coastguard Worker }; 82*71db0c75SAndroid Build Coastguard Worker 83*71db0c75SAndroid Build Coastguard Worker #define LIST_NEARBYINT_TESTS(T, func) \ 84*71db0c75SAndroid Build Coastguard Worker using LlvmLibcNearbyIntTest = NearbyIntTestTemplate<T>; \ 85*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcNearbyIntTest, TestNaN) { testNaN(&func); } \ 86*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcNearbyIntTest, TestInfinities) { testInfinities(&func); } \ 87*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcNearbyIntTest, TestZeroes) { testZeroes(&func); } \ 88*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcNearbyIntTest, TestIntegers) { testIntegers(&func); } \ 89*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcNearbyIntTest, TestSubnormalToNearest) { \ 90*71db0c75SAndroid Build Coastguard Worker testSubnormalToNearest(&func); \ 91*71db0c75SAndroid Build Coastguard Worker } \ 92*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcNearbyIntTest, TestSubnormalTowardZero) { \ 93*71db0c75SAndroid Build Coastguard Worker testSubnormalTowardZero(&func); \ 94*71db0c75SAndroid Build Coastguard Worker } \ 95*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcNearbyIntTest, TestSubnormalToPosInf) { \ 96*71db0c75SAndroid Build Coastguard Worker testSubnormalToPosInf(&func); \ 97*71db0c75SAndroid Build Coastguard Worker } \ 98*71db0c75SAndroid Build Coastguard Worker TEST_F(LlvmLibcNearbyIntTest, TestSubnormalToNegInf) { \ 99*71db0c75SAndroid Build Coastguard Worker testSubnormalToNegInf(&func); \ 100*71db0c75SAndroid Build Coastguard Worker } 101*71db0c75SAndroid Build Coastguard Worker 102*71db0c75SAndroid Build Coastguard Worker #endif // LLVM_LIBC_TEST_SRC_MATH_NEARBYINTTEST_H 103