From 44913825b5e93d40ea4ca4fb3d03ab3aa15e1714 Mon Sep 17 00:00:00 2001 From: Alexa VanHattum Date: Fri, 6 Jan 2023 17:18:16 -0500 Subject: [PATCH] cranelift: fix register for `srem.i8` on x86_64 (#5540) * Change register written to in specific srem case. Add regression test as filetest case. Fixes #5470 * Add another test case, newline * Update comment --- cranelift/codegen/src/isa/x64/inst/emit.rs | 4 ++-- cranelift/filetests/filetests/runtests/srem.clif | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/cranelift/codegen/src/isa/x64/inst/emit.rs b/cranelift/codegen/src/isa/x64/inst/emit.rs index fc4f740a42..f5b002e450 100644 --- a/cranelift/codegen/src/isa/x64/inst/emit.rs +++ b/cranelift/codegen/src/isa/x64/inst/emit.rs @@ -543,10 +543,10 @@ pub(crate) fn emit( // Here, divisor == -1. if !kind.is_div() { - // x % -1 = 0; put the result into the destination, $rdx. + // x % -1 = 0; put the result into the destination, $rax. let done_label = sink.get_label(); - let inst = Inst::imm(OperandSize::Size64, 0, Writable::from_reg(regs::rdx())); + let inst = Inst::imm(OperandSize::Size64, 0, Writable::from_reg(regs::rax())); inst.emit(&[], sink, info, state); let inst = Inst::jmp_known(done_label); diff --git a/cranelift/filetests/filetests/runtests/srem.clif b/cranelift/filetests/filetests/runtests/srem.clif index ec6d3b76d9..96b0f95fe9 100644 --- a/cranelift/filetests/filetests/runtests/srem.clif +++ b/cranelift/filetests/filetests/runtests/srem.clif @@ -142,3 +142,12 @@ block0(v0: i8): ; run: %srem_imm_i8(-19) == -1 ; run: %srem_imm_i8(0xC0) == -1 ; run: %srem_imm_i8(0x80) == -2 + +function %srem_with_bmask(i64, i8) -> i8 { +block0(v0: i64, v1: i8): + v2 = bmask.i8 v0 + v3 = srem v2, v1 + return v3 +} +; run: %srem_with_bmask(4352, -1) == 0 +; run: %srem_with_bmask(4352, 1) == 0