Reviewers: Toon Verwaest, danno, Paul Lind, kisg,

Description:
MIPS: Swapped transition array and descriptor array.

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=


Please review this at https://chromiumcodereview.appspot.com/10827335/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files:
  M src/mips/macro-assembler-mips.cc


Index: src/mips/macro-assembler-mips.cc
diff --git a/src/mips/macro-assembler-mips.cc b/src/mips/macro-assembler-mips.cc index cd6d7dc108b868b11ad482ca0c4609b154b3f8ff..349937d716813fe604f15ea714fcd87c690be21b 100644
--- a/src/mips/macro-assembler-mips.cc
+++ b/src/mips/macro-assembler-mips.cc
@@ -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.


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

Reply via email to