From b23916504a1a9f29c7519ed83813774eecce1789 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Wed, 30 Sep 2020 13:55:01 -0700 Subject: [PATCH] Patch IEEEFloat::isSignificandAllZeros and IEEEFloat::isSignificandAllOnes (bug 34579) Patch IEEEFloat::isSignificandAllZeros and IEEEFloat::isSignificandAllOnes to behave correctly in the case that the size of the significand is a multiple of the width of the integerParts making up the significand. The patch to IEEEFloat::isSignificandAllOnes fixes bug 34579, and the patch to IEEE:Float:isSignificandAllZeros fixes the unit test "APFloatTest.x87Next" I added here. I have included both in this diff since the changes are very similar. Patch by Andrew Briand --- llvm/lib/Support/APFloat.cpp | 4 ++-- llvm/unittests/ADT/APFloatTest.cpp | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Support/APFloat.cpp b/llvm/lib/Support/APFloat.cpp index adc6299..c5adbe9 100644 --- a/llvm/lib/Support/APFloat.cpp +++ b/llvm/lib/Support/APFloat.cpp @@ -842,7 +842,7 @@ bool IEEEFloat::isSignificandAllOnes() const { // Test if the significand excluding the integral bit is all ones. This allows // us to test for binade boundaries. const integerPart *Parts = significandParts(); - const unsigned PartCount = partCount(); + const unsigned PartCount = partCountForBits(semantics->precision); for (unsigned i = 0; i < PartCount - 1; i++) if (~Parts[i]) return false; @@ -864,7 +864,7 @@ bool IEEEFloat::isSignificandAllZeros() const { // Test if the significand excluding the integral bit is all zeros. This // allows us to test for binade boundaries. const integerPart *Parts = significandParts(); - const unsigned PartCount = partCount(); + const unsigned PartCount = partCountForBits(semantics->precision); for (unsigned i = 0; i < PartCount - 1; i++) if (Parts[i]) diff --git a/llvm/unittests/ADT/APFloatTest.cpp b/llvm/unittests/ADT/APFloatTest.cpp index 4cd027d..475ad83 100644 --- a/llvm/unittests/ADT/APFloatTest.cpp +++ b/llvm/unittests/ADT/APFloatTest.cpp @@ -4696,4 +4696,15 @@ TEST(APFloatTest, PPCDoubleDoubleFrexp) { EXPECT_EQ(0x3fe8000000000000ull, Result.bitcastToAPInt().getRawData()[0]); EXPECT_EQ(0x3c98000000000000ull, Result.bitcastToAPInt().getRawData()[1]); } + +TEST(APFloatTest, x87Largest) { + APFloat MaxX87Val = APFloat::getLargest(APFloat::x87DoubleExtended()); + EXPECT_TRUE(MaxX87Val.isLargest()); +} + +TEST(APFloatTest, x87Next) { + APFloat F(APFloat::x87DoubleExtended(), "-1.0"); + F.next(false); + EXPECT_TRUE(ilogb(F) == -1); +} } -- 2.7.4