1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-20 11:55:08 +00:00

LibJS/Bytecode: Store current interpreter register window as a Span

This avoids a bunch of indirections on every single register access.

~17% speed-up on Kraken/stanford-crypto-aes.js :^)
This commit is contained in:
Andreas Kling 2023-07-01 13:56:40 +02:00 committed by Linus Groh
parent e7435d68b0
commit 1efe4b58aa
2 changed files with 23 additions and 6 deletions

View file

@ -206,11 +206,9 @@ Interpreter::ValueAndFrame Interpreter::run_and_return_frame(Realm& realm, Execu
TemporaryChange restore_current_block { m_current_block, entry_point ?: executable.basic_blocks.first() };
if (in_frame)
m_register_windows.append(in_frame);
push_register_window(in_frame, executable.number_of_registers);
else
m_register_windows.append(make<RegisterWindow>(MarkedVector<Value>(vm().heap()), MarkedVector<GCPtr<Environment>>(vm().heap()), MarkedVector<GCPtr<Environment>>(vm().heap()), Vector<UnwindInfo> {}));
registers().resize(executable.number_of_registers);
push_register_window(make<RegisterWindow>(MarkedVector<Value>(vm().heap()), MarkedVector<GCPtr<Environment>>(vm().heap()), MarkedVector<GCPtr<Environment>>(vm().heap()), Vector<UnwindInfo> {}), executable.number_of_registers);
for (;;) {
Bytecode::InstructionStreamIterator pc(m_current_block->instruction_stream());
@ -306,7 +304,7 @@ Interpreter::ValueAndFrame Interpreter::run_and_return_frame(Realm& realm, Execu
}
}
auto frame = m_register_windows.take_last();
auto frame = pop_register_window();
Value return_value = js_undefined();
if (!m_return_value.is_empty()) {
@ -453,4 +451,18 @@ Realm& Interpreter::realm()
return *m_vm.current_realm();
}
void Interpreter::push_register_window(Variant<NonnullOwnPtr<RegisterWindow>, RegisterWindow*> window, size_t register_count)
{
m_register_windows.append(move(window));
this->window().registers.resize(register_count);
m_current_register_window = this->window().registers;
}
Variant<NonnullOwnPtr<RegisterWindow>, RegisterWindow*> Interpreter::pop_register_window()
{
auto window = m_register_windows.take_last();
m_current_register_window = m_register_windows.is_empty() ? Span<Value> {} : this->window().registers;
return window;
}
}