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 
156168b422STue Ly #include <thread>
166168b422STue Ly 
1738cadd90STue Ly using FPBits = __llvm_libc::fputil::FPBits<float>;
1838cadd90STue Ly 
1938cadd90STue Ly namespace mpfr = __llvm_libc::testing::mpfr;
2038cadd90STue Ly 
2138cadd90STue Ly struct LlvmLibcExpfExhaustiveTest : public LlvmLibcExhaustiveTest<uint32_t> {
checkLlvmLibcExpfExhaustiveTest224c9bfec6STue Ly   bool check(uint32_t start, uint32_t stop,
2338cadd90STue Ly              mpfr::RoundingMode rounding) override {
2438cadd90STue Ly     mpfr::ForceRoundingMode r(rounding);
2538cadd90STue Ly     uint32_t bits = start;
264c9bfec6STue Ly     bool result = true;
2738cadd90STue Ly     do {
2838cadd90STue Ly       FPBits xbits(bits);
2938cadd90STue Ly       float x = float(xbits);
304c9bfec6STue Ly       result &= EXPECT_MPFR_MATCH(mpfr::Operation::Exp, x, __llvm_libc::expf(x),
314c9bfec6STue Ly                                   0.5, rounding);
3238cadd90STue Ly     } while (bits++ < stop);
334c9bfec6STue Ly     return result;
3438cadd90STue Ly   }
3538cadd90STue Ly };
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 
TEST_F(LlvmLibcExpfExhaustiveTest,PostiveRangeRoundNearestTieToEven)4138cadd90STue Ly TEST_F(LlvmLibcExpfExhaustiveTest, PostiveRangeRoundNearestTieToEven) {
42*fdf1fda5SKirill Okhotnikov   test_full_range(POS_START, POS_STOP, mpfr::RoundingMode::Nearest);
4338cadd90STue Ly }
4438cadd90STue Ly 
TEST_F(LlvmLibcExpfExhaustiveTest,PostiveRangeRoundUp)4538cadd90STue Ly TEST_F(LlvmLibcExpfExhaustiveTest, PostiveRangeRoundUp) {
46*fdf1fda5SKirill Okhotnikov   test_full_range(POS_START, POS_STOP, mpfr::RoundingMode::Upward);
4738cadd90STue Ly }
4838cadd90STue Ly 
TEST_F(LlvmLibcExpfExhaustiveTest,PostiveRangeRoundDown)4938cadd90STue Ly TEST_F(LlvmLibcExpfExhaustiveTest, PostiveRangeRoundDown) {
50*fdf1fda5SKirill Okhotnikov   test_full_range(POS_START, POS_STOP, mpfr::RoundingMode::Downward);
5138cadd90STue Ly }
5238cadd90STue Ly 
TEST_F(LlvmLibcExpfExhaustiveTest,PostiveRangeRoundTowardZero)5338cadd90STue Ly TEST_F(LlvmLibcExpfExhaustiveTest, PostiveRangeRoundTowardZero) {
54*fdf1fda5SKirill Okhotnikov   test_full_range(POS_START, POS_STOP, mpfr::RoundingMode::TowardZero);
5538cadd90STue Ly }
5638cadd90STue Ly 
5738cadd90STue Ly // Range: [-104, 0];
5838cadd90STue Ly static constexpr uint32_t NEG_START = 0x8000'0000U;
5938cadd90STue Ly static constexpr uint32_t NEG_STOP = 0xc2d0'0000U;
6038cadd90STue Ly 
TEST_F(LlvmLibcExpfExhaustiveTest,NegativeRangeRoundNearestTieToEven)6138cadd90STue Ly TEST_F(LlvmLibcExpfExhaustiveTest, NegativeRangeRoundNearestTieToEven) {
62*fdf1fda5SKirill Okhotnikov   test_full_range(NEG_START, NEG_STOP, mpfr::RoundingMode::Nearest);
6338cadd90STue Ly }
6438cadd90STue Ly 
TEST_F(LlvmLibcExpfExhaustiveTest,NegativeRangeRoundUp)6538cadd90STue Ly TEST_F(LlvmLibcExpfExhaustiveTest, NegativeRangeRoundUp) {
66*fdf1fda5SKirill Okhotnikov   test_full_range(NEG_START, NEG_STOP, mpfr::RoundingMode::Upward);
6738cadd90STue Ly }
6838cadd90STue Ly 
TEST_F(LlvmLibcExpfExhaustiveTest,NegativeRangeRoundDown)6938cadd90STue Ly TEST_F(LlvmLibcExpfExhaustiveTest, NegativeRangeRoundDown) {
70*fdf1fda5SKirill Okhotnikov   test_full_range(NEG_START, NEG_STOP, mpfr::RoundingMode::Downward);
7138cadd90STue Ly }
7238cadd90STue Ly 
TEST_F(LlvmLibcExpfExhaustiveTest,NegativeRangeRoundTowardZero)7338cadd90STue Ly TEST_F(LlvmLibcExpfExhaustiveTest, NegativeRangeRoundTowardZero) {
74*fdf1fda5SKirill Okhotnikov   test_full_range(NEG_START, NEG_STOP, mpfr::RoundingMode::TowardZero);
7538cadd90STue Ly }
76