Revision: 10890
Author:   [email protected]
Date:     Thu Mar  1 04:38:58 2012
Log:      MIPS: Implement inlined object allocation in Crankshaft.

Port r10881 (0d25c61e).

Original commit message:

Generates inlined code for object allocation specific to the initial map
of the given constructor function. Also forces completion of inobject
slack tracking while crankshafting to finalize instance size of these
objects.

BUG=
TEST=

Review URL: https://chromiumcodereview.appspot.com/9569008
Patch from Daniel Kalmar <[email protected]>.
http://code.google.com/p/v8/source/detail?r=10890

Modified:
 /branches/bleeding_edge/src/flag-definitions.h
 /branches/bleeding_edge/src/mips/lithium-codegen-mips.cc
 /branches/bleeding_edge/src/mips/lithium-mips.cc
 /branches/bleeding_edge/src/mips/lithium-mips.h

=======================================
--- /branches/bleeding_edge/src/flag-definitions.h      Thu Mar  1 03:33:37 2012
+++ /branches/bleeding_edge/src/flag-definitions.h      Thu Mar  1 04:38:58 2012
@@ -168,7 +168,7 @@
 DEFINE_bool(trace_osr, false, "trace on-stack replacement")
 DEFINE_int(stress_runs, 0, "number of stress runs")
 DEFINE_bool(optimize_closures, true, "optimize closures")
-DEFINE_bool(inline_construct, false, "inline constructor calls")
+DEFINE_bool(inline_construct, true, "inline constructor calls")
 DEFINE_int(loop_weight, 1, "loop weight for representation inference")

 DEFINE_bool(optimize_for_in, true,
=======================================
--- /branches/bleeding_edge/src/mips/lithium-codegen-mips.cc Thu Mar 1 03:33:37 2012 +++ /branches/bleeding_edge/src/mips/lithium-codegen-mips.cc Thu Mar 1 04:38:58 2012
@@ -4243,9 +4243,45 @@

DeferredAllocateObject* deferred = new DeferredAllocateObject(this, instr);

-  // TODO(mstarzinger): Implement inlined version instead of jumping to
-  // deferred runtime call.
-  __ jmp(deferred->entry());
+  Register result = ToRegister(instr->result());
+  Register scratch = ToRegister(instr->TempAt(0));
+  Register scratch2 = ToRegister(instr->TempAt(1));
+  Handle<JSFunction> constructor = instr->hydrogen()->constructor();
+  Handle<Map> initial_map(constructor->initial_map());
+  int instance_size = initial_map->instance_size();
+  ASSERT(initial_map->pre_allocated_property_fields() +
+         initial_map->unused_property_fields() -
+         initial_map->inobject_properties() == 0);
+
+  // Allocate memory for the object.  The initial map might change when
+  // the constructor's prototype changes, but instance size and property
+  // counts remain unchanged (if slack tracking finished).
+  ASSERT(!constructor->shared()->IsInobjectSlackTrackingInProgress());
+  __ AllocateInNewSpace(instance_size,
+                        result,
+                        scratch,
+                        scratch2,
+                        deferred->entry(),
+                        TAG_OBJECT);
+
+  // Load the initial map.
+  Register map = scratch;
+  __ LoadHeapObject(map, constructor);
+ __ lw(map, FieldMemOperand(map, JSFunction::kPrototypeOrInitialMapOffset));
+
+  // Initialize map and fields of the newly allocated object.
+  ASSERT(initial_map->instance_type() == JS_OBJECT_TYPE);
+  __ sw(map, FieldMemOperand(result, JSObject::kMapOffset));
+  __ LoadRoot(scratch, Heap::kEmptyFixedArrayRootIndex);
+  __ sw(scratch, FieldMemOperand(result, JSObject::kElementsOffset));
+  __ sw(scratch, FieldMemOperand(result, JSObject::kPropertiesOffset));
+  if (initial_map->inobject_properties() != 0) {
+    __ LoadRoot(scratch, Heap::kUndefinedValueRootIndex);
+    for (int i = 0; i < initial_map->inobject_properties(); i++) {
+      int property_offset = JSObject::kHeaderSize + i * kPointerSize;
+      __ sw(scratch, FieldMemOperand(result, property_offset));
+    }
+  }

   __ bind(deferred->exit());
 }
=======================================
--- /branches/bleeding_edge/src/mips/lithium-mips.cc Thu Mar 1 03:33:37 2012 +++ /branches/bleeding_edge/src/mips/lithium-mips.cc Thu Mar 1 04:38:58 2012
@@ -2126,7 +2126,8 @@


 LInstruction* LChunkBuilder::DoAllocateObject(HAllocateObject* instr) {
-  LAllocateObject* result = new(zone()) LAllocateObject();
+  LAllocateObject* result = new(zone()) LAllocateObject(
+      TempRegister(), TempRegister());
   return AssignPointerMap(DefineAsRegister(result));
 }

=======================================
--- /branches/bleeding_edge/src/mips/lithium-mips.h     Wed Feb 29 04:05:58 2012
+++ /branches/bleeding_edge/src/mips/lithium-mips.h     Thu Mar  1 04:38:58 2012
@@ -1922,8 +1922,13 @@
 };


-class LAllocateObject: public LTemplateInstruction<1, 0, 0> {
+class LAllocateObject: public LTemplateInstruction<1, 0, 2> {
  public:
+  LAllocateObject(LOperand* temp1, LOperand* temp2) {
+    temps_[0] = temp1;
+    temps_[1] = temp2;
+  }
+
   DECLARE_CONCRETE_INSTRUCTION(AllocateObject, "allocate-object")
   DECLARE_HYDROGEN_ACCESSOR(AllocateObject)
 };

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

Reply via email to