[llvm-commits] CVS: llvm/lib/Support/APInt.cpp

Reid Spencer reid at x10sys.com
Tue Feb 20 16:30:05 PST 2007



Changes in directory llvm/lib/Support:

APInt.cpp updated: 1.25 -> 1.26
---
Log message:

Fix countLeadingZeros to actually return the correct number.
Fix toString to correctly return "0" for zero valued APInts over 128 bits.


---
Diffs of the changes:  (+13 -11)

 APInt.cpp |   24 +++++++++++++-----------
 1 files changed, 13 insertions(+), 11 deletions(-)


Index: llvm/lib/Support/APInt.cpp
diff -u llvm/lib/Support/APInt.cpp:1.25 llvm/lib/Support/APInt.cpp:1.26
--- llvm/lib/Support/APInt.cpp:1.25	Tue Feb 20 17:40:25 2007
+++ llvm/lib/Support/APInt.cpp	Tue Feb 20 18:29:48 2007
@@ -696,18 +696,20 @@
 /// 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 @@
     result = "-";
     insert_at = 1;
   }
-  if (tmp == 0)
+  if (tmp == APInt(tmp.getBitWidth(), 0))
     result = "0";
   else while (tmp.ne(zero)) {
     APInt APdigit(1,0);






More information about the llvm-commits mailing list