big leftshift split out
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Tue, 26 Apr 2022 14:26:22 +0000 (15:26 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Tue, 26 Apr 2022 14:26:22 +0000 (15:26 +0100)
openpower/sv/biginteger/divgnu64.c

index 483f099a54e3e04cdaeef48827541397e3dc0c06..18e765e6d6c9ed59fd64f965fa4229d890c2db5c 100644 (file)
@@ -63,6 +63,13 @@ void bigrsh(unsigned s, unsigned r[], unsigned un[], int n)
     r[n - 1] = un[n - 1] >> s;
 }
 
+void biglsh(unsigned s, unsigned vn[], unsigned const v[], int n)
+{
+    for (int i = n - 1; i > 0; i--)
+        vn[i] = (v[i] << s) | ((unsigned long long)v[i - 1] >> (32 - s));
+    vn[0] = v[0] << s;
+}
+
 bool bigmul(unsigned long long qhat, unsigned product[], unsigned vn[], int m,
             int n)
 {
@@ -177,15 +184,11 @@ int divmnu(unsigned q[], unsigned r[], const unsigned u[], const unsigned v[],
 
     s = nlz(v[n - 1]); // 0 <= s <= 31.
     vn = (unsigned *)alloca(4 * n);
-    for (i = n - 1; i > 0; i--)
-        vn[i] = (v[i] << s) | ((unsigned long long)v[i - 1] >> (32 - s));
-    vn[0] = v[0] << s;
+    biglsh(s, vn, v, n);
 
     un = (unsigned *)alloca(4 * (m + 1));
     un[m] = (unsigned long long)u[m - 1] >> (32 - s);
-    for (i = m - 1; i > 0; i--)
-        un[i] = (u[i] << s) | ((unsigned long long)u[i - 1] >> (32 - s));
-    un[0] = u[0] << s;
+    biglsh(s, un, u, m);
 
     for (j = m - n; j >= 0; j--)
     { // Main loop.