Chromium Code Reviews| 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); |
| } |