msf 0.0.1

multiprecision int/float library
Documentation
use super::*;
use equator::debug_assert;

fn widening_mul_acc(lhs: Limb, rhs: Limb, acc: Limb, carry: Limb) -> (Limb, Limb) {
    let wide = acc as u128 + carry as u128 + lhs as u128 * rhs as u128;
    (wide as u64, (wide >> 64) as u64)
}

#[inline]
pub fn mul_bigint(full_mul: &mut [Limb], lhs: &[Limb], rhs: &[Limb]) {
    debug_assert!(full_mul.len() == lhs.len() + rhs.len());
    full_mul.fill(consts::LIMB_ZERO);
    for (i, &l) in lhs.iter().enumerate() {
        let dst = &mut full_mul[i..];
        let mut carry = consts::LIMB_ZERO;
        for (dst, &r) in core::iter::zip(&mut *dst, rhs) {
            (*dst, carry) = widening_mul_acc(l, r, *dst, carry);
        }
        dst[rhs.len()] = carry;
    }
}