x86_32: legalize br{z,nz}.i64.

This commit is contained in:
whitequark
2020-05-29 17:17:56 +00:00
committed by Andrew Brown
parent 31b8e5695c
commit 3796164642
2 changed files with 74 additions and 34 deletions

View File

@@ -199,8 +199,6 @@ pub(crate) fn define(insts: &InstructionGroup, imm: &Immediates) -> TransformGro
let ah = var("ah");
let cc = var("cc");
let block = var("block");
let block1 = var("block1");
let block2 = var("block2");
let ptr = var("ptr");
let flags = var("flags");
let offset = var("off");
@@ -269,39 +267,45 @@ pub(crate) fn define(insts: &InstructionGroup, imm: &Immediates) -> TransformGro
],
);
narrow.legalize(
def!(brz.I128(x, block, vararg)),
vec![
def!((xl, xh) = isplit(x)),
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)),
],
);
for &ty in &[I128, I64] {
let block = var("block");
let block1 = var("block1");
let block2 = var("block2");
narrow.legalize(
def!(brnz.I128(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(
def!(brz.ty(x, block, vararg)),
vec![
def!((xl, xh) = isplit(x)),
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(
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(
def!(a = popcnt.I128(x)),

View 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
}