From e81581d40e65c46a9074d51d5caaf64914694425 Mon Sep 17 00:00:00 2001 From: Amanieu d'Antras Date: Fri, 30 Jul 2021 00:23:15 +0200 Subject: [PATCH] Don't panic if the shift intrinsics receive out-of-range shifts LLVM sometimes emits calls with out-of-range shifts but then discards the results. We should avoid panics in these cases. --- src/int/shift.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/int/shift.rs b/src/int/shift.rs index 59909929..908e619e 100644 --- a/src/int/shift.rs +++ b/src/int/shift.rs @@ -6,13 +6,13 @@ trait Ashl: DInt { let n_h = Self::H::BITS; if shl & n_h != 0 { // we only need `self.lo()` because `self.hi()` will be shifted out entirely - (self.lo() << (shl - n_h)).widen_hi() + self.lo().wrapping_shl(shl - n_h).widen_hi() } else if shl == 0 { self } else { Self::from_lo_hi( - self.lo() << shl, - self.lo().logical_shr(n_h - shl) | (self.hi() << shl), + self.lo().wrapping_shl(shl), + self.lo().logical_shr(n_h - shl) | self.hi().wrapping_shl(shl), ) } } @@ -28,16 +28,16 @@ trait Ashr: DInt { let n_h = Self::H::BITS; if shr & n_h != 0 { Self::from_lo_hi( - self.hi() >> (shr - n_h), + self.hi().wrapping_shr(shr - n_h), // smear the sign bit - self.hi() >> (n_h - 1), + self.hi().wrapping_shr(n_h - 1), ) } else if shr == 0 { self } else { Self::from_lo_hi( - self.lo().logical_shr(shr) | (self.hi() << (n_h - shr)), - self.hi() >> shr, + self.lo().logical_shr(shr) | self.hi().wrapping_shl(n_h - shr), + self.hi().wrapping_shr(shr), ) } } @@ -57,7 +57,7 @@ trait Lshr: DInt { self } else { Self::from_lo_hi( - self.lo().logical_shr(shr) | (self.hi() << (n_h - shr)), + self.lo().logical_shr(shr) | self.hi().wrapping_shl(n_h - shr), self.hi().logical_shr(shr), ) }