Chromium Code Reviews| Index: src/arm/stub-cache-arm.cc |
| diff --git a/src/arm/stub-cache-arm.cc b/src/arm/stub-cache-arm.cc |
| index b039b3d2765741d29414bc0043aa502c0c26d520..82c740fb23ea2319abe28319fb6badda22eadb9f 100644 |
| --- a/src/arm/stub-cache-arm.cc |
| +++ b/src/arm/stub-cache-arm.cc |
| @@ -1623,7 +1623,7 @@ Handle<Code> CallStubCompiler::CompileArrayPushCall( |
| Label call_builtin; |
| if (argc == 1) { // Otherwise fall through to call the builtin. |
| - Label attempt_to_grow_elements; |
| + Label attempt_to_grow_elements, with_write_barrier, check_double; |
| Register elements = r6; |
| Register end_elements = r5; |
| @@ -1634,7 +1634,7 @@ Handle<Code> CallStubCompiler::CompileArrayPushCall( |
| __ CheckMap(elements, |
| r0, |
| Heap::kFixedArrayMapRootIndex, |
| - &call_builtin, |
| + &check_double, |
| DONT_DO_SMI_CHECK); |
| @@ -1652,7 +1652,6 @@ Handle<Code> CallStubCompiler::CompileArrayPushCall( |
| __ b(gt, &attempt_to_grow_elements); |
| // Check if value is a smi. |
| - Label with_write_barrier; |
| __ ldr(r4, MemOperand(sp, (argc - 1) * kPointerSize)); |
| __ JumpIfNotSmi(r4, &with_write_barrier); |
| @@ -1672,6 +1671,41 @@ Handle<Code> CallStubCompiler::CompileArrayPushCall( |
| __ Drop(argc + 1); |
| __ Ret(); |
| + __ bind(&check_double); |
| + |
| + // Check that the elements are in fast mode and writable. |
| + __ CheckMap(elements, |
| + r0, |
| + Heap::kFixedDoubleArrayMapRootIndex, |
| + &call_builtin, |
| + DONT_DO_SMI_CHECK); |
| + |
|
danno
2012/11/13 22:05:12
nit: why the double space?
Toon Verwaest
2012/11/14 11:53:13
Done.
|
| + |
| + // Get the array's length into r0 and calculate new length. |
| + __ ldr(r0, FieldMemOperand(receiver, JSArray::kLengthOffset)); |
| + STATIC_ASSERT(kSmiTagSize == 1); |
| + STATIC_ASSERT(kSmiTag == 0); |
| + __ add(r0, r0, Operand(Smi::FromInt(argc))); |
| + |
| + // Get the elements' length. |
| + __ ldr(r4, FieldMemOperand(elements, FixedArray::kLengthOffset)); |
| + |
| + // Check if we could survive without allocation. |
| + __ cmp(r0, r4); |
| + __ b(gt, &call_builtin); |
| + |
| + __ ldr(r4, MemOperand(sp, (argc - 1) * kPointerSize)); |
| + __ StoreNumberToDoubleElements( |
| + r4, r0, elements, r3, r5, r2, r9, |
| + &call_builtin, argc * kDoubleSize); |
| + |
| + // Save new length. |
| + __ str(r0, FieldMemOperand(receiver, JSArray::kLengthOffset)); |
| + |
| + // Check for a smi. |
| + __ Drop(argc + 1); |
| + __ Ret(); |
| + |
| __ bind(&with_write_barrier); |
| __ ldr(r3, FieldMemOperand(receiver, HeapObject::kMapOffset)); |
| @@ -1683,6 +1717,11 @@ Handle<Code> CallStubCompiler::CompileArrayPushCall( |
| // In case of fast smi-only, convert to fast object, otherwise bail out. |
| __ bind(¬_fast_object); |
| __ CheckFastSmiElements(r3, r7, &call_builtin); |
| + |
| + __ ldr(r7, FieldMemOperand(r4, HeapObject::kMapOffset)); |
| + __ LoadRoot(ip, Heap::kHeapNumberMapRootIndex); |
| + __ cmp(r7, ip); |
| + __ b(eq, &call_builtin); |
| // edx: receiver |
| // r3: map |
| Label try_holey_map; |
| @@ -4698,7 +4737,6 @@ void KeyedStoreStubCompiler::GenerateStoreFastDoubleElement( |
| __ bind(&finish_store); |
| __ StoreNumberToDoubleElements(value_reg, |
| key_reg, |
| - receiver_reg, |
| // All registers after this are overwritten. |
| elements_reg, |
| scratch1, |