Partial and small update to the codegen to use the new register allocator framework. See http://codereview.chromium.org/1732024. Committed for Rodolph Perfetta.

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@4564 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
erik.corry@gmail.com 2010-05-03 10:22:25 +00:00
parent 289b245d2b
commit 9d5f6d0b46
3 changed files with 45 additions and 21 deletions

View File

@ -1563,12 +1563,11 @@ void CodeGenerator::VisitBlock(Block* node) {
void CodeGenerator::DeclareGlobals(Handle<FixedArray> pairs) { void CodeGenerator::DeclareGlobals(Handle<FixedArray> pairs) {
VirtualFrame::SpilledScope spilled_scope(frame_);
frame_->EmitPush(cp); frame_->EmitPush(cp);
__ mov(r0, Operand(pairs)); frame_->EmitPush(Operand(pairs));
frame_->EmitPush(r0); frame_->EmitPush(Operand(Smi::FromInt(is_eval() ? 1 : 0)));
__ mov(r0, Operand(Smi::FromInt(is_eval() ? 1 : 0)));
frame_->EmitPush(r0); VirtualFrame::SpilledScope spilled_scope(frame_);
frame_->CallRuntime(Runtime::kDeclareGlobals, 3); frame_->CallRuntime(Runtime::kDeclareGlobals, 3);
// The result is discarded. // The result is discarded.
} }
@ -1578,7 +1577,6 @@ void CodeGenerator::VisitDeclaration(Declaration* node) {
#ifdef DEBUG #ifdef DEBUG
int original_height = frame_->height(); int original_height = frame_->height();
#endif #endif
VirtualFrame::SpilledScope spilled_scope(frame_);
Comment cmnt(masm_, "[ Declaration"); Comment cmnt(masm_, "[ Declaration");
Variable* var = node->proxy()->var(); Variable* var = node->proxy()->var();
ASSERT(var != NULL); // must have been resolved ASSERT(var != NULL); // must have been resolved
@ -1593,28 +1591,27 @@ void CodeGenerator::VisitDeclaration(Declaration* node) {
ASSERT(var->is_dynamic()); ASSERT(var->is_dynamic());
// For now, just do a runtime call. // For now, just do a runtime call.
frame_->EmitPush(cp); frame_->EmitPush(cp);
__ mov(r0, Operand(var->name())); frame_->EmitPush(Operand(var->name()));
frame_->EmitPush(r0);
// Declaration nodes are always declared in only two modes. // Declaration nodes are always declared in only two modes.
ASSERT(node->mode() == Variable::VAR || node->mode() == Variable::CONST); ASSERT(node->mode() == Variable::VAR || node->mode() == Variable::CONST);
PropertyAttributes attr = node->mode() == Variable::VAR ? NONE : READ_ONLY; PropertyAttributes attr = node->mode() == Variable::VAR ? NONE : READ_ONLY;
__ mov(r0, Operand(Smi::FromInt(attr))); frame_->EmitPush(Operand(Smi::FromInt(attr)));
frame_->EmitPush(r0);
// Push initial value, if any. // Push initial value, if any.
// Note: For variables we must not push an initial value (such as // Note: For variables we must not push an initial value (such as
// 'undefined') because we may have a (legal) redeclaration and we // 'undefined') because we may have a (legal) redeclaration and we
// must not destroy the current value. // must not destroy the current value.
if (node->mode() == Variable::CONST) { if (node->mode() == Variable::CONST) {
__ LoadRoot(r0, Heap::kTheHoleValueRootIndex); frame_->EmitPushRoot(Heap::kTheHoleValueRootIndex);
frame_->EmitPush(r0);
} else if (node->fun() != NULL) { } else if (node->fun() != NULL) {
LoadAndSpill(node->fun()); Load(node->fun());
} else { } else {
__ mov(r0, Operand(0)); // no initial value! frame_->EmitPush(Operand(0));
frame_->EmitPush(r0);
} }
VirtualFrame::SpilledScope spilled_scope(frame_);
frame_->CallRuntime(Runtime::kDeclareContextSlot, 4); frame_->CallRuntime(Runtime::kDeclareContextSlot, 4);
// Ignore the return value (declarations are statements). // Ignore the return value (declarations are statements).
ASSERT(frame_->height() == original_height); ASSERT(frame_->height() == original_height);
return; return;
} }
@ -1630,12 +1627,11 @@ void CodeGenerator::VisitDeclaration(Declaration* node) {
} }
if (val != NULL) { if (val != NULL) {
{ // Set initial value.
// Set initial value. Reference target(this, node->proxy());
Reference target(this, node->proxy()); Load(val);
LoadAndSpill(val); target.SetValue(NOT_CONST_INIT);
target.SetValue(NOT_CONST_INIT);
}
// Get rid of the assigned value (declarations are statements). // Get rid of the assigned value (declarations are statements).
frame_->Drop(); frame_->Drop();
} }

View File

@ -541,6 +541,19 @@ Register VirtualFrame::GetTOSRegister() {
} }
void VirtualFrame::EmitPush(Operand operand) {
element_count_++;
if (SpilledScope::is_spilled()) {
__ mov(r0, operand);
__ push(r0);
return;
}
EnsureOneFreeTOSRegister();
top_of_stack_state_ = kStateAfterPush[top_of_stack_state_];
__ mov(kTopRegister[top_of_stack_state_], operand);
}
void VirtualFrame::EmitPush(MemOperand operand) { void VirtualFrame::EmitPush(MemOperand operand) {
element_count_++; element_count_++;
if (SpilledScope::is_spilled()) { if (SpilledScope::is_spilled()) {
@ -554,6 +567,19 @@ void VirtualFrame::EmitPush(MemOperand operand) {
} }
void VirtualFrame::EmitPushRoot(Heap::RootListIndex index) {
element_count_++;
if (SpilledScope::is_spilled()) {
__ LoadRoot(r0, index);
__ push(r0);
return;
}
EnsureOneFreeTOSRegister();
top_of_stack_state_ = kStateAfterPush[top_of_stack_state_];
__ LoadRoot(kTopRegister[top_of_stack_state_], index);
}
void VirtualFrame::EmitPushMultiple(int count, int src_regs) { void VirtualFrame::EmitPushMultiple(int count, int src_regs) {
ASSERT(SpilledScope::is_spilled()); ASSERT(SpilledScope::is_spilled());
Adjust(count); Adjust(count);

View File

@ -372,7 +372,9 @@ class VirtualFrame : public ZoneObject {
// Push an element on top of the expression stack and emit a // Push an element on top of the expression stack and emit a
// corresponding push instruction. // corresponding push instruction.
void EmitPush(Register reg); void EmitPush(Register reg);
void EmitPush(Operand operand);
void EmitPush(MemOperand operand); void EmitPush(MemOperand operand);
void EmitPushRoot(Heap::RootListIndex index);
// Get a register which is free and which must be immediately used to // Get a register which is free and which must be immediately used to
// push on the top of the stack. // push on the top of the stack.