diff --git a/llvm/lib/Support/APFloat.cpp b/llvm/lib/Support/APFloat.cpp --- a/llvm/lib/Support/APFloat.cpp +++ b/llvm/lib/Support/APFloat.cpp @@ -4099,6 +4099,11 @@ // Fill the buffer. unsigned precision = significand.getBitWidth(); + if (precision < 4) { + // We need enough precision to store the value 10. + precision = 4; + significand = significand.zext(precision); + } APInt ten(precision, 10); APInt digit(precision, 0); diff --git a/llvm/unittests/ADT/APFloatTest.cpp b/llvm/unittests/ADT/APFloatTest.cpp --- a/llvm/unittests/ADT/APFloatTest.cpp +++ b/llvm/unittests/ADT/APFloatTest.cpp @@ -5152,6 +5152,26 @@ } } +TEST(APFloatTest, F8ToString) { + for (APFloat::Semantics S : + {APFloat::S_Float8E5M2, APFloat::S_Float8E4M3FN}) { + SCOPED_TRACE("Semantics=" + std::to_string(S)); + for (int i = 0; i < 256; i++) { + SCOPED_TRACE("i=" + std::to_string(i)); + APFloat test(APFloat::Float8E5M2(), APInt(8, i)); + llvm::SmallString<128> str; + test.toString(str); + + if (test.isNaN()) { + EXPECT_EQ(str, "NaN"); + } else { + APFloat test2(APFloat::Float8E5M2(), str); + EXPECT_TRUE(test.bitwiseIsEqual(test2)); + } + } + } +} + TEST(APFloatTest, IEEEdoubleToDouble) { APFloat DPosZero(0.0); APFloat DPosZeroToDouble(DPosZero.convertToDouble());