Chromium Code Reviews| 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,17 @@ |
| // 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_; |
| - |
| + // This function must be called with no free registers - all counts |
| + // in the CodeGenerator's Allocator must be above 0. |
|
Kevin Millikin (Chromium)
2009/03/25 09:54:11
I don't like this comment. It's not really a true
William Hesse
2012/05/07 09:35:42
Done.
|
| 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 +264,6 @@ |
| if (cgen_->frame() == this) { |
| Unuse(source.reg()); |
| } else { |
| - frame_registers_.Unuse(source.reg()); |
| register_locations_[source.reg().code()] = kIllegalIndex; |
| } |
| } |
| @@ -390,24 +374,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 +399,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 +476,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 +539,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; |
| } |