summaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/frame.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler/frame.cc')
-rw-r--r--deps/v8/src/compiler/frame.cc40
1 files changed, 34 insertions, 6 deletions
diff --git a/deps/v8/src/compiler/frame.cc b/deps/v8/src/compiler/frame.cc
index 079fccb71c..b08030b8c6 100644
--- a/deps/v8/src/compiler/frame.cc
+++ b/deps/v8/src/compiler/frame.cc
@@ -12,12 +12,40 @@ namespace v8 {
namespace internal {
namespace compiler {
-Frame::Frame(int fixed_frame_size_in_slots)
- : frame_slot_count_(fixed_frame_size_in_slots),
- spilled_callee_register_slot_count_(0),
- stack_slot_count_(0),
- allocated_registers_(NULL),
- allocated_double_registers_(NULL) {}
+Frame::Frame(int fixed_frame_size_in_slots, const CallDescriptor* descriptor)
+ : needs_frame_((descriptor != nullptr) &&
+ descriptor->RequiresFrameAsIncoming()),
+ frame_slot_count_(fixed_frame_size_in_slots),
+ callee_saved_slot_count_(0),
+ spill_slot_count_(0),
+ allocated_registers_(nullptr),
+ allocated_double_registers_(nullptr) {}
+
+
+void FrameAccessState::SetFrameAccessToDefault() {
+ if (frame()->needs_frame() && !FLAG_turbo_sp_frame_access) {
+ SetFrameAccessToFP();
+ } else {
+ SetFrameAccessToSP();
+ }
+}
+
+
+FrameOffset FrameAccessState::GetFrameOffset(int spill_slot) const {
+ const int offset =
+ (StandardFrameConstants::kFixedSlotCountAboveFp - spill_slot - 1) *
+ kPointerSize;
+ if (access_frame_with_fp()) {
+ DCHECK(frame()->needs_frame());
+ return FrameOffset::FromFramePointer(offset);
+ } else {
+ // No frame. Retrieve all parameters relative to stack pointer.
+ int sp_offset =
+ offset + ((frame()->GetSpToFpSlotCount() + sp_delta()) * kPointerSize);
+ return FrameOffset::FromStackPointer(sp_offset);
+ }
+}
+
} // namespace compiler
} // namespace internal