diff options
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"); |