aboutsummaryrefslogtreecommitdiff
path: root/lib/Support/APFloat.cpp
diff options
context:
space:
mode:
authorNeil Booth <neil@daikokuya.co.uk>2007-10-03 15:16:41 +0000
committerNeil Booth <neil@daikokuya.co.uk>2007-10-03 15:16:41 +0000
commitb7dea4cb368c7b2e825e6d58b249693736a32e21 (patch)
tree04709e5ae4de38a788f1e2a692bfe5b53d02b4fd /lib/Support/APFloat.cpp
parent0abe116022a45879d5f17e6c4964769f24bb05aa (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.cpp21
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();