Index: src/x64/virtual-frame-x64.h |
=================================================================== |
--- src/x64/virtual-frame-x64.h (revision 2055) |
+++ src/x64/virtual-frame-x64.h (working copy) |
@@ -83,21 +83,35 @@ |
// Create a duplicate of an existing valid frame element. |
FrameElement CopyElementAt(int index); |
+ // The number of elements on the virtual frame. |
+ int element_count() { return elements_.length(); } |
+ |
// The height of the virtual expression stack. |
int height() { |
- return elements_.length() - expression_base_index(); |
+ return element_count() - expression_base_index(); |
} |
- int register_index(Register reg) { |
- return register_locations_[reg.code()]; |
+ int register_location(int num) { |
+ ASSERT(num >= 0 && num < RegisterAllocator::kNumRegisters); |
+ return register_locations_[num]; |
} |
- bool is_used(int reg_code) { |
- return register_locations_[reg_code] != kIllegalIndex; |
+ int register_location(Register reg) { |
+ return register_locations_[RegisterAllocator::ToNumber(reg)]; |
} |
+ void set_register_location(Register reg, int index) { |
+ register_locations_[RegisterAllocator::ToNumber(reg)] = index; |
+ } |
+ |
+ bool is_used(int num) { |
+ ASSERT(num >= 0 && num < RegisterAllocator::kNumRegisters); |
+ return register_locations_[num] != kIllegalIndex; |
+ } |
+ |
bool is_used(Register reg) { |
- return is_used(reg.code()); |
+ return register_locations_[RegisterAllocator::ToNumber(reg)] |
+ != kIllegalIndex; |
} |
// Add extra in-memory elements to the top of the frame to match an actual |
@@ -112,7 +126,7 @@ |
// handler). No code will be emitted. |
void Forget(int count) { |
ASSERT(count >= 0); |
- ASSERT(stack_pointer_ == elements_.length() - 1); |
+ ASSERT(stack_pointer_ == element_count() - 1); |
stack_pointer_ -= count; |
ForgetElements(count); |
} |
@@ -127,7 +141,7 @@ |
// Spill all occurrences of a specific register from the frame. |
void Spill(Register reg) { |
- if (is_used(reg)) SpillElementAt(register_index(reg)); |
+ if (is_used(reg)) SpillElementAt(register_location(reg)); |
} |
// Spill all occurrences of an arbitrary register if possible. Return the |
@@ -135,6 +149,9 @@ |
// (ie, they all have frame-external references). |
Register SpillAnyRegister(); |
+ // Sync the range of elements in [begin, end] with memory. |
+ void SyncRange(int begin, int end); |
+ |
// Make this frame so that an arbitrary frame of the same height can |
// be merged to it. Copies and constants are removed from the |
// topmost mergable_elements elements of the frame. A |
@@ -158,11 +175,8 @@ |
// one to NULL by an unconditional jump. |
void DetachFromCodeGenerator() { |
RegisterAllocator* cgen_allocator = cgen()->allocator(); |
- for (int i = 0; i < kNumRegisters; i++) { |
- if (is_used(i)) { |
- Register temp = { i }; |
- cgen_allocator->Unuse(temp); |
- } |
+ for (int i = 0; i < RegisterAllocator::kNumRegisters; i++) { |
+ if (is_used(i)) cgen_allocator->Unuse(i); |
} |
} |
@@ -172,11 +186,8 @@ |
// binding a label. |
void AttachToCodeGenerator() { |
RegisterAllocator* cgen_allocator = cgen()->allocator(); |
- for (int i = 0; i < kNumRegisters; i++) { |
- if (is_used(i)) { |
- Register temp = { i }; |
- cgen_allocator->Use(temp); |
- } |
+ for (int i = 0; i < RegisterAllocator::kNumRegisters; i++) { |
+ if (is_used(i)) cgen_allocator->Use(i); |
} |
} |
@@ -211,11 +222,11 @@ |
} |
void PushElementAt(int index) { |
- PushFrameSlotAt(elements_.length() - index - 1); |
+ PushFrameSlotAt(element_count() - index - 1); |
} |
void StoreToElementAt(int index) { |
- StoreToFrameSlotAt(elements_.length() - index - 1); |
+ StoreToFrameSlotAt(element_count() - index - 1); |
} |
// A frame-allocated local as an assembly operand. |
@@ -352,7 +363,7 @@ |
void Drop() { Drop(1); } |
// Duplicate the top element of the frame. |
- void Dup() { PushFrameSlotAt(elements_.length() - 1); } |
+ void Dup() { PushFrameSlotAt(element_count() - 1); } |
// Pop an element from the top of the expression stack. Returns a |
// Result, which may be a constant or a register. |
@@ -407,7 +418,7 @@ |
// The index of the register frame element using each register, or |
// kIllegalIndex if a register is not on the frame. |
- int register_locations_[kNumRegisters]; |
+ int register_locations_[RegisterAllocator::kNumRegisters]; |
// The number of frame-allocated locals and parameters respectively. |
int parameter_count() { return cgen()->scope()->num_parameters(); } |
@@ -420,7 +431,7 @@ |
// The index of the first parameter. The receiver lies below the first |
// parameter. |
- int param0_index() const { return 1; } |
+ int param0_index() { return 1; } |
// The index of the context slot in the frame. It is immediately |
// above the frame pointer. |
@@ -440,8 +451,8 @@ |
// Convert a frame index into a frame pointer relative offset into the |
// actual stack. |
int fp_relative(int index) { |
- ASSERT(index < elements_.length()); |
- ASSERT(frame_pointer() < elements_.length()); // FP is on the frame. |
+ ASSERT(index < element_count()); |
+ ASSERT(frame_pointer() < element_count()); // FP is on the frame. |
return (frame_pointer() - index) * kPointerSize; |
} |
@@ -450,7 +461,7 @@ |
// of updating the index of the register's location in the frame. |
void Use(Register reg, int index) { |
ASSERT(!is_used(reg)); |
- register_locations_[reg.code()] = index; |
+ set_register_location(reg, index); |
cgen()->allocator()->Use(reg); |
} |
@@ -458,8 +469,8 @@ |
// decrements the register's external reference count and invalidates the |
// index of the register's location in the frame. |
void Unuse(Register reg) { |
- ASSERT(register_locations_[reg.code()] != kIllegalIndex); |
- register_locations_[reg.code()] = kIllegalIndex; |
+ ASSERT(is_used(reg)); |
+ set_register_location(reg, kIllegalIndex); |
cgen()->allocator()->Unuse(reg); |
} |
@@ -473,9 +484,6 @@ |
// Keep the element type as register or constant, and clear the dirty bit. |
void SyncElementAt(int index); |
- // Sync the range of elements in [begin, end). |
- void SyncRange(int begin, int end); |
- |
// Sync a single unsynced element that lies beneath or at the stack pointer. |
void SyncElementBelowStackPointer(int index); |