Pārlūkot izejas kodu

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
Hendiadyoin1 1 gadu atpakaļ
vecāks
revīzija
a42d849ec1
1 mainītis faili ar 6 papildinājumiem un 3 dzēšanām
  1. 6 3
      Userland/Libraries/LibJIT/Assembler.h

+ 6 - 3
Userland/Libraries/LibJIT/Assembler.h

@@ -615,14 +615,17 @@ struct Assembler {
 
     void add32(Operand dst, Operand src, Optional<Label&> 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);