Skip to content

Commit f276e39

Browse files
committed
Fix bitcasting E8M0 APFloat to APInt
1 parent aea60ab commit f276e39

File tree

2 files changed

+6
-2
lines changed

2 files changed

+6
-2
lines changed

llvm/lib/Support/APFloat.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,8 @@ exponentNaN(const fltSemantics &semantics) {
408408
if (semantics.nonFiniteBehavior == fltNonfiniteBehavior::NanOnly) {
409409
if (semantics.nanEncoding == fltNanEncoding::NegativeZero)
410410
return exponentZero(semantics);
411-
return semantics.maxExponent;
411+
if (semantics.hasSignedRepr)
412+
return semantics.maxExponent;
412413
}
413414
return semantics.maxExponent + 1;
414415
}
@@ -3663,7 +3664,7 @@ APInt IEEEFloat::convertIEEEFloatToAPInt() const {
36633664
std::array<uint64_t, (S.sizeInBits + 63) / 64> words;
36643665
auto words_iter =
36653666
std::copy_n(mysignificand.begin(), mysignificand.size(), words.begin());
3666-
if constexpr (significand_mask != 0) {
3667+
if constexpr (significand_mask != 0 || trailing_significand_bits == 0) {
36673668
// Clear the integer bit.
36683669
words[mysignificand.size() - 1] &= significand_mask;
36693670
}

llvm/unittests/ADT/APFloatTest.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -5985,6 +5985,9 @@ TEST(APFloatTest, Float8E8M0FNUExhaustive) {
59855985
APFloat test(APFloat::Float8E8M0FNU(), APInt(8, i));
59865986
SCOPED_TRACE("i=" + std::to_string(i));
59875987

5988+
// bitcastToAPInt
5989+
EXPECT_EQ(i, test.bitcastToAPInt());
5990+
59885991
// isLargest
59895992
if (i == 254) {
59905993
EXPECT_TRUE(test.isLargest());

0 commit comments

Comments
 (0)