mul.rs: use wrapping_mul not plain
rustc in debug mode with a plain multiplication will call @llvm.umul.with.overflow.* which may call the builtin resulting in infinite recursion.
This commit is contained in:
parent
0fd5e7549f
commit
ee0aacf4be
|
@ -9,18 +9,18 @@ macro_rules! mul {
|
||||||
pub extern "C" fn $intrinsic(a: $ty, b: $ty) -> $ty {
|
pub extern "C" fn $intrinsic(a: $ty, b: $ty) -> $ty {
|
||||||
let half_bits = <$ty>::bits() / 4;
|
let half_bits = <$ty>::bits() / 4;
|
||||||
let lower_mask = !0 >> half_bits;
|
let lower_mask = !0 >> half_bits;
|
||||||
let mut low = (a.low() & lower_mask) * (b.low() & lower_mask);
|
let mut low = (a.low() & lower_mask).wrapping_mul(b.low() & lower_mask);
|
||||||
let mut t = low >> half_bits;
|
let mut t = low >> half_bits;
|
||||||
low &= lower_mask;
|
low &= lower_mask;
|
||||||
t += (a.low() >> half_bits) * (b.low() & lower_mask);
|
t += (a.low() >> half_bits).wrapping_mul(b.low() & lower_mask);
|
||||||
low += (t & lower_mask) << half_bits;
|
low += (t & lower_mask) << half_bits;
|
||||||
let mut high = t >> half_bits;
|
let mut high = t >> half_bits;
|
||||||
t = low >> half_bits;
|
t = low >> half_bits;
|
||||||
low &= lower_mask;
|
low &= lower_mask;
|
||||||
t += (b.low() >> half_bits) * (a.low() & lower_mask);
|
t += (b.low() >> half_bits).wrapping_mul(a.low() & lower_mask);
|
||||||
low += (t & lower_mask) << half_bits;
|
low += (t & lower_mask) << half_bits;
|
||||||
high += t >> half_bits;
|
high += t >> half_bits;
|
||||||
high += (a.low() >> half_bits) * (b.low() >> half_bits);
|
high += (a.low() >> half_bits).wrapping_mul(b.low() >> half_bits);
|
||||||
high = high.wrapping_add(a.high().wrapping_mul(b.low()).wrapping_add(a.low().wrapping_mul(b.high())));
|
high = high.wrapping_add(a.high().wrapping_mul(b.low()).wrapping_add(a.low().wrapping_mul(b.high())));
|
||||||
<$ty>::from_parts(low, high)
|
<$ty>::from_parts(low, high)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue