diff --git a/cranelift/codegen/meta/src/shared/legalize.rs b/cranelift/codegen/meta/src/shared/legalize.rs index 18ade6a6b7..93fc2b1962 100644 --- a/cranelift/codegen/meta/src/shared/legalize.rs +++ b/cranelift/codegen/meta/src/shared/legalize.rs @@ -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)), diff --git a/cranelift/filetests/filetests/isa/x86/brz-x86_32-i64.clif b/cranelift/filetests/filetests/isa/x86/brz-x86_32-i64.clif new file mode 100644 index 0000000000..51d19b7b8f --- /dev/null +++ b/cranelift/filetests/filetests/isa/x86/brz-x86_32-i64.clif @@ -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 +}