add original variants back
authorJacob Lifshay <programmerjake@gmail.com>
Mon, 18 Apr 2022 20:39:49 +0000 (13:39 -0700)
committerJacob Lifshay <programmerjake@gmail.com>
Mon, 18 Apr 2022 20:40:56 +0000 (13:40 -0700)
openpower/sv/bitmanip/divmnu64.c

index bc9b033b1b3e565417d5373c6e3f4c6bdaeb7143..1249ddab5a995a8750ed9127d5320adc8fe5d826 100644 (file)
@@ -107,7 +107,6 @@ again:
         if (rhat < b) goto again;
       }
 
-#define SUB_MUL_BORROW
 #ifdef ORIGINAL
       // Multiply and subtract.
       k = 0;
@@ -123,6 +122,33 @@ again:
 #elif defined(SUB_MUL_BORROW)
       (void)p; // shut up unused variable warning
 
+      // Multiply and subtract.
+      uint32_t borrow = 0;
+      for(int i = 0; i <= n; i++) {
+         uint32_t vn_i = i < n ? vn[i] : 0;
+         uint64_t value = un[i + j] - (uint64_t)qhat * vn_i - borrow;
+         borrow = -(uint32_t)(value >> 32);
+         un[i + j] = (uint32_t)value;
+      }
+      bool need_fixup = borrow != 0;
+#elif defined(MUL_RSUB_CARRY)
+      (void)p; // shut up unused variable warning
+
+      // Multiply and subtract.
+      uint32_t carry = 1;
+      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;
+         uint32_t result_high = result >> 32;
+         if(carry <= 1)
+            result_high++;
+         carry = result_high;
+         un[i + j] = (uint32_t)result;
+      }
+      bool need_fixup = carry != 1;
+#elif defined(SUB_MUL_BORROW_2_STAGE)
+      (void)p; // shut up unused variable warning
+
       // Multiply and subtract.
       uint32_t borrow = 0;
       uint32_t phi[2000]; // plenty space
@@ -145,7 +171,7 @@ again:
          un[i + j] = (uint32_t)value;
       }
       bool need_fixup = borrow != 0;
-#elif defined(MUL_RSUB_CARRY)
+#elif defined(MUL_RSUB_CARRY_2_STAGE)
       (void)p; // shut up unused variable warning
 
       // Multiply and subtract.
@@ -167,7 +193,7 @@ again:
          un[i + j] = (uint32_t)result;
       }
       bool need_fixup = carry != 1;
-#elif defined(MUL_RSUB_CARRY1)
+#elif defined(MUL_RSUB_CARRY_2_STAGE1)
       (void)p; // shut up unused variable warning
 
       // Multiply and subtract.
@@ -195,7 +221,7 @@ again:
       }
       bool need_fixup = carry != 1;
 #else
-#error need to define one of ORIGINAL, SUB_MUL_BORROW, or MUL_RSUB_CARRY
+#error need to choose one of the algorithm options; e.g. -DORIGINAL
 #endif
 
       q[j] = qhat;              // Store quotient digit.