Tweak RoundAwayFromZero the bit number below which is truncated, and make
authorNeil Booth <neil@daikokuya.co.uk>
Wed, 3 Oct 2007 15:16:41 +0000 (15:16 +0000)
committerNeil Booth <neil@daikokuya.co.uk>
Wed, 3 Oct 2007 15:16:41 +0000 (15:16 +0000)
it const.

Preparation for APFloat -> hexadecimal string conversion.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@42576 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 69d1e123ef34c379a3a7867251e6e797eeb7802a..c6b62dc7f8cba2d03bce6839634f17a93986d975 100644 (file)
@@ -253,7 +253,7 @@ namespace llvm {
     opStatus addOrSubtract(const APFloat &, roundingMode, bool subtract);
     cmpResult compareAbsoluteValue(const APFloat &) const;
     opStatus handleOverflow(roundingMode);
-    bool roundAwayFromZero(roundingMode, lostFraction);
+    bool roundAwayFromZero(roundingMode, lostFraction, unsigned int) const;
     opStatus convertFromUnsignedInteger(integerPart *, unsigned int,
                                        roundingMode);
     lostFraction combineLostFractions(lostFraction, lostFraction);
index 8e1580bd4a70998406a1a2acd691ebee201b69f3..f5f9659b3c4ed730ddc72fc1f3b115b047dffa23 100644 (file)
@@ -184,7 +184,8 @@ namespace {
       return digitValue == 0 ? lfLessThanHalf: lfMoreThanHalf;
   }
 
-  /* Return the fraction lost were a bignum truncated.  */
+  /* Return the fraction lost were a bignum truncated losing the least
+     significant BITS bits.  */
   lostFraction
   lostFractionThroughTruncation(integerPart *parts,
                                 unsigned int partCount,
@@ -694,16 +695,20 @@ APFloat::handleOverflow(roundingMode rounding_mode)
   return opInexact;
 }
 
-/* This routine must work for fcZero of both signs, and fcNormal
-   numbers.  */
+/* Returns TRUE if, when truncating the current number, with BIT the
+   new LSB, with the given lost fraction and rounding mode, the result
+   would need to be rounded away from zero (i.e., by increasing the
+   signficand).  This routine must work for fcZero of both signs, and
+   fcNormal numbers.  */
 bool
 APFloat::roundAwayFromZero(roundingMode rounding_mode,
-                           lostFraction lost_fraction)
+                           lostFraction lost_fraction,
+                           unsigned int bit) const
 {
   /* NaNs and infinities should not have lost fractions.  */
   assert(category == fcNormal || category == fcZero);
 
-  /* Our caller has already handled this case.  */
+  /* Current callers never pass this so we don't handle it.  */
   assert(lost_fraction != lfExactlyZero);
 
   switch(rounding_mode) {
@@ -719,7 +724,7 @@ APFloat::roundAwayFromZero(roundingMode rounding_mode,
 
     /* Our zeroes don't have a significand to test.  */
     if(lost_fraction == lfExactlyHalf && category != fcZero)
-      return significandParts()[0] & 1;
+      return APInt::tcExtractBit(significandParts(), bit);
 
     return false;
 
@@ -802,7 +807,7 @@ APFloat::normalize(roundingMode rounding_mode,
   }
 
   /* Increment the significand if we're rounding away from zero.  */
-  if(roundAwayFromZero(rounding_mode, lost_fraction)) {
+  if(roundAwayFromZero(rounding_mode, lost_fraction, 0)) {
     if(omsb == 0)
       exponent = semantics->minExponent;
 
@@ -1451,7 +1456,7 @@ APFloat::convertToInteger(integerPart *parts, unsigned int width,
   }
 
   if(lost_fraction != lfExactlyZero
-     && tmp.roundAwayFromZero(rounding_mode, lost_fraction))
+     && tmp.roundAwayFromZero(rounding_mode, lost_fraction, 0))
     tmp.incrementSignificand();
 
   msb = tmp.significandMSB();