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:
parent
57da353113
commit
4a12504f89
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user