mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-19 15:13:49 -04:00
APInt: Slightly simplify countLeadingZerosSlowCase()
We always clear the unused bits in the most signifant word so there is no need to mask them out in countLeadingZerosSlowCase(). Differential Revision: http://reviews.llvm.org/D16621 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@260911 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
+8
-19
@@ -676,30 +676,19 @@ APInt APInt::getLoBits(unsigned numBits) const {
|
||||
}
|
||||
|
||||
unsigned APInt::countLeadingZerosSlowCase() const {
|
||||
// Treat the most significand word differently because it might have
|
||||
// meaningless bits set beyond the precision.
|
||||
unsigned BitsInMSW = BitWidth % APINT_BITS_PER_WORD;
|
||||
integerPart MSWMask;
|
||||
if (BitsInMSW) MSWMask = (integerPart(1) << BitsInMSW) - 1;
|
||||
else {
|
||||
MSWMask = ~integerPart(0);
|
||||
BitsInMSW = APINT_BITS_PER_WORD;
|
||||
}
|
||||
|
||||
unsigned i = getNumWords();
|
||||
integerPart MSW = pVal[i-1] & MSWMask;
|
||||
if (MSW)
|
||||
return llvm::countLeadingZeros(MSW) - (APINT_BITS_PER_WORD - BitsInMSW);
|
||||
|
||||
unsigned Count = BitsInMSW;
|
||||
for (--i; i > 0u; --i) {
|
||||
if (pVal[i-1] == 0)
|
||||
unsigned Count = 0;
|
||||
for (int i = getNumWords()-1; i >= 0; --i) {
|
||||
integerPart V = pVal[i];
|
||||
if (V == 0)
|
||||
Count += APINT_BITS_PER_WORD;
|
||||
else {
|
||||
Count += llvm::countLeadingZeros(pVal[i-1]);
|
||||
Count += llvm::countLeadingZeros(V);
|
||||
break;
|
||||
}
|
||||
}
|
||||
// Adjust for unused bits in the most significant word (they are zero).
|
||||
unsigned Mod = BitWidth % APINT_BITS_PER_WORD;
|
||||
Count -= Mod > 0 ? APINT_BITS_PER_WORD - Mod : 0;
|
||||
return Count;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user