[libc-commits] [libc] [libc] Allow BigInt class to use base word types other than uint64_t. (PR #81634)
via libc-commits
libc-commits at lists.llvm.org
Tue Feb 13 10:18:20 PST 2024
================
@@ -403,127 +408,139 @@ template <size_t Bits, bool Signed> struct BigInt {
return nullopt;
}
- BigInt<Bits, Signed> quotient(0);
- BigInt<Bits, Signed> subtractor = other;
+ BigInt<Bits, Signed, WordType> quotient(0);
+ BigInt<Bits, Signed, WordType> subtractor = other;
int cur_bit = static_cast<int>(subtractor.clz() - this->clz());
subtractor.shift_left(cur_bit);
for (; cur_bit >= 0 && *this > 0; --cur_bit, subtractor.shift_right(1)) {
if (*this >= subtractor) {
this->sub(subtractor);
- quotient = quotient | (BigInt<Bits, Signed>(1) << cur_bit);
+ quotient = quotient | (BigInt<Bits, Signed, WordType>(1) << cur_bit);
}
}
remainder = *this;
*this = quotient;
return remainder;
}
- // Efficiently perform BigInt / (x * 2^e), where x is a 32-bit unsigned
- // integer, and return the remainder. The main idea is as follow:
+ // Efficiently perform BigInt / (x * 2^e), where x is a half-word-size
+ // unsigned integer, and return the remainder. The main idea is as follow:
// Let q = y / (x * 2^e) be the quotient, and
// r = y % (x * 2^e) be the remainder.
// First, notice that:
// r % (2^e) = y % (2^e),
// so we just need to focus on all the bits of y that is >= 2^e.
// To speed up the shift-and-add steps, we only use x as the divisor, and
// performing 32-bit shiftings instead of bit-by-bit shiftings.
- // Since the remainder of each division step < x < 2^32, the computation of
- // each step is now properly contained within uint64_t.
+ // Since the remainder of each division step < x < 2^(WORD_SIZE / 2), the
+ // computation of each step is now properly contained within WordType.
// And finally we perform some extra alignment steps for the remaining bits.
- LIBC_INLINE constexpr optional<BigInt<Bits, Signed>>
- div_uint32_times_pow_2(uint32_t x, size_t e) {
- BigInt<Bits, Signed> remainder(0);
+ // template <typename T>
----------------
michaelrj-google wrote:
it looks like you decided to not go with this design, should the code be deleted and comments reverted?
https://github.com/llvm/llvm-project/pull/81634
More information about the libc-commits
mailing list