From: Neil Booth Date: Wed, 3 Oct 2007 15:16:41 +0000 (+0000) Subject: Tweak RoundAwayFromZero the bit number below which is truncated, and make X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=b7dea4cb368c7b2e825e6d58b249693736a32e21;p=oota-llvm.git 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 --- diff --git a/include/llvm/ADT/APFloat.h b/include/llvm/ADT/APFloat.h index 69d1e123ef3..c6b62dc7f8c 100644 --- a/include/llvm/ADT/APFloat.h +++ b/include/llvm/ADT/APFloat.h @@ -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); diff --git a/lib/Support/APFloat.cpp b/lib/Support/APFloat.cpp index 8e1580bd4a7..f5f9659b3c4 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();