Index: src/ia32/virtual-frame-ia32.cc |
=================================================================== |
--- src/ia32/virtual-frame-ia32.cc (revision 2055) |
+++ src/ia32/virtual-frame-ia32.cc (working copy) |
@@ -47,7 +47,7 @@ |
for (int i = 0; i <= stack_pointer_; i++) { |
elements_.Add(FrameElement::MemoryElement()); |
} |
- for (int i = 0; i < kNumRegisters; i++) { |
+ for (int i = 0; i < RegisterAllocator::kNumRegisters; i++) { |
register_locations_[i] = kIllegalIndex; |
} |
} |
@@ -156,7 +156,7 @@ |
// [min(stack_pointer_ + 1,begin), end]. |
void VirtualFrame::SyncRange(int begin, int end) { |
ASSERT(begin >= 0); |
- ASSERT(end < elements_.length()); |
+ ASSERT(end < element_count()); |
// Sync elements below the range if they have not been materialized |
// on the stack. |
int start = Min(begin, stack_pointer_ + 1); |
@@ -176,12 +176,12 @@ |
void VirtualFrame::MakeMergable(int mergable_elements) { |
if (mergable_elements == JumpTarget::kAllElements) { |
- mergable_elements = elements_.length(); |
+ mergable_elements = element_count(); |
} |
- ASSERT(mergable_elements <= elements_.length()); |
+ ASSERT(mergable_elements <= element_count()); |
- int start_index = elements_.length() - mergable_elements; |
- for (int i = start_index; i < elements_.length(); i++) { |
+ int start_index = element_count() - mergable_elements; |
+ for (int i = start_index; i < element_count(); i++) { |
FrameElement element = elements_[i]; |
if (element.is_constant() || element.is_copy()) { |
@@ -281,7 +281,7 @@ |
// of the index of the frame element esi is caching or kIllegalIndex |
// if esi has not been disturbed. |
int esi_caches = kIllegalIndex; |
- for (int i = elements_.length() - 1; i >= 0; i--) { |
+ for (int i = element_count() - 1; i >= 0; i--) { |
FrameElement target = expected->elements_[i]; |
if (target.is_register()) continue; // Handle registers later. |
if (target.is_memory()) { |
@@ -347,17 +347,16 @@ |
// We have already done X-to-memory moves. |
ASSERT(stack_pointer_ >= expected->stack_pointer_); |
- for (int i = 0; i < kNumRegisters; i++) { |
+ for (int i = 0; i < RegisterAllocator::kNumRegisters; i++) { |
// Move the right value into register i if it is currently in a register. |
- int index = expected->register_locations_[i]; |
- int use_index = register_locations_[i]; |
+ int index = expected->register_location(i); |
+ int use_index = register_location(i); |
// Skip if register i is unused in the target or else if source is |
// not a register (this is not a register-to-register move). |
if (index == kIllegalIndex || !elements_[index].is_register()) continue; |
- Register target = { i }; |
+ Register target = RegisterAllocator::ToRegister(i); |
Register source = elements_[index].reg(); |
- |
if (index != use_index) { |
if (use_index == kIllegalIndex) { // Target is currently unused. |
// Copy contents of source from source to target. |
@@ -369,8 +368,8 @@ |
// Exchange contents of registers source and target. |
// Nothing except the register backing use_index has changed. |
elements_[use_index].set_reg(source); |
- register_locations_[target.code()] = index; |
- register_locations_[source.code()] = use_index; |
+ set_register_location(target, index); |
+ set_register_location(source, use_index); |
__ xchg(source, target); |
} |
} |
@@ -390,20 +389,24 @@ |
// register code order, we have special code to ensure that the backing |
// elements of copies are in their correct locations when we |
// encounter the copies. |
- for (int i = 0; i < kNumRegisters; i++) { |
- int index = expected->register_locations_[i]; |
+ for (int i = 0; i < RegisterAllocator::kNumRegisters; i++) { |
+ int index = expected->register_location(i); |
if (index != kIllegalIndex) { |
FrameElement source = elements_[index]; |
FrameElement target = expected->elements_[index]; |
- Register target_reg = { i }; |
+ Register target_reg = RegisterAllocator::ToRegister(i); |
ASSERT(target.reg().is(target_reg)); |
switch (source.type()) { |
case FrameElement::INVALID: // Fall through. |
UNREACHABLE(); |
break; |
case FrameElement::REGISTER: |
- ASSERT(source.reg().is(target_reg)); |
- continue; // Go to next iteration. Skips Use(target_reg) below. |
+ ASSERT(source.Equals(target)); |
+ // Go to next iteration. Skips Use(target_reg) and syncing |
+ // below. It is safe to skip syncing because a target |
+ // register frame element would only be synced if all source |
+ // elements were. |
+ continue; |
break; |
case FrameElement::MEMORY: |
ASSERT(index <= stack_pointer_); |
@@ -443,8 +446,7 @@ |
} |
} |
} |
- // Ensure the proper sync state. If the source was memory no |
- // code needs to be emitted. |
+ // Ensure the proper sync state. |
if (target.is_synced() && !source.is_synced()) { |
__ mov(Operand(ebp, fp_relative(index)), target_reg); |
} |
@@ -482,7 +484,7 @@ |
// Store the function in the frame. The frame owns the register |
// reference now (ie, it can keep it in edi or spill it later). |
Push(edi); |
- SyncElementAt(elements_.length() - 1); |
+ SyncElementAt(element_count() - 1); |
cgen()->allocator()->Unuse(edi); |
} |
@@ -499,7 +501,7 @@ |
// debugger. See VisitReturnStatement for the full return sequence. |
__ mov(esp, Operand(ebp)); |
stack_pointer_ = frame_pointer(); |
- for (int i = elements_.length() - 1; i > stack_pointer_; i--) { |
+ for (int i = element_count() - 1; i > stack_pointer_; i--) { |
FrameElement last = elements_.RemoveLast(); |
if (last.is_register()) { |
Unuse(last.reg()); |
@@ -518,7 +520,7 @@ |
// we sync them with the actual frame to allocate space for spilling |
// them later. First sync everything above the stack pointer so we can |
// use pushes to allocate and initialize the locals. |
- SyncRange(stack_pointer_ + 1, elements_.length() - 1); |
+ SyncRange(stack_pointer_ + 1, element_count() - 1); |
Handle<Object> undefined = Factory::undefined_value(); |
FrameElement initial_value = |
FrameElement::ConstantElement(undefined, FrameElement::SYNCED); |
@@ -561,7 +563,7 @@ |
int new_backing_index = kIllegalIndex; |
if (original.is_copied()) { |
// Verify it is copied, and find first copy. |
- for (int i = index + 1; i < elements_.length(); i++) { |
+ for (int i = index + 1; i < element_count(); i++) { |
if (elements_[i].is_copy() && elements_[i].index() == index) { |
new_backing_index = i; |
break; |
@@ -589,7 +591,7 @@ |
} else { |
// The original was in a register. |
backing_reg = original.reg(); |
- register_locations_[backing_reg.code()] = new_backing_index; |
+ set_register_location(backing_reg, new_backing_index); |
} |
// Invalidate the element at index. |
elements_[index] = FrameElement::InvalidElement(); |
@@ -602,7 +604,7 @@ |
FrameElement::RegisterElement(backing_reg, FrameElement::NOT_SYNCED); |
} |
// Update the other copies. |
- for (int i = new_backing_index + 1; i < elements_.length(); i++) { |
+ for (int i = new_backing_index + 1; i < element_count(); i++) { |
if (elements_[i].is_copy() && elements_[i].index() == index) { |
elements_[i].set_index(new_backing_index); |
elements_[new_backing_index].set_copied(); |
@@ -614,7 +616,7 @@ |
void VirtualFrame::TakeFrameSlotAt(int index) { |
ASSERT(index >= 0); |
- ASSERT(index <= elements_.length()); |
+ ASSERT(index <= element_count()); |
FrameElement original = elements_[index]; |
int new_backing_store_index = InvalidateFrameSlotAt(index); |
if (new_backing_store_index != kIllegalIndex) { |
@@ -631,13 +633,13 @@ |
FrameElement new_element = |
FrameElement::RegisterElement(fresh.reg(), |
FrameElement::NOT_SYNCED); |
- Use(fresh.reg(), elements_.length()); |
+ Use(fresh.reg(), element_count()); |
elements_.Add(new_element); |
__ mov(fresh.reg(), Operand(ebp, fp_relative(index))); |
break; |
} |
case FrameElement::REGISTER: |
- Use(original.reg(), elements_.length()); |
+ Use(original.reg(), element_count()); |
// Fall through. |
case FrameElement::CONSTANT: |
case FrameElement::COPY: |
@@ -656,9 +658,9 @@ |
// a given index. The value on top of the frame is left in place. |
// This is a duplicating operation, so it can create copies. |
ASSERT(index >= 0); |
- ASSERT(index < elements_.length()); |
+ ASSERT(index < element_count()); |
- int top_index = elements_.length() - 1; |
+ int top_index = element_count() - 1; |
FrameElement top = elements_[top_index]; |
FrameElement original = elements_[index]; |
if (top.is_copy() && top.index() == index) return; |
@@ -705,7 +707,7 @@ |
__ mov(temp.reg(), Operand(ebp, fp_relative(backing_index))); |
__ mov(Operand(ebp, fp_relative(index)), temp.reg()); |
} else { |
- register_locations_[backing_element.reg().code()] = index; |
+ set_register_location(backing_element.reg(), index); |
if (backing_element.is_synced()) { |
// If the element is a register, we will not actually move |
// anything on the stack but only update the virtual frame |
@@ -725,7 +727,7 @@ |
// All the copies of the old backing element (including the top |
// element) become copies of the new backing element. |
- for (int i = backing_index + 1; i < elements_.length(); i++) { |
+ for (int i = backing_index + 1; i < element_count(); i++) { |
if (elements_[i].is_copy() && elements_[i].index() == backing_index) { |
elements_[i].set_index(index); |
} |
@@ -752,7 +754,7 @@ |
__ mov(temp.reg(), Operand(esp, 0)); |
__ mov(Operand(ebp, fp_relative(index)), temp.reg()); |
} else if (top.is_register()) { |
- register_locations_[top.reg().code()] = index; |
+ set_register_location(top.reg(), index); |
// The stored-to slot has the (unsynced) register reference and |
// the top element becomes a copy. The sync state of the top is |
// preserved. |
@@ -976,7 +978,7 @@ |
void VirtualFrame::Drop(int count) { |
ASSERT(height() >= count); |
- int num_virtual_elements = (elements_.length() - 1) - stack_pointer_; |
+ int num_virtual_elements = (element_count() - 1) - stack_pointer_; |
// Emit code to lower the stack pointer if necessary. |
if (num_virtual_elements < count) { |
@@ -997,7 +999,7 @@ |
Result VirtualFrame::Pop() { |
FrameElement element = elements_.RemoveLast(); |
- int index = elements_.length(); |
+ int index = element_count(); |
ASSERT(element.is_valid()); |
bool pop_needed = (stack_pointer_ == index); |
@@ -1052,7 +1054,7 @@ |
void VirtualFrame::EmitPop(Register reg) { |
- ASSERT(stack_pointer_ == elements_.length() - 1); |
+ ASSERT(stack_pointer_ == element_count() - 1); |
stack_pointer_--; |
elements_.RemoveLast(); |
__ pop(reg); |
@@ -1060,7 +1062,7 @@ |
void VirtualFrame::EmitPop(Operand operand) { |
- ASSERT(stack_pointer_ == elements_.length() - 1); |
+ ASSERT(stack_pointer_ == element_count() - 1); |
stack_pointer_--; |
elements_.RemoveLast(); |
__ pop(operand); |
@@ -1068,7 +1070,7 @@ |
void VirtualFrame::EmitPush(Register reg) { |
- ASSERT(stack_pointer_ == elements_.length() - 1); |
+ ASSERT(stack_pointer_ == element_count() - 1); |
elements_.Add(FrameElement::MemoryElement()); |
stack_pointer_++; |
__ push(reg); |
@@ -1076,7 +1078,7 @@ |
void VirtualFrame::EmitPush(Operand operand) { |
- ASSERT(stack_pointer_ == elements_.length() - 1); |
+ ASSERT(stack_pointer_ == element_count() - 1); |
elements_.Add(FrameElement::MemoryElement()); |
stack_pointer_++; |
__ push(operand); |
@@ -1084,7 +1086,7 @@ |
void VirtualFrame::EmitPush(Immediate immediate) { |
- ASSERT(stack_pointer_ == elements_.length() - 1); |
+ ASSERT(stack_pointer_ == element_count() - 1); |
elements_.Add(FrameElement::MemoryElement()); |
stack_pointer_++; |
__ push(immediate); |