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