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)),