diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2007-02-21 00:29:48 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2007-02-21 00:29:48 +0000 |
commit | e549c4940c414521ea4872f0da2ebcfe510f5317 (patch) | |
tree | 00d362b6c4b9507cb20cb9281aa9d446fe1dc2ab /lib/Support/APInt.cpp | |
parent | 54362ca09512419734b5edc7e42e1fb90457377e (diff) |
Fix countLeadingZeros to actually return the correct number.
Fix toString to correctly return "0" for zero valued APInts over 128 bits.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34459 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support/APInt.cpp')
-rw-r--r-- | lib/Support/APInt.cpp | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/lib/Support/APInt.cpp b/lib/Support/APInt.cpp index 9dca64085c..4bb9ff749e 100644 --- a/lib/Support/APInt.cpp +++ b/lib/Support/APInt.cpp @@ -696,18 +696,20 @@ bool APInt::isPowerOf2() const { /// the number of zeros from the most significant bit to the first one bit. /// @returns numWord() * 64 if the value is zero. uint32_t APInt::countLeadingZeros() const { - if (isSingleWord()) - return CountLeadingZeros_64(VAL) - (APINT_BITS_PER_WORD - BitWidth); uint32_t Count = 0; - for (uint32_t i = getNumWords(); i > 0u; --i) { - uint32_t tmp = CountLeadingZeros_64(pVal[i-1]); - Count += tmp; - if (tmp != APINT_BITS_PER_WORD) - if (i == getNumWords()) - Count -= (APINT_BITS_PER_WORD - whichBit(BitWidth)); - break; + if (isSingleWord()) + Count = CountLeadingZeros_64(VAL); + else { + for (uint32_t i = getNumWords(); i > 0u; --i) { + if (pVal[i-1] == 0) + Count += APINT_BITS_PER_WORD; + else { + Count += CountLeadingZeros_64(pVal[i-1]); + break; + } + } } - return Count; + return Count - (APINT_BITS_PER_WORD - (BitWidth % APINT_BITS_PER_WORD)); } /// countTrailingZeros - This function is a APInt version corresponding to @@ -1513,7 +1515,7 @@ std::string APInt::toString(uint8_t radix, bool wantSigned) const { result = "-"; insert_at = 1; } - if (tmp == 0) + if (tmp == APInt(tmp.getBitWidth(), 0)) result = "0"; else while (tmp.ne(zero)) { APInt APdigit(1,0); |