split out bigdiv as separate function
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Tue, 26 Apr 2022 16:12:16 +0000 (17:12 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Tue, 26 Apr 2022 16:12:16 +0000 (17:12 +0100)
openpower/sv/biginteger/divgnu64.c

index 3c216eff856fd8e34cc3ed29c595be28f89453d2..762f8d9655fca14faacfdc005bf4041956970989 100644 (file)
@@ -70,6 +70,17 @@ void biglsh(unsigned s, unsigned vn[], unsigned const v[], int n)
     vn[0] = v[0] << s;
 }
 
+long bigdiv(unsigned v, unsigned q[], unsigned const u[], int m)
+{
+    long long k = 0; // the case of a
+    for (int j = m - 1; j >= 0; j--) { // single-digit
+        unsigned long d2 = (k << 32) | u[j];
+        q[j] = d2 / v; // divisor here.
+        k    = d2 % v;
+    }
+    return k;
+}
+
 bool bigmul(unsigned long long qhat, unsigned product[], unsigned vn[], int m,
             int n)
 {
@@ -166,11 +177,7 @@ int divmnu(unsigned q[], unsigned r[], const unsigned u[], const unsigned v[],
         return 1; // Return if invalid param.
 
     if (n == 1) { // Take care of
-        k = 0; // the case of a
-        for (j = m - 1; j >= 0; j--) { // single-digit
-            q[j] = (k * b + u[j]) / v[0]; // divisor here.
-            k = (k * b + u[j]) - q[j] * v[0];
-        }
+        k = bigdiv(v[0], q, u, m);
         if (r != NULL)
             r[0] = k;
         return 0;