Expand Up
@@ -6,8 +6,6 @@
//
// ===----------------------------------------------------------------------===//
#include " include/errno.h"
#include " src/errno/llvmlibc_errno.h"
#include " src/math/expf.h"
#include " utils/FPUtil/BitPatterns.h"
#include " utils/FPUtil/ClassificationFunctions.h"
Expand All
@@ -17,6 +15,7 @@
#include " utils/UnitTest/Test.h"
#include < math.h>
#include < errno.h>
#include < stdint.h>
using __llvm_libc::fputil::isNegativeQuietNaN;
Expand All
@@ -29,96 +28,96 @@ using BitPatterns = __llvm_libc::fputil::BitPatterns<float>;
namespace mpfr = __llvm_libc::testing::mpfr;
TEST (LlvmLibcExpfTest, SpecialNumbers) {
llvmlibc_errno = 0 ;
errno = 0 ;
EXPECT_TRUE (
isQuietNaN (__llvm_libc::expf (valueFromBits (BitPatterns::aQuietNaN))));
EXPECT_EQ (llvmlibc_errno , 0 );
EXPECT_EQ (errno , 0 );
EXPECT_TRUE (isNegativeQuietNaN (
__llvm_libc::expf (valueFromBits (BitPatterns::aNegativeQuietNaN))));
EXPECT_EQ (llvmlibc_errno , 0 );
EXPECT_EQ (errno , 0 );
EXPECT_TRUE (isQuietNaN (
__llvm_libc::expf (valueFromBits (BitPatterns::aSignallingNaN))));
EXPECT_EQ (llvmlibc_errno , 0 );
EXPECT_EQ (errno , 0 );
EXPECT_TRUE (isNegativeQuietNaN (
__llvm_libc::expf (valueFromBits (BitPatterns::aNegativeSignallingNaN))));
EXPECT_EQ (llvmlibc_errno , 0 );
EXPECT_EQ (errno , 0 );
EXPECT_EQ (BitPatterns::inf,
valueAsBits (__llvm_libc::expf (valueFromBits (BitPatterns::inf))));
EXPECT_EQ (llvmlibc_errno , 0 );
EXPECT_EQ (errno , 0 );
EXPECT_EQ (BitPatterns::zero,
valueAsBits (__llvm_libc::expf (valueFromBits (BitPatterns::negInf))));
EXPECT_EQ (llvmlibc_errno , 0 );
EXPECT_EQ (errno , 0 );
EXPECT_EQ (BitPatterns::one,
valueAsBits (__llvm_libc::expf (valueFromBits (BitPatterns::zero))));
EXPECT_EQ (llvmlibc_errno , 0 );
EXPECT_EQ (errno , 0 );
EXPECT_EQ (BitPatterns::one, valueAsBits (__llvm_libc::expf (
valueFromBits (BitPatterns::negZero))));
EXPECT_EQ (llvmlibc_errno , 0 );
EXPECT_EQ (errno , 0 );
}
TEST (LlvmLibcExpfTest, Overflow) {
llvmlibc_errno = 0 ;
errno = 0 ;
EXPECT_EQ (BitPatterns::inf,
valueAsBits (__llvm_libc::expf (valueFromBits (0x7f7fffffU ))));
EXPECT_EQ (llvmlibc_errno , ERANGE);
EXPECT_EQ (errno , ERANGE);
llvmlibc_errno = 0 ;
errno = 0 ;
EXPECT_EQ (BitPatterns::inf,
valueAsBits (__llvm_libc::expf (valueFromBits (0x42cffff8U ))));
EXPECT_EQ (llvmlibc_errno , ERANGE);
EXPECT_EQ (errno , ERANGE);
llvmlibc_errno = 0 ;
errno = 0 ;
EXPECT_EQ (BitPatterns::inf,
valueAsBits (__llvm_libc::expf (valueFromBits (0x42d00008U ))));
EXPECT_EQ (llvmlibc_errno , ERANGE);
EXPECT_EQ (errno , ERANGE);
}
TEST (LlvmLibcExpfTest, Underflow) {
llvmlibc_errno = 0 ;
errno = 0 ;
EXPECT_EQ (BitPatterns::zero,
valueAsBits (__llvm_libc::expf (valueFromBits (0xff7fffffU ))));
EXPECT_EQ (llvmlibc_errno , ERANGE);
EXPECT_EQ (errno , ERANGE);
llvmlibc_errno = 0 ;
errno = 0 ;
EXPECT_EQ (BitPatterns::zero,
valueAsBits (__llvm_libc::expf (valueFromBits (0xc2cffff8U ))));
EXPECT_EQ (llvmlibc_errno , ERANGE);
EXPECT_EQ (errno , ERANGE);
llvmlibc_errno = 0 ;
errno = 0 ;
EXPECT_EQ (BitPatterns::zero,
valueAsBits (__llvm_libc::expf (valueFromBits (0xc2d00008U ))));
EXPECT_EQ (llvmlibc_errno , ERANGE);
EXPECT_EQ (errno , ERANGE);
}
// Test with inputs which are the borders of underflow/overflow but still
// produce valid results without setting errno.
TEST (LlvmLibcExpfTest, Borderline) {
float x;
llvmlibc_errno = 0 ;
errno = 0 ;
x = valueFromBits (0x42affff8U );
ASSERT_MPFR_MATCH (mpfr::Operation::Exp, x, __llvm_libc::expf (x), 1.0 );
EXPECT_EQ (llvmlibc_errno , 0 );
EXPECT_EQ (errno , 0 );
x = valueFromBits (0x42b00008U );
ASSERT_MPFR_MATCH (mpfr::Operation::Exp, x, __llvm_libc::expf (x), 1.0 );
EXPECT_EQ (llvmlibc_errno , 0 );
EXPECT_EQ (errno , 0 );
x = valueFromBits (0xc2affff8U );
ASSERT_MPFR_MATCH (mpfr::Operation::Exp, x, __llvm_libc::expf (x), 1.0 );
EXPECT_EQ (llvmlibc_errno , 0 );
EXPECT_EQ (errno , 0 );
x = valueFromBits (0xc2b00008U );
ASSERT_MPFR_MATCH (mpfr::Operation::Exp, x, __llvm_libc::expf (x), 1.0 );
EXPECT_EQ (llvmlibc_errno , 0 );
EXPECT_EQ (errno , 0 );
}
TEST (LlvmLibcExpfTest, InFloatRange) {
Expand All
@@ -128,14 +127,14 @@ TEST(LlvmLibcExpfTest, InFloatRange) {
float x = valueFromBits (v);
if (isnan (x) || isinf (x))
continue ;
llvmlibc_errno = 0 ;
errno = 0 ;
float result = __llvm_libc::expf (x);
// If the computation resulted in an error or did not produce valid result
// in the single-precision floating point range, then ignore comparing with
// MPFR result as MPFR can still produce valid results because of its
// wider precision.
if (isnan (result) || isinf (result) || llvmlibc_errno != 0 )
if (isnan (result) || isinf (result) || errno != 0 )
continue ;
ASSERT_MPFR_MATCH (mpfr::Operation::Exp, x, __llvm_libc::expf (x), 1.0 );
}
Expand Down