Commit 4a12504f authored by whesse@chromium.org's avatar whesse@chromium.org

Improve algorithm for detaching and attaching a virtual frame to the code

generator.  Inline copying of a register file.
Review URL: http://codereview.chromium.org/113402

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@1954 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 57da3531
......@@ -127,13 +127,29 @@ class VirtualFrame : public ZoneObject {
// tells the register allocator that it is free to use frame-internal
// registers. Used when the code generator's frame is switched from this
// one to NULL by an unconditional jump.
void DetachFromCodeGenerator();
void DetachFromCodeGenerator() {
RegisterAllocator* cgen_allocator = cgen_->allocator();
for (int i = 0; i < kNumRegisters; i++) {
if (is_used(i)) {
Register temp = { i };
cgen_allocator->Unuse(temp);
}
}
}
// (Re)attach a frame to its code generator. This informs the register
// allocator that the frame-internal register references are active again.
// Used when a code generator's frame is switched from NULL to this one by
// binding a label.
void AttachToCodeGenerator();
void AttachToCodeGenerator() {
RegisterAllocator* cgen_allocator = cgen_->allocator();
for (int i = 0; i < kNumRegisters; i++) {
if (is_used(i)) {
Register temp = { i };
cgen_allocator->Use(temp);
}
}
}
// Emit code for the physical JS entry and exit frame sequences. After
// calling Enter, the virtual frame is ready for use; and after calling
......
......@@ -130,13 +130,29 @@ class VirtualFrame : public ZoneObject {
// tells the register allocator that it is free to use frame-internal
// registers. Used when the code generator's frame is switched from this
// one to NULL by an unconditional jump.
void DetachFromCodeGenerator();
void DetachFromCodeGenerator() {
RegisterAllocator* cgen_allocator = cgen_->allocator();
for (int i = 0; i < kNumRegisters; i++) {
if (is_used(i)) {
Register temp = { i };
cgen_allocator->Unuse(temp);
}
}
}
// (Re)attach a frame to its code generator. This informs the register
// allocator that the frame-internal register references are active again.
// Used when a code generator's frame is switched from NULL to this one by
// binding a label.
void AttachToCodeGenerator();
void AttachToCodeGenerator() {
RegisterAllocator* cgen_allocator = cgen_->allocator();
for (int i = 0; i < kNumRegisters; i++) {
if (is_used(i)) {
Register temp = { i };
cgen_allocator->Use(temp);
}
}
}
// Emit code for the physical JS entry and exit frame sequences. After
// calling Enter, the virtual frame is ready for use; and after calling
......
......@@ -71,16 +71,6 @@ void Result::CopyTo(Result* destination) const {
}
// -------------------------------------------------------------------------
// RegisterFile implementation.
void RegisterFile::CopyTo(RegisterFile* other) {
for (int i = 0; i < kNumRegisters; i++) {
other->ref_counts_[i] = ref_counts_[i];
}
}
// -------------------------------------------------------------------------
// RegisterAllocator implementation.
......
......@@ -243,7 +243,11 @@ class RegisterFile BASE_EMBEDDED {
}
// Copy the reference counts from this register file to the other.
void CopyTo(RegisterFile* other);
void CopyTo(RegisterFile* other) {
for (int i = 0; i < kNumRegisters; i++) {
other->ref_counts_[i] = ref_counts_[i];
}
}
private:
int ref_counts_[kNumRegisters];
......
......@@ -304,30 +304,6 @@ void VirtualFrame::PrepareForCall(int spilled_args, int dropped_args) {
}
void VirtualFrame::DetachFromCodeGenerator() {
// Tell the global register allocator that it is free to reallocate all
// register references contained in this frame. The frame elements remain
// register references, so the frame-internal reference count is not
// decremented.
for (int i = 0; i < elements_.length(); i++) {
if (elements_[i].is_register()) {
cgen_->allocator()->Unuse(elements_[i].reg());
}
}
}
void VirtualFrame::AttachToCodeGenerator() {
// Tell the global register allocator that the frame-internal register
// references are live again.
for (int i = 0; i < elements_.length(); i++) {
if (elements_[i].is_register()) {
cgen_->allocator()->Use(elements_[i].reg());
}
}
}
void VirtualFrame::PrepareForReturn() {
// Spill all locals. This is necessary to make sure all locals have
// the right value when breaking at the return site in the debugger.
......
......@@ -130,13 +130,28 @@ class VirtualFrame : public Malloced {
// tells the register allocator that it is free to use frame-internal
// registers. Used when the code generator's frame is switched from this
// one to NULL by an unconditional jump.
void DetachFromCodeGenerator();
void DetachFromCodeGenerator() {
RegisterAllocator* cgen_allocator = cgen_->allocator();
for (int i = 0; i < kNumRegisters; i++) {
if (is_used(i)) {
Register temp = { i };
cgen_allocator->Unuse(temp);
}
}
}
// (Re)attach a frame to its code generator. This informs the register
// allocator that the frame-internal register references are active again.
// Used when a code generator's frame is switched from NULL to this one by
// binding a label.
void AttachToCodeGenerator();
void AttachToCodeGenerator() {
RegisterAllocator* cgen_allocator = cgen_->allocator();
for (int i = 0; i < kNumRegisters; i++) {
if (is_used(i)) {
Register temp = { i };
cgen_allocator->Use(temp);
}
}
}
// Emit code for the physical JS entry and exit frame sequences. After
// calling Enter, the virtual frame is ready for use; and after calling
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment