use super::super::mul::kernels::{addmul_1, addmul_2};
pub(super) use super::super::mul::kernels::addmul_1 as row;
#[inline(always)]
pub(super) unsafe fn redc(
r: *mut u64,
u: *mut u64,
m: *const u64,
n: usize,
minv: [u64; 2],
) -> bool {
let [n0, n1] = minv;
unsafe {
let mut j = 0;
while j + 2 <= n {
let (u0, u1) = (*u.add(j), *u.add(j + 1));
let p = u128::from(u0) * u128::from(n0);
let q0 = p as u64;
let q1 = ((p >> 64) as u64)
.wrapping_add(u0.wrapping_mul(n1))
.wrapping_add(u1.wrapping_mul(n0));
let kept = *u.add(j + n);
let top = addmul_2(u.add(j), m, n, q0, q1, 0);
*u.add(j) = *u.add(j + n);
*u.add(j + 1) = top;
*u.add(j + n) = kept;
j += 2;
}
if j < n {
let q = (*u.add(j)).wrapping_mul(n0);
*u.add(j) = addmul_1(u.add(j), m, n, q);
}
super::super::mul::limbs::add_n(r, u.add(n), u, n)
}
}