use crate::arithmetic::inlineops::*;
use std::cmp::Ordering;
pub(crate) fn sig_pos(x: &[u64]) -> usize {
if x.last() == Some(&0) {
return x.iter().rposition(|&x| x != 0).map_or(0, |i| i + 1);
}
x.len()
}
pub(crate) fn cmp_slice(x: &[u64], y: &[u64]) -> Ordering {
if x.len() > y.len() {
return Ordering::Greater;
}
if x.len() < y.len() {
Ordering::Less
} else {
Iterator::cmp(x.iter().rev(), y.iter().rev())
}
}
pub(crate) fn _shr_slice(x: &mut [u64], shift: u32) -> u64 {
let mut carry = 0u64;
for i in x.iter_mut().rev() {
carry = carry_shr(carry, *i, shift, i);
}
carry
}
pub(crate) fn shl_slice(x: &mut [u64], shift: u32) -> u64 {
let mut carry = 0u64;
for i in x.iter_mut() {
carry = carry_shl(carry, *i, shift, i);
}
carry
}
#[inline]
pub(crate) fn add_slice(x: &mut [u64], y: &[u64]) -> u8 {
let mut carry = 0u8;
let (lo, hi) = x.split_at_mut(y.len());
for (i, j) in lo.iter_mut().zip(y.iter()) {
carry = adc(carry, *i, *j, i);
}
if carry > 0u8 {
for k in hi.iter_mut() {
carry = adc(carry, *k, 0u64, k);
if carry == 0u8 {
break;
}
}
}
carry
}
pub(crate) fn sub_slice(x: &mut [u64], y: &[u64]) -> u8 {
let mut carry = 0u8;
let (lo, hi) = x.split_at_mut(y.len());
for (i, j) in lo.iter_mut().zip(y.iter()) {
carry = sbb(carry, *i, *j, i);
}
if carry > 0u8 {
for k in hi.iter_mut() {
carry = sbb(carry, *k, 0u64, k);
if carry == 0u8 {
break;
}
}
}
carry
}
pub(crate) fn scale_slice(x: &mut [u64], scale: u64) -> u64 {
let mut carry = 0u64;
for i in x.iter_mut() {
carry = carry_mul(carry, *i, scale, i);
}
carry
}
pub(crate) fn div_slice(x: &mut [u64], divisor: u64) -> u64 {
let mut carry = 0u64;
for i in x.iter_mut().rev() {
carry = carry_div(carry, *i, divisor, i);
}
carry
}
pub(crate) fn mod_slice(x: &[u64], divisor: u64) -> u64 {
let mut carry = 0u64;
for i in x.iter().rev() {
carry = carry_mod(carry, *i, divisor);
}
carry
}