浏览代码

LibJS/JIT: Add fast path for Int32 | Int32

Andreas Kling 1 年之前
父节点
当前提交
3a5c177025
共有 2 个文件被更改,包括 29 次插入1 次删除
  1. 29 0
      Userland/Libraries/LibJS/JIT/Compiler.cpp
  2. 0 1
      Userland/Libraries/LibJS/JIT/Compiler.h

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

@@ -655,6 +655,35 @@ void Compiler::compile_bitwise_and(Bytecode::Op::BitwiseAnd const& op)
     end.link(m_assembler);
 }
 
+static Value cxx_bitwise_or(VM& vm, Value lhs, Value rhs)
+{
+    return TRY_OR_SET_EXCEPTION(bitwise_or(vm, lhs, rhs));
+}
+
+void Compiler::compile_bitwise_or(Bytecode::Op::BitwiseOr const& op)
+{
+    load_vm_register(ARG1, op.lhs());
+    load_accumulator(ARG2);
+
+    Assembler::Label end {};
+
+    branch_if_both_int32(ARG1, ARG2, [&] {
+        // NOTE: Since both sides are Int32, we know that the upper 32 bits are nothing but the INT32_TAG.
+        //       This means we can get away with just a simple 64-bit bitwise or.
+        m_assembler.bitwise_or(
+            Assembler::Operand::Register(ARG1),
+            Assembler::Operand::Register(ARG2));
+
+        store_accumulator(ARG1);
+        m_assembler.jump(end);
+    });
+
+    native_call((void*)cxx_bitwise_or);
+    store_accumulator(RET);
+    check_exception();
+    end.link(m_assembler);
+}
+
 static ThrowCompletionOr<Value> not_(VM&, Value value)
 {
     return Value(!value.to_boolean());

+ 0 - 1
Userland/Libraries/LibJS/JIT/Compiler.h

@@ -54,7 +54,6 @@ private:
         O(LooselyEquals, abstract_equals)                       \
         O(StrictlyInequals, typed_inequals)                     \
         O(StrictlyEquals, typed_equals)                         \
-        O(BitwiseOr, bitwise_or)                                \
         O(BitwiseXor, bitwise_xor)                              \
         O(LeftShift, left_shift)                                \
         O(RightShift, right_shift)                              \