Consolidate logic for creating NaNs. Silence compiler warning.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@42966 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Neil Booth 2007-10-14 10:39:51 +00:00
parent caf19d79e5
commit e5e0194583
2 changed files with 16 additions and 10 deletions

View File

@ -268,6 +268,7 @@ namespace llvm {
opStatus multiplySpecials(const APFloat &);
/* Miscellany. */
void makeNaN(void);
opStatus normalize(roundingMode, lostFraction);
opStatus addOrSubtract(const APFloat &, roundingMode, bool subtract);
cmpResult compareAbsoluteValue(const APFloat &) const;

View File

@ -586,6 +586,15 @@ APFloat::copySignificand(const APFloat &rhs)
partCount());
}
/* Make this number a NaN, with an arbitrary but deterministic value
for the significand. */
void
APFloat::makeNaN(void)
{
category = fcNaN;
APInt::tcSet(significandParts(), ~0U, partCount());
}
APFloat &
APFloat::operator=(const APFloat &rhs)
{
@ -650,6 +659,8 @@ APFloat::APFloat(const fltSemantics &ourSemantics,
sign = negative;
if(category == fcNormal)
category = fcZero;
else if (ourCategory == fcNaN)
makeNaN();
}
APFloat::APFloat(const fltSemantics &ourSemantics, const char *text)
@ -1210,9 +1221,7 @@ APFloat::addOrSubtractSpecials(const APFloat &rhs, bool subtract)
/* Differently signed infinities can only be validly
subtracted. */
if(sign ^ rhs.sign != subtract) {
category = fcNaN;
// Arbitrary but deterministic value for significand
APInt::tcSet(significandParts(), ~0U, partCount());
makeNaN();
return opInvalidOp;
}
@ -1328,9 +1337,7 @@ APFloat::multiplySpecials(const APFloat &rhs)
case convolve(fcZero, fcInfinity):
case convolve(fcInfinity, fcZero):
category = fcNaN;
// Arbitrary but deterministic value for significand
APInt::tcSet(significandParts(), ~0U, partCount());
makeNaN();
return opInvalidOp;
case convolve(fcNormal, fcNormal):
@ -1372,9 +1379,7 @@ APFloat::divideSpecials(const APFloat &rhs)
case convolve(fcInfinity, fcInfinity):
case convolve(fcZero, fcZero):
category = fcNaN;
// Arbitrary but deterministic value for significand
APInt::tcSet(significandParts(), ~0U, partCount());
makeNaN();
return opInvalidOp;
case convolve(fcNormal, fcNormal):
@ -1769,7 +1774,7 @@ APFloat::convertToInteger(integerPart *parts, unsigned int width,
if(bits > 0) {
lost_fraction = tmp.shiftSignificandRight(bits);
} else {
if (-bits >= semantics->precision) {
if ((unsigned) -bits >= semantics->precision) {
// Unrepresentably large.
if (!sign && isSigned)
APInt::tcSetLeastSignificantBits(parts, partsCount, width-1);