1 | //===-- Unittests for atan2f ----------------------------------------------===// |
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/atan2f.h" |
13 | #include "test/UnitTest/FPMatcher.h" |
14 | #include "test/UnitTest/Test.h" |
15 | |
16 | using LlvmLibcAtan2fTest = LIBC_NAMESPACE::testing::FPTest<float>; |
17 | |
18 | TEST_F(LlvmLibcAtan2fTest, SpecialNumbers) { |
19 | libc_errno = 0; |
20 | |
21 | EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::atan2f(sNaN, sNaN), |
22 | FE_INVALID); |
23 | EXPECT_MATH_ERRNO(0); |
24 | |
25 | EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::atan2f(sNaN, 1.0f), |
26 | FE_INVALID); |
27 | EXPECT_MATH_ERRNO(0); |
28 | |
29 | EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::atan2f(1.0f, sNaN), |
30 | FE_INVALID); |
31 | EXPECT_MATH_ERRNO(0); |
32 | |
33 | // TODO: Strengthen errno,exception checks and remove these assert macros |
34 | // after new matchers/test fixtures are added see: |
35 | // https://github.com/llvm/llvm-project/issues/90653. |
36 | LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT); |
37 | EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::atan2f(aNaN, zero)); |
38 | // TODO: Uncomment these checks later, RoundingMode affects running |
39 | // tests in this way https://github.com/llvm/llvm-project/issues/90653. |
40 | // EXPECT_FP_EXCEPTION(0); |
41 | EXPECT_MATH_ERRNO(0); |
42 | |
43 | LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT); |
44 | EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::atan2f(1.0f, aNaN)); |
45 | // See above TODO |
46 | // EXPECT_FP_EXCEPTION(0); |
47 | EXPECT_MATH_ERRNO(0); |
48 | |
49 | LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT); |
50 | EXPECT_FP_EQ_ALL_ROUNDING(0.0f, LIBC_NAMESPACE::atan2f(zero, zero)); |
51 | // See above TODO |
52 | // EXPECT_FP_EXCEPTION(0); |
53 | EXPECT_MATH_ERRNO(0); |
54 | |
55 | LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT); |
56 | EXPECT_FP_EQ_ALL_ROUNDING(-0.0f, LIBC_NAMESPACE::atan2f(-0.0f, zero)); |
57 | // See above TODO |
58 | // EXPECT_FP_EXCEPTION(0); |
59 | EXPECT_MATH_ERRNO(0); |
60 | |
61 | LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT); |
62 | EXPECT_FP_EQ_ALL_ROUNDING(0.0f, LIBC_NAMESPACE::atan2f(1.0f, inf)); |
63 | // See above TODO |
64 | // EXPECT_FP_EXCEPTION(0); |
65 | EXPECT_MATH_ERRNO(0); |
66 | |
67 | LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT); |
68 | EXPECT_FP_EQ_ALL_ROUNDING(-0.0f, LIBC_NAMESPACE::atan2f(-1.0f, inf)); |
69 | // See above TODO |
70 | // EXPECT_FP_EXCEPTION(0); |
71 | EXPECT_MATH_ERRNO(0); |
72 | } |
73 | |
74 | #ifdef LIBC_TEST_FTZ_DAZ |
75 | |
76 | using namespace LIBC_NAMESPACE::testing; |
77 | |
78 | TEST_F(LlvmLibcAtan2fTest, FTZMode) { |
79 | ModifyMXCSR mxcsr(FTZ); |
80 | |
81 | EXPECT_FP_EQ(0x1.921fb6p-1f, |
82 | LIBC_NAMESPACE::atan2f(min_denormal, min_denormal)); |
83 | EXPECT_FP_EQ(0x1.000002p-23f, |
84 | LIBC_NAMESPACE::atan2f(min_denormal, max_denormal)); |
85 | EXPECT_FP_EQ(0x1.921fb4p0f, |
86 | LIBC_NAMESPACE::atan2f(max_denormal, min_denormal)); |
87 | EXPECT_FP_EQ(0x1.921fb6p-1f, |
88 | LIBC_NAMESPACE::atan2f(max_denormal, max_denormal)); |
89 | } |
90 | |
91 | TEST_F(LlvmLibcAtan2fTest, DAZMode) { |
92 | ModifyMXCSR mxcsr(DAZ); |
93 | |
94 | EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::atan2f(min_denormal, min_denormal)); |
95 | EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::atan2f(min_denormal, max_denormal)); |
96 | EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::atan2f(max_denormal, min_denormal)); |
97 | EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::atan2f(max_denormal, max_denormal)); |
98 | } |
99 | |
100 | TEST_F(LlvmLibcAtan2fTest, FTZDAZMode) { |
101 | ModifyMXCSR mxcsr(FTZ | DAZ); |
102 | |
103 | EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::atan2f(min_denormal, min_denormal)); |
104 | EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::atan2f(min_denormal, max_denormal)); |
105 | EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::atan2f(max_denormal, min_denormal)); |
106 | EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::atan2f(max_denormal, max_denormal)); |
107 | } |
108 | |
109 | #endif |
110 | |