pub(crate) type Limb = u64;
pub(crate) type DLimb = u128;
pub(crate) const LIMB_BITS: u32 = Limb::BITS;
#[inline]
pub(crate) const fn adc(a: Limb, b: Limb, carry_in: Limb) -> (Limb, Limb) {
let t = a as DLimb + b as DLimb + carry_in as DLimb;
(t as Limb, (t >> LIMB_BITS) as Limb)
}
#[inline]
pub(crate) const fn sbb(a: Limb, b: Limb, borrow_in: Limb) -> (Limb, Limb) {
let t = (a as DLimb)
.wrapping_sub(b as DLimb)
.wrapping_sub(borrow_in as DLimb);
(t as Limb, ((t >> LIMB_BITS) as Limb) & 1)
}
#[inline]
pub(crate) const fn mac(acc: Limb, a: Limb, b: Limb, carry_in: Limb) -> (Limb, Limb) {
let t = acc as DLimb + a as DLimb * b as DLimb + carry_in as DLimb;
(t as Limb, (t >> LIMB_BITS) as Limb)
}