Skip to content

Commit 0b336b6

Browse files
committed
[APFloat] Add support for operations on Signaling NaN
Fix PR30781 Differential Revision: https://reviews.llvm.org/D69774
1 parent 9aba2ce commit 0b336b6

File tree

2 files changed

+175
-354
lines changed

2 files changed

+175
-354
lines changed

llvm/lib/Support/APFloat.cpp

Lines changed: 43 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1439,25 +1439,26 @@ IEEEFloat::opStatus IEEEFloat::addOrSubtractSpecials(const IEEEFloat &rhs,
14391439
default:
14401440
llvm_unreachable(nullptr);
14411441

1442+
case PackCategoriesIntoKey(fcZero, fcNaN):
1443+
case PackCategoriesIntoKey(fcNormal, fcNaN):
1444+
case PackCategoriesIntoKey(fcInfinity, fcNaN):
1445+
assign(rhs);
1446+
LLVM_FALLTHROUGH;
14421447
case PackCategoriesIntoKey(fcNaN, fcZero):
14431448
case PackCategoriesIntoKey(fcNaN, fcNormal):
14441449
case PackCategoriesIntoKey(fcNaN, fcInfinity):
14451450
case PackCategoriesIntoKey(fcNaN, fcNaN):
1451+
if (isSignaling()) {
1452+
makeQuiet();
1453+
return opInvalidOp;
1454+
}
1455+
return rhs.isSignaling() ? opInvalidOp : opOK;
1456+
14461457
case PackCategoriesIntoKey(fcNormal, fcZero):
14471458
case PackCategoriesIntoKey(fcInfinity, fcNormal):
14481459
case PackCategoriesIntoKey(fcInfinity, fcZero):
14491460
return opOK;
14501461

1451-
case PackCategoriesIntoKey(fcZero, fcNaN):
1452-
case PackCategoriesIntoKey(fcNormal, fcNaN):
1453-
case PackCategoriesIntoKey(fcInfinity, fcNaN):
1454-
// We need to be sure to flip the sign here for subtraction because we
1455-
// don't have a separate negate operation so -NaN becomes 0 - NaN here.
1456-
sign = rhs.sign ^ subtract;
1457-
category = fcNaN;
1458-
copySignificand(rhs);
1459-
return opOK;
1460-
14611462
case PackCategoriesIntoKey(fcNormal, fcInfinity):
14621463
case PackCategoriesIntoKey(fcZero, fcInfinity):
14631464
category = fcInfinity;
@@ -1562,20 +1563,22 @@ IEEEFloat::opStatus IEEEFloat::multiplySpecials(const IEEEFloat &rhs) {
15621563
default:
15631564
llvm_unreachable(nullptr);
15641565

1565-
case PackCategoriesIntoKey(fcNaN, fcZero):
1566-
case PackCategoriesIntoKey(fcNaN, fcNormal):
1567-
case PackCategoriesIntoKey(fcNaN, fcInfinity):
1568-
case PackCategoriesIntoKey(fcNaN, fcNaN):
1569-
sign = false;
1570-
return opOK;
1571-
15721566
case PackCategoriesIntoKey(fcZero, fcNaN):
15731567
case PackCategoriesIntoKey(fcNormal, fcNaN):
15741568
case PackCategoriesIntoKey(fcInfinity, fcNaN):
1569+
assign(rhs);
15751570
sign = false;
1576-
category = fcNaN;
1577-
copySignificand(rhs);
1578-
return opOK;
1571+
LLVM_FALLTHROUGH;
1572+
case PackCategoriesIntoKey(fcNaN, fcZero):
1573+
case PackCategoriesIntoKey(fcNaN, fcNormal):
1574+
case PackCategoriesIntoKey(fcNaN, fcInfinity):
1575+
case PackCategoriesIntoKey(fcNaN, fcNaN):
1576+
sign ^= rhs.sign; // restore the original sign
1577+
if (isSignaling()) {
1578+
makeQuiet();
1579+
return opInvalidOp;
1580+
}
1581+
return rhs.isSignaling() ? opInvalidOp : opOK;
15791582

15801583
case PackCategoriesIntoKey(fcNormal, fcInfinity):
15811584
case PackCategoriesIntoKey(fcInfinity, fcNormal):
@@ -1607,15 +1610,20 @@ IEEEFloat::opStatus IEEEFloat::divideSpecials(const IEEEFloat &rhs) {
16071610
case PackCategoriesIntoKey(fcZero, fcNaN):
16081611
case PackCategoriesIntoKey(fcNormal, fcNaN):
16091612
case PackCategoriesIntoKey(fcInfinity, fcNaN):
1610-
category = fcNaN;
1611-
copySignificand(rhs);
1613+
assign(rhs);
1614+
sign = false;
16121615
LLVM_FALLTHROUGH;
16131616
case PackCategoriesIntoKey(fcNaN, fcZero):
16141617
case PackCategoriesIntoKey(fcNaN, fcNormal):
16151618
case PackCategoriesIntoKey(fcNaN, fcInfinity):
16161619
case PackCategoriesIntoKey(fcNaN, fcNaN):
1617-
sign = false;
1618-
LLVM_FALLTHROUGH;
1620+
sign ^= rhs.sign; // restore the original sign
1621+
if (isSignaling()) {
1622+
makeQuiet();
1623+
return opInvalidOp;
1624+
}
1625+
return rhs.isSignaling() ? opInvalidOp : opOK;
1626+
16191627
case PackCategoriesIntoKey(fcInfinity, fcZero):
16201628
case PackCategoriesIntoKey(fcInfinity, fcNormal):
16211629
case PackCategoriesIntoKey(fcZero, fcInfinity):
@@ -1645,23 +1653,26 @@ IEEEFloat::opStatus IEEEFloat::modSpecials(const IEEEFloat &rhs) {
16451653
default:
16461654
llvm_unreachable(nullptr);
16471655

1656+
case PackCategoriesIntoKey(fcZero, fcNaN):
1657+
case PackCategoriesIntoKey(fcNormal, fcNaN):
1658+
case PackCategoriesIntoKey(fcInfinity, fcNaN):
1659+
assign(rhs);
1660+
LLVM_FALLTHROUGH;
16481661
case PackCategoriesIntoKey(fcNaN, fcZero):
16491662
case PackCategoriesIntoKey(fcNaN, fcNormal):
16501663
case PackCategoriesIntoKey(fcNaN, fcInfinity):
16511664
case PackCategoriesIntoKey(fcNaN, fcNaN):
1665+
if (isSignaling()) {
1666+
makeQuiet();
1667+
return opInvalidOp;
1668+
}
1669+
return rhs.isSignaling() ? opInvalidOp : opOK;
1670+
16521671
case PackCategoriesIntoKey(fcZero, fcInfinity):
16531672
case PackCategoriesIntoKey(fcZero, fcNormal):
16541673
case PackCategoriesIntoKey(fcNormal, fcInfinity):
16551674
return opOK;
16561675

1657-
case PackCategoriesIntoKey(fcZero, fcNaN):
1658-
case PackCategoriesIntoKey(fcNormal, fcNaN):
1659-
case PackCategoriesIntoKey(fcInfinity, fcNaN):
1660-
sign = false;
1661-
category = fcNaN;
1662-
copySignificand(rhs);
1663-
return opOK;
1664-
16651676
case PackCategoriesIntoKey(fcNormal, fcZero):
16661677
case PackCategoriesIntoKey(fcInfinity, fcZero):
16671678
case PackCategoriesIntoKey(fcInfinity, fcNormal):

0 commit comments

Comments
 (0)