[ci skip] flush
This commit is contained in:
parent
2ee4a0c8c6
commit
600859ed04
@ -165,7 +165,7 @@ macro_rules! uint_overflowing_mul {
|
||||
let self_t: &[u64; 4] = unsafe { &mem::transmute($self_expr) };
|
||||
let other_t: &[u64; 4] = unsafe { &mem::transmute($other) };
|
||||
|
||||
let overflow: u8;
|
||||
let overflow: u64;
|
||||
unsafe {
|
||||
asm!("
|
||||
mov $5, %rax
|
||||
@ -222,25 +222,25 @@ macro_rules! uint_overflowing_mul {
|
||||
adc $$0, %rdx
|
||||
or %rdx, %rcx
|
||||
|
||||
cmpq $$0, %rcx
|
||||
cmpq $$0, %rcx
|
||||
jne 2f
|
||||
|
||||
mov $8, %rax
|
||||
cmpq $$0, %rax
|
||||
sete %cl
|
||||
setne %cl
|
||||
|
||||
mov $7, %rax
|
||||
cmpq $$0, %rax
|
||||
sete %dl
|
||||
setne %dl
|
||||
or %dl, %cl
|
||||
|
||||
mov $3, %rax
|
||||
cmpq $$0, %rax
|
||||
sete %dl
|
||||
setne %dl
|
||||
|
||||
mov $2, %rax
|
||||
cmpq $$0, %rax
|
||||
sete %bl
|
||||
setne %bl
|
||||
or %bl, %dl
|
||||
|
||||
and %dl, %cl
|
||||
@ -253,7 +253,7 @@ macro_rules! uint_overflowing_mul {
|
||||
: /* $5 */ "m"(self_t[0]), /* $6 */ "m"(self_t[1]), /* $7 */ "m"(self_t[2]),
|
||||
/* $8 */ "m"(self_t[3]), /* $9 */ "m"(other_t[0]), /* $10 */ "m"(other_t[1]),
|
||||
/* $11 */ "m"(other_t[2]), /* $12 */ "m"(other_t[3])
|
||||
: "rax", "rdx"
|
||||
: "rax", "rdx", "rbx"
|
||||
:
|
||||
|
||||
);
|
||||
@ -740,23 +740,8 @@ macro_rules! construct_uint {
|
||||
type Output = $name;
|
||||
|
||||
fn add(self, other: $name) -> $name {
|
||||
let $name(ref me) = self;
|
||||
let $name(ref you) = other;
|
||||
let mut ret = [0u64; $n_words];
|
||||
let mut carry = [0u64; $n_words];
|
||||
let mut b_carry = false;
|
||||
for i in 0..$n_words {
|
||||
if i < $n_words - 1 {
|
||||
ret[i] = me[i].wrapping_add(you[i]);
|
||||
if ret[i] < me[i] {
|
||||
carry[i + 1] = 1;
|
||||
b_carry = true;
|
||||
}
|
||||
} else {
|
||||
ret[i] = me[i] + you[i];
|
||||
}
|
||||
}
|
||||
if b_carry { $name(ret) + $name(carry) } else { $name(ret) }
|
||||
let (result, _) = self.overflowing_add(other);
|
||||
result
|
||||
}
|
||||
}
|
||||
|
||||
@ -765,8 +750,7 @@ macro_rules! construct_uint {
|
||||
|
||||
#[inline]
|
||||
fn sub(self, other: $name) -> $name {
|
||||
let (result, overflow) = self.overflowing_sub(other);
|
||||
panic_on_overflow!(overflow);
|
||||
let (result, _) = self.overflowing_sub(other);
|
||||
result
|
||||
}
|
||||
}
|
||||
@ -775,15 +759,9 @@ macro_rules! construct_uint {
|
||||
type Output = $name;
|
||||
|
||||
fn mul(self, other: $name) -> $name {
|
||||
let mut res = $name::from(0u64);
|
||||
// TODO: be more efficient about this
|
||||
for i in 0..(2 * $n_words) {
|
||||
let v = self.mul_u32((other >> (32 * i)).low_u32());
|
||||
let (r, overflow) = v.overflowing_shl(32 * i as u32);
|
||||
panic_on_overflow!(overflow);
|
||||
res = res + r;
|
||||
}
|
||||
res
|
||||
let (result, overflow) = self.overflowing_mul(other);
|
||||
panic_on_overflow!(overflow);
|
||||
result
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user