cranelift: Sign extend Imm64 immediates

When an instruction has an `Imm64` immediate, but operates on values of a
narrower width, we need to sign extend the value.

Fixes #1095
This commit is contained in:
Nick Fitzgerald
2020-05-12 14:19:45 -07:00
parent 0bc0503f3f
commit 9b867b09c7
4 changed files with 103 additions and 1 deletions

View File

@@ -62,6 +62,21 @@ impl Imm64 {
pub fn bits(&self) -> i64 {
self.0
}
/// Sign extend this immediate as if it were a signed integer of the given
/// power-of-two width.
pub fn sign_extend_from_width(&mut self, bit_width: u16) {
debug_assert!(bit_width.is_power_of_two());
if bit_width >= 64 {
return;
}
let bit_width = bit_width as i64;
let delta = 64 - bit_width;
let sign_extended = (self.0 << delta) >> delta;
*self = Imm64(sign_extended);
}
}
impl Into<i64> for Imm64 {