From ee0aacf4be036263302479bed91c3f250573e592 Mon Sep 17 00:00:00 2001 From: James Duley Date: Mon, 2 Jan 2017 22:57:38 +1300 Subject: [PATCH] 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. --- src/int/mul.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/int/mul.rs b/src/int/mul.rs index db9f0d9..0403aa9 100644 --- a/src/int/mul.rs +++ b/src/int/mul.rs @@ -9,18 +9,18 @@ macro_rules! mul { pub extern "C" fn $intrinsic(a: $ty, b: $ty) -> $ty { let half_bits = <$ty>::bits() / 4; 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; 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; let mut high = t >> half_bits; t = low >> half_bits; 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; 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()))); <$ty>::from_parts(low, high) }