#[inline(always)]
pub const fn _div_64(dividend: u64, divisor: u64) -> u64 {
debug_assert!(divisor != 0);
if dividend < divisor {
0
} else if divisor == 1 {
dividend
} else if divisor == dividend {
1
} else {
dividend / divisor
}
}
#[inline(always)]
pub const fn _div_rem_64(dividend: u64, divisor: u64) -> (u64, u64) {
debug_assert!(divisor != 0);
if dividend < divisor {
(0, dividend)
} else if divisor == 1 {
(dividend, 0)
} else if divisor == dividend {
(1, 0)
} else {
let q = dividend / divisor;
let r = dividend % divisor;
(q, r)
}
}
#[inline]
#[allow(clippy::needless_late_init)]
pub const fn _div_rem_128_64(mut low: u64, mut high: u64, mut den: u64) -> (u64, u64) {
debug_assert!(high < den);
const B: u64 = 1 << 32;
let q1: u32;
let q0: u32;
let shift: u32;
let den1: u32;
let den0: u32;
let num1: u32;
let num0: u32;
let rem;
let mut qhat: u64;
let mut rhat: u64;
let mut c1: u64;
let mut c2: u64;
shift = den.leading_zeros();
den <<= shift;
high <<= shift;
high |= (low >> (-(shift as i32) & 63)) & (-(shift as i64) >> 63) as u64;
low <<= shift;
num1 = (low >> 32) as u32;
num0 = (low & 0xFFFFFFFF) as u32;
den1 = (den >> 32) as u32;
den0 = (den & 0xFFFFFFFF) as u32;
qhat = high / den1 as u64;
rhat = high % den1 as u64;
c1 = qhat * den0 as u64;
c2 = rhat * B + num1 as u64;
if c1 > c2 {
if c1 - c2 > den {
qhat -= 2;
} else {
qhat -= 1;
}
}
q1 = qhat as u32;
rem = high
.wrapping_mul(B)
.wrapping_add(num1 as u64)
.wrapping_sub((q1 as u64).wrapping_mul(den));
qhat = rem / den1 as u64;
rhat = rem % den1 as u64;
c1 = qhat * den0 as u64;
c2 = rhat * B + num0 as u64;
if c1 > c2 {
if c1 - c2 > den {
qhat -= 2;
} else {
qhat -= 1;
}
}
q0 = qhat as u32;
(
((q1 as u64) << 32) | q0 as u64,
(rem.wrapping_mul(B)
.wrapping_add(num0 as u64)
.wrapping_sub((q0 as u64).wrapping_mul(den)))
>> shift,
)
}