From: Reid Spencer Date: Sat, 24 Feb 2007 20:38:01 +0000 (+0000) Subject: Fix the remainder shifting in KnuthDiv. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=1050ec5cc42c4b1ff1702e09da9d520abe205b0d;p=oota-llvm.git Fix the remainder shifting in KnuthDiv. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34562 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Support/APInt.cpp b/lib/Support/APInt.cpp index 7f2aa429247..60c940c566d 100644 --- a/lib/Support/APInt.cpp +++ b/lib/Support/APInt.cpp @@ -1134,12 +1134,19 @@ static void KnuthDiv(uint32_t *u, uint32_t *v, uint32_t *q, uint32_t* r, // The value d is expressed by the "shift" value above since we avoided // multiplication by d by using a shift left. So, all we have to do is // shift right here. In order to mak - uint32_t carry = 0; - DEBUG(cerr << "KnuthDiv: remainder:"); - for (int i = n-1; i >= 0; i--) { - r[i] = (u[i] >> shift) | carry; - carry = u[i] << shift; - DEBUG(cerr << " " << r[i]); + if (shift) { + uint32_t carry = 0; + DEBUG(cerr << "KnuthDiv: remainder:"); + for (int i = n-1; i >= 0; i--) { + r[i] = (u[i] >> shift) | carry; + carry = u[i] << (32 - shift); + DEBUG(cerr << " " << r[i]); + } + } else { + for (int i = n-1; i >= 0; i--) { + r[i] = u[i]; + DEBUG(cerr << " " << r[i]); + } } DEBUG(cerr << '\n'); }