LibRegex: Always inline get_opcode()

This function's prologue was showing up as very hot in profiles, taking
almost 9% of runtime in our Regex test suite.
This commit is contained in:
Ali Mohammad Pur 2023-07-28 20:54:44 +03:30 committed by Andreas Kling
parent a539c261b1
commit 11abca421a
Notes: sideshowbarker 2024-07-17 07:35:03 +09:00
2 changed files with 22 additions and 22 deletions

View File

@ -181,28 +181,6 @@ void ByteCode::ensure_opcodes_initialized()
s_opcodes_initialized = true;
}
ALWAYS_INLINE OpCode& ByteCode::get_opcode_by_id(OpCodeId id) const
{
VERIFY(id >= OpCodeId::First && id <= OpCodeId::Last);
auto& opcode = s_opcodes[(u32)id];
opcode->set_bytecode(*const_cast<ByteCode*>(this));
return *opcode;
}
OpCode& ByteCode::get_opcode(MatchState& state) const
{
OpCodeId opcode_id;
if (auto opcode_ptr = static_cast<DisjointChunks<ByteCodeValueType> const&>(*this).find(state.instruction_position))
opcode_id = (OpCodeId)*opcode_ptr;
else
opcode_id = OpCodeId::Exit;
auto& opcode = get_opcode_by_id(opcode_id);
opcode.set_state(state);
return opcode;
}
ALWAYS_INLINE ExecutionResult OpCode_Exit::execute(MatchInput const& input, MatchState& state) const
{
if (state.string_position > input.view.length() || state.instruction_position >= m_bytecode->size())

View File

@ -822,6 +822,28 @@ public:
}
};
ALWAYS_INLINE OpCode& ByteCode::get_opcode(regex::MatchState& state) const
{
OpCodeId opcode_id;
if (auto opcode_ptr = static_cast<DisjointChunks<ByteCodeValueType> const&>(*this).find(state.instruction_position))
opcode_id = (OpCodeId)*opcode_ptr;
else
opcode_id = OpCodeId::Exit;
auto& opcode = get_opcode_by_id(opcode_id);
opcode.set_state(state);
return opcode;
}
ALWAYS_INLINE OpCode& ByteCode::get_opcode_by_id(OpCodeId id) const
{
VERIFY(id >= OpCodeId::First && id <= OpCodeId::Last);
auto& opcode = s_opcodes[(u32)id];
opcode->set_bytecode(*const_cast<ByteCode*>(this));
return *opcode;
}
template<typename T>
bool is(OpCode const&);