x86_32: legalize br{z,nz}.i64.
This commit is contained in:
@@ -199,8 +199,6 @@ pub(crate) fn define(insts: &InstructionGroup, imm: &Immediates) -> TransformGro
|
|||||||
let ah = var("ah");
|
let ah = var("ah");
|
||||||
let cc = var("cc");
|
let cc = var("cc");
|
||||||
let block = var("block");
|
let block = var("block");
|
||||||
let block1 = var("block1");
|
|
||||||
let block2 = var("block2");
|
|
||||||
let ptr = var("ptr");
|
let ptr = var("ptr");
|
||||||
let flags = var("flags");
|
let flags = var("flags");
|
||||||
let offset = var("off");
|
let offset = var("off");
|
||||||
@@ -269,39 +267,45 @@ pub(crate) fn define(insts: &InstructionGroup, imm: &Immediates) -> TransformGro
|
|||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
|
||||||
narrow.legalize(
|
for &ty in &[I128, I64] {
|
||||||
def!(brz.I128(x, block, vararg)),
|
let block = var("block");
|
||||||
vec![
|
let block1 = var("block1");
|
||||||
def!((xl, xh) = isplit(x)),
|
let block2 = var("block2");
|
||||||
def!(
|
|
||||||
a = icmp_imm(
|
|
||||||
Literal::enumerator_for(&imm.intcc, "eq"),
|
|
||||||
xl,
|
|
||||||
Literal::constant(&imm.imm64, 0)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
def!(
|
|
||||||
b = icmp_imm(
|
|
||||||
Literal::enumerator_for(&imm.intcc, "eq"),
|
|
||||||
xh,
|
|
||||||
Literal::constant(&imm.imm64, 0)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
def!(c = band(a, b)),
|
|
||||||
def!(brnz(c, block, vararg)),
|
|
||||||
],
|
|
||||||
);
|
|
||||||
|
|
||||||
narrow.legalize(
|
narrow.legalize(
|
||||||
def!(brnz.I128(x, block1, vararg)),
|
def!(brz.ty(x, block, vararg)),
|
||||||
vec![
|
vec![
|
||||||
def!((xl, xh) = isplit(x)),
|
def!((xl, xh) = isplit(x)),
|
||||||
def!(brnz(xl, block1, vararg)),
|
def!(
|
||||||
def!(jump(block2, Literal::empty_vararg())),
|
a = icmp_imm(
|
||||||
block!(block2),
|
Literal::enumerator_for(&imm.intcc, "eq"),
|
||||||
def!(brnz(xh, block1, vararg)),
|
xl,
|
||||||
],
|
Literal::constant(&imm.imm64, 0)
|
||||||
);
|
)
|
||||||
|
),
|
||||||
|
def!(
|
||||||
|
b = icmp_imm(
|
||||||
|
Literal::enumerator_for(&imm.intcc, "eq"),
|
||||||
|
xh,
|
||||||
|
Literal::constant(&imm.imm64, 0)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
def!(c = band(a, b)),
|
||||||
|
def!(brnz(c, block, vararg)),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
narrow.legalize(
|
||||||
|
def!(brnz.ty(x, block1, vararg)),
|
||||||
|
vec![
|
||||||
|
def!((xl, xh) = isplit(x)),
|
||||||
|
def!(brnz(xl, block1, vararg)),
|
||||||
|
def!(jump(block2, Literal::empty_vararg())),
|
||||||
|
block!(block2),
|
||||||
|
def!(brnz(xh, block1, vararg)),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
narrow.legalize(
|
narrow.legalize(
|
||||||
def!(a = popcnt.I128(x)),
|
def!(a = popcnt.I128(x)),
|
||||||
|
|||||||
36
cranelift/filetests/filetests/isa/x86/brz-x86_32-i64.clif
Normal file
36
cranelift/filetests/filetests/isa/x86/brz-x86_32-i64.clif
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
test compile
|
||||||
|
target i686
|
||||||
|
|
||||||
|
function u0:0(i32, i32) -> i32 {
|
||||||
|
block0(v0: i32, v1: i32):
|
||||||
|
v2 = iconcat v0, v1
|
||||||
|
; check: v6 = fill v0
|
||||||
|
; nextln: v3 = icmp_imm eq v6, 0
|
||||||
|
; nextln: v7 = fill v1
|
||||||
|
; nextln: v4 = icmp_imm eq v7, 0
|
||||||
|
; nextln: v5 = band v3, v4
|
||||||
|
; nextln: brnz v5, block1
|
||||||
|
brz v2, block1
|
||||||
|
jump block2
|
||||||
|
block1:
|
||||||
|
trap unreachable
|
||||||
|
block2:
|
||||||
|
trap unreachable
|
||||||
|
}
|
||||||
|
|
||||||
|
function u0:1(i32, i32) -> i32 {
|
||||||
|
block0(v0: i32, v1: i32):
|
||||||
|
v2 = iconcat v0, v1
|
||||||
|
; check: v3 = fill v0
|
||||||
|
; nextln: brnz v3, block1
|
||||||
|
; nextln: fallthrough block3
|
||||||
|
; check: block3:
|
||||||
|
; nextln: v4 = fill.i32 v1
|
||||||
|
; nextln: brnz v4, block1
|
||||||
|
brnz v2, block1
|
||||||
|
jump block2
|
||||||
|
block1:
|
||||||
|
trap unreachable
|
||||||
|
block2:
|
||||||
|
trap unreachable
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user