Author: [email protected]
Date: Tue Feb 17 05:57:30 2009
New Revision: 1291

Modified:
    branches/experimental/toiger/src/codegen-ia32.cc

Log:
Experimental: eliminate a few spilled scopes in function prologue and
declaration code.
Review URL: http://codereview.chromium.org/20417

Modified: branches/experimental/toiger/src/codegen-ia32.cc
==============================================================================
--- branches/experimental/toiger/src/codegen-ia32.cc    (original)
+++ branches/experimental/toiger/src/codegen-ia32.cc    Tue Feb 17 05:57:30  
2009
@@ -191,13 +191,26 @@
          Variable* par = scope_->parameter(i);
          Slot* slot = par->slot();
          if (slot != NULL && slot->type() == Slot::CONTEXT) {
-          VirtualFrame::SpilledScope spilled_scope(this);
-          ASSERT(!scope_->is_global_scope());  // no parameters in global  
scope
-          __ mov(eax, frame_->ParameterAt(i));
-          // Loads ecx with context; used below in RecordWrite.
-          __ mov(SlotOperand(slot, edx), eax);
+          // The use of SlotOperand below is safe in unspilled code
+          // because the slot is guaranteed to be a context slot.
+          //
+          // There are no parameters in the global scope.
+          ASSERT(!scope_->is_global_scope());
+          frame_->PushParameterAt(i);
+          Result value = frame_->Pop();
+          value.ToRegister();
+
+          // SlotOperand loads context.reg() with the context object
+          // stored to, used below in RecordWrite.
+          Result context = allocator_->Allocate();
+          ASSERT(context.is_valid());
+          __ mov(SlotOperand(slot, context.reg()), value.reg());
            int offset = FixedArray::kHeaderSize + slot->index() *  
kPointerSize;
-          __ RecordWrite(edx, offset, eax, ebx);
+          Result scratch = allocator_->Allocate();
+          ASSERT(scratch.is_valid());
+          frame_->Spill(context.reg());
+          frame_->Spill(value.reg());
+          __ RecordWrite(context.reg(), offset, value.reg(),  
scratch.reg());
          }
        }
      }
@@ -210,7 +223,6 @@
      // initialization because the arguments object may be stored in the
      // context.
      if (scope_->arguments() != NULL) {
-      VirtualFrame::SpilledScope spilled_scope(this);
        Comment cmnt(masm_, "[ store arguments object");
        { Reference shadow_ref(this, scope_->arguments_shadow());
          ASSERT(shadow_ref.is_slot());
@@ -535,7 +547,6 @@
      // The expression is a variable proxy that does not rewrite to a
      // property.  Global variables are treated as named property  
references.
      if (var->is_global()) {
-      VirtualFrame::SpilledScope spilled_scope(this);
        LoadGlobal();
        ref->set_type(Reference::NAMED);
      } else {
@@ -1497,11 +1508,14 @@


  void CodeGenerator::DeclareGlobals(Handle<FixedArray> pairs) {
-  VirtualFrame::SpilledScope spilled_scope(this);
-  frame_->EmitPush(Immediate(pairs));
-  frame_->EmitPush(esi);
-  frame_->EmitPush(Immediate(Smi::FromInt(is_eval() ? 1 : 0)));
-  frame_->CallRuntime(Runtime::kDeclareGlobals, 3);
+  frame_->Push(pairs);
+
+  // Duplicate the context register.
+  Result context(esi, this);
+  frame_->Push(&context);
+
+  frame_->Push(Smi::FromInt(is_eval() ? 1 : 0));
+  Result ignored = frame_->CallRuntime(Runtime::kDeclareGlobals, 3);
    // Return value is ignored.
  }

@@ -1520,26 +1534,26 @@
      // Variables with a "LOOKUP" slot were introduced as non-locals
      // during variable resolution and must have mode DYNAMIC.
      ASSERT(var->mode() == Variable::DYNAMIC);
-    // For now, just do a runtime call.
-    VirtualFrame::SpilledScope spilled_scope(this);
-    frame_->EmitPush(esi);
-    frame_->EmitPush(Immediate(var->name()));
+    // For now, just do a runtime call.  Duplicate the context register.
+    Result context(esi, this);
+    frame_->Push(&context);
+    frame_->Push(var->name());
      // Declaration nodes are always introduced in one of two modes.
      ASSERT(node->mode() == Variable::VAR || node->mode() ==  
Variable::CONST);
      PropertyAttributes attr = node->mode() == Variable::VAR ? NONE :  
READ_ONLY;
-    frame_->EmitPush(Immediate(Smi::FromInt(attr)));
+    frame_->Push(Smi::FromInt(attr));
      // Push initial value, if any.
      // Note: For variables we must not push an initial value (such as
      // 'undefined') because we may have a (legal) redeclaration and we
      // must not destroy the current value.
      if (node->mode() == Variable::CONST) {
-      frame_->EmitPush(Immediate(Factory::the_hole_value()));
+      frame_->Push(Factory::the_hole_value());
      } else if (node->fun() != NULL) {
-      LoadAndSpill(node->fun());
+      Load(node->fun());
      } else {
-      frame_->EmitPush(Immediate(0));  // no initial value!
+      frame_->Push(Smi::FromInt(0));  // no initial value!
      }
-    frame_->CallRuntime(Runtime::kDeclareContextSlot, 4);
+    Result ignored = frame_->CallRuntime(Runtime::kDeclareContextSlot, 4);
      // Ignore the return value (declarations are statements).
      return;
    }
@@ -1555,11 +1569,10 @@
    }

    if (val != NULL) {
-    VirtualFrame::SpilledScope spilled_scope(this);
      {
-      // Set initial value.
+      // Set the initial value.
        Reference target(this, node->proxy());
-      LoadAndSpill(val);
+      Load(val);
        target.SetValue(NOT_CONST_INIT);
        // The reference is removed from the stack (preserving TOS) when
        // it goes out of scope.
@@ -3394,13 +3407,12 @@


  void CodeGenerator::VisitThrow(Throw* node) {
-  VirtualFrame::SpilledScope spilled_scope(this);
    Comment cmnt(masm_, "[ Throw");
    CodeForStatementPosition(node);

-  LoadAndSpill(node->exception());
-  frame_->CallRuntime(Runtime::kThrow, 1);
-  frame_->EmitPush(eax);
+  Load(node->exception());
+  Result result = frame_->CallRuntime(Runtime::kThrow, 1);
+  frame_->Push(&result);
  }



--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to