184c899b2STue Ly //===-- Unittests for expf ------------------------------------------------===// 284c899b2STue Ly // 384c899b2STue Ly // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 484c899b2STue Ly // See https://llvm.org/LICENSE.txt for license information. 584c899b2STue Ly // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 684c899b2STue Ly // 784c899b2STue Ly //===----------------------------------------------------------------------===// 884c899b2STue Ly 95748ad84Slntue #include "hdr/math_macros.h" 1084c899b2STue Ly #include "src/__support/FPUtil/FPBits.h" 1184c899b2STue Ly #include "src/errno/libc_errno.h" 1284c899b2STue Ly #include "src/math/expf.h" 1384c899b2STue Ly #include "test/UnitTest/FPMatcher.h" 1484c899b2STue Ly #include "test/UnitTest/Test.h" 1584c899b2STue Ly 1684c899b2STue Ly #include <stdint.h> 1784c899b2STue Ly 183fd5113cSlntue using LlvmLibcExpfTest = LIBC_NAMESPACE::testing::FPTest<float>; 1984c899b2STue Ly 203fd5113cSlntue TEST_F(LlvmLibcExpfTest, SpecialNumbers) { 213eb1e6d8Smichaelrj-google LIBC_NAMESPACE::libc_errno = 0; 2284c899b2STue Ly 23b6bc9d72SGuillaume Chatelet EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::expf(aNaN)); 2484c899b2STue Ly EXPECT_MATH_ERRNO(0); 2584c899b2STue Ly 26b6bc9d72SGuillaume Chatelet EXPECT_FP_EQ_ALL_ROUNDING(inf, LIBC_NAMESPACE::expf(inf)); 2784c899b2STue Ly EXPECT_MATH_ERRNO(0); 2884c899b2STue Ly 29b6bc9d72SGuillaume Chatelet EXPECT_FP_EQ_ALL_ROUNDING(0.0f, LIBC_NAMESPACE::expf(neg_inf)); 3084c899b2STue Ly EXPECT_MATH_ERRNO(0); 3184c899b2STue Ly 32b6bc9d72SGuillaume Chatelet EXPECT_FP_EQ_ALL_ROUNDING(1.0f, LIBC_NAMESPACE::expf(0.0f)); 3384c899b2STue Ly EXPECT_MATH_ERRNO(0); 3484c899b2STue Ly 35b6bc9d72SGuillaume Chatelet EXPECT_FP_EQ_ALL_ROUNDING(1.0f, LIBC_NAMESPACE::expf(-0.0f)); 3684c899b2STue Ly EXPECT_MATH_ERRNO(0); 3784c899b2STue Ly } 3884c899b2STue Ly 393fd5113cSlntue TEST_F(LlvmLibcExpfTest, Overflow) { 403eb1e6d8Smichaelrj-google LIBC_NAMESPACE::libc_errno = 0; 4184c899b2STue Ly EXPECT_FP_EQ_WITH_EXCEPTION( 422856db0dSGuillaume Chatelet inf, LIBC_NAMESPACE::expf(FPBits(0x7f7fffffU).get_val()), FE_OVERFLOW); 4384c899b2STue Ly EXPECT_MATH_ERRNO(ERANGE); 4484c899b2STue Ly 4584c899b2STue Ly EXPECT_FP_EQ_WITH_EXCEPTION( 462856db0dSGuillaume Chatelet inf, LIBC_NAMESPACE::expf(FPBits(0x42cffff8U).get_val()), FE_OVERFLOW); 4784c899b2STue Ly EXPECT_MATH_ERRNO(ERANGE); 4884c899b2STue Ly 4984c899b2STue Ly EXPECT_FP_EQ_WITH_EXCEPTION( 502856db0dSGuillaume Chatelet inf, LIBC_NAMESPACE::expf(FPBits(0x42d00008U).get_val()), FE_OVERFLOW); 5184c899b2STue Ly EXPECT_MATH_ERRNO(ERANGE); 5284c899b2STue Ly } 53*0f4b3c40Slntue 54*0f4b3c40Slntue #ifdef LIBC_TEST_FTZ_DAZ 55*0f4b3c40Slntue 56*0f4b3c40Slntue using namespace LIBC_NAMESPACE::testing; 57*0f4b3c40Slntue 58*0f4b3c40Slntue TEST_F(LlvmLibcExpfTest, FTZMode) { 59*0f4b3c40Slntue ModifyMXCSR mxcsr(FTZ); 60*0f4b3c40Slntue 61*0f4b3c40Slntue EXPECT_FP_EQ(1.0f, LIBC_NAMESPACE::expf(min_denormal)); 62*0f4b3c40Slntue EXPECT_FP_EQ(1.0f, LIBC_NAMESPACE::expf(max_denormal)); 63*0f4b3c40Slntue } 64*0f4b3c40Slntue 65*0f4b3c40Slntue TEST_F(LlvmLibcExpfTest, DAZMode) { 66*0f4b3c40Slntue ModifyMXCSR mxcsr(DAZ); 67*0f4b3c40Slntue 68*0f4b3c40Slntue EXPECT_FP_EQ(1.0f, LIBC_NAMESPACE::expf(min_denormal)); 69*0f4b3c40Slntue EXPECT_FP_EQ(1.0f, LIBC_NAMESPACE::expf(max_denormal)); 70*0f4b3c40Slntue } 71*0f4b3c40Slntue 72*0f4b3c40Slntue TEST_F(LlvmLibcExpfTest, FTZDAZMode) { 73*0f4b3c40Slntue ModifyMXCSR mxcsr(FTZ | DAZ); 74*0f4b3c40Slntue 75*0f4b3c40Slntue EXPECT_FP_EQ(1.0f, LIBC_NAMESPACE::expf(min_denormal)); 76*0f4b3c40Slntue EXPECT_FP_EQ(1.0f, LIBC_NAMESPACE::expf(max_denormal)); 77*0f4b3c40Slntue } 78*0f4b3c40Slntue 79*0f4b3c40Slntue #endif 80