Commit 40c0f84a authored by Santiago Aboy Solanes's avatar Santiago Aboy Solanes Committed by Commit Bot

[builtins] Avoid reloading undefined value in InterpreterEntryTrampoline

Since we were already loading the undefined value a few lines above,
we could avoid loading it again.

Bug: v8:9771
Change-Id: Id05a77494c06a212612a365b5c0dcba4803ba756
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1817609
Commit-Queue: Santiago Aboy Solanes <solanes@chromium.org>
Reviewed-by: 's avatarDan Elphick <delphick@chromium.org>
Cr-Commit-Position: refs/heads/master@{#63935}
parent 12a9ee3a
...@@ -1138,11 +1138,11 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { ...@@ -1138,11 +1138,11 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
// If ok, push undefined as the initial value for all register file entries. // If ok, push undefined as the initial value for all register file entries.
Label loop_header; Label loop_header;
Label loop_check; Label loop_check;
__ LoadRoot(r9, RootIndex::kUndefinedValue); __ LoadRoot(kInterpreterAccumulatorRegister, RootIndex::kUndefinedValue);
__ b(&loop_check, al); __ b(&loop_check, al);
__ bind(&loop_header); __ bind(&loop_header);
// TODO(rmcilroy): Consider doing more than one push per loop iteration. // TODO(rmcilroy): Consider doing more than one push per loop iteration.
__ push(r9); __ push(kInterpreterAccumulatorRegister);
// Continue loop if not done. // Continue loop if not done.
__ bind(&loop_check); __ bind(&loop_check);
__ sub(r4, r4, Operand(kPointerSize), SetCC); __ sub(r4, r4, Operand(kPointerSize), SetCC);
...@@ -1157,8 +1157,7 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { ...@@ -1157,8 +1157,7 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
__ cmp(r9, Operand::Zero()); __ cmp(r9, Operand::Zero());
__ str(r3, MemOperand(fp, r9, LSL, kPointerSizeLog2), ne); __ str(r3, MemOperand(fp, r9, LSL, kPointerSizeLog2), ne);
// Load accumulator with undefined. // The accumulator is already loaded with undefined.
__ LoadRoot(kInterpreterAccumulatorRegister, RootIndex::kUndefinedValue);
// Load the dispatch table into a register and dispatch to the bytecode // Load the dispatch table into a register and dispatch to the bytecode
// handler at the current bytecode offset. // handler at the current bytecode offset.
......
...@@ -1270,13 +1270,13 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { ...@@ -1270,13 +1270,13 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
// Note: there should always be at least one stack slot for the return // Note: there should always be at least one stack slot for the return
// register in the register file. // register in the register file.
Label loop_header; Label loop_header;
__ LoadRoot(x10, RootIndex::kUndefinedValue); __ LoadRoot(kInterpreterAccumulatorRegister, RootIndex::kUndefinedValue);
__ Lsr(x11, x11, kSystemPointerSizeLog2); __ Lsr(x11, x11, kSystemPointerSizeLog2);
// Round up the number of registers to a multiple of 2, to align the stack // Round up the number of registers to a multiple of 2, to align the stack
// to 16 bytes. // to 16 bytes.
__ Add(x11, x11, 1); __ Add(x11, x11, 1);
__ Bic(x11, x11, 1); __ Bic(x11, x11, 1);
__ PushMultipleTimes(x10, x11); __ PushMultipleTimes(kInterpreterAccumulatorRegister, x11);
__ Bind(&loop_header); __ Bind(&loop_header);
} }
...@@ -1291,8 +1291,7 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { ...@@ -1291,8 +1291,7 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
__ Str(x3, MemOperand(fp, x10, LSL, kSystemPointerSizeLog2)); __ Str(x3, MemOperand(fp, x10, LSL, kSystemPointerSizeLog2));
__ Bind(&no_incoming_new_target_or_generator_register); __ Bind(&no_incoming_new_target_or_generator_register);
// Load accumulator with undefined. // The accumulator is already loaded with undefined.
__ LoadRoot(kInterpreterAccumulatorRegister, RootIndex::kUndefinedValue);
// Load the dispatch table into a register and dispatch to the bytecode // Load the dispatch table into a register and dispatch to the bytecode
// handler at the current bytecode offset. // handler at the current bytecode offset.
......
...@@ -1154,11 +1154,11 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { ...@@ -1154,11 +1154,11 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
// If ok, push undefined as the initial value for all register file entries. // If ok, push undefined as the initial value for all register file entries.
Label loop_header; Label loop_header;
Label loop_check; Label loop_check;
__ LoadRoot(rax, RootIndex::kUndefinedValue); __ LoadRoot(kInterpreterAccumulatorRegister, RootIndex::kUndefinedValue);
__ j(always, &loop_check, Label::kNear); __ j(always, &loop_check, Label::kNear);
__ bind(&loop_header); __ bind(&loop_header);
// TODO(rmcilroy): Consider doing more than one push per loop iteration. // TODO(rmcilroy): Consider doing more than one push per loop iteration.
__ Push(rax); __ Push(kInterpreterAccumulatorRegister);
// Continue loop if not done. // Continue loop if not done.
__ bind(&loop_check); __ bind(&loop_check);
__ subq(rcx, Immediate(kSystemPointerSize)); __ subq(rcx, Immediate(kSystemPointerSize));
...@@ -1169,16 +1169,15 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { ...@@ -1169,16 +1169,15 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) {
// register, initialize it with incoming value which was passed in rdx. // register, initialize it with incoming value which was passed in rdx.
Label no_incoming_new_target_or_generator_register; Label no_incoming_new_target_or_generator_register;
__ movsxlq( __ movsxlq(
rax, rcx,
FieldOperand(kInterpreterBytecodeArrayRegister, FieldOperand(kInterpreterBytecodeArrayRegister,
BytecodeArray::kIncomingNewTargetOrGeneratorRegisterOffset)); BytecodeArray::kIncomingNewTargetOrGeneratorRegisterOffset));
__ testl(rax, rax); __ testl(rcx, rcx);
__ j(zero, &no_incoming_new_target_or_generator_register, Label::kNear); __ j(zero, &no_incoming_new_target_or_generator_register, Label::kNear);
__ movq(Operand(rbp, rax, times_system_pointer_size, 0), rdx); __ movq(Operand(rbp, rcx, times_system_pointer_size, 0), rdx);
__ bind(&no_incoming_new_target_or_generator_register); __ bind(&no_incoming_new_target_or_generator_register);
// Load accumulator with undefined. // The accumulator is already loaded with undefined.
__ LoadRoot(kInterpreterAccumulatorRegister, RootIndex::kUndefinedValue);
// Load the dispatch table into a register and dispatch to the bytecode // Load the dispatch table into a register and dispatch to the bytecode
// handler at the current bytecode offset. // handler at the current bytecode offset.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment