diff --git a/Userland/Libraries/LibJIT/X86_64/Assembler.h b/Userland/Libraries/LibJIT/X86_64/Assembler.h index 863531365f..15ed60afe7 100644 --- a/Userland/Libraries/LibJIT/X86_64/Assembler.h +++ b/Userland/Libraries/LibJIT/X86_64/Assembler.h @@ -742,6 +742,21 @@ struct X86_64Assembler { } } + void inc32(Operand op, Optional overflow_label) + { + if (op.is_register_or_memory()) { + emit_rex_for_slash(op, REX_W::No); + emit8(0xff); + emit_modrm_slash(0, op); + } else { + VERIFY_NOT_REACHED(); + } + + if (overflow_label.has_value()) { + jump_if(Condition::Overflow, *overflow_label); + } + } + void add(Operand dst, Operand src) { if (dst.is_register_or_memory() && src.type == Operand::Type::Reg) { diff --git a/Userland/Libraries/LibJS/JIT/Compiler.cpp b/Userland/Libraries/LibJS/JIT/Compiler.cpp index e23a8d8d25..2d419b4da4 100644 --- a/Userland/Libraries/LibJS/JIT/Compiler.cpp +++ b/Userland/Libraries/LibJS/JIT/Compiler.cpp @@ -356,31 +356,23 @@ void Compiler::compile_increment(Bytecode::Op::Increment const&) Assembler::Label slow_case {}; branch_if_int32(ARG1, [&] { - // GPR0 = ARG1 & 0xffffffff; + // GPR0 = ARG1 m_assembler.mov( Assembler::Operand::Register(GPR0), Assembler::Operand::Register(ARG1)); - m_assembler.mov( - Assembler::Operand::Register(GPR1), - Assembler::Operand::Imm(0xffffffff)); - m_assembler.bitwise_and( + // GPR0++; + m_assembler.inc32( Assembler::Operand::Register(GPR0), - Assembler::Operand::Register(GPR1)); - - // if (GPR0 == 0x7fffffff) goto slow_case; - m_assembler.jump_if( - Assembler::Operand::Register(GPR0), - Assembler::Condition::EqualTo, - Assembler::Operand::Imm(0x7fffffff), slow_case); - // ARG1 += 1; - m_assembler.add( - Assembler::Operand::Register(ARG1), - Assembler::Operand::Imm(1)); - - // accumulator = ARG1; - store_accumulator(ARG1); + // accumulator = GPR0 | SHIFTED_INT32_TAG; + m_assembler.mov( + Assembler::Operand::Register(GPR1), + Assembler::Operand::Imm(SHIFTED_INT32_TAG)); + m_assembler.bitwise_or( + Assembler::Operand::Register(GPR0), + Assembler::Operand::Register(GPR1)); + store_accumulator(GPR0); m_assembler.jump(end); });