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/errno/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_NAMESPACE::libc_errno = 0; 20 21 // TODO: Strengthen errno,exception checks and remove these assert macros 22 // after new matchers/test fixtures are added see: 23 // https://github.com/llvm/llvm-project/issues/90653. 24 LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT); 25 EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::atan2f(aNaN, zero)); 26 // TODO: Uncomment these checks later, RoundingMode affects running 27 // tests in this way https://github.com/llvm/llvm-project/issues/90653. 28 // EXPECT_FP_EXCEPTION(0); 29 EXPECT_MATH_ERRNO(0); 30 31 LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT); 32 EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::atan2f(1.0f, aNaN)); 33 // See above TODO 34 // EXPECT_FP_EXCEPTION(0); 35 EXPECT_MATH_ERRNO(0); 36 37 LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT); 38 EXPECT_FP_EQ_ALL_ROUNDING(0.0f, LIBC_NAMESPACE::atan2f(zero, zero)); 39 // See above TODO 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(-0.0f, LIBC_NAMESPACE::atan2f(-0.0f, zero)); 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(1.0f, inf)); 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(-1.0f, inf)); 57 // See above TODO 58 // EXPECT_FP_EXCEPTION(0); 59 EXPECT_MATH_ERRNO(0); 60 } 61 62 #ifdef LIBC_TEST_FTZ_DAZ 63 64 using namespace LIBC_NAMESPACE::testing; 65 66 TEST_F(LlvmLibcAtan2fTest, FTZMode) { 67 ModifyMXCSR mxcsr(FTZ); 68 69 EXPECT_FP_EQ(0x1.921fb6p-1f, 70 LIBC_NAMESPACE::atan2f(min_denormal, min_denormal)); 71 EXPECT_FP_EQ(0x1.000002p-23f, 72 LIBC_NAMESPACE::atan2f(min_denormal, max_denormal)); 73 EXPECT_FP_EQ(0x1.921fb4p0f, 74 LIBC_NAMESPACE::atan2f(max_denormal, min_denormal)); 75 EXPECT_FP_EQ(0x1.921fb6p-1f, 76 LIBC_NAMESPACE::atan2f(max_denormal, max_denormal)); 77 } 78 79 TEST_F(LlvmLibcAtan2fTest, DAZMode) { 80 ModifyMXCSR mxcsr(DAZ); 81 82 EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::atan2f(min_denormal, min_denormal)); 83 EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::atan2f(min_denormal, max_denormal)); 84 EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::atan2f(max_denormal, min_denormal)); 85 EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::atan2f(max_denormal, max_denormal)); 86 } 87 88 TEST_F(LlvmLibcAtan2fTest, FTZDAZMode) { 89 ModifyMXCSR mxcsr(FTZ | DAZ); 90 91 EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::atan2f(min_denormal, min_denormal)); 92 EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::atan2f(min_denormal, max_denormal)); 93 EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::atan2f(max_denormal, min_denormal)); 94 EXPECT_FP_EQ(0.0f, LIBC_NAMESPACE::atan2f(max_denormal, max_denormal)); 95 } 96 97 #endif 98