Consolidate logic for creating NaNs. Silence compiler warning.
authorNeil Booth <neil@daikokuya.co.uk>
Sun, 14 Oct 2007 10:39:51 +0000 (10:39 +0000)
committerNeil Booth <neil@daikokuya.co.uk>
Sun, 14 Oct 2007 10:39:51 +0000 (10:39 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@42966 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ADT/APFloat.h
lib/Support/APFloat.cpp

index 7a43843bf02b95da34e871c566b6d6ddce5f6fab..9037ef5f727337d98e9335a6416b2c5374c5b2ee 100644 (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;
index e6f6b504e7a4f33c223e2a80f3e4a19596a4cd97..8f07bd5fae2df5bd42089ca8308e165b1a423de8 100644 (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);