1 | //===-- Unittests for atanhf ----------------------------------------------===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #include "hdr/math_macros.h" |
10 | #include "src/__support/FPUtil/FPBits.h" |
11 | #include "src/__support/libc_errno.h" |
12 | #include "src/math/atanhf.h" |
13 | #include "test/UnitTest/FPMatcher.h" |
14 | #include "test/UnitTest/Test.h" |
15 | |
16 | #include <stdint.h> |
17 | |
18 | using LIBC_NAMESPACE::Sign; |
19 | |
20 | using LlvmLibcAtanhfTest = LIBC_NAMESPACE::testing::FPTest<float>; |
21 | |
22 | TEST_F(LlvmLibcAtanhfTest, SpecialNumbers) { |
23 | libc_errno = 0; |
24 | EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::atanhf(sNaN), FE_INVALID); |
25 | EXPECT_MATH_ERRNO(0); |
26 | // TODO: Strengthen errno,exception checks and remove these assert macros |
27 | // after new matchers/test fixtures are added, see: |
28 | // https://github.com/llvm/llvm-project/issues/90653 |
29 | LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT); |
30 | EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::atanhf(aNaN)); |
31 | // TODO: Uncomment these checks later, RoundingMode affects running |
32 | // tests in this way https://github.com/llvm/llvm-project/issues/90653. |
33 | // EXPECT_FP_EXCEPTION(0); |
34 | EXPECT_MATH_ERRNO(0); |
35 | |
36 | LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT); |
37 | EXPECT_FP_EQ_ALL_ROUNDING(0.0f, LIBC_NAMESPACE::atanhf(0.0f)); |
38 | // See above TODO |
39 | // EXPECT_FP_EXCEPTION(0); |
40 | EXPECT_MATH_ERRNO(0); |
41 | |
42 | LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT); |
43 | EXPECT_FP_EQ_ALL_ROUNDING(-0.0f, LIBC_NAMESPACE::atanhf(-0.0f)); |
44 | // See above TODO |
45 | // EXPECT_FP_EXCEPTION(0); |
46 | EXPECT_MATH_ERRNO(0); |
47 | |
48 | EXPECT_FP_EQ_WITH_EXCEPTION(inf, LIBC_NAMESPACE::atanhf(1.0f), FE_DIVBYZERO); |
49 | EXPECT_MATH_ERRNO(ERANGE); |
50 | |
51 | EXPECT_FP_EQ_WITH_EXCEPTION(neg_inf, LIBC_NAMESPACE::atanhf(-1.0f), |
52 | FE_DIVBYZERO); |
53 | EXPECT_MATH_ERRNO(ERANGE); |
54 | |
55 | auto bt = FPBits(1.0f); |
56 | bt.set_uintval(bt.uintval() + 1); |
57 | |
58 | EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::atanhf(bt.get_val()), |
59 | FE_INVALID); |
60 | EXPECT_MATH_ERRNO(EDOM); |
61 | |
62 | bt.set_sign(Sign::NEG); |
63 | EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::atanhf(bt.get_val()), |
64 | FE_INVALID); |
65 | EXPECT_MATH_ERRNO(EDOM); |
66 | |
67 | EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::atanhf(2.0f), FE_INVALID); |
68 | EXPECT_MATH_ERRNO(EDOM); |
69 | |
70 | EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::atanhf(-2.0f), FE_INVALID); |
71 | EXPECT_MATH_ERRNO(EDOM); |
72 | |
73 | EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::atanhf(inf), FE_INVALID); |
74 | EXPECT_MATH_ERRNO(EDOM); |
75 | |
76 | bt.set_sign(Sign::NEG); |
77 | EXPECT_FP_IS_NAN_WITH_EXCEPTION(LIBC_NAMESPACE::atanhf(neg_inf), FE_INVALID); |
78 | EXPECT_MATH_ERRNO(EDOM); |
79 | } |
80 | |
81 | #ifdef LIBC_TEST_FTZ_DAZ |
82 | |
83 | using namespace LIBC_NAMESPACE::testing; |
84 | |
85 | TEST_F(LlvmLibcAtanhfTest, FTZMode) { |
86 | ModifyMXCSR mxcsr(FTZ); |
87 | |
88 | EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::atanhf(min_denormal)); |
89 | } |
90 | |
91 | TEST_F(LlvmLibcAtanhfTest, DAZMode) { |
92 | ModifyMXCSR mxcsr(DAZ); |
93 | |
94 | EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::atanhf(min_denormal)); |
95 | } |
96 | |
97 | TEST_F(LlvmLibcAtanhfTest, FTZDAZMode) { |
98 | ModifyMXCSR mxcsr(FTZ | DAZ); |
99 | |
100 | EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::atanhf(min_denormal)); |
101 | } |
102 | |
103 | #endif |
104 | |