| Index: src/mips/stub-cache-mips.cc
|
| diff --git a/src/mips/stub-cache-mips.cc b/src/mips/stub-cache-mips.cc
|
| index 563e302f5d9d2a5da53e087a488b0f4ca67b7571..85497b5fc3bb2b3f9b4bd5abd30e8578e84faec8 100644
|
| --- a/src/mips/stub-cache-mips.cc
|
| +++ b/src/mips/stub-cache-mips.cc
|
| @@ -1628,7 +1628,7 @@ Handle<Code> CallStubCompiler::CompileArrayPushCall(
|
| } else {
|
| 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 = t2;
|
| Register end_elements = t1;
|
| @@ -1639,7 +1639,7 @@ Handle<Code> CallStubCompiler::CompileArrayPushCall(
|
| __ CheckMap(elements,
|
| v0,
|
| Heap::kFixedArrayMapRootIndex,
|
| - &call_builtin,
|
| + &check_double,
|
| DONT_DO_SMI_CHECK);
|
|
|
| // Get the array's length into v0 and calculate new length.
|
| @@ -1655,7 +1655,6 @@ Handle<Code> CallStubCompiler::CompileArrayPushCall(
|
| __ Branch(&attempt_to_grow_elements, gt, v0, Operand(t0));
|
|
|
| // Check if value is a smi.
|
| - Label with_write_barrier;
|
| __ lw(t0, MemOperand(sp, (argc - 1) * kPointerSize));
|
| __ JumpIfNotSmi(t0, &with_write_barrier);
|
|
|
| @@ -1676,6 +1675,39 @@ Handle<Code> CallStubCompiler::CompileArrayPushCall(
|
| __ Drop(argc + 1);
|
| __ Ret();
|
|
|
| + __ bind(&check_double);
|
| +
|
| + // Check that the elements are in fast mode and writable.
|
| + __ CheckMap(elements,
|
| + a0,
|
| + Heap::kFixedDoubleArrayMapRootIndex,
|
| + &call_builtin,
|
| + DONT_DO_SMI_CHECK);
|
| +
|
| + // Get the array's length into r0 and calculate new length.
|
| + __ lw(a0, FieldMemOperand(receiver, JSArray::kLengthOffset));
|
| + STATIC_ASSERT(kSmiTagSize == 1);
|
| + STATIC_ASSERT(kSmiTag == 0);
|
| + __ Addu(a0, a0, Operand(Smi::FromInt(argc)));
|
| +
|
| + // Get the elements' length.
|
| + __ lw(t0, FieldMemOperand(elements, FixedArray::kLengthOffset));
|
| +
|
| + // Check if we could survive without allocation.
|
| + __ Branch(&call_builtin, gt, a0, Operand(t0));
|
| +
|
| + __ lw(t0, MemOperand(sp, (argc - 1) * kPointerSize));
|
| + __ StoreNumberToDoubleElements(
|
| + t0, a0, elements, a3, t1, a2, t5,
|
| + &call_builtin, argc * kDoubleSize);
|
| +
|
| + // Save new length.
|
| + __ sw(a0, FieldMemOperand(receiver, JSArray::kLengthOffset));
|
| +
|
| + // Check for a smi.
|
| + __ Drop(argc + 1);
|
| + __ Ret();
|
| +
|
| __ bind(&with_write_barrier);
|
|
|
| __ lw(a3, FieldMemOperand(receiver, HeapObject::kMapOffset));
|
| @@ -1687,8 +1719,12 @@ Handle<Code> CallStubCompiler::CompileArrayPushCall(
|
| // In case of fast smi-only, convert to fast object, otherwise bail out.
|
| __ bind(¬_fast_object);
|
| __ CheckFastSmiElements(a3, t3, &call_builtin);
|
| +
|
| + __ lw(t3, FieldMemOperand(t0, HeapObject::kMapOffset));
|
| + __ LoadRoot(at, Heap::kHeapNumberMapRootIndex);
|
| + __ Branch(&call_builtin, eq, t3, Operand(at));
|
| // edx: receiver
|
| - // r3: map
|
| + // a3: map
|
| Label try_holey_map;
|
| __ LoadTransitionedArrayMapConditional(FAST_SMI_ELEMENTS,
|
| FAST_ELEMENTS,
|
| @@ -4757,7 +4793,6 @@ void KeyedStoreStubCompiler::GenerateStoreFastDoubleElement(
|
|
|
| __ StoreNumberToDoubleElements(value_reg,
|
| key_reg,
|
| - receiver_reg,
|
| // All registers after this are overwritten.
|
| elements_reg,
|
| scratch1,
|
|
|