diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2022-12-01 09:12:20 -0500 |
---|---|---|
committer | Matt Arsenault <arsenm2@gmail.com> | 2022-12-15 14:04:26 -0500 |
commit | 191c1d95e880227a13687c77c940f63baf88c594 (patch) | |
tree | 6b94632a7afbc4e624f8a1632226ee3cd1757842 /llvm/unittests/ADT/APFloatTest.cpp | |
parent | 992bee045b7586774ffd539bb46d9a1e22896f60 (diff) | |
download | llvm-191c1d95e880227a13687c77c940f63baf88c594.zip llvm-191c1d95e880227a13687c77c940f63baf88c594.tar.gz llvm-191c1d95e880227a13687c77c940f63baf88c594.tar.bz2 |
APFloat: Add isSmallestNormalized predicate function
It was annoying to write the check for this in the one case I added,
and I'm planning on adding another, so add a convenient PatternMatch
like for other special case values.
I have no idea what is going on in the DoubleAPFloat case, I reversed
this from the makeSmallestNormalized test. Also could implement this
as *this == getSmallestNormalized() for less code, but this avoids the
construction of a temporary APFloat copy and follows the style of the
other functions.
Diffstat (limited to 'llvm/unittests/ADT/APFloatTest.cpp')
-rw-r--r-- | llvm/unittests/ADT/APFloatTest.cpp | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/llvm/unittests/ADT/APFloatTest.cpp b/llvm/unittests/ADT/APFloatTest.cpp index c46508a..ff295f7 100644 --- a/llvm/unittests/ADT/APFloatTest.cpp +++ b/llvm/unittests/ADT/APFloatTest.cpp @@ -664,6 +664,57 @@ TEST(APFloatTest, Denormal) { } } +TEST(APFloatTest, IsSmallestNormalized) { + for (unsigned I = 0; I != APFloat::S_MaxSemantics + 1; ++I) { + const fltSemantics &Semantics = + APFloat::EnumToSemantics(static_cast<APFloat::Semantics>(I)); + + EXPECT_FALSE(APFloat::getZero(Semantics, false).isSmallestNormalized()); + EXPECT_FALSE(APFloat::getZero(Semantics, true).isSmallestNormalized()); + + EXPECT_FALSE(APFloat::getInf(Semantics, false).isSmallestNormalized()); + EXPECT_FALSE(APFloat::getInf(Semantics, true).isSmallestNormalized()); + + EXPECT_FALSE(APFloat::getQNaN(Semantics).isSmallestNormalized()); + EXPECT_FALSE(APFloat::getSNaN(Semantics).isSmallestNormalized()); + + EXPECT_FALSE(APFloat::getLargest(Semantics).isSmallestNormalized()); + EXPECT_FALSE(APFloat::getLargest(Semantics, true).isSmallestNormalized()); + + EXPECT_FALSE(APFloat::getSmallest(Semantics).isSmallestNormalized()); + EXPECT_FALSE(APFloat::getSmallest(Semantics, true).isSmallestNormalized()); + + EXPECT_FALSE(APFloat::getAllOnesValue(Semantics).isSmallestNormalized()); + + APFloat PosSmallestNormalized = + APFloat::getSmallestNormalized(Semantics, false); + APFloat NegSmallestNormalized = + APFloat::getSmallestNormalized(Semantics, true); + EXPECT_TRUE(PosSmallestNormalized.isSmallestNormalized()); + EXPECT_TRUE(NegSmallestNormalized.isSmallestNormalized()); + + for (APFloat *Val : {&PosSmallestNormalized, &NegSmallestNormalized}) { + bool OldSign = Val->isNegative(); + + // Step down, make sure it's still not smallest normalized. + EXPECT_EQ(APFloat::opOK, Val->next(false)); + EXPECT_EQ(OldSign, Val->isNegative()); + EXPECT_FALSE(Val->isSmallestNormalized()); + EXPECT_EQ(OldSign, Val->isNegative()); + + // Step back up should restore it to being smallest normalized. + EXPECT_EQ(APFloat::opOK, Val->next(true)); + EXPECT_TRUE(Val->isSmallestNormalized()); + EXPECT_EQ(OldSign, Val->isNegative()); + + // Step beyond should no longer smallest normalized. + EXPECT_EQ(APFloat::opOK, Val->next(true)); + EXPECT_FALSE(Val->isSmallestNormalized()); + EXPECT_EQ(OldSign, Val->isNegative()); + } + } +} + TEST(APFloatTest, Zero) { EXPECT_EQ(0.0f, APFloat(0.0f).convertToFloat()); EXPECT_EQ(-0.0f, APFloat(-0.0f).convertToFloat()); @@ -1723,6 +1774,7 @@ TEST(APFloatTest, getSmallestNormalized) { EXPECT_TRUE(test.isFiniteNonZero()); EXPECT_FALSE(test.isDenormal()); EXPECT_TRUE(test.bitwiseIsEqual(expected)); + EXPECT_TRUE(test.isSmallestNormalized()); test = APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true); expected = APFloat(APFloat::IEEEsingle(), "-0x1p-126"); @@ -1730,6 +1782,23 @@ TEST(APFloatTest, getSmallestNormalized) { EXPECT_TRUE(test.isFiniteNonZero()); EXPECT_FALSE(test.isDenormal()); EXPECT_TRUE(test.bitwiseIsEqual(expected)); + EXPECT_TRUE(test.isSmallestNormalized()); + + test = APFloat::getSmallestNormalized(APFloat::IEEEdouble(), false); + expected = APFloat(APFloat::IEEEdouble(), "0x1p-1022"); + EXPECT_FALSE(test.isNegative()); + EXPECT_TRUE(test.isFiniteNonZero()); + EXPECT_FALSE(test.isDenormal()); + EXPECT_TRUE(test.bitwiseIsEqual(expected)); + EXPECT_TRUE(test.isSmallestNormalized()); + + test = APFloat::getSmallestNormalized(APFloat::IEEEdouble(), true); + expected = APFloat(APFloat::IEEEdouble(), "-0x1p-1022"); + EXPECT_TRUE(test.isNegative()); + EXPECT_TRUE(test.isFiniteNonZero()); + EXPECT_FALSE(test.isDenormal()); + EXPECT_TRUE(test.bitwiseIsEqual(expected)); + EXPECT_TRUE(test.isSmallestNormalized()); test = APFloat::getSmallestNormalized(APFloat::IEEEquad(), false); expected = APFloat(APFloat::IEEEquad(), "0x1p-16382"); @@ -1737,6 +1806,7 @@ TEST(APFloatTest, getSmallestNormalized) { EXPECT_TRUE(test.isFiniteNonZero()); EXPECT_FALSE(test.isDenormal()); EXPECT_TRUE(test.bitwiseIsEqual(expected)); + EXPECT_TRUE(test.isSmallestNormalized()); test = APFloat::getSmallestNormalized(APFloat::IEEEquad(), true); expected = APFloat(APFloat::IEEEquad(), "-0x1p-16382"); @@ -1744,6 +1814,7 @@ TEST(APFloatTest, getSmallestNormalized) { EXPECT_TRUE(test.isFiniteNonZero()); EXPECT_FALSE(test.isDenormal()); EXPECT_TRUE(test.bitwiseIsEqual(expected)); + EXPECT_TRUE(test.isSmallestNormalized()); } TEST(APFloatTest, getZero) { |