================
@@ -2278,8 +2285,28 @@ void APInt::toString(SmallVectorImpl<char> &Str, 
unsigned Radix, bool Signed,
     }
   } else {
     int Pos = 0;
+    // The value of cutOffSize is not special, it is just a number of
+    // characters that gives us enough info without losing readability.
+    constexpr int cutOffSize = 20;
     while (Tmp.getBoolValue()) {
       uint64_t Digit;
+      if (truncate && Pos == cutOffSize) {
+        unsigned numDigits = (int32_t)(Tmp.logBase2()/log2(Radix))+1;
+        if(numDigits-cutOffSize > 0) {
+          // Calculating pow of exponents over 300000 takes a long time.
+          // To keep note printing time short(under 3s), values with more 
digits
+          // will only return the last 20 digits.
+          if(numDigits < 300000) {
+            APInt divider = 
APIntOps::pow(APInt(Tmp.getBitWidth(),Radix),numDigits-cutOffSize);
+            Tmp = Tmp.udiv(divider);
+            Str.append(3,'.');
+          }
+          else {
+            Str.append(3,'.');
----------------
erichkeane wrote:

Would there be any way to find the 'first' digit or something in this case?  I 
find myself wondering if there is a 'better' way here... 

IS there any special-casing we can do here for base-10?  I DO find myself 
wondering if `pow` is the best way for Radix==10.  I know that V<<3 + v << 1 is 
the same as *10, I wonder if someone better at math than I could come up with a 
way to apply that as a way to do the 10^N as a simple set of shifts/math? 

https://github.com/llvm/llvm-project/pull/145053
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to