From aaf403e92c7b2dc2581f5ec8c8a11f8cee6f61e2 Mon Sep 17 00:00:00 2001 From: "verwaest@chromium.org" Date: Thu, 16 Aug 2012 11:42:02 +0000 Subject: [PATCH] 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= Review URL: https://chromiumcodereview.appspot.com/10827335 Patch from Akos Palfi . git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@12319 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/mips/macro-assembler-mips.cc | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/mips/macro-assembler-mips.cc b/src/mips/macro-assembler-mips.cc index cd6d7dc..349937d 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. -- 2.7.4