split MUL_RSUB_CARRY into 2 loops
authorLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Mon, 18 Apr 2022 18:55:51 +0000 (19:55 +0100)
committerLuke Kenneth Casson Leighton <lkcl@lkcl.net>
Mon, 18 Apr 2022 18:55:51 +0000 (19:55 +0100)
again make them look like 2 instructions

openpower/sv/bitmanip/divmnu64.c

index 44310d32d3655a1d91593cde3302c9dc0ec99d95..e5cd1f1d15adbcd3c7d21a32d825d3af7dec1ad9 100644 (file)
@@ -107,7 +107,7 @@ again:
         if (rhat < b) goto again;
       }
 
-#define SUB_MUL_BORROW
+#define MUL_RSUB_CARRY
 #ifdef ORIGINAL
       // Multiply and subtract.
       k = 0;
@@ -150,9 +150,16 @@ again:
 
       // 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++;