Index: src/arm/codegen-arm.cc |
diff --git a/src/arm/codegen-arm.cc b/src/arm/codegen-arm.cc |
index ce35b97c1841ae74d946919449882139b82ed927..c809eb3fe9c52280d6645b028fea4ffe9ccab66a 100644 |
--- a/src/arm/codegen-arm.cc |
+++ b/src/arm/codegen-arm.cc |
@@ -90,11 +90,17 @@ void ElementsTransitionGenerator::GenerateSmiOnlyToDouble( |
// -- r3 : target map, scratch for subsequent call |
// -- r4 : scratch (elements) |
// ----------------------------------- |
- Label loop, entry, convert_hole, gc_required; |
+ Label loop, entry, convert_hole, gc_required, only_change_map, done; |
bool vfp3_supported = CpuFeatures::IsSupported(VFP3); |
- __ push(lr); |
+ // Check for empty arrays, which only require a map transition and no changes |
+ // to the backing store. |
__ ldr(r4, FieldMemOperand(r2, JSObject::kElementsOffset)); |
+ __ LoadRoot(r5, Heap::kEmptyFixedArrayRootIndex); |
+ __ cmp(r4, r5); |
Vyacheslav Egorov (Chromium)
2012/02/10 00:19:18
CompareRoot(r4, Heap::kEmptyFixedArrayRootIndex) ?
danno
2012/02/10 12:25:34
Done.
|
+ __ b(eq, &only_change_map); |
+ |
+ __ push(lr); |
__ ldr(r5, FieldMemOperand(r4, FixedArray::kLengthOffset)); |
// r4: source FixedArray |
// r5: number of elements (smi-tagged) |
@@ -146,6 +152,18 @@ void ElementsTransitionGenerator::GenerateSmiOnlyToDouble( |
__ b(&entry); |
+ __ bind(&only_change_map); |
+ __ str(r3, FieldMemOperand(r2, HeapObject::kMapOffset)); |
+ __ RecordWriteField(r2, |
+ HeapObject::kMapOffset, |
+ r3, |
+ r9, |
+ kLRHasBeenSaved, |
+ kDontSaveFPRegs, |
+ EMIT_REMEMBERED_SET, |
Vyacheslav Egorov (Chromium)
2012/02/09 16:29:19
OMIT_REMEMBERED_SET (maps are never in new space).
danno
2012/02/10 12:25:34
Done.
|
+ OMIT_SMI_CHECK); |
+ __ b(&done); |
+ |
// Call into runtime if GC is required. |
__ bind(&gc_required); |
__ pop(lr); |
@@ -194,6 +212,7 @@ void ElementsTransitionGenerator::GenerateSmiOnlyToDouble( |
if (!vfp3_supported) __ Pop(r1, r0); |
__ pop(lr); |
+ __ bind(&done); |
} |
@@ -207,10 +226,16 @@ void ElementsTransitionGenerator::GenerateDoubleToObject( |
// -- r3 : target map, scratch for subsequent call |
// -- r4 : scratch (elements) |
// ----------------------------------- |
- Label entry, loop, convert_hole, gc_required; |
+ Label entry, loop, convert_hole, gc_required, only_change_map; |
- __ push(lr); |
+ // Check for empty arrays, which only require a map transition and no changes |
+ // to the backing store. |
__ ldr(r4, FieldMemOperand(r2, JSObject::kElementsOffset)); |
+ __ LoadRoot(r5, Heap::kEmptyFixedArrayRootIndex); |
+ __ cmp(r4, r5); |
Vyacheslav Egorov (Chromium)
2012/02/10 00:19:18
CompareRoot?
danno
2012/02/10 12:25:34
Done.
|
+ __ b(eq, &only_change_map); |
+ |
+ __ push(lr); |
__ Push(r3, r2, r1, r0); |
__ ldr(r5, FieldMemOperand(r4, FixedArray::kLengthOffset)); |
// r4: source FixedDoubleArray |
@@ -280,16 +305,6 @@ void ElementsTransitionGenerator::GenerateDoubleToObject( |
__ b(lt, &loop); |
__ Pop(r3, r2, r1, r0); |
- // Update receiver's map. |
- __ str(r3, FieldMemOperand(r2, HeapObject::kMapOffset)); |
- __ RecordWriteField(r2, |
- HeapObject::kMapOffset, |
- r3, |
- r9, |
- kLRHasBeenSaved, |
- kDontSaveFPRegs, |
- EMIT_REMEMBERED_SET, |
- OMIT_SMI_CHECK); |
// Replace receiver's backing store with newly created and filled FixedArray. |
__ str(r6, FieldMemOperand(r2, JSObject::kElementsOffset)); |
__ RecordWriteField(r2, |
@@ -301,6 +316,18 @@ void ElementsTransitionGenerator::GenerateDoubleToObject( |
EMIT_REMEMBERED_SET, |
OMIT_SMI_CHECK); |
__ pop(lr); |
+ |
+ __ bind(&only_change_map); |
+ // Update receiver's map. |
+ __ str(r3, FieldMemOperand(r2, HeapObject::kMapOffset)); |
+ __ RecordWriteField(r2, |
+ HeapObject::kMapOffset, |
+ r3, |
+ r9, |
+ kLRHasNotBeenSaved, |
+ kDontSaveFPRegs, |
+ EMIT_REMEMBERED_SET, |
Vyacheslav Egorov (Chromium)
2012/02/09 16:29:19
OMIT_
danno
2012/02/10 12:25:34
Done.
|
+ OMIT_SMI_CHECK); |
} |