Index: src/virtual-frame.cc |
=================================================================== |
--- src/virtual-frame.cc (revision 1589) |
+++ src/virtual-frame.cc (working copy) |
@@ -63,6 +63,9 @@ |
for (int i = 0; i < original->elements_.length(); i++) { |
elements_.Add(original->elements_[i]); |
} |
+ for (int i = 0; i < kNumRegisters; i++) { |
+ register_locations_[i] = original->register_locations_[i]; |
+ } |
} |
@@ -150,19 +153,26 @@ |
Unuse(last.reg()); |
} else { |
frame_registers_.Unuse(last.reg()); |
+ register_locations_[last.reg().code()] = kIllegalIndex; |
} |
} |
} |
} |
-void VirtualFrame::Use(Register reg) { |
+void VirtualFrame::Use(Register reg, int index) { |
+ ASSERT(frame_registers_.count(reg) == 0); |
+ ASSERT(register_locations_[reg.code()] == kIllegalIndex); |
+ register_locations_[reg.code()] = index; |
frame_registers_.Use(reg); |
cgen_->allocator()->Use(reg); |
} |
void VirtualFrame::Unuse(Register reg) { |
+ ASSERT(frame_registers_.count(reg) == 1); |
+ ASSERT(register_locations_[reg.code()] != kIllegalIndex); |
+ register_locations_[reg.code()] = kIllegalIndex; |
frame_registers_.Unuse(reg); |
cgen_->allocator()->Unuse(reg); |
} |
@@ -270,6 +280,7 @@ |
Unuse(source.reg()); |
} else { |
frame_registers_.Unuse(source.reg()); |
+ register_locations_[source.reg().code()] = kIllegalIndex; |
} |
} |
elements_[i] = target; |
@@ -382,7 +393,7 @@ |
// There are two cases depending no whether the register already |
// occurs in the frame or not. |
if (register_count(value->reg()) == 0) { |
- Use(value->reg()); |
+ Use(value->reg(), frame_index); |
elements_[frame_index] = |
FrameElement::RegisterElement(value->reg(), |
FrameElement::NOT_SYNCED); |
@@ -408,6 +419,7 @@ |
elements_[i].set_sync(); |
} |
elements_[frame_index].clear_sync(); |
+ register_locations_[value->reg().code()] = frame_index; |
for (int j = i + 1; j < elements_.length(); j++) { |
if (elements_[j].is_copy() && elements_[j].index() == i) { |
elements_[j].set_index(frame_index); |
@@ -487,7 +499,7 @@ |
void VirtualFrame::Push(Register reg) { |
FrameElement new_element; |
if (register_count(reg) == 0) { |
- Use(reg); |
+ Use(reg, elements_.length()); |
new_element = |
FrameElement::RegisterElement(reg, FrameElement::NOT_SYNCED); |
} else { |
@@ -560,6 +572,9 @@ |
if (frame_registers_.count(i) != other->frame_registers_.count(i)) { |
return false; |
} |
+ if (register_locations_[i] != other->register_locations_[i]) { |
+ return false; |
+ } |
} |
if (elements_.length() != other->elements_.length()) return false; |
#endif |