From a42d849ec1918afaa29e435c3c4e756c20a56aa8 Mon Sep 17 00:00:00 2001 From: Hendiadyoin1 Date: Sun, 29 Oct 2023 14:47:44 +0100 Subject: [PATCH] LibJIT: Widen allowed argument range for add32 and use REX if necessary The REX prefix is elided when it is not needed, so no change in code size is to be expected --- Userland/Libraries/LibJIT/Assembler.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Userland/Libraries/LibJIT/Assembler.h b/Userland/Libraries/LibJIT/Assembler.h index 07a789b006..d462b2b273 100644 --- a/Userland/Libraries/LibJIT/Assembler.h +++ b/Userland/Libraries/LibJIT/Assembler.h @@ -615,14 +615,17 @@ struct Assembler { void add32(Operand dst, Operand src, Optional label) { - if (dst.type == Operand::Type::Reg && to_underlying(dst.reg) < 8 && src.type == Operand::Type::Reg && to_underlying(src.reg) < 8) { + if (dst.is_register_or_memory() && src.type == Operand::Type::Reg) { + emit_rex_for_mr(dst, src, REX_W::No); emit8(0x01); emit_modrm_mr(dst, src); - } else if (dst.type == Operand::Type::Reg && to_underlying(dst.reg) < 8 && src.type == Operand::Type::Imm && src.fits_in_i8()) { + } else if (dst.is_register_or_memory() && src.type == Operand::Type::Imm && src.fits_in_i8()) { + emit_rex_for_slash(dst, REX_W::No); emit8(0x83); emit_modrm_slash(0, dst); emit8(src.offset_or_immediate); - } else if (dst.type == Operand::Type::Reg && to_underlying(dst.reg) < 8 && src.type == Operand::Type::Imm && src.fits_in_i32()) { + } else if (dst.is_register_or_memory() && src.type == Operand::Type::Imm && src.fits_in_i32()) { + emit_rex_for_slash(dst, REX_W::No); emit8(0x81); emit_modrm_slash(0, dst); emit32(src.offset_or_immediate);