cranelift: Fix brz,brnz instructions in the interpreter
This commit is contained in:
committed by
Andrew Brown
parent
d33f8337b3
commit
004af01a88
@@ -1,3 +1,4 @@
|
|||||||
|
test interpret
|
||||||
test run
|
test run
|
||||||
target aarch64
|
target aarch64
|
||||||
target arm
|
target arm
|
||||||
@@ -5,9 +6,23 @@ target s390x
|
|||||||
target x86_64 machinst
|
target x86_64 machinst
|
||||||
target x86_64 legacy
|
target x86_64 legacy
|
||||||
|
|
||||||
function u0:0() -> b1 {
|
function %jump() -> b1 {
|
||||||
block0:
|
block0:
|
||||||
v0 = iconst.i8 0
|
jump block2
|
||||||
|
|
||||||
|
block1:
|
||||||
|
v0 = bconst.b1 false
|
||||||
|
return v0
|
||||||
|
|
||||||
|
block2:
|
||||||
|
v1 = bconst.b1 true
|
||||||
|
return v1
|
||||||
|
}
|
||||||
|
; run: %jump() == true
|
||||||
|
|
||||||
|
|
||||||
|
function %brz_i64(i64) -> b1 {
|
||||||
|
block0(v0: i64):
|
||||||
brz v0, block1
|
brz v0, block1
|
||||||
jump block2
|
jump block2
|
||||||
|
|
||||||
@@ -19,20 +34,195 @@ block2:
|
|||||||
v2 = bconst.b1 false
|
v2 = bconst.b1 false
|
||||||
return v2
|
return v2
|
||||||
}
|
}
|
||||||
; run
|
; run: %brz_i64(0) == true
|
||||||
|
; run: %brz_i64(1) == false
|
||||||
|
; run: %brz_i64(-1) == false
|
||||||
|
|
||||||
function u0:1() -> b1 {
|
function %brz_i32(i32) -> b1 {
|
||||||
|
block0(v0: i32):
|
||||||
|
brz v0, block1
|
||||||
|
jump block2
|
||||||
|
|
||||||
|
block1:
|
||||||
|
v1 = bconst.b1 true
|
||||||
|
return v1
|
||||||
|
|
||||||
|
block2:
|
||||||
|
v2 = bconst.b1 false
|
||||||
|
return v2
|
||||||
|
}
|
||||||
|
; run: %brz_i32(0) == true
|
||||||
|
; run: %brz_i32(1) == false
|
||||||
|
; run: %brz_i32(-1) == false
|
||||||
|
|
||||||
|
function %brz_i16(i16) -> b1 {
|
||||||
|
block0(v0: i16):
|
||||||
|
brz v0, block1
|
||||||
|
jump block2
|
||||||
|
|
||||||
|
block1:
|
||||||
|
v1 = bconst.b1 true
|
||||||
|
return v1
|
||||||
|
|
||||||
|
block2:
|
||||||
|
v2 = bconst.b1 false
|
||||||
|
return v2
|
||||||
|
}
|
||||||
|
; run: %brz_i16(0) == true
|
||||||
|
; run: %brz_i16(1) == false
|
||||||
|
; run: %brz_i16(-1) == false
|
||||||
|
|
||||||
|
function %brz_i8(i8) -> b1 {
|
||||||
|
block0(v0: i8):
|
||||||
|
brz v0, block1
|
||||||
|
jump block2
|
||||||
|
|
||||||
|
block1:
|
||||||
|
v1 = bconst.b1 true
|
||||||
|
return v1
|
||||||
|
|
||||||
|
block2:
|
||||||
|
v2 = bconst.b1 false
|
||||||
|
return v2
|
||||||
|
}
|
||||||
|
; run: %brz_i8(0) == true
|
||||||
|
; run: %brz_i8(1) == false
|
||||||
|
; run: %brz_i8(-1) == false
|
||||||
|
|
||||||
|
|
||||||
|
; TODO: Merge this with brz_b1_false when we are able to pass bool imm's in test params
|
||||||
|
function %brz_b1_true() -> b1 {
|
||||||
block0:
|
block0:
|
||||||
v0 = iconst.i8 0
|
v1 = bconst.b1 true
|
||||||
|
brz v1, block1
|
||||||
|
jump block2
|
||||||
|
|
||||||
|
block1:
|
||||||
|
v2 = bconst.b1 true
|
||||||
|
return v2
|
||||||
|
|
||||||
|
block2:
|
||||||
|
v3 = bconst.b1 false
|
||||||
|
return v3
|
||||||
|
}
|
||||||
|
; run: %brz_b1_true() == false
|
||||||
|
|
||||||
|
function %brz_b1_false() -> b1 {
|
||||||
|
block0:
|
||||||
|
v1 = bconst.b1 false
|
||||||
|
brz v1, block1
|
||||||
|
jump block2
|
||||||
|
|
||||||
|
block1:
|
||||||
|
v2 = bconst.b1 true
|
||||||
|
return v2
|
||||||
|
|
||||||
|
block2:
|
||||||
|
v3 = bconst.b1 false
|
||||||
|
return v3
|
||||||
|
}
|
||||||
|
; run: %brz_b1_false() == true
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function %brnz_i64(i64) -> b1 {
|
||||||
|
block0(v0: i64):
|
||||||
brnz v0, block1
|
brnz v0, block1
|
||||||
jump block2
|
jump block2
|
||||||
|
|
||||||
block1:
|
block1:
|
||||||
v1 = bconst.b1 false
|
v1 = bconst.b1 true
|
||||||
return v1
|
return v1
|
||||||
|
|
||||||
block2:
|
block2:
|
||||||
v2 = bconst.b1 true
|
v2 = bconst.b1 false
|
||||||
return v2
|
return v2
|
||||||
}
|
}
|
||||||
; run
|
; run: %brnz_i64(0) == false
|
||||||
|
; run: %brnz_i64(1) == true
|
||||||
|
; run: %brnz_i64(-1) == true
|
||||||
|
|
||||||
|
function %brnz_i32(i32) -> b1 {
|
||||||
|
block0(v0: i32):
|
||||||
|
brnz v0, block1
|
||||||
|
jump block2
|
||||||
|
|
||||||
|
block1:
|
||||||
|
v1 = bconst.b1 true
|
||||||
|
return v1
|
||||||
|
|
||||||
|
block2:
|
||||||
|
v2 = bconst.b1 false
|
||||||
|
return v2
|
||||||
|
}
|
||||||
|
; run: %brnz_i32(0) == false
|
||||||
|
; run: %brnz_i32(1) == true
|
||||||
|
; run: %brnz_i32(-1) == true
|
||||||
|
|
||||||
|
function %brnz_i16(i16) -> b1 {
|
||||||
|
block0(v0: i16):
|
||||||
|
brnz v0, block1
|
||||||
|
jump block2
|
||||||
|
|
||||||
|
block1:
|
||||||
|
v1 = bconst.b1 true
|
||||||
|
return v1
|
||||||
|
|
||||||
|
block2:
|
||||||
|
v2 = bconst.b1 false
|
||||||
|
return v2
|
||||||
|
}
|
||||||
|
; run: %brnz_i16(0) == false
|
||||||
|
; run: %brnz_i16(1) == true
|
||||||
|
; run: %brnz_i16(-1) == true
|
||||||
|
|
||||||
|
function %brnz_i8(i8) -> b1 {
|
||||||
|
block0(v0: i8):
|
||||||
|
brnz v0, block1
|
||||||
|
jump block2
|
||||||
|
|
||||||
|
block1:
|
||||||
|
v1 = bconst.b1 true
|
||||||
|
return v1
|
||||||
|
|
||||||
|
block2:
|
||||||
|
v2 = bconst.b1 false
|
||||||
|
return v2
|
||||||
|
}
|
||||||
|
; run: %brnz_i8(0) == false
|
||||||
|
; run: %brnz_i8(1) == true
|
||||||
|
; run: %brnz_i8(-1) == true
|
||||||
|
|
||||||
|
|
||||||
|
; TODO: Merge this with brz_b1_false when we are able to pass bool imm's in test params
|
||||||
|
function %brnz_b1_true() -> b1 {
|
||||||
|
block0:
|
||||||
|
v1 = bconst.b1 true
|
||||||
|
brnz v1, block1
|
||||||
|
jump block2
|
||||||
|
|
||||||
|
block1:
|
||||||
|
v2 = bconst.b1 true
|
||||||
|
return v2
|
||||||
|
|
||||||
|
block2:
|
||||||
|
v3 = bconst.b1 false
|
||||||
|
return v3
|
||||||
|
}
|
||||||
|
; run: %brnz_b1_true() == true
|
||||||
|
|
||||||
|
function %brnz_b1_false() -> b1 {
|
||||||
|
block0:
|
||||||
|
v1 = bconst.b1 false
|
||||||
|
brnz v1, block1
|
||||||
|
jump block2
|
||||||
|
|
||||||
|
block1:
|
||||||
|
v2 = bconst.b1 true
|
||||||
|
return v2
|
||||||
|
|
||||||
|
block2:
|
||||||
|
v3 = bconst.b1 false
|
||||||
|
return v3
|
||||||
|
}
|
||||||
|
; run: %brnz_b1_false() == false
|
||||||
|
|||||||
@@ -133,8 +133,16 @@ where
|
|||||||
// Interpret a Cranelift instruction.
|
// Interpret a Cranelift instruction.
|
||||||
Ok(match inst.opcode() {
|
Ok(match inst.opcode() {
|
||||||
Opcode::Jump | Opcode::Fallthrough => ControlFlow::ContinueAt(branch(), args()?),
|
Opcode::Jump | Opcode::Fallthrough => ControlFlow::ContinueAt(branch(), args()?),
|
||||||
Opcode::Brz => branch_when(!arg(0)?.into_bool()?)?,
|
Opcode::Brz => branch_when(match arg(0)?.ty() {
|
||||||
Opcode::Brnz => branch_when(arg(0)?.into_bool()?)?,
|
ty if ty.is_bool() => !arg(0)?.into_bool()?,
|
||||||
|
ty if ty.is_int() => arg(0)?.into_int()? == 0,
|
||||||
|
_ => return Err(StepError::ValueError(ValueError::InvalidValue(types::B1))),
|
||||||
|
})?,
|
||||||
|
Opcode::Brnz => branch_when(match arg(0)?.ty() {
|
||||||
|
ty if ty.is_bool() => arg(0)?.into_bool()?,
|
||||||
|
ty if ty.is_int() => arg(0)?.into_int()? != 0,
|
||||||
|
_ => return Err(StepError::ValueError(ValueError::InvalidValue(types::B1))),
|
||||||
|
})?,
|
||||||
Opcode::BrIcmp => branch_when(icmp(inst.cond_code().unwrap(), &arg(1)?, &arg(2)?)?)?,
|
Opcode::BrIcmp => branch_when(icmp(inst.cond_code().unwrap(), &arg(1)?, &arg(2)?)?)?,
|
||||||
Opcode::Brif => branch_when(state.has_iflag(inst.cond_code().unwrap()))?,
|
Opcode::Brif => branch_when(state.has_iflag(inst.cond_code().unwrap()))?,
|
||||||
Opcode::Brff => branch_when(state.has_fflag(inst.fp_cond_code().unwrap()))?,
|
Opcode::Brff => branch_when(state.has_fflag(inst.fp_cond_code().unwrap()))?,
|
||||||
|
|||||||
Reference in New Issue
Block a user