xref: /llvm-project/libc/test/src/math/log2f16_test.cpp (revision 6d347fdfbd018b6555a754219fda461e166f2a64)
1*6d347fdfSOverMighty //===-- Exhaustive test for log2f16 ---------------------------------------===//
2*6d347fdfSOverMighty //
3*6d347fdfSOverMighty // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*6d347fdfSOverMighty // See https://llvm.org/LICENSE.txt for license information.
5*6d347fdfSOverMighty // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*6d347fdfSOverMighty //
7*6d347fdfSOverMighty //===----------------------------------------------------------------------===//
8*6d347fdfSOverMighty 
9*6d347fdfSOverMighty #include "src/math/log2f16.h"
10*6d347fdfSOverMighty #include "test/UnitTest/FPMatcher.h"
11*6d347fdfSOverMighty #include "test/UnitTest/Test.h"
12*6d347fdfSOverMighty #include "utils/MPFRWrapper/MPFRUtils.h"
13*6d347fdfSOverMighty 
14*6d347fdfSOverMighty using LlvmLibcLog2f16Test = LIBC_NAMESPACE::testing::FPTest<float16>;
15*6d347fdfSOverMighty 
16*6d347fdfSOverMighty namespace mpfr = LIBC_NAMESPACE::testing::mpfr;
17*6d347fdfSOverMighty 
18*6d347fdfSOverMighty // Range: [0, Inf];
19*6d347fdfSOverMighty static constexpr uint16_t POS_START = 0x0000U;
20*6d347fdfSOverMighty static constexpr uint16_t POS_STOP = 0x7c00U;
21*6d347fdfSOverMighty 
22*6d347fdfSOverMighty // Range: [-Inf, 0];
23*6d347fdfSOverMighty static constexpr uint16_t NEG_START = 0x8000U;
24*6d347fdfSOverMighty static constexpr uint16_t NEG_STOP = 0xfc00U;
25*6d347fdfSOverMighty 
26*6d347fdfSOverMighty TEST_F(LlvmLibcLog2f16Test, PositiveRange) {
27*6d347fdfSOverMighty   for (uint16_t v = POS_START; v <= POS_STOP; ++v) {
28*6d347fdfSOverMighty     float16 x = FPBits(v).get_val();
29*6d347fdfSOverMighty     EXPECT_MPFR_MATCH_ALL_ROUNDING(mpfr::Operation::Log2, x,
30*6d347fdfSOverMighty                                    LIBC_NAMESPACE::log2f16(x), 0.5);
31*6d347fdfSOverMighty   }
32*6d347fdfSOverMighty }
33*6d347fdfSOverMighty 
34*6d347fdfSOverMighty TEST_F(LlvmLibcLog2f16Test, NegativeRange) {
35*6d347fdfSOverMighty   for (uint16_t v = NEG_START; v <= NEG_STOP; ++v) {
36*6d347fdfSOverMighty     float16 x = FPBits(v).get_val();
37*6d347fdfSOverMighty     EXPECT_MPFR_MATCH_ALL_ROUNDING(mpfr::Operation::Log2, x,
38*6d347fdfSOverMighty                                    LIBC_NAMESPACE::log2f16(x), 0.5);
39*6d347fdfSOverMighty   }
40*6d347fdfSOverMighty }
41