summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--zjit/src/backend/arm64/mod.rs13
1 files changed, 8 insertions, 5 deletions
diff --git a/zjit/src/backend/arm64/mod.rs b/zjit/src/backend/arm64/mod.rs
index db4fc5f710..25b0a525fd 100644
--- a/zjit/src/backend/arm64/mod.rs
+++ b/zjit/src/backend/arm64/mod.rs
@@ -421,13 +421,16 @@ impl Assembler
(Opnd::Reg(_) | Opnd::VReg { .. }, Opnd::Reg(_) | Opnd::VReg { .. }) => {
merge_three_reg_mov(&live_ranges, &mut iterator, left, right, out);
asm.push_insn(insn);
- },
+ }
(reg_opnd @ (Opnd::Reg(_) | Opnd::VReg { .. }), other_opnd) |
(other_opnd, reg_opnd @ (Opnd::Reg(_) | Opnd::VReg { .. })) => {
*left = reg_opnd;
*right = split_shifted_immediate(asm, other_opnd);
+ // Now `right` is either a register or an immediate, both can try to
+ // merge with a subsequent mov.
+ merge_three_reg_mov(&live_ranges, &mut iterator, left, left, out);
asm.push_insn(insn);
- },
+ }
_ => {
*left = split_load_operand(asm, *left);
*right = split_shifted_immediate(asm, *right);
@@ -1381,12 +1384,12 @@ mod tests {
asm.mov(sp, new_sp);
let new_sp = asm.sub(sp, 0x20.into());
asm.mov(sp, new_sp);
- asm.compile_with_num_regs(&mut cb, 2);
- assert_disasm!(cb, "e08300b11f000091e08300f11f000091", {"
+ asm.compile_with_num_regs(&mut cb, 2);
+ assert_disasm!(cb, "ff830091ff8300d1", "
0x0: add sp, sp, #0x20
0x4: sub sp, sp, #0x20
- "});
+ ");
}
#[test]