1d08a801bSTue Ly //===-- Exhaustive test for logf ------------------------------------------===//
2d08a801bSTue Ly //
3d08a801bSTue Ly // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4d08a801bSTue Ly // See https://llvm.org/LICENSE.txt for license information.
5d08a801bSTue Ly // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d08a801bSTue Ly //
7d08a801bSTue Ly //===----------------------------------------------------------------------===//
8d08a801bSTue Ly
98cd81274STue Ly #include "exhaustive_test.h"
10d08a801bSTue Ly #include "src/__support/FPUtil/FPBits.h"
11d08a801bSTue Ly #include "src/math/logf.h"
12d08a801bSTue Ly #include "utils/MPFRWrapper/MPFRUtils.h"
13d08a801bSTue Ly #include "utils/UnitTest/FPMatcher.h"
14d08a801bSTue Ly
15d08a801bSTue Ly using FPBits = __llvm_libc::fputil::FPBits<float>;
16d08a801bSTue Ly
17d08a801bSTue Ly namespace mpfr = __llvm_libc::testing::mpfr;
18d08a801bSTue Ly
198cd81274STue Ly struct LlvmLibcLogfExhaustiveTest : public LlvmLibcExhaustiveTest<uint32_t> {
checkLlvmLibcLogfExhaustiveTest204c9bfec6STue Ly bool check(uint32_t start, uint32_t stop,
218cd81274STue Ly mpfr::RoundingMode rounding) override {
228cd81274STue Ly mpfr::ForceRoundingMode r(rounding);
238cd81274STue Ly uint32_t bits = start;
244c9bfec6STue Ly bool result = true;
25d08a801bSTue Ly do {
26d08a801bSTue Ly FPBits xbits(bits);
27d08a801bSTue Ly float x = float(xbits);
284c9bfec6STue Ly result &= EXPECT_MPFR_MATCH(mpfr::Operation::Log, x, __llvm_libc::logf(x),
294c9bfec6STue Ly 0.5, rounding);
308cd81274STue Ly } while (bits++ < stop);
314c9bfec6STue Ly return result;
328cd81274STue Ly }
338cd81274STue Ly };
348cd81274STue Ly
TEST_F(LlvmLibcLogfExhaustiveTest,RoundNearestTieToEven)358cd81274STue Ly TEST_F(LlvmLibcLogfExhaustiveTest, RoundNearestTieToEven) {
36*fdf1fda5SKirill Okhotnikov test_full_range(/*start=*/0U, /*stop=*/0x7f80'0000U,
378cd81274STue Ly mpfr::RoundingMode::Nearest);
388cd81274STue Ly }
398cd81274STue Ly
TEST_F(LlvmLibcLogfExhaustiveTest,RoundUp)408cd81274STue Ly TEST_F(LlvmLibcLogfExhaustiveTest, RoundUp) {
41*fdf1fda5SKirill Okhotnikov test_full_range(/*start=*/0U, /*stop=*/0x7f80'0000U,
428cd81274STue Ly mpfr::RoundingMode::Upward);
438cd81274STue Ly }
448cd81274STue Ly
TEST_F(LlvmLibcLogfExhaustiveTest,RoundDown)458cd81274STue Ly TEST_F(LlvmLibcLogfExhaustiveTest, RoundDown) {
46*fdf1fda5SKirill Okhotnikov test_full_range(/*start=*/0U, /*stop=*/0x7f80'0000U,
478cd81274STue Ly mpfr::RoundingMode::Downward);
488cd81274STue Ly }
498cd81274STue Ly
TEST_F(LlvmLibcLogfExhaustiveTest,RoundTowardZero)508cd81274STue Ly TEST_F(LlvmLibcLogfExhaustiveTest, RoundTowardZero) {
51*fdf1fda5SKirill Okhotnikov test_full_range(/*start=*/0U, /*stop=*/0x7f80'0000U,
528cd81274STue Ly mpfr::RoundingMode::TowardZero);
53d08a801bSTue Ly }
54