if (rhat < b) goto again;
}
-#define SUB_MUL_BORROW
+#define MUL_RSUB_CARRY
#ifdef ORIGINAL
// Multiply and subtract.
k = 0;
// Multiply and subtract.
uint32_t carry = 1;
+ uint32_t phi[2000]; // plenty space
+ uint32_t plo[2000]; // plenty space
for(int i = 0; i <= n; i++) {
uint32_t vn_i = i < n ? vn[i] : 0;
- uint64_t result = un[i + j] + ~((uint64_t)qhat * vn_i) + carry;
+ uint64_t value = un[i + j] + ~((uint64_t)qhat * vn_i);
+ plo[i] = value & 0xffffffffLL;
+ phi[i] = value >> 32;
+ }
+ for(int i = 0; i <= n; i++) {
+ uint64_t result = (((uint64_t)phi[i]<<32) | plo[i]) + carry;
uint32_t result_high = result >> 32;
if(carry <= 1)
result_high++;