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
This commit is contained in:
whesse@chromium.org 2009-05-14 16:06:04 +00:00
parent 57da353113
commit 4a12504f89
6 changed files with 59 additions and 42 deletions

View File

@ -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

View File

@ -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

View File

@ -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.

View File

@ -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];

View File

@ -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.

View File

@ -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