1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 07:48:11 +00:00

LibJS/JIT: Add fast path for UnaryMinus on Int32

5% speedup on Octane/mandreel.js :^)
This commit is contained in:
Andreas Kling 2023-12-11 20:47:43 +01:00
parent 78419e858d
commit 6cbcd521a2
2 changed files with 55 additions and 1 deletions

View file

@ -1406,9 +1406,57 @@ static ThrowCompletionOr<Value> typeof_(VM& vm, Value value)
check_exception(); \
}
JS_ENUMERATE_COMMON_UNARY_OPS(DO_COMPILE_COMMON_UNARY_OP)
JS_ENUMERATE_COMMON_UNARY_OPS_WITHOUT_FAST_PATH(DO_COMPILE_COMMON_UNARY_OP)
# undef DO_COMPILE_COMMON_UNARY_OP
static Value cxx_unary_minus(VM& vm, Value value)
{
return TRY_OR_SET_EXCEPTION(unary_minus(vm, value));
}
void Compiler::compile_unary_minus(Bytecode::Op::UnaryMinus const&)
{
Assembler::Label end;
Assembler::Label slow_case;
load_accumulator(ARG1);
branch_if_int32(ARG1, [&] {
m_assembler.mov32(
Assembler::Operand::Register(ARG1),
Assembler::Operand::Register(ARG1),
Assembler::Extension::ZeroExtend);
// For ~0 to become negative zero, we need to create a floating-point JS::Value.
Assembler::Label zero_case;
m_assembler.jump_if(
Assembler::Operand::Register(ARG1),
Assembler::Condition::EqualTo,
Assembler::Operand::Imm(0),
zero_case);
// accumulator = -accumulator
m_assembler.neg32(Assembler::Operand::Register(ARG1));
// accumulator |= SHIFTED_INT32_TAG;
m_assembler.mov(Assembler::Operand::Register(GPR0), Assembler::Operand::Imm(SHIFTED_INT32_TAG));
m_assembler.bitwise_or(Assembler::Operand::Register(ARG1), Assembler::Operand::Register(GPR0));
store_accumulator(ARG1);
m_assembler.jump(end);
zero_case.link(m_assembler);
m_assembler.mov(Assembler::Operand::Register(ARG1), Assembler::Operand::Imm(Value(-0.0).encoded()));
store_accumulator(ARG1);
m_assembler.jump(end);
});
slow_case.link(m_assembler);
native_call((void*)cxx_unary_minus);
store_accumulator(RET);
check_exception();
end.link(m_assembler);
}
void Compiler::compile_return(Bytecode::Op::Return const&)
{
load_accumulator(GPR0);