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

@@ -0,0 +1,39 @@
test simple_preopt
target x86_64
;; Tests for sign-extending immediates.
function %sign_extend_signed_icmp(i8) -> b1 {
block0(v0: i8):
; 255 = -1 as u8
v1 = iconst.i8 255
v2 = icmp sge v0, v1
; check: v2 = icmp_imm sge v0, -1
return v2
}
function %do_not_sign_extend_unsigned_icmp(i8) -> b1 {
block0(v0: i8):
v1 = iconst.i8 255
v2 = icmp uge v0, v1
; check: v2 = icmp_imm uge v0, 255
return v2
}
function %sign_extend_sdiv(i8) -> i8 {
block0(v0: i8):
; 255 = -1 as u8
v1 = iconst.i8 255
v2 = sdiv v0, v1
; check: v2 = sdiv_imm v0, -1
return v2
}
function %sign_extend_srem(i8) -> i8 {
block0(v0: i8):
; 255 = -1 as u8
v1 = iconst.i8 255
v2 = srem v0, v1
; check: v2 = srem_imm v0, -1
return v2
}