mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-25 21:18:19 +00:00
Fix some bugs in division logic.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34384 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -980,7 +980,7 @@ static unsigned subMul(unsigned dest[], unsigned offset,
|
||||
unsigned carry = 0;
|
||||
unsigned j = 0;
|
||||
do {
|
||||
uint64_t prod = ((uint64_t) x[j] & 0xffffffffL) * yl;
|
||||
uint64_t prod = ((uint64_t) x[j] & 0xffffffffUL) * yl;
|
||||
unsigned prod_low = (unsigned) prod;
|
||||
unsigned prod_high = (unsigned) (prod >> 32);
|
||||
prod_low += carry;
|
||||
@@ -1104,7 +1104,8 @@ APInt APInt::udiv(const APInt& RHS) const {
|
||||
X = APIntOps::shl(Result, nshift);
|
||||
++lhsWords;
|
||||
}
|
||||
div((unsigned*)X.pVal, lhsWords * 2 - 1, (unsigned*)Y.pVal, rhsWords*2);
|
||||
div((unsigned*)X.pVal, lhsWords * 2 - 1,
|
||||
(unsigned*)(Y.isSingleWord()? &Y.VAL : Y.pVal), rhsWords*2);
|
||||
memset(Result.pVal, 0, Result.getNumWords() * 8);
|
||||
memcpy(Result.pVal, X.pVal + rhsWords, (lhsWords - rhsWords) * 8);
|
||||
}
|
||||
@@ -1154,7 +1155,8 @@ APInt APInt::urem(const APInt& RHS) const {
|
||||
APIntOps::shl(Y, nshift);
|
||||
APIntOps::shl(X, nshift);
|
||||
}
|
||||
div((unsigned*)X.pVal, rhsWords*2-1, (unsigned*)Y.pVal, rhsWords*2);
|
||||
div((unsigned*)X.pVal, rhsWords*2-1,
|
||||
(unsigned*)(Y.isSingleWord()? &Y.VAL : Y.pVal), rhsWords*2);
|
||||
memset(Result.pVal, 0, Result.getNumWords() * 8);
|
||||
for (unsigned i = 0; i < rhsWords-1; ++i)
|
||||
Result.pVal[i] = (X.pVal[i] >> nshift) | (X.pVal[i+1] << (64 - nshift));
|
||||
|
||||
Reference in New Issue
Block a user