138cadd90STue Ly //===-- Exhaustive test for expf ------------------------------------------===// 238cadd90STue Ly // 338cadd90STue Ly // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 438cadd90STue Ly // See https://llvm.org/LICENSE.txt for license information. 538cadd90STue Ly // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 638cadd90STue Ly // 738cadd90STue Ly //===----------------------------------------------------------------------===// 838cadd90STue Ly 938cadd90STue Ly #include "exhaustive_test.h" 1038cadd90STue Ly #include "src/__support/FPUtil/FPBits.h" 1138cadd90STue Ly #include "src/math/expf.h" 1238cadd90STue Ly #include "utils/MPFRWrapper/MPFRUtils.h" 1338cadd90STue Ly #include "utils/UnitTest/FPMatcher.h" 1438cadd90STue Ly 1538cadd90STue Ly using FPBits = __llvm_libc::fputil::FPBits<float>; 1638cadd90STue Ly 1738cadd90STue Ly namespace mpfr = __llvm_libc::testing::mpfr; 1838cadd90STue Ly 1938cadd90STue Ly struct LlvmLibcExpfExhaustiveTest : public LlvmLibcExhaustiveTest<uint32_t> { 20*4c9bfec6STue Ly bool check(uint32_t start, uint32_t stop, 2138cadd90STue Ly mpfr::RoundingMode rounding) override { 2238cadd90STue Ly mpfr::ForceRoundingMode r(rounding); 2338cadd90STue Ly uint32_t bits = start; 24*4c9bfec6STue Ly bool result = true; 2538cadd90STue Ly do { 2638cadd90STue Ly FPBits xbits(bits); 2738cadd90STue Ly float x = float(xbits); 28*4c9bfec6STue Ly result &= EXPECT_MPFR_MATCH(mpfr::Operation::Exp, x, __llvm_libc::expf(x), 29*4c9bfec6STue Ly 0.5, rounding); 3038cadd90STue Ly } while (bits++ < stop); 31*4c9bfec6STue Ly return result; 3238cadd90STue Ly } 3338cadd90STue Ly }; 3438cadd90STue Ly 3538cadd90STue Ly static constexpr int NUM_THREADS = 16; 3638cadd90STue Ly 3738cadd90STue Ly // Range: [0, 89]; 3838cadd90STue Ly static constexpr uint32_t POS_START = 0x0000'0000U; 3938cadd90STue Ly static constexpr uint32_t POS_STOP = 0x42b2'0000U; 4038cadd90STue Ly 4138cadd90STue Ly TEST_F(LlvmLibcExpfExhaustiveTest, PostiveRangeRoundNearestTieToEven) { 4238cadd90STue Ly test_full_range(POS_START, POS_STOP, NUM_THREADS, 4338cadd90STue Ly mpfr::RoundingMode::Nearest); 4438cadd90STue Ly } 4538cadd90STue Ly 4638cadd90STue Ly TEST_F(LlvmLibcExpfExhaustiveTest, PostiveRangeRoundUp) { 4738cadd90STue Ly test_full_range(POS_START, POS_STOP, NUM_THREADS, mpfr::RoundingMode::Upward); 4838cadd90STue Ly } 4938cadd90STue Ly 5038cadd90STue Ly TEST_F(LlvmLibcExpfExhaustiveTest, PostiveRangeRoundDown) { 5138cadd90STue Ly test_full_range(POS_START, POS_STOP, NUM_THREADS, 5238cadd90STue Ly mpfr::RoundingMode::Downward); 5338cadd90STue Ly } 5438cadd90STue Ly 5538cadd90STue Ly TEST_F(LlvmLibcExpfExhaustiveTest, PostiveRangeRoundTowardZero) { 5638cadd90STue Ly test_full_range(POS_START, POS_STOP, NUM_THREADS, 5738cadd90STue Ly mpfr::RoundingMode::TowardZero); 5838cadd90STue Ly } 5938cadd90STue Ly 6038cadd90STue Ly // Range: [-104, 0]; 6138cadd90STue Ly static constexpr uint32_t NEG_START = 0x8000'0000U; 6238cadd90STue Ly static constexpr uint32_t NEG_STOP = 0xc2d0'0000U; 6338cadd90STue Ly 6438cadd90STue Ly TEST_F(LlvmLibcExpfExhaustiveTest, NegativeRangeRoundNearestTieToEven) { 6538cadd90STue Ly test_full_range(NEG_START, NEG_STOP, NUM_THREADS, 6638cadd90STue Ly mpfr::RoundingMode::Nearest); 6738cadd90STue Ly } 6838cadd90STue Ly 6938cadd90STue Ly TEST_F(LlvmLibcExpfExhaustiveTest, NegativeRangeRoundUp) { 7038cadd90STue Ly test_full_range(NEG_START, NEG_STOP, NUM_THREADS, mpfr::RoundingMode::Upward); 7138cadd90STue Ly } 7238cadd90STue Ly 7338cadd90STue Ly TEST_F(LlvmLibcExpfExhaustiveTest, NegativeRangeRoundDown) { 7438cadd90STue Ly test_full_range(NEG_START, NEG_STOP, NUM_THREADS, 7538cadd90STue Ly mpfr::RoundingMode::Downward); 7638cadd90STue Ly } 7738cadd90STue Ly 7838cadd90STue Ly TEST_F(LlvmLibcExpfExhaustiveTest, NegativeRangeRoundTowardZero) { 7938cadd90STue Ly test_full_range(NEG_START, NEG_STOP, NUM_THREADS, 8038cadd90STue Ly mpfr::RoundingMode::TowardZero); 8138cadd90STue Ly } 82