(no commit message)
authorlkcl <lkcl@web>
Sun, 24 Apr 2022 21:00:16 +0000 (22:00 +0100)
committerIkiWiki <ikiwiki.info>
Sun, 24 Apr 2022 21:00:16 +0000 (22:00 +0100)
openpower/sv/biginteger/analysis.mdwn

index c77a7a8598c2502910c1f0afebb6953483c91e58..1f422337cc799f4329cd348f2083139e6edac8dc 100644 (file)
@@ -369,12 +369,24 @@ In this way a Scalar Integer divide can be performed in the same
 time-order as Newton-Raphson, using two hardware multipliers
 and a subtract.
 
+There is however another reason for having a 128/64 division
+instruction, and it's effectively the reverse of `madded`.
+Look closely at Algorithm D when the divisor is only a scalar
+(`v[0]`):
+
 ```
         k = 0; // the case of a
         for (j = m - 1; j >= 0; j--)
         {                                 // single-digit
-            uint64_t dig2 = (k * b + u[j]);
+            uint64_t dig2 = ((k << 32) | u[j]);
             q[j] = dig2 / v[0]; // divisor here.
-            k = dig2 % v[0]; // modulo bak into next loop
+            k = dig2 % v[0]; // modulo back into next loop
         }
 ```
+
+Here, just as with `madded` which can put the hi-half of the 128 bit product
+back in as a form of 64-bit carry, a scalar divisor of a vector dividend
+puts the modulo back in as the hi-half of a 128/64-bit divide.
+By a nice coincidence this is exactly the same 128/64-bit operation
+needed for the `qhat` estimate if it may produce both the quotient and
+the remainder.