Quellcode durchsuchen

LibJS/JIT: Sign-extend integers before comparing in LessThan fast path

Andreas Kling vor 1 Jahr
Ursprung
Commit
5bd93f34af
2 geänderte Dateien mit 12 neuen und 0 gelöschten Zeilen
  1. 8 0
      Userland/Libraries/LibJS/JIT/Assembler.h
  2. 4 0
      Userland/Libraries/LibJS/JIT/Compiler.cpp

+ 8 - 0
Userland/Libraries/LibJS/JIT/Assembler.h

@@ -320,6 +320,14 @@ struct Assembler {
         label.add_jump(m_output.size());
         label.add_jump(m_output.size());
     }
     }
 
 
+    void sign_extend_32_to_64_bits(Reg reg)
+    {
+        // movsxd (reg as 64-bit), (reg as 32-bit)
+        emit8(0x48 | ((to_underlying(reg) >= 8) ? 1 << 0 : 0));
+        emit8(0x63);
+        emit8(0xc0 | (encode_reg(reg) << 3) | encode_reg(reg));
+    }
+
     void bitwise_and(Operand dst, Operand src)
     void bitwise_and(Operand dst, Operand src)
     {
     {
         // and dst,src
         // and dst,src

+ 4 - 0
Userland/Libraries/LibJS/JIT/Compiler.cpp

@@ -468,6 +468,10 @@ void Compiler::compile_less_than(Bytecode::Op::LessThan const& op)
         // else return false;
         // else return false;
 
 
         auto true_case = m_assembler.make_label();
         auto true_case = m_assembler.make_label();
+
+        m_assembler.sign_extend_32_to_64_bits(ARG1);
+        m_assembler.sign_extend_32_to_64_bits(ARG2);
+
         m_assembler.jump_if_less_than(
         m_assembler.jump_if_less_than(
             Assembler::Operand::Register(ARG1),
             Assembler::Operand::Register(ARG1),
             Assembler::Operand::Register(ARG2),
             Assembler::Operand::Register(ARG2),