blob: b08030b8c6634fedbdd1e95a1f63caf7e9f93789 [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// Copyright 2015 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "src/compiler/frame.h"
6
7#include "src/compiler/linkage.h"
8#include "src/compiler/register-allocator.h"
9#include "src/macro-assembler.h"
10
11namespace v8 {
12namespace internal {
13namespace compiler {
14
15Frame::Frame(int fixed_frame_size_in_slots, const CallDescriptor* descriptor)
16 : needs_frame_((descriptor != nullptr) &&
17 descriptor->RequiresFrameAsIncoming()),
18 frame_slot_count_(fixed_frame_size_in_slots),
19 callee_saved_slot_count_(0),
20 spill_slot_count_(0),
21 allocated_registers_(nullptr),
22 allocated_double_registers_(nullptr) {}
23
24
25void FrameAccessState::SetFrameAccessToDefault() {
26 if (frame()->needs_frame() && !FLAG_turbo_sp_frame_access) {
27 SetFrameAccessToFP();
28 } else {
29 SetFrameAccessToSP();
30 }
31}
32
33
34FrameOffset FrameAccessState::GetFrameOffset(int spill_slot) const {
35 const int offset =
36 (StandardFrameConstants::kFixedSlotCountAboveFp - spill_slot - 1) *
37 kPointerSize;
38 if (access_frame_with_fp()) {
39 DCHECK(frame()->needs_frame());
40 return FrameOffset::FromFramePointer(offset);
41 } else {
42 // No frame. Retrieve all parameters relative to stack pointer.
43 int sp_offset =
44 offset + ((frame()->GetSpToFpSlotCount() + sp_delta()) * kPointerSize);
45 return FrameOffset::FromStackPointer(sp_offset);
46 }
47}
48
49
50} // namespace compiler
51} // namespace internal
52} // namespace v8