Index: src/mips64/builtins-mips64.cc |
diff --git a/src/mips64/builtins-mips64.cc b/src/mips64/builtins-mips64.cc |
index eb1bd554195a331ffcd782053238039d5069671b..9f1a2e0a63d98201f4b63113fd06e8f9301e37da 100644 |
--- a/src/mips64/builtins-mips64.cc |
+++ b/src/mips64/builtins-mips64.cc |
@@ -917,14 +917,15 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { |
__ bind(&ok); |
// If ok, push undefined as the initial value for all register file entries. |
- // Note: there should always be at least one stack slot for the return |
- // register in the register file. |
Label loop_header; |
+ Label loop_check; |
__ LoadRoot(a5, Heap::kUndefinedValueRootIndex); |
+ __ Branch(&loop_check); |
__ bind(&loop_header); |
// TODO(rmcilroy): Consider doing more than one push per loop iteration. |
__ push(a5); |
// Continue loop if not done. |
+ __ bind(&loop_check); |
__ Dsubu(a4, a4, Operand(kPointerSize)); |
__ Branch(&loop_header, ge, a4, Operand(zero_reg)); |
} |
@@ -960,6 +961,10 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { |
} |
// Load bytecode offset and dispatch table into registers. |
+ __ LoadRoot(kInterpreterAccumulatorRegister, Heap::kUndefinedValueRootIndex); |
+ __ Dsubu( |
+ kInterpreterRegisterFileRegister, fp, |
+ Operand(kPointerSize + StandardFrameConstants::kFixedFrameSizeFromFp)); |
__ li(kInterpreterBytecodeOffsetRegister, |
Operand(BytecodeArray::kHeaderSize - kHeapObjectTag)); |
__ LoadRoot(kInterpreterDispatchTableRegister, |
@@ -977,7 +982,7 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { |
// TODO(rmcilroy): Make dispatch table point to code entrys to avoid untagging |
// and header removal. |
__ Daddu(at, at, Operand(Code::kHeaderSize - kHeapObjectTag)); |
- __ Jump(at); |
+ __ Call(at); |
} |
@@ -988,9 +993,8 @@ void Builtins::Generate_InterpreterExitTrampoline(MacroAssembler* masm) { |
// - Support profiler (specifically decrementing profiling_counter |
// appropriately and calling out to HandleInterrupts if necessary). |
- // Load return value into v0. |
- __ ld(v0, MemOperand(fp, -kPointerSize - |
- StandardFrameConstants::kFixedFrameSizeFromFp)); |
+ // The return value is in accumulator, which is already in v0. |
+ |
// Leave the frame (also dropping the register file). |
__ LeaveFrame(StackFrame::JAVA_SCRIPT); |
// Drop receiver + arguments. |