MIPS: Swapped transition array and descriptor array.
authorverwaest@chromium.org <verwaest@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Thu, 16 Aug 2012 11:42:02 +0000 (11:42 +0000)
committerverwaest@chromium.org <verwaest@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Thu, 16 Aug 2012 11:42:02 +0000 (11:42 +0000)
Port r12298 (7b39ef67)

Original commit message:
Now a map points to a transition array which contains the descriptor array. The descriptor array is now immutable. The next step is to share the descriptor array with all back-pointed maps as long as there is a single line of extension. Maps that require a descriptor array but don't need transitions will still need a pseudo-empty transition array to contain the descriptor array.

BUG=
TEST=

Review URL: https://chromiumcodereview.appspot.com/10827335
Patch from Akos Palfi <palfia@homejinni.com>.

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@12319 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/mips/macro-assembler-mips.cc

index cd6d7dc..349937d 100644 (file)
@@ -5293,15 +5293,16 @@ void MacroAssembler::EnsureNotWhite(
 void MacroAssembler::LoadInstanceDescriptors(Register map,
                                              Register descriptors,
                                              Register scratch) {
-  lw(descriptors,
-     FieldMemOperand(map, Map::kInstanceDescriptorsOrBackPointerOffset));
+  Register temp = descriptors;
+  lw(temp, FieldMemOperand(map, Map::kTransitionsOrBackPointerOffset));
 
   Label ok, fail;
-  CheckMap(descriptors,
+  CheckMap(temp,
            scratch,
            isolate()->factory()->fixed_array_map(),
            &fail,
            DONT_DO_SMI_CHECK);
+  lw(descriptors, FieldMemOperand(temp, TransitionArray::kDescriptorsOffset));
   jmp(&ok);
   bind(&fail);
   LoadRoot(descriptors, Heap::kEmptyDescriptorArrayRootIndex);
@@ -5314,9 +5315,6 @@ void MacroAssembler::CheckEnumCache(Register null_value, Label* call_runtime) {
   // Preload a couple of values used in the loop.
   Register  empty_fixed_array_value = t2;
   LoadRoot(empty_fixed_array_value, Heap::kEmptyFixedArrayRootIndex);
-  Register empty_descriptor_array_value = t3;
-  LoadRoot(empty_descriptor_array_value,
-           Heap::kEmptyDescriptorArrayRootIndex);
   mov(a1, a0);
   bind(&next);
 
@@ -5329,7 +5327,7 @@ void MacroAssembler::CheckEnumCache(Register null_value, Label* call_runtime) {
   // check for an enum cache.  Leave the map in a2 for the subsequent
   // prototype load.
   lw(a2, FieldMemOperand(a1, HeapObject::kMapOffset));
-  lw(a3, FieldMemOperand(a2, Map::kInstanceDescriptorsOrBackPointerOffset));
+  lw(a3, FieldMemOperand(a2, Map::kTransitionsOrBackPointerOffset));
 
   CheckMap(a3,
            t3,
@@ -5337,6 +5335,10 @@ void MacroAssembler::CheckEnumCache(Register null_value, Label* call_runtime) {
            call_runtime,
            DONT_DO_SMI_CHECK);
 
+  LoadRoot(t3, Heap::kEmptyDescriptorArrayRootIndex);
+  lw(a3, FieldMemOperand(a3, TransitionArray::kDescriptorsOffset));
+  Branch(call_runtime, eq, a3, Operand(t3));
+
   // Check that there is an enum cache in the non-empty instance
   // descriptors (a3).  This is the case if the next enumeration
   // index field does not contain a smi.