| Index: src/compiler/frame.h
|
| diff --git a/src/compiler/frame.h b/src/compiler/frame.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..251bd49f5d8ffe5a7460e4268b1b9aa71e8b5d3e
|
| --- /dev/null
|
| +++ b/src/compiler/frame.h
|
| @@ -0,0 +1,104 @@
|
| +// Copyright 2014 the V8 project authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef V8_COMPILER_FRAME_H_
|
| +#define V8_COMPILER_FRAME_H_
|
| +
|
| +#include "src/v8.h"
|
| +
|
| +#include "src/data-flow.h"
|
| +
|
| +namespace v8 {
|
| +namespace internal {
|
| +namespace compiler {
|
| +
|
| +// Collects the spill slot requirements and the allocated general and double
|
| +// registers for a compiled function. Frames are usually populated by the
|
| +// register allocator and are used by Linkage to generate code for the prologue
|
| +// and epilogue to compiled code.
|
| +class Frame {
|
| + public:
|
| + Frame()
|
| + : register_save_area_size_(0),
|
| + spill_slot_count_(0),
|
| + double_spill_slot_count_(0),
|
| + allocated_registers_(NULL),
|
| + allocated_double_registers_(NULL) {}
|
| +
|
| + inline int GetSpillSlotCount() { return spill_slot_count_; }
|
| + inline int GetDoubleSpillSlotCount() { return double_spill_slot_count_; }
|
| +
|
| + void SetAllocatedRegisters(BitVector* regs) {
|
| + ASSERT(allocated_registers_ == NULL);
|
| + allocated_registers_ = regs;
|
| + }
|
| +
|
| + void SetAllocatedDoubleRegisters(BitVector* regs) {
|
| + ASSERT(allocated_double_registers_ == NULL);
|
| + allocated_double_registers_ = regs;
|
| + }
|
| +
|
| + bool DidAllocateDoubleRegisters() {
|
| + return !allocated_double_registers_->IsEmpty();
|
| + }
|
| +
|
| + void SetRegisterSaveAreaSize(int size) {
|
| + ASSERT(IsAligned(size, kPointerSize));
|
| + register_save_area_size_ = size;
|
| + }
|
| +
|
| + int GetRegisterSaveAreaSize() { return register_save_area_size_; }
|
| +
|
| + int AllocateSpillSlot(bool is_double) {
|
| + // If 32-bit, skip one if the new slot is a double.
|
| + if (is_double) {
|
| + if (kDoubleSize > kPointerSize) {
|
| + ASSERT(kDoubleSize == kPointerSize * 2);
|
| + spill_slot_count_++;
|
| + spill_slot_count_ |= 1;
|
| + }
|
| + double_spill_slot_count_++;
|
| + }
|
| + return spill_slot_count_++;
|
| + }
|
| +
|
| + private:
|
| + int register_save_area_size_;
|
| + int spill_slot_count_;
|
| + int double_spill_slot_count_;
|
| + BitVector* allocated_registers_;
|
| + BitVector* allocated_double_registers_;
|
| +};
|
| +
|
| +
|
| +// Represents an offset from either the stack pointer or frame pointer.
|
| +class FrameOffset {
|
| + public:
|
| + inline bool from_stack_pointer() { return (offset_ & 1) == kFromSp; }
|
| + inline bool from_frame_pointer() { return (offset_ & 1) == kFromFp; }
|
| + inline int offset() { return offset_ & ~1; }
|
| +
|
| + inline static FrameOffset FromStackPointer(int offset) {
|
| + ASSERT((offset & 1) == 0);
|
| + return FrameOffset(offset | kFromSp);
|
| + }
|
| +
|
| + inline static FrameOffset FromFramePointer(int offset) {
|
| + ASSERT((offset & 1) == 0);
|
| + return FrameOffset(offset | kFromFp);
|
| + }
|
| +
|
| + private:
|
| + explicit FrameOffset(int offset) : offset_(offset) {}
|
| +
|
| + int offset_; // Encodes SP or FP in the low order bit.
|
| +
|
| + static const int kFromSp = 1;
|
| + static const int kFromFp = 0;
|
| +};
|
| +}
|
| +}
|
| +} // namespace v8::internal::compiler
|
| +
|
| +#endif // V8_COMPILER_FRAME_H_
|
|
|