Index: src/compiler/mips64/code-generator-mips64.cc |
diff --git a/src/compiler/mips64/code-generator-mips64.cc b/src/compiler/mips64/code-generator-mips64.cc |
index 67b9d3f8087500c5a378694274d32495c53e3db5..830869a8a93683e2811f9b7f8b90a82a5969cc2b 100644 |
--- a/src/compiler/mips64/code-generator-mips64.cc |
+++ b/src/compiler/mips64/code-generator-mips64.cc |
@@ -1043,6 +1043,7 @@ void CodeGenerator::AssembleDeoptimizerCall(int deoptimization_id) { |
void CodeGenerator::AssemblePrologue() { |
CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); |
+ int stack_slots = frame()->GetSpillSlotCount(); |
if (descriptor->kind() == CallDescriptor::kCallAddress) { |
__ Push(ra, fp); |
__ mov(fp, sp); |
@@ -1062,12 +1063,11 @@ void CodeGenerator::AssemblePrologue() { |
__ Prologue(info->IsCodePreAgingActive()); |
frame()->SetRegisterSaveAreaSize( |
StandardFrameConstants::kFixedFrameSizeFromFp); |
- } else { |
+ } else if (stack_slots > 0) { |
__ StubPrologue(); |
frame()->SetRegisterSaveAreaSize( |
StandardFrameConstants::kFixedFrameSizeFromFp); |
} |
- int stack_slots = frame()->GetSpillSlotCount(); |
if (info()->is_osr()) { |
// TurboFan OSR-compiled functions cannot be entered directly. |
@@ -1091,10 +1091,10 @@ void CodeGenerator::AssemblePrologue() { |
void CodeGenerator::AssembleReturn() { |
CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); |
+ int stack_slots = frame()->GetSpillSlotCount(); |
if (descriptor->kind() == CallDescriptor::kCallAddress) { |
if (frame()->GetRegisterSaveAreaSize() > 0) { |
// Remove this frame's spill slots first. |
- int stack_slots = frame()->GetSpillSlotCount(); |
if (stack_slots > 0) { |
__ Daddu(sp, sp, Operand(stack_slots * kPointerSize)); |
} |
@@ -1107,13 +1107,15 @@ void CodeGenerator::AssembleReturn() { |
__ mov(sp, fp); |
__ Pop(ra, fp); |
__ Ret(); |
- } else { |
+ } else if (descriptor->IsJSFunctionCall() || stack_slots > 0) { |
__ mov(sp, fp); |
__ Pop(ra, fp); |
int pop_count = descriptor->IsJSFunctionCall() |
? static_cast<int>(descriptor->JSParameterCount()) |
: 0; |
__ DropAndRet(pop_count); |
+ } else { |
+ __ Ret(); |
} |
} |