From 32d3a470583645844a70eefcdeed5179a1d8c8c7 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 28 Oct 2023 19:23:14 +0200 Subject: [PATCH] LibJIT: Generate MOV ModR/M without displacement when possible For non-extended register bases and 0x0 offset, we can emit a ModR/M byte without displacement. --- Userland/Libraries/LibJIT/Assembler.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Userland/Libraries/LibJIT/Assembler.h b/Userland/Libraries/LibJIT/Assembler.h index b75e71bf3a..cb1a8261ff 100644 --- a/Userland/Libraries/LibJIT/Assembler.h +++ b/Userland/Libraries/LibJIT/Assembler.h @@ -161,7 +161,9 @@ struct Assembler { | ((to_underlying(src.reg) >= 8) ? 1 << 2 : 0) | ((to_underlying(dst.reg) >= 8) ? 1 << 0 : 0)); emit8(0x89); - if (dst.offset_or_immediate <= 127) { + if (dst.reg <= Reg::RDI && dst.offset_or_immediate == 0) { + emit8(0x00 | (encode_reg(src.reg) << 3) | encode_reg(dst.reg)); + } else if (dst.offset_or_immediate <= 127) { emit8(0x40 | (encode_reg(src.reg) << 3) | encode_reg(dst.reg)); emit8(dst.offset_or_immediate); } else { @@ -176,7 +178,9 @@ struct Assembler { | ((to_underlying(dst.reg) >= 8) ? 1 << 2 : 0) | ((to_underlying(src.reg) >= 8) ? 1 << 0 : 0)); emit8(0x8b); - if (src.offset_or_immediate <= 127) { + if (src.reg <= Reg::RDI && src.offset_or_immediate == 0) { + emit8(0x00 | (encode_reg(dst.reg) << 3) | encode_reg(src.reg)); + } else if (src.offset_or_immediate <= 127) { emit8(0x40 | (encode_reg(dst.reg) << 3) | encode_reg(src.reg)); emit8(src.offset_or_immediate); } else {