1971a1ac4SOverMighty //===-- Unittests for expf16 ----------------------------------------------===// 2971a1ac4SOverMighty // 3971a1ac4SOverMighty // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4971a1ac4SOverMighty // See https://llvm.org/LICENSE.txt for license information. 5971a1ac4SOverMighty // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6971a1ac4SOverMighty // 7971a1ac4SOverMighty //===----------------------------------------------------------------------===// 8971a1ac4SOverMighty 9971a1ac4SOverMighty #include "hdr/errno_macros.h" 10971a1ac4SOverMighty #include "hdr/fenv_macros.h" 11*127349fcSOverMighty #include "src/__support/FPUtil/cast.h" 12971a1ac4SOverMighty #include "src/errno/libc_errno.h" 13971a1ac4SOverMighty #include "src/math/expf16.h" 14971a1ac4SOverMighty #include "test/UnitTest/FPMatcher.h" 15971a1ac4SOverMighty #include "test/UnitTest/Test.h" 16971a1ac4SOverMighty 17971a1ac4SOverMighty using LlvmLibcExpf16Test = LIBC_NAMESPACE::testing::FPTest<float16>; 18971a1ac4SOverMighty 19971a1ac4SOverMighty TEST_F(LlvmLibcExpf16Test, SpecialNumbers) { 20971a1ac4SOverMighty LIBC_NAMESPACE::libc_errno = 0; 21971a1ac4SOverMighty 22971a1ac4SOverMighty EXPECT_FP_EQ_ALL_ROUNDING(aNaN, LIBC_NAMESPACE::expf16(aNaN)); 23971a1ac4SOverMighty EXPECT_MATH_ERRNO(0); 24971a1ac4SOverMighty 25b66aa3bfSOverMighty EXPECT_FP_EQ_WITH_EXCEPTION(aNaN, LIBC_NAMESPACE::expf16(sNaN), FE_INVALID); 26971a1ac4SOverMighty EXPECT_MATH_ERRNO(0); 27971a1ac4SOverMighty 28971a1ac4SOverMighty EXPECT_FP_EQ_ALL_ROUNDING(inf, LIBC_NAMESPACE::expf16(inf)); 29971a1ac4SOverMighty EXPECT_MATH_ERRNO(0); 30971a1ac4SOverMighty 31*127349fcSOverMighty EXPECT_FP_EQ_ALL_ROUNDING(zero, LIBC_NAMESPACE::expf16(neg_inf)); 32971a1ac4SOverMighty EXPECT_MATH_ERRNO(0); 33971a1ac4SOverMighty 34*127349fcSOverMighty EXPECT_FP_EQ_ALL_ROUNDING(LIBC_NAMESPACE::fputil::cast<float16>(1.0f), 35971a1ac4SOverMighty LIBC_NAMESPACE::expf16(zero)); 36971a1ac4SOverMighty EXPECT_MATH_ERRNO(0); 37971a1ac4SOverMighty 38*127349fcSOverMighty EXPECT_FP_EQ_ALL_ROUNDING(LIBC_NAMESPACE::fputil::cast<float16>(1.0f), 39971a1ac4SOverMighty LIBC_NAMESPACE::expf16(neg_zero)); 40971a1ac4SOverMighty EXPECT_MATH_ERRNO(0); 41971a1ac4SOverMighty } 42971a1ac4SOverMighty 43971a1ac4SOverMighty TEST_F(LlvmLibcExpf16Test, Overflow) { 44971a1ac4SOverMighty LIBC_NAMESPACE::libc_errno = 0; 45971a1ac4SOverMighty 46971a1ac4SOverMighty EXPECT_FP_EQ_WITH_EXCEPTION(inf, LIBC_NAMESPACE::expf16(max_normal), 47971a1ac4SOverMighty FE_OVERFLOW); 48971a1ac4SOverMighty EXPECT_MATH_ERRNO(ERANGE); 49971a1ac4SOverMighty 50971a1ac4SOverMighty EXPECT_FP_EQ_WITH_EXCEPTION( 51*127349fcSOverMighty inf, LIBC_NAMESPACE::expf16(LIBC_NAMESPACE::fputil::cast<float16>(12.0)), 52*127349fcSOverMighty FE_OVERFLOW); 53971a1ac4SOverMighty EXPECT_MATH_ERRNO(ERANGE); 54971a1ac4SOverMighty } 55971a1ac4SOverMighty 56971a1ac4SOverMighty TEST_F(LlvmLibcExpf16Test, Underflow) { 57971a1ac4SOverMighty LIBC_NAMESPACE::libc_errno = 0; 58971a1ac4SOverMighty 59971a1ac4SOverMighty EXPECT_FP_EQ_WITH_EXCEPTION(zero, LIBC_NAMESPACE::expf16(neg_max_normal), 60971a1ac4SOverMighty FE_UNDERFLOW | FE_INEXACT); 61971a1ac4SOverMighty EXPECT_MATH_ERRNO(ERANGE); 62971a1ac4SOverMighty 63971a1ac4SOverMighty EXPECT_FP_EQ_WITH_EXCEPTION( 64*127349fcSOverMighty zero, 65*127349fcSOverMighty LIBC_NAMESPACE::expf16(LIBC_NAMESPACE::fputil::cast<float16>(-18.0)), 66971a1ac4SOverMighty FE_UNDERFLOW | FE_INEXACT); 67971a1ac4SOverMighty EXPECT_MATH_ERRNO(ERANGE); 68971a1ac4SOverMighty } 69