Legalize brz.i128 and brnz.i128
This commit is contained in:
@@ -415,6 +415,11 @@ fn gen_transform<'a>(
|
||||
fmt.line("let removed = pos.remove_inst();");
|
||||
fmt.line("debug_assert_eq!(removed, inst);");
|
||||
}
|
||||
|
||||
if transform.def_pool.get(transform.src).apply.inst.is_branch {
|
||||
fmt.line("cfg.recompute_ebb(pos.func, pos.current_ebb().unwrap());");
|
||||
}
|
||||
|
||||
fmt.line("return true;");
|
||||
});
|
||||
fmt.line("}");
|
||||
|
||||
@@ -4,7 +4,7 @@ use crate::cdsl::xform::{TransformGroupBuilder, TransformGroups};
|
||||
|
||||
use crate::shared::immediates::Immediates;
|
||||
use crate::shared::types::Float::{F32, F64};
|
||||
use crate::shared::types::Int::{I16, I32, I64, I8};
|
||||
use crate::shared::types::Int::{I16, I128, I32, I64, I8};
|
||||
|
||||
pub(crate) fn define(insts: &InstructionGroup, imm: &Immediates) -> TransformGroups {
|
||||
let mut narrow = TransformGroupBuilder::new(
|
||||
@@ -49,6 +49,8 @@ pub(crate) fn define(insts: &InstructionGroup, imm: &Immediates) -> TransformGro
|
||||
let bor = insts.by_name("bor");
|
||||
let bor_imm = insts.by_name("bor_imm");
|
||||
let bor_not = insts.by_name("bor_not");
|
||||
let brnz = insts.by_name("brnz");
|
||||
let brz = insts.by_name("brz");
|
||||
let br_icmp = insts.by_name("br_icmp");
|
||||
let br_table = insts.by_name("br_table");
|
||||
let bxor = insts.by_name("bxor");
|
||||
@@ -177,9 +179,11 @@ pub(crate) fn define(insts: &InstructionGroup, imm: &Immediates) -> TransformGro
|
||||
let al = var("al");
|
||||
let ah = var("ah");
|
||||
let cc = var("cc");
|
||||
let ebb = var("ebb");
|
||||
let ptr = var("ptr");
|
||||
let flags = var("flags");
|
||||
let offset = var("off");
|
||||
let vararg = var("vararg");
|
||||
|
||||
narrow.legalize(
|
||||
def!(a = iadd(x, y)),
|
||||
@@ -227,6 +231,26 @@ pub(crate) fn define(insts: &InstructionGroup, imm: &Immediates) -> TransformGro
|
||||
],
|
||||
);
|
||||
|
||||
narrow.legalize(
|
||||
def!(brz.I128(x, ebb, vararg)),
|
||||
vec![
|
||||
def!((xl, xh) = isplit(x)),
|
||||
def!(a = icmp_imm(Literal::enumerator_for(intcc, "eq"), xl, Literal::constant(imm64, 0))),
|
||||
def!(b = icmp_imm(Literal::enumerator_for(intcc, "eq"), xh, Literal::constant(imm64, 0))),
|
||||
def!(c = band(a, b)),
|
||||
def!(brz(c, ebb, vararg)),
|
||||
],
|
||||
);
|
||||
|
||||
narrow.legalize(
|
||||
def!(brnz.I128(x, ebb, vararg)),
|
||||
vec![
|
||||
def!((xl, xh) = isplit(x)),
|
||||
def!(brnz(xl, ebb, vararg)),
|
||||
def!(brnz(xh, ebb, vararg)),
|
||||
],
|
||||
);
|
||||
|
||||
// Widen instructions with one input operand.
|
||||
for &op in &[bnot, popcnt] {
|
||||
for &int_ty in &[I8, I16] {
|
||||
|
||||
24
cranelift/filetests/filetests/isa/x86/br-i128.clif
Normal file
24
cranelift/filetests/filetests/isa/x86/br-i128.clif
Normal file
@@ -0,0 +1,24 @@
|
||||
test compile
|
||||
target x86_64
|
||||
|
||||
function u0:0(i128) -> i8 fast {
|
||||
ebb0(v0: i128):
|
||||
brz v0, ebb1
|
||||
v1 = iconst.i8 0
|
||||
return v1
|
||||
|
||||
ebb1:
|
||||
v2 = iconst.i8 1
|
||||
return v2
|
||||
}
|
||||
|
||||
function u0:1(i128) -> i8 fast {
|
||||
ebb0(v0: i128):
|
||||
brnz v0, ebb1
|
||||
v1 = iconst.i8 0
|
||||
return v1
|
||||
|
||||
ebb1:
|
||||
v2 = iconst.i8 1
|
||||
return v2
|
||||
}
|
||||
Reference in New Issue
Block a user