]> granicus.if.org Git - llvm/commitdiff
[APInt] Make toString use udivrem instead of calling the divide helper method directl...
authorCraig Topper <craig.topper@gmail.com>
Wed, 10 May 2017 18:15:24 +0000 (18:15 +0000)
committerCraig Topper <craig.topper@gmail.com>
Wed, 10 May 2017 18:15:24 +0000 (18:15 +0000)
This lets toString take advantage of the degenerate case checks in udivrem and is just generally cleaner.

One minor downside of this is that the divisor APInt now needs to be the same size as Tmp which requires an additional allocation. But we were doing a poor job of reusing allocations before so the new code should still be an improvement.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@302704 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Support/APInt.cpp

index 90aba5b36248d67da79a40da6c9a8bfd4e78a482..227cfbd2e2eb153a2f5bcc96d77f7604de4d4172 100644 (file)
@@ -1948,22 +1948,23 @@ void APInt::toString(SmallVectorImpl<char> &Str, unsigned Radix,
     unsigned ShiftAmt = (Radix == 16 ? 4 : (Radix == 8 ? 3 : 1));
     unsigned MaskAmt = Radix - 1;
 
-    while (Tmp != 0) {
+    while (Tmp.getBoolValue()) {
       unsigned Digit = unsigned(Tmp.getRawData()[0]) & MaskAmt;
       Str.push_back(Digits[Digit]);
       Tmp.lshrInPlace(ShiftAmt);
     }
   } else {
-    APInt divisor(Radix == 10? 4 : 8, Radix);
-    while (Tmp != 0) {
-      APInt APdigit(1, 0);
-      APInt tmp2(Tmp.getBitWidth(), 0);
-      divide(Tmp, Tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2,
-             &APdigit);
+    APInt divisor(Tmp.getBitWidth(), Radix);
+    APInt APdigit;
+    APInt tmp2(Tmp.getBitWidth(), 0);
+    while (Tmp.getBoolValue()) {
+      udivrem(Tmp, divisor, tmp2, APdigit);
       unsigned Digit = (unsigned)APdigit.getZExtValue();
       assert(Digit < Radix && "divide failed");
       Str.push_back(Digits[Digit]);
-      Tmp = tmp2;
+      // Move the quotient into Tmp and move the old allocation of Tmp into
+      // tmp2 to be used on the next loop iteration.
+      std::swap(Tmp, tmp2);
     }
   }