Chromium Code Reviews| Index: src/mips/builtins-mips.cc |
| diff --git a/src/mips/builtins-mips.cc b/src/mips/builtins-mips.cc |
| index 259df211bd9eef633adaa0c6ae1cf26e7e3ca401..7083f1b0193090c6c1a2d210fdd4b36a94cad659 100644 |
| --- a/src/mips/builtins-mips.cc |
| +++ b/src/mips/builtins-mips.cc |
| @@ -321,7 +321,7 @@ static void ArrayNativeCode(MacroAssembler* masm, |
| Label* call_generic_code) { |
| Counters* counters = masm->isolate()->counters(); |
| Label argc_one_or_more, argc_two_or_more, not_empty_array, empty_array, |
| - has_non_smi_element; |
| + has_non_smi_element, finish, cant_transition_map, not_double; |
| // Check for array construction with zero arguments or one. |
| __ Branch(&argc_one_or_more, ne, a0, Operand(zero_reg)); |
| @@ -425,6 +425,8 @@ static void ArrayNativeCode(MacroAssembler* masm, |
| __ sw(a2, MemOperand(t1)); |
| __ bind(&entry); |
| __ Branch(&loop, lt, t0, Operand(t1)); |
| + |
| + __ bind(&finish); |
| __ mov(sp, t3); |
| // Remove caller arguments and receiver from the stack, setup return value and |
| @@ -437,8 +439,40 @@ static void ArrayNativeCode(MacroAssembler* masm, |
| __ Ret(); |
| __ bind(&has_non_smi_element); |
| + // Double values are handled by the runtime. |
| + __ CheckMap( |
| + a2, t5, Heap::kHeapNumberMapRootIndex, ¬_double, DONT_DO_SMI_CHECK); |
| + __ bind(&cant_transition_map); |
| __ UndoAllocationInNewSpace(a3, t0); |
| - __ b(call_generic_code); |
| + __ Branch(call_generic_code); |
| + |
| + __ bind(¬_double); |
| + // Transition FAST_SMI_ONLY_ELEMENTS to FAST_ELEMENTS. |
| + // a3: JSArray |
| + __ lw(a2, FieldMemOperand(a3, HeapObject::kMapOffset)); |
| + __ LoadTransitionedArrayMapConditional(FAST_SMI_ONLY_ELEMENTS, |
| + FAST_ELEMENTS, |
| + a2, |
| + t5, |
| + &cant_transition_map); |
| + __ sw(a2, FieldMemOperand(a3, HeapObject::kMapOffset)); |
| + __ RecordWriteField(a3, |
| + HeapObject::kMapOffset, |
| + a2, |
| + t5, |
| + kRAHasNotBeenSaved, |
| + kDontSaveFPRegs, |
| + EMIT_REMEMBERED_SET, |
| + OMIT_SMI_CHECK); |
| + Label loop2; |
| + __ Subu(t3, t3, Operand(kPointerSize)); |
|
Yang
2012/02/13 13:14:59
this is the decrement I'm talking about in the pre
|
| + __ bind(&loop2); |
| + __ lw(a2, MemOperand(t3)); |
| + __ Addu(t3, t3, kPointerSize); |
| + __ Subu(t1, t1, kPointerSize); |
| + __ sw(a2, MemOperand(t1)); |
| + __ Branch(&loop2, lt, t0, Operand(t1)); |
| + __ Branch(&finish); |
| } |