Index: src/compiler/arm64/code-generator-arm64.cc |
diff --git a/src/compiler/arm64/code-generator-arm64.cc b/src/compiler/arm64/code-generator-arm64.cc |
index 57e1e4661269218eb32f12356b93268e98e1359a..7ad3c142cf51be5ba98e3204999ec4afa783ada2 100644 |
--- a/src/compiler/arm64/code-generator-arm64.cc |
+++ b/src/compiler/arm64/code-generator-arm64.cc |
@@ -1515,22 +1515,40 @@ void CodeGenerator::AssembleDeoptimizerCall( |
__ Call(deopt_entry, RelocInfo::RUNTIME_ENTRY); |
} |
-void CodeGenerator::AssembleSetupStackPointer() { |
- const CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); |
+void CodeGenerator::FinishFrame(Frame* frame) { |
+ frame->AlignFrame(16); |
+ CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); |
+ |
if (descriptor->UseNativeStack() || descriptor->IsCFunctionCall()) { |
__ SetStackPointer(csp); |
} else { |
__ SetStackPointer(jssp); |
} |
+ |
+ // Save FP registers. |
+ CPURegList saves_fp = CPURegList(CPURegister::kFPRegister, kDRegSizeInBits, |
+ descriptor->CalleeSavedFPRegisters()); |
+ int saved_count = saves_fp.Count(); |
+ if (saved_count != 0) { |
+ DCHECK(saves_fp.list() == CPURegList::GetCalleeSavedFP().list()); |
+ frame->AllocateSavedCalleeRegisterSlots(saved_count * |
+ (kDoubleSize / kPointerSize)); |
+ } |
+ |
+ CPURegList saves = CPURegList(CPURegister::kRegister, kXRegSizeInBits, |
+ descriptor->CalleeSavedRegisters()); |
+ saved_count = saves.Count(); |
+ if (saved_count != 0) { |
+ frame->AllocateSavedCalleeRegisterSlots(saved_count); |
+ } |
} |
-void CodeGenerator::AssemblePrologue() { |
+void CodeGenerator::AssembleConstructFrame() { |
CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); |
if (descriptor->UseNativeStack()) { |
__ AssertCspAligned(); |
} |
- int stack_shrink_slots = frame()->GetSpillSlotCount(); |
if (frame_access_state()->has_frame()) { |
if (descriptor->IsJSFunctionCall()) { |
DCHECK(!descriptor->UseNativeStack()); |
@@ -1539,7 +1557,7 @@ void CodeGenerator::AssemblePrologue() { |
if (descriptor->IsCFunctionCall()) { |
__ Push(lr, fp); |
__ Mov(fp, masm_.StackPointer()); |
- __ Claim(stack_shrink_slots); |
+ __ Claim(frame()->GetSpillSlotCount()); |
} else { |
__ StubPrologue(info()->GetOutputStackFrameType(), |
frame()->GetTotalFrameSlotCount()); |
@@ -1547,6 +1565,8 @@ void CodeGenerator::AssemblePrologue() { |
} |
} |
+ int shrink_slots = frame()->GetSpillSlotCount(); |
+ |
if (info()->is_osr()) { |
// TurboFan OSR-compiled functions cannot be entered directly. |
__ Abort(kShouldNotDirectlyEnterOsrFunction); |
@@ -1557,11 +1577,11 @@ void CodeGenerator::AssemblePrologue() { |
// remaining stack slots. |
if (FLAG_code_comments) __ RecordComment("-- OSR entrypoint --"); |
osr_pc_offset_ = __ pc_offset(); |
- stack_shrink_slots -= OsrHelper(info()).UnoptimizedFrameSlots(); |
+ shrink_slots -= OsrHelper(info()).UnoptimizedFrameSlots(); |
} |
if (descriptor->IsJSFunctionCall()) { |
- __ Claim(stack_shrink_slots); |
+ __ Claim(shrink_slots); |
} |
// Save FP registers. |
@@ -1571,8 +1591,6 @@ void CodeGenerator::AssemblePrologue() { |
if (saved_count != 0) { |
DCHECK(saves_fp.list() == CPURegList::GetCalleeSavedFP().list()); |
__ PushCPURegList(saves_fp); |
- frame()->AllocateSavedCalleeRegisterSlots(saved_count * |
- (kDoubleSize / kPointerSize)); |
} |
// Save registers. |
// TODO(palfia): TF save list is not in sync with |
@@ -1583,7 +1601,6 @@ void CodeGenerator::AssemblePrologue() { |
saved_count = saves.Count(); |
if (saved_count != 0) { |
__ PushCPURegList(saves); |
- frame()->AllocateSavedCalleeRegisterSlots(saved_count); |
} |
} |