summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
3f65f02)
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
/// @param numWords the number of words in bigVal
/// @param bigVal a sequence of words to form the initial value of the APInt
/// @brief Construct an APInt of numBits width, initialized as bigVal[].
/// @param numWords the number of words in bigVal
/// @param bigVal a sequence of words to form the initial value of the APInt
/// @brief Construct an APInt of numBits width, initialized as bigVal[].
- APInt(uint32_t numBits, uint32_t numWords, uint64_t bigVal[]);
+ APInt(uint32_t numBits, uint32_t numWords, const uint64_t bigVal[]);
/// This constructor interprets Val as a string in the given radix. The
/// interpretation stops when the first charater that is not suitable for the
/// This constructor interprets Val as a string in the given radix. The
/// interpretation stops when the first charater that is not suitable for the
const uint64_t zero[] = {0, 0};
APFloat apf = APFloat(APInt(MVT::getSizeInBits(VT), 2, zero));
uint64_t x = 1ULL << ShiftAmt;
const uint64_t zero[] = {0, 0};
APFloat apf = APFloat(APInt(MVT::getSizeInBits(VT), 2, zero));
uint64_t x = 1ULL << ShiftAmt;
- (void)apf.convertFromInteger(&x, 1, false, APFloat::rmTowardZero);
+ (void)apf.convertFromInteger(&x, MVT::getSizeInBits(NVT), false,
+ APFloat::rmTowardZero);
Tmp2 = DAG.getConstantFP(apf, VT);
Tmp3 = DAG.getSetCC(TLI.getSetCCResultTy(),
Node->getOperand(0), Tmp2, ISD::SETLT);
Tmp2 = DAG.getConstantFP(apf, VT);
Tmp3 = DAG.getSetCC(TLI.getSetCCResultTy(),
Node->getOperand(0), Tmp2, ISD::SETLT);
case ISD::SINT_TO_FP: {
const uint64_t zero[] = {0, 0};
APFloat apf = APFloat(APInt(MVT::getSizeInBits(VT), 2, zero));
case ISD::SINT_TO_FP: {
const uint64_t zero[] = {0, 0};
APFloat apf = APFloat(APInt(MVT::getSizeInBits(VT), 2, zero));
- (void)apf.convertFromInteger(&Val, 1, Opcode==ISD::SINT_TO_FP,
- APFloat::rmTowardZero);
+ (void)apf.convertFromInteger(&Val,
+ MVT::getSizeInBits(Operand.getValueType()),
+ Opcode==ISD::SINT_TO_FP,
+ APFloat::rmTowardZero);
return getConstantFP(apf, VT);
}
case ISD::BIT_CONVERT:
return getConstantFP(apf, VT);
}
case ISD::BIT_CONVERT:
GV.FloatVal = float(GV.IntVal.roundToDouble());
else if (CE->getType() == Type::DoubleTy)
GV.DoubleVal = GV.IntVal.roundToDouble();
GV.FloatVal = float(GV.IntVal.roundToDouble());
else if (CE->getType() == Type::DoubleTy)
GV.DoubleVal = GV.IntVal.roundToDouble();
- else if (CE->getType() == Type::X86_FP80Ty) {
+ else if (CE->getType() == Type::X86_FP80Ty) {
const uint64_t zero[] = {0, 0};
APFloat apf = APFloat(APInt(80, 2, zero));
const uint64_t zero[] = {0, 0};
APFloat apf = APFloat(APInt(80, 2, zero));
- (void)apf.convertFromInteger(GV.IntVal.getRawData(), 2, false,
+ (void)apf.convertFromInteger(GV.IntVal.getRawData(),
+ GV.IntVal.getBitWidth(), false,
APFloat::rmTowardZero);
GV.IntVal = apf.convertToAPInt();
}
APFloat::rmTowardZero);
GV.IntVal = apf.convertToAPInt();
}
else if (CE->getType() == Type::X86_FP80Ty) {
const uint64_t zero[] = { 0, 0};
APFloat apf = APFloat(APInt(80, 2, zero));
else if (CE->getType() == Type::X86_FP80Ty) {
const uint64_t zero[] = { 0, 0};
APFloat apf = APFloat(APInt(80, 2, zero));
- (void)apf.convertFromInteger(GV.IntVal.getRawData(), 2, true,
+ (void)apf.convertFromInteger(GV.IntVal.getRawData(),
+ GV.IntVal.getBitWidth(), true,
APFloat::rmTowardZero);
GV.IntVal = apf.convertToAPInt();
}
APFloat::rmTowardZero);
GV.IntVal = apf.convertToAPInt();
}
if (fs==opInvalidOp)
return fs;
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);
assert(fs==opOK); // should always work
fs = V.multiply(rhs, rounding_mode);
-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 partCount = partCountForBits(width);
- 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];
- 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);
status = convertFromUnsignedInteger(copy, partCount, rounding_mode);
-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");
: BitWidth(numBits), VAL(0) {
assert(BitWidth >= IntegerType::MIN_INT_BITS && "bitwidth too small");
assert(BitWidth <= IntegerType::MAX_INT_BITS && "bitwidth too large");