From b0f6e3d316944285f48e12a05dfd1847a1258f17 Mon Sep 17 00:00:00 2001 From: Jacob Lifshay Date: Mon, 18 Apr 2022 13:39:49 -0700 Subject: [PATCH] add original variants back --- openpower/sv/bitmanip/divmnu64.c | 34 ++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/openpower/sv/bitmanip/divmnu64.c b/openpower/sv/bitmanip/divmnu64.c index bc9b033b1..1249ddab5 100644 --- a/openpower/sv/bitmanip/divmnu64.c +++ b/openpower/sv/bitmanip/divmnu64.c @@ -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. -- 2.30.2