Chromium Code Reviews| Index: src/jump-target.cc |
| =================================================================== |
| --- src/jump-target.cc (revision 1905) |
| +++ src/jump-target.cc (working copy) |
| @@ -189,28 +189,37 @@ |
| } |
| } |
| - // Compute the registers already reserved by values in the frame. |
| - // Count the reserved registers to avoid using them. |
| - RegisterFile frame_registers = RegisterAllocator::Reserved(); |
| - for (int i = 0; i < length; i++) { |
| - FrameElement* element = elements[i]; |
| - if (element != NULL && element->is_register()) { |
| - frame_registers.Use(element->reg()); |
| + // Build the new frame. Initially it has memory elements for the |
| + // parameters and some platform-dependent elements (e.g., return |
| + // address). Fill those in first. |
|
William Hesse
2009/05/11 13:47:34
The new frame does not "have" memory elements for
Kevin Millikin (Chromium)
2009/05/11 13:57:15
Replaced with:
// Build the new frame. A freshl
|
| + entry_frame_ = new VirtualFrame(cgen_); |
| + int index = 0; |
| + for (; index < entry_frame_->elements_.length(); index++) { |
| + // If the element is determined, set it now and count registers. |
| + // Undetermined elements are initially recorded as if in memory. |
| + if (elements[index] != NULL) { |
| + entry_frame_->elements_[index] = *elements[index]; |
| + if (elements[index]->is_register()) { |
| + entry_frame_->register_locations_[elements[index]->reg().code()] = |
| + index; |
| + } |
| } |
| } |
| - |
| - // Build the new frame. The frame already has memory elements for |
| - // the parameters (including the receiver) and the return address. |
| - // We will fill it up with memory elements. |
| - entry_frame_ = new VirtualFrame(cgen_); |
| - while (entry_frame_->elements_.length() < length) { |
| - entry_frame_->elements_.Add(FrameElement::MemoryElement()); |
| + // Fill in the rest of the frame with new elements. |
| + for (; index < length; index++) { |
| + if (elements[index] == NULL) { |
| + entry_frame_->elements_.Add(FrameElement::MemoryElement()); |
| + } else { |
| + entry_frame_->elements_.Add(*elements[index]); |
| + if (elements[index]->is_register()) { |
| + entry_frame_->register_locations_[elements[index]->reg().code()] = |
| + index; |
| + } |
| + } |
| } |
| - |
| - // Copy the already-determined frame elements to the entry frame, |
| - // and allocate any still-undetermined frame elements to registers |
| - // or memory, from the top down. |
| + // Allocate any still-undetermined frame elements to registers or |
| + // memory, from the top down. |
| for (int i = length - 1; i >= 0; i--) { |
| if (elements[i] == NULL) { |
| // If the value is synced on all frames, put it in memory. This |
| @@ -234,7 +243,7 @@ |
| for (int j = 0; j < reaching_frames_.length(); j++) { |
| FrameElement element = reaching_frames_[j]->elements_[i]; |
| if (element.is_register() && |
| - !frame_registers.is_used(element.reg())) { |
| + !entry_frame_->is_used(element.reg())) { |
| candidate_registers.Use(element.reg()); |
| if (candidate_registers.count(element.reg()) > max_count) { |
| max_count = candidate_registers.count(element.reg()); |
| @@ -245,7 +254,7 @@ |
| // If there was no preferred choice consider any free register. |
| if (best_reg_code == no_reg.code_) { |
| for (int j = 0; j < kNumRegisters; j++) { |
| - if (!frame_registers.is_used(j)) { |
| + if (!entry_frame_->is_used(j) && !RegisterAllocator::IsReserved(j)) { |
| best_reg_code = j; |
| break; |
| } |
| @@ -256,27 +265,21 @@ |
| // (the element is already recorded as in memory) |
| if (best_reg_code != no_reg.code_) { |
| Register reg = { best_reg_code }; |
| - frame_registers.Use(reg); |
| entry_frame_->elements_[i] = |
| FrameElement::RegisterElement(reg, |
| FrameElement::NOT_SYNCED); |
| + entry_frame_->register_locations_[best_reg_code] = i; |
| } |
| - } else { |
| - // The element is already determined. |
| - entry_frame_->elements_[i] = *elements[i]; |
| } |
| } |
| // Set the copied flags in the frame to be exact. This assumes that |
| // the backing store of copies is always lower in the frame. |
| - // Set the register locations to their index in the frame. |
| for (int i = 0; i < length; i++) { |
| FrameElement* current = &entry_frame_->elements_[i]; |
| current->clear_copied(); |
| if (current->is_copy()) { |
| entry_frame_->elements_[current->index()].set_copied(); |
| - } else if (current->is_register()) { |
| - entry_frame_->register_locations_[current->reg().code()] = i; |
| } |
| if (direction_ == BIDIRECTIONAL && i >= high_water_mark) { |