Change APFloat::convertFromInteger to take the incoming

bit width instead of number of words allocated, which
makes it actually work for int->APF conversions.
Adjust callers.  Add const to one of the APInt constructors
to prevent surprising match when called with const
argument.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@42210 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Dale Johannesen
2007-09-21 22:09:37 +00:00
parent 3f65f02d25
commit 910993e8dc
6 changed files with 32 additions and 24 deletions

View File

@@ -1180,7 +1180,8 @@ APFloat::mod(const APFloat &rhs, roundingMode rounding_mode)
if (fs==opInvalidOp)
return fs;
fs = V.convertFromInteger(x, parts, true, rmNearestTiesToEven);
fs = V.convertFromInteger(x, parts * integerPartWidth, true,
rmNearestTiesToEven);
assert(fs==opOK); // should always work
fs = V.multiply(rhs, rounding_mode);
@@ -1459,28 +1460,30 @@ APFloat::convertFromUnsignedInteger(integerPart *parts,
}
APFloat::opStatus
APFloat::convertFromInteger(const integerPart *parts,
unsigned int partCount, bool isSigned,
roundingMode rounding_mode)
APFloat::convertFromInteger(const integerPart *parts, unsigned int width,
bool isSigned, roundingMode rounding_mode)
{
unsigned int width;
unsigned int partCount = partCountForBits(width);
opStatus status;
integerPart *copy;
copy = new integerPart[partCount];
APInt::tcAssign(copy, parts, partCount);
width = partCount * integerPartWidth;
APInt api = APInt(width, partCount, parts);
integerPart *copy = new integerPart[partCount];
sign = false;
if(isSigned && APInt::tcExtractBit(parts, width - 1)) {
sign = true;
APInt::tcNegate(copy, partCount);
if(isSigned) {
if (APInt::tcExtractBit(parts, width - 1)) {
sign = true;
if (width < partCount * integerPartWidth)
api = api.sext(partCount * integerPartWidth);
}
else if (width < partCount * integerPartWidth)
api = api.zext(partCount * integerPartWidth);
} else {
if (width < partCount * integerPartWidth)
api = api.zext(partCount * integerPartWidth);
}
APInt::tcAssign(copy, api.getRawData(), partCount);
status = convertFromUnsignedInteger(copy, partCount, rounding_mode);
delete [] copy;
return status;
}