Index: src/virtual-frame.cc |
=================================================================== |
--- src/virtual-frame.cc (revision 1604) |
+++ src/virtual-frame.cc (working copy) |
@@ -57,8 +57,7 @@ |
parameter_count_(original->parameter_count_), |
local_count_(original->local_count_), |
stack_pointer_(original->stack_pointer_), |
- frame_pointer_(original->frame_pointer_), |
- frame_registers_(original->frame_registers_) { |
+ frame_pointer_(original->frame_pointer_) { |
// Copy all the elements from the original. |
for (int i = 0; i < original->elements_.length(); i++) { |
elements_.Add(original->elements_[i]); |
@@ -152,7 +151,6 @@ |
if (cgen_->frame() == this) { |
Unuse(last.reg()); |
} else { |
- frame_registers_.Unuse(last.reg()); |
register_locations_[last.reg().code()] = kIllegalIndex; |
} |
} |
@@ -161,29 +159,22 @@ |
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); |
} |
void VirtualFrame::Spill(Register target) { |
- if (!frame_registers_.is_used(target)) return; |
- for (int i = 0; i < elements_.length(); i++) { |
- if (elements_[i].is_register() && elements_[i].reg().is(target)) { |
- SpillElementAt(i); |
- } |
+ if (is_used(target)) { |
+ SpillElementAt(register_index(target)); |
} |
} |
@@ -194,23 +185,15 @@ |
// internally-referenced register whose internal reference count matches |
// its external reference count (so that spilling it from the frame frees |
// it for use). |
- int min_count = kMaxInt; |
- int best_register_code = no_reg.code_; |
- |
for (int i = 0; i < kNumRegisters; i++) { |
- int count = frame_registers_.count(i); |
- if (count < min_count && count == cgen_->allocator()->count(i)) { |
- min_count = count; |
- best_register_code = i; |
+ if (is_used(i) && cgen_->allocator()->count(i) == 1) { |
+ Register result = { i }; |
+ Spill(result); |
+ ASSERT(!cgen_->allocator()->is_used(result)); |
+ return result; |
} |
} |
- |
- Register result = { best_register_code }; |
- if (result.is_valid()) { |
- Spill(result); |
- ASSERT(!cgen_->allocator()->is_used(result)); |
- } |
- return result; |
+ return no_reg; |
} |
@@ -279,7 +262,6 @@ |
if (cgen_->frame() == this) { |
Unuse(source.reg()); |
} else { |
- frame_registers_.Unuse(source.reg()); |
register_locations_[source.reg().code()] = kIllegalIndex; |
} |
} |
@@ -390,24 +372,13 @@ |
FrameElement new_element; |
if (value->is_register()) { |
- // 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(), frame_index); |
- elements_[frame_index] = |
- FrameElement::RegisterElement(value->reg(), |
- FrameElement::NOT_SYNCED); |
- } else { |
- int i = 0; |
- for (; i < elements_.length(); i++) { |
- if (elements_[i].is_register() && elements_[i].reg().is(value->reg())) { |
- break; |
- } |
- } |
- ASSERT(i < elements_.length()); |
- |
+ if (is_used(value->reg())) { |
+ // The register already appears on the frame. Either the existing |
+ // register element, or the new element at frame_index, must be made |
+ // a copy. |
+ int i = register_index(value->reg()); |
if (i < frame_index) { |
- // The register backing store is lower in the frame than its copy. |
+ // The register FrameElement is lower in the frame than the new copy. |
elements_[frame_index] = CopyElementAt(i); |
} else { |
// There was an early bailout for the case of setting a |
@@ -426,6 +397,12 @@ |
} |
} |
} |
+ } else { |
+ // The register value->reg() was not already used on the frame. |
+ Use(value->reg(), frame_index); |
+ elements_[frame_index] = |
+ FrameElement::RegisterElement(value->reg(), |
+ FrameElement::NOT_SYNCED); |
} |
} else { |
ASSERT(value->is_constant()); |
@@ -497,21 +474,12 @@ |
void VirtualFrame::Push(Register reg) { |
- FrameElement new_element; |
- if (register_count(reg) == 0) { |
- Use(reg, elements_.length()); |
- new_element = |
- FrameElement::RegisterElement(reg, FrameElement::NOT_SYNCED); |
+ if (is_used(reg)) { |
+ elements_.Add(CopyElementAt(register_index(reg))); |
} else { |
- for (int i = 0; i < elements_.length(); i++) { |
- FrameElement element = elements_[i]; |
- if (element.is_register() && element.reg().is(reg)) { |
- new_element = CopyElementAt(i); |
- break; |
- } |
- } |
+ Use(reg, elements_.length()); |
+ elements_.Add(FrameElement::RegisterElement(reg, FrameElement::NOT_SYNCED)); |
} |
- elements_.Add(new_element); |
} |
@@ -569,9 +537,6 @@ |
if (frame_pointer_ != other->frame_pointer_) return false; |
for (int i = 0; i < kNumRegisters; i++) { |
- if (frame_registers_.count(i) != other->frame_registers_.count(i)) { |
- return false; |
- } |
if (register_locations_[i] != other->register_locations_[i]) { |
return false; |
} |