Index: src/ppc/builtins-ppc.cc |
diff --git a/src/ppc/builtins-ppc.cc b/src/ppc/builtins-ppc.cc |
index f50060443bbfd7b4569a4e91cfc6099f8fce95bc..e002df89ec6fb0dfca8f026e86410ca8336e46d2 100644 |
--- a/src/ppc/builtins-ppc.cc |
+++ b/src/ppc/builtins-ppc.cc |
@@ -8,7 +8,6 @@ |
#include "src/debug/debug.h" |
#include "src/deoptimizer.h" |
#include "src/full-codegen/full-codegen.h" |
-#include "src/interpreter/bytecodes.h" |
#include "src/runtime/runtime.h" |
namespace v8 { |
@@ -907,22 +906,22 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { |
Label ok; |
__ sub(r6, sp, r5); |
__ LoadRoot(r0, Heap::kRealStackLimitRootIndex); |
- __ cmp(r6, r0); |
+ __ cmpl(r6, r0); |
__ bge(&ok); |
__ InvokeBuiltin(Builtins::STACK_OVERFLOW, CALL_FUNCTION); |
__ 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. |
// TODO(rmcilroy): Consider doing more than one push per loop iteration. |
- Label loop_header; |
+ Label loop, no_args; |
__ LoadRoot(r6, Heap::kUndefinedValueRootIndex); |
- __ ShiftRightImm(r5, r5, Operand(kPointerSizeLog2)); |
+ __ ShiftRightImm(r5, r5, Operand(kPointerSizeLog2), SetRC); |
+ __ beq(&no_args, cr0); |
__ mtctr(r5); |
- __ bind(&loop_header); |
+ __ bind(&loop); |
__ push(r6); |
- __ bdnz(&loop_header); |
+ __ bdnz(&loop); |
+ __ bind(&no_args); |
} |
// TODO(rmcilroy): List of things not currently dealt with here but done in |
@@ -956,7 +955,12 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { |
__ bind(&ok); |
} |
- // Load bytecode offset and dispatch table into registers. |
+ // Load accumulator, register file, bytecode offset, dispatch table into |
+ // registers. |
+ __ LoadRoot(kInterpreterAccumulatorRegister, Heap::kUndefinedValueRootIndex); |
+ __ subi( |
+ kInterpreterRegisterFileRegister, fp, |
+ Operand(kPointerSize + StandardFrameConstants::kFixedFrameSizeFromFp)); |
__ mov(kInterpreterBytecodeOffsetRegister, |
Operand(BytecodeArray::kHeaderSize - kHeapObjectTag)); |
__ LoadRoot(kInterpreterDispatchTableRegister, |
@@ -965,14 +969,14 @@ void Builtins::Generate_InterpreterEntryTrampoline(MacroAssembler* masm) { |
Operand(FixedArray::kHeaderSize - kHeapObjectTag)); |
// Dispatch to the first bytecode handler for the function. |
- __ lbzx(r3, MemOperand(kInterpreterBytecodeArrayRegister, |
+ __ lbzx(r4, MemOperand(kInterpreterBytecodeArrayRegister, |
kInterpreterBytecodeOffsetRegister)); |
- __ ShiftLeftImm(ip, r3, Operand(kPointerSizeLog2)); |
+ __ ShiftLeftImm(ip, r4, Operand(kPointerSizeLog2)); |
__ LoadPX(ip, MemOperand(kInterpreterDispatchTableRegister, ip)); |
// TODO(rmcilroy): Make dispatch table point to code entrys to avoid untagging |
// and header removal. |
__ addi(ip, ip, Operand(Code::kHeaderSize - kHeapObjectTag)); |
- __ Jump(ip); |
+ __ Call(ip); |
} |
@@ -983,10 +987,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 r3. |
- __ LoadP(r3, |
- MemOperand(fp, -kPointerSize - |
- StandardFrameConstants::kFixedFrameSizeFromFp)); |
+ // The return value is in accumulator, which is already in r3. |
+ |
// Leave the frame (also dropping the register file). |
__ LeaveFrame(StackFrame::JAVA_SCRIPT); |
// Drop receiver + arguments. |