From fd059d4e4a5d2fcb5f67db10d551e235dccdd042 Mon Sep 17 00:00:00 2001 From: Simon Wanner Date: Mon, 30 Oct 2023 00:39:58 +0100 Subject: [PATCH] LibJS/JIT: Compile the JumpUndefined instruction --- Userland/Libraries/LibJS/JIT/Compiler.cpp | 17 +++++++++++++++++ Userland/Libraries/LibJS/JIT/Compiler.h | 1 + 2 files changed, 18 insertions(+) diff --git a/Userland/Libraries/LibJS/JIT/Compiler.cpp b/Userland/Libraries/LibJS/JIT/Compiler.cpp index 9bf2d278d9..5985fc9ca1 100644 --- a/Userland/Libraries/LibJS/JIT/Compiler.cpp +++ b/Userland/Libraries/LibJS/JIT/Compiler.cpp @@ -212,6 +212,23 @@ void Compiler::compile_jump_nullish(Bytecode::Op::JumpNullish const& op) m_assembler.jump(label_for(op.false_target()->block())); } +void Compiler::compile_jump_undefined(Bytecode::Op::JumpUndefined const& op) +{ + load_vm_register(GPR0, Bytecode::Register::accumulator()); + + m_assembler.shift_right( + Assembler::Operand::Register(GPR0), + Assembler::Operand::Imm(48)); + + m_assembler.jump_if( + Assembler::Operand::Register(GPR0), + Assembler::Condition::EqualTo, + Assembler::Operand::Imm(UNDEFINED_TAG), + label_for(op.true_target()->block())); + + m_assembler.jump(label_for(op.false_target()->block())); +} + [[maybe_unused]] static Value cxx_increment(VM& vm, Value value) { auto old_value = TRY_OR_SET_EXCEPTION(value.to_numeric(vm)); diff --git a/Userland/Libraries/LibJS/JIT/Compiler.h b/Userland/Libraries/LibJS/JIT/Compiler.h index 932dd01aca..d21902af3b 100644 --- a/Userland/Libraries/LibJS/JIT/Compiler.h +++ b/Userland/Libraries/LibJS/JIT/Compiler.h @@ -74,6 +74,7 @@ private: O(Jump, jump) \ O(JumpConditional, jump_conditional) \ O(JumpNullish, jump_nullish) \ + O(JumpUndefined, jump_undefined) \ O(Increment, increment) \ O(Decrement, decrement) \ O(EnterUnwindContext, enter_unwind_context) \