Index: src/mips/lithium-codegen-mips.cc |
diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc |
index 7f6e86980872e1c79cd66f4bfdabecdfe81cf0ab..6f1ecdfc474928593ffec49ab29cb0169b4ddb0f 100644 |
--- a/src/mips/lithium-codegen-mips.cc |
+++ b/src/mips/lithium-codegen-mips.cc |
@@ -488,17 +488,36 @@ Operand LCodeGen::ToOperand(LOperand* op) { |
} |
+static int ArgumentsOffsetWithoutFrame(int index) { |
+ ASSERT(index < 0); |
+ return -(index + 1) * kPointerSize; |
+} |
+ |
+ |
MemOperand LCodeGen::ToMemOperand(LOperand* op) const { |
ASSERT(!op->IsRegister()); |
ASSERT(!op->IsDoubleRegister()); |
ASSERT(op->IsStackSlot() || op->IsDoubleStackSlot()); |
- return MemOperand(fp, StackSlotOffset(op->index())); |
+ if (NeedsEagerFrame()) { |
+ return MemOperand(fp, StackSlotOffset(op->index())); |
+ } else { |
+ // Retrieve parameter without eager stack-frame relative to the |
+ // stack-pointer. |
+ return MemOperand(sp, ArgumentsOffsetWithoutFrame(op->index())); |
+ } |
} |
MemOperand LCodeGen::ToHighMemOperand(LOperand* op) const { |
ASSERT(op->IsDoubleStackSlot()); |
- return MemOperand(fp, StackSlotOffset(op->index()) + kPointerSize); |
+ if (NeedsEagerFrame()) { |
+ return MemOperand(fp, StackSlotOffset(op->index()) + kPointerSize); |
+ } else { |
+ // Retrieve parameter without eager stack-frame relative to the |
+ // stack-pointer. |
+ return MemOperand( |
+ sp, ArgumentsOffsetWithoutFrame(op->index()) + kPointerSize); |
+ } |
} |
@@ -4015,7 +4034,12 @@ void LCodeGen::DoCallFunction(LCallFunction* instr) { |
int arity = instr->arity(); |
CallFunctionStub stub(arity, NO_CALL_FUNCTION_FLAGS); |
- CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); |
+ if (instr->hydrogen()->IsTailCall()) { |
+ if (NeedsEagerFrame()) __ mov(sp, fp); |
+ __ Jump(stub.GetCode(isolate()), RelocInfo::CODE_TARGET); |
+ } else { |
+ CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); |
+ } |
} |