diff options
author | Dale Johannesen <dalej@apple.com> | 2007-09-21 22:09:37 +0000 |
---|---|---|
committer | Dale Johannesen <dalej@apple.com> | 2007-09-21 22:09:37 +0000 |
commit | a6f7974e97825e9575b5c5cf9f6665aef86cbe03 (patch) | |
tree | 3dbc8815c0b1b48e3bdaf73a2b46004c3827bbcf /lib/Support | |
parent | 058c67a070dea39e3c0282664f0e82b1346ae845 (diff) | |
download | external_llvm-a6f7974e97825e9575b5c5cf9f6665aef86cbe03.zip external_llvm-a6f7974e97825e9575b5c5cf9f6665aef86cbe03.tar.gz external_llvm-a6f7974e97825e9575b5c5cf9f6665aef86cbe03.tar.bz2 |
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
Diffstat (limited to 'lib/Support')
-rw-r--r-- | lib/Support/APFloat.cpp | 35 | ||||
-rw-r--r-- | lib/Support/APInt.cpp | 2 |
2 files changed, 20 insertions, 17 deletions
diff --git a/lib/Support/APFloat.cpp b/lib/Support/APFloat.cpp index d314742..1fab6ca 100644 --- a/lib/Support/APFloat.cpp +++ b/lib/Support/APFloat.cpp @@ -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; } diff --git a/lib/Support/APInt.cpp b/lib/Support/APInt.cpp index 4a4474d..63bde6c 100644 --- a/lib/Support/APInt.cpp +++ b/lib/Support/APInt.cpp @@ -58,7 +58,7 @@ APInt::APInt(uint32_t numBits, uint64_t val, bool isSigned) clearUnusedBits(); } -APInt::APInt(uint32_t numBits, uint32_t numWords, uint64_t bigVal[]) +APInt::APInt(uint32_t numBits, uint32_t numWords, const uint64_t bigVal[]) : BitWidth(numBits), VAL(0) { assert(BitWidth >= IntegerType::MIN_INT_BITS && "bitwidth too small"); assert(BitWidth <= IntegerType::MAX_INT_BITS && "bitwidth too large"); |