(no commit message)
authorlkcl <lkcl@web>
Tue, 26 Apr 2022 13:10:47 +0000 (14:10 +0100)
committerIkiWiki <ikiwiki.info>
Tue, 26 Apr 2022 13:10:47 +0000 (14:10 +0100)
openpower/sv/biginteger/analysis.mdwn

index dc9d4ac87b560a3addc6470ca57d1f15fdb17f46..a29aa6a6b4842c69ce51f055ad380bfdb8ee7694 100644 (file)
@@ -320,15 +320,17 @@ the digits are 32 bit and, special-casing the overflow, a 64/32 divide is suffic
 ```
         // Compute estimate qhat of q[j] from top 2 digits
         uint64_t dig2 = ((uint64_t)un[j + n] << 32) | un[j + n - 1];
-        qhat = dig2 / vn[n - 1]; // 64/32 divide
-        rhat = dig2 % vn[n - 1]; // 64/32 modulo
-    again:
+        if (un[j+n] >= vn[n-1]) {
+            // rhat can be bigger than 32-bit when the division overflows,
+            rhat = dig2 - UINT32_MAX * vn[n - 1];
+        } else {
+            qhat = dig2 / vn[n - 1]; // 64/32 divide
+            rhat = dig2 % vn[n - 1]; // 64/32 modulo
+        }
         // use 3rd-from-top digit to obtain better accuracy
-        if (qhat >= b || qhat * vn[n - 2] > b * rhat + un[j + n - 2]) {
+        while (rhat < b || qhat * vn[n - 2] > b * rhat + un[j + n - 2]) {
             qhat = qhat - 1;
             rhat = rhat + vn[n - 1];
-            if (rhat < b)
-                goto again;
         }
 ```