diff options
author | Neil Booth <neil@daikokuya.co.uk> | 2007-10-03 15:16:41 +0000 |
---|---|---|
committer | Neil Booth <neil@daikokuya.co.uk> | 2007-10-03 15:16:41 +0000 |
commit | b7dea4cb368c7b2e825e6d58b249693736a32e21 (patch) | |
tree | 04709e5ae4de38a788f1e2a692bfe5b53d02b4fd /lib/Support/APFloat.cpp | |
parent | 0abe116022a45879d5f17e6c4964769f24bb05aa (diff) |
Tweak RoundAwayFromZero the bit number below which is truncated, and make
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
Diffstat (limited to 'lib/Support/APFloat.cpp')
-rw-r--r-- | lib/Support/APFloat.cpp | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/lib/Support/APFloat.cpp b/lib/Support/APFloat.cpp index 8e1580bd4a..f5f9659b3c 100644 --- a/lib/Support/APFloat.cpp +++ b/lib/Support/APFloat.cpp @@ -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(); |