Author: [email protected]
Date: Mon Jan 26 02:14:20 2009
New Revision: 1144

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

Log:
Experimental: cleanup of the code generator source file.  Some simple
formatting changes, and external issue numbers attached to TODOs.
Review URL: http://codereview.chromium.org/18742

Modified: branches/experimental/toiger/src/codegen-ia32.cc
==============================================================================
--- branches/experimental/toiger/src/codegen-ia32.cc    (original)
+++ branches/experimental/toiger/src/codegen-ia32.cc    Mon Jan 26 02:14:20  
2009
@@ -718,23 +718,13 @@
                                  Token::Value op,
                                  OverwriteMode mode,
                                  GenericBinaryFlags flags)
-      : DeferredCode(generator),
-        stub_(op, mode, flags),
-        op_(op) {
+      : DeferredCode(generator), stub_(op, mode, flags), op_(op) {
+    set_comment("[ DeferredInlineBinaryOperation");
    }

-  // The binary operation's arguments are on top of the code generator's  
frame.
    Result GenerateInlineCode();

-  virtual void Generate() {
-    Result left(generator());
-    Result right(generator());
-    enter()->Bind(&left, &right);
-    generator()->frame()->Push(&left);
-    generator()->frame()->Push(&right);
-    Result answer = generator()->frame()->CallStub(&stub_, 2);
-    exit()->Jump(&answer);
-  }
+  virtual void Generate();

   private:
    GenericBinaryOpStub stub_;
@@ -742,6 +732,17 @@
  };


+void DeferredInlineBinaryOperation::Generate() {
+  Result left(generator());
+  Result right(generator());
+  enter()->Bind(&left, &right);
+  generator()->frame()->Push(&left);
+  generator()->frame()->Push(&right);
+  Result answer = generator()->frame()->CallStub(&stub_, 2);
+  exit()->Jump(&answer);
+}
+
+
  void CodeGenerator::GenericBinaryOperation(Token::Value op,
                                             StaticType* type,
                                             OverwriteMode overwrite_mode) {
@@ -800,23 +801,17 @@
  class DeferredInlinedSmiOperation: public DeferredCode {
   public:
    DeferredInlinedSmiOperation(CodeGenerator* generator,
-                              Token::Value op, int value,
-                              OverwriteMode overwrite_mode) :
-      DeferredCode(generator), op_(op), value_(value),
-      overwrite_mode_(overwrite_mode) {
+                              Token::Value op,
+                              int value,
+                              OverwriteMode overwrite_mode)
+      : DeferredCode(generator),
+        op_(op),
+        value_(value),
+        overwrite_mode_(overwrite_mode) {
      set_comment("[ DeferredInlinedSmiOperation");
    }
-  virtual void Generate() {
-    // The argument is actually passed in eax.
-    enter()->Bind();
-    VirtualFrame::SpilledScope spilled_scope(generator());
-    generator()->frame()->EmitPush(eax);
-    generator()->frame()->EmitPush(Immediate(Smi::FromInt(value_)));
-    GenericBinaryOpStub igostub(op_, overwrite_mode_, SMI_CODE_INLINED);
-    generator()->frame()->CallStub(&igostub, 2);
-    // The result is actually returned in eax.
-    exit()->Jump();
-  }
+
+  virtual void Generate();

   private:
    Token::Value op_;
@@ -825,26 +820,33 @@
  };


+void DeferredInlinedSmiOperation::Generate() {
+  // The argument is passed in eax.
+  enter()->Bind();
+  VirtualFrame::SpilledScope spilled_scope(generator());
+  generator()->frame()->EmitPush(eax);
+  generator()->frame()->EmitPush(Immediate(Smi::FromInt(value_)));
+  GenericBinaryOpStub igostub(op_, overwrite_mode_, SMI_CODE_INLINED);
+  generator()->frame()->CallStub(&igostub, 2);
+  // The result is returned in eax.
+  exit()->Jump();
+}
+
+
  class DeferredInlinedSmiOperationReversed: public DeferredCode {
   public:
    DeferredInlinedSmiOperationReversed(CodeGenerator* generator,
-                                      Token::Value op, int value,
-                                      OverwriteMode overwrite_mode) :
-      DeferredCode(generator), op_(op), value_(value),
-      overwrite_mode_(overwrite_mode) {
+                                      Token::Value op,
+                                      int value,
+                                      OverwriteMode overwrite_mode)
+      : DeferredCode(generator),
+        op_(op),
+        value_(value),
+        overwrite_mode_(overwrite_mode) {
      set_comment("[ DeferredInlinedSmiOperationReversed");
    }
-  virtual void Generate() {
-    // The argument is actually passed in eax.
-    enter()->Bind();
-    VirtualFrame::SpilledScope spilled_scope(generator());
-    generator()->frame()->EmitPush(Immediate(Smi::FromInt(value_)));
-    generator()->frame()->EmitPush(eax);
-    GenericBinaryOpStub igostub(op_, overwrite_mode_, SMI_CODE_INLINED);
-    generator()->frame()->CallStub(&igostub, 2);
-    // The result is actually returned in eax.
-    exit()->Jump();
-  }
+
+  virtual void Generate();

   private:
    Token::Value op_;
@@ -853,27 +855,31 @@
  };


+void DeferredInlinedSmiOperationReversed::Generate() {
+  // The argument is passed in eax.
+  enter()->Bind();
+  VirtualFrame::SpilledScope spilled_scope(generator());
+  generator()->frame()->EmitPush(Immediate(Smi::FromInt(value_)));
+  generator()->frame()->EmitPush(eax);
+  GenericBinaryOpStub igostub(op_, overwrite_mode_, SMI_CODE_INLINED);
+  generator()->frame()->CallStub(&igostub, 2);
+  // The result is returned in eax.
+  exit()->Jump();
+}
+
+
  class DeferredInlinedSmiAdd: public DeferredCode {
   public:
-  DeferredInlinedSmiAdd(CodeGenerator* generator, Smi* value,
-                        OverwriteMode overwrite_mode) :
-      DeferredCode(generator), value_(value),  
overwrite_mode_(overwrite_mode) {
+  DeferredInlinedSmiAdd(CodeGenerator* generator,
+                        Smi* value,
+                        OverwriteMode overwrite_mode)
+      : DeferredCode(generator),
+        value_(value),
+        overwrite_mode_(overwrite_mode) {
      set_comment("[ DeferredInlinedSmiAdd");
    }

-  virtual void Generate() {
-    Result arg(generator());
-    enter()->Bind(&arg);
-    arg.ToRegister();
-    generator()->frame()->Spill(arg.reg());
-    // Undo the optimistic add operation and call the shared stub.
-    __ sub(Operand(arg.reg()), Immediate(value_));
-    generator()->frame()->Push(&arg);
-    generator()->frame()->Push(value_);
-    GenericBinaryOpStub igostub(Token::ADD, overwrite_mode_,  
SMI_CODE_INLINED);
-    Result result = generator()->frame()->CallStub(&igostub, 2);
-    exit()->Jump(&result);
-  }
+  virtual void Generate();

   private:
    Smi* value_;
@@ -881,27 +887,33 @@
  };


+void DeferredInlinedSmiAdd::Generate() {
+  // Undo the optimistic add operation and call the shared stub.
+  Result left(generator());  // Initially left + value_.
+  enter()->Bind(&left);
+  left.ToRegister();
+  generator()->frame()->Spill(left.reg());
+  __ sub(Operand(left.reg()), Immediate(value_));
+  generator()->frame()->Push(&left);
+  generator()->frame()->Push(value_);
+  GenericBinaryOpStub igostub(Token::ADD, overwrite_mode_,  
SMI_CODE_INLINED);
+  Result answer = generator()->frame()->CallStub(&igostub, 2);
+  exit()->Jump(&answer);
+}
+
+
  class DeferredInlinedSmiAddReversed: public DeferredCode {
   public:
-  DeferredInlinedSmiAddReversed(CodeGenerator* generator, Smi* value,
-                        OverwriteMode overwrite_mode) :
-      DeferredCode(generator), value_(value),  
overwrite_mode_(overwrite_mode) {
+  DeferredInlinedSmiAddReversed(CodeGenerator* generator,
+                                Smi* value,
+                                OverwriteMode overwrite_mode)
+      : DeferredCode(generator),
+        value_(value),
+        overwrite_mode_(overwrite_mode) {
      set_comment("[ DeferredInlinedSmiAddReversed");
    }

-  virtual void Generate() {
-    Result arg(generator());
-    enter()->Bind(&arg);
-    arg.ToRegister();
-    generator()->frame()->Spill(arg.reg());
-    // Undo the optimistic add operation and call the shared stub.
-    __ sub(Operand(arg.reg()), Immediate(value_));
-    generator()->frame()->Push(value_);
-    generator()->frame()->Push(&arg);
-    GenericBinaryOpStub igostub(Token::ADD, overwrite_mode_,  
SMI_CODE_INLINED);
-    arg = generator()->frame()->CallStub(&igostub, 2);
-    exit()->Jump(&arg);
-  }
+  virtual void Generate();

   private:
    Smi* value_;
@@ -909,29 +921,33 @@
  };


+void DeferredInlinedSmiAddReversed::Generate() {
+  // Undo the optimistic add operation and call the shared stub.
+  Result right(generator());  // Initially value_ + right.
+  enter()->Bind(&right);
+  right.ToRegister();
+  generator()->frame()->Spill(right.reg());
+  __ sub(Operand(right.reg()), Immediate(value_));
+  generator()->frame()->Push(value_);
+  generator()->frame()->Push(&right);
+  GenericBinaryOpStub igostub(Token::ADD, overwrite_mode_,  
SMI_CODE_INLINED);
+  Result answer = generator()->frame()->CallStub(&igostub, 2);
+  exit()->Jump(&answer);
+}
+
+
  class DeferredInlinedSmiSub: public DeferredCode {
   public:
    DeferredInlinedSmiSub(CodeGenerator* generator,
                          Smi* value,
-                        OverwriteMode overwrite_mode) :
-      DeferredCode(generator), value_(value),  
overwrite_mode_(overwrite_mode) {
+                        OverwriteMode overwrite_mode)
+      : DeferredCode(generator),
+        value_(value),
+        overwrite_mode_(overwrite_mode) {
      set_comment("[ DeferredInlinedSmiSub");
    }

-  virtual void Generate() {
-    Result argument(generator());
-    enter()->Bind(&argument);
-    argument.ToRegister();
-    generator()->frame()->Spill(argument.reg());
-    // Undo the optimistic sub operation and call the shared stub.
-    __ add(Operand(argument.reg()), Immediate(value_));
-    generator()->frame()->Push(&argument);
-    generator()->frame()->Push(value_);
-    GenericBinaryOpStub igostub(Token::SUB, overwrite_mode_,  
SMI_CODE_INLINED);
-    Result answer = generator()->frame()->CallStub(&igostub, 2);
-    // The result is actually returned in eax.
-    exit()->Jump(&answer);
-  }
+  virtual void Generate();

   private:
    Smi* value_;
@@ -939,25 +955,33 @@
  };


+void DeferredInlinedSmiSub::Generate() {
+  // Undo the optimistic sub operation and call the shared stub.
+  Result left(generator());  // Initially left - value_.
+  enter()->Bind(&left);
+  left.ToRegister();
+  generator()->frame()->Spill(left.reg());
+  __ add(Operand(left.reg()), Immediate(value_));
+  generator()->frame()->Push(&left);
+  generator()->frame()->Push(value_);
+  GenericBinaryOpStub igostub(Token::SUB, overwrite_mode_,  
SMI_CODE_INLINED);
+  Result answer = generator()->frame()->CallStub(&igostub, 2);
+  exit()->Jump(&answer);
+}
+
+
  class DeferredInlinedSmiSubReversed: public DeferredCode {
   public:
    DeferredInlinedSmiSubReversed(CodeGenerator* generator,
                                  Smi* value,
-                                OverwriteMode overwrite_mode) :
-      DeferredCode(generator), value_(value),
-      overwrite_mode_(overwrite_mode) {
+                                OverwriteMode overwrite_mode)
+      : DeferredCode(generator),
+        value_(value),
+        overwrite_mode_(overwrite_mode) {
      set_comment("[ DeferredInlinedSmiSubReversed");
    }

-  virtual void Generate() {
-    Result rhs(generator());
-    enter()->Bind(&rhs);
-    generator()->frame()->Push(value_);
-    generator()->frame()->Push(&rhs);
-    GenericBinaryOpStub igostub(Token::SUB, overwrite_mode_,  
SMI_CODE_INLINED);
-    Result answer = generator()->frame()->CallStub(&igostub, 2);
-    exit()->Jump(&answer);
-  }
+  virtual void Generate();

   private:
    Smi* value_;
@@ -965,6 +989,18 @@
  };


+void DeferredInlinedSmiSubReversed::Generate() {
+  // Call the shared stub.
+  Result right(generator());
+  enter()->Bind(&right);
+  generator()->frame()->Push(value_);
+  generator()->frame()->Push(&right);
+  GenericBinaryOpStub igostub(Token::SUB, overwrite_mode_,  
SMI_CODE_INLINED);
+  Result answer = generator()->frame()->CallStub(&igostub, 2);
+  exit()->Jump(&answer);
+}
+
+
  void CodeGenerator::SmiOperation(Token::Value op,
                                   StaticType* type,
                                   Handle<Object> value,
@@ -1343,7 +1379,7 @@

  class DeferredStackCheck: public DeferredCode {
   public:
-  DeferredStackCheck(CodeGenerator* generator)
+  explicit DeferredStackCheck(CodeGenerator* generator)
        : DeferredCode(generator) {
      set_comment("[ DeferredStackCheck");
    }
@@ -1603,7 +1639,7 @@

      // Move the result into register eax where it belongs.
      result.ToRegister(eax);
-    // TODO(): Instead of explictly calling Unuse on the result, it
+    // TODO(203): Instead of explictly calling Unuse on the result, it
      // might be better to pass the result to Jump and Bind below.
      result.Unuse();

@@ -2726,8 +2762,8 @@
        __ mov(SlotOperand(slot, start.reg()), value.reg());
        // RecordWrite may destroy the value registers.
        //
-      // TODO(): Avoid actually spilling when the value is not needed
-      // (probably the common case).
+      // TODO(204): Avoid actually spilling when the value is not
+      // needed (probably the common case).
        frame_->Spill(value.reg());
        int offset = FixedArray::kHeaderSize + slot->index() * kPointerSize;
        Result temp = allocator_->Allocate();
@@ -2798,7 +2834,9 @@
        : DeferredCode(generator), node_(node) {
      set_comment("[ DeferredRegExpLiteral");
    }
+
    virtual void Generate();
+
   private:
    RegExpLiteral* node_;
  };
@@ -2867,7 +2905,9 @@
        : DeferredCode(generator), node_(node) {
      set_comment("[ DeferredObjectLiteral");
    }
+
    virtual void Generate();
+
   private:
    ObjectLiteral* node_;
  };
@@ -3268,8 +3308,8 @@
      Load(args->at(i));
    }

-  // TODO(): Get rid of this spilling. It is only necessary because we
-  // load the function from the non-virtual stack.
+  // TODO(205): Get rid of this spilling. It is only necessary because
+  // we load the function from the non-virtual stack.
    frame_->SpillAll();

    // Constructors are called with the number of arguments in register
@@ -4366,42 +4406,7 @@
      set_comment("[ DeferredReferenceGetKeyedValue");
    }

-  virtual void Generate() {
-    CodeGenerator* cgen = generator();
-    Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize));
-    Result receiver(cgen);
-    Result key(cgen);
-    enter()->Bind(&receiver, &key);
-    VirtualFrame* frame = generator()->frame();
-    frame->Push(&receiver);  // First IC argument.
-    frame->Push(&key);       // Second IC argument.
-
-    // Calculate the delta from the IC call instruction to the map
-    // check cmp instruction in the inlined version.  This delta is
-    // stored in a test(eax, delta) instruction after the call so that
-    // we can find it in the IC initialization code and patch the cmp
-    // instruction.  This means that we cannot allow test instructions
-    // after calls to KeyedLoadIC stubs in other places.
-    //
-    // The virtual frame should be spilled fully before the call so
-    // that the call itself does not generate extra code to spill
-    // values.
-    frame->SpillAll();
-    int delta_to_patch_site = __ SizeOfCodeGeneratedSince(patch_site());
-    Result value(cgen);
-    if (is_global_) {
-      value = frame->CallCodeObject(ic, RelocInfo::CODE_TARGET_CONTEXT, 0);
-    } else {
-      value = frame->CallCodeObject(ic, RelocInfo::CODE_TARGET, 0);
-    }
-    // The result needs to be specifically the eax register because
-    // the offset to the patch site will be expected in a test eax
-    // instruction.
-    ASSERT(value.is_register() && value.reg().is(eax));
-    __ test(value.reg(), Immediate(-delta_to_patch_site));
-    __ IncrementCounter(&Counters::keyed_load_inline_miss, 1);
-    exit()->Jump(&value);
-  }
+  virtual void Generate();

    Label* patch_site() { return &patch_site_; }

@@ -4411,6 +4416,45 @@
  };


+void DeferredReferenceGetKeyedValue::Generate() {
+  CodeGenerator* cgen = generator();
+  Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize));
+  Result receiver(cgen);
+  Result key(cgen);
+  enter()->Bind(&receiver, &key);
+  cgen->frame()->Push(&receiver);  // First IC argument.
+  cgen->frame()->Push(&key);       // Second IC argument.
+
+  // Calculate the delta from the IC call instruction to the map check
+  // cmp instruction in the inlined version.  This delta is stored in
+  // a test(eax, delta) instruction after the call so that we can find
+  // it in the IC initialization code and patch the cmp instruction.
+  // This means that we cannot allow test instructions after calls to
+  // KeyedLoadIC stubs in other places.
+  //
+  // The virtual frame should be spilled fully before the call so that
+  // the call itself does not generate extra code to spill values,
+  // which would invalidate the delta calculation.
+  cgen->frame()->SpillAll();
+  int delta_to_patch_site = __ SizeOfCodeGeneratedSince(patch_site());
+  Result value(cgen);
+  if (is_global_) {
+    value = cgen->frame()->CallCodeObject(ic,
+                                          RelocInfo::CODE_TARGET_CONTEXT,
+                                          0);
+  } else {
+    value = cgen->frame()->CallCodeObject(ic, RelocInfo::CODE_TARGET, 0);
+  }
+  // The result needs to be specifically the eax register because the
+  // offset to the patch site will be expected in a test eax
+  // instruction.
+  ASSERT(value.is_register() && value.reg().is(eax));
+  __ test(value.reg(), Immediate(-delta_to_patch_site));
+  __ IncrementCounter(&Counters::keyed_load_inline_miss, 1);
+  exit()->Jump(&value);
+}
+
+
  #undef __
  #define __ masm->

@@ -4532,7 +4576,7 @@
          // Load and check that the result is not the hole.  We could
          // reuse the index or elements register for the value.
          //
-        // TODO(): Consider whether it makes sense to try some
+        // TODO(206): Consider whether it makes sense to try some
          // heuristic about which register to reuse.  For example, if
          // one is eax, the we can reuse that one because the value
          // coming from the deferred code will be in eax.
@@ -4941,7 +4985,9 @@
          case Token::SHL: {
            __ shl(left.reg());
            // Check that the *signed* result fits in a smi.
-          // TODO(): Can reduce registers from 4 to 3 by preallocating ecx.
+          //
+          // TODO(207): Can reduce registers from 4 to 3 by
+          // preallocating ecx.
            JumpTarget result_ok(generator());
            Result smi_test_reg = generator()->allocator()->Allocate();
            ASSERT(smi_test_reg.is_valid());

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

Reply via email to