Subtraction optimization
This commit is contained in:
parent
c5840be1cb
commit
76865694ce
@ -166,9 +166,22 @@ macro_rules! uint_overflowing_add {
|
|||||||
#[cfg(not(all(asm_available, target_arch="x86_64")))]
|
#[cfg(not(all(asm_available, target_arch="x86_64")))]
|
||||||
macro_rules! uint_overflowing_sub {
|
macro_rules! uint_overflowing_sub {
|
||||||
($name:ident, $n_words: expr, $self_expr: expr, $other: expr) => ({
|
($name:ident, $n_words: expr, $self_expr: expr, $other: expr) => ({
|
||||||
let res = overflowing!((!$other).overflowing_add(From::from(1u64)));
|
let $name(ref me) = $self_expr;
|
||||||
let res = overflowing!($self_expr.overflowing_add(res));
|
let $name(ref you) = $other;
|
||||||
(res, $self_expr < $other)
|
|
||||||
|
let mut ret = [0u64; $n_words];
|
||||||
|
let mut carry = 0u64;
|
||||||
|
|
||||||
|
for i in 0..$n_words {
|
||||||
|
let (res1, overflow1) = me[i].overflowing_sub(you[i]);
|
||||||
|
let (res2, overflow2) = res1.overflowing_sub(carry);
|
||||||
|
|
||||||
|
ret[i] = res2;
|
||||||
|
carry = overflow1 as u64 + overflow2 as u64;
|
||||||
|
}
|
||||||
|
|
||||||
|
($name(ret), carry > 0)
|
||||||
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user