| Index: src/mips/code-stubs-mips.cc
|
| diff --git a/src/mips/code-stubs-mips.cc b/src/mips/code-stubs-mips.cc
|
| index 88b0c70c7a9b75674adc76373d36aa7a51cacb4e..d65ce502e96d405d6dd14e2ec4627e57216005ca 100644
|
| --- a/src/mips/code-stubs-mips.cc
|
| +++ b/src/mips/code-stubs-mips.cc
|
| @@ -4724,10 +4724,10 @@ void FastNewRestParameterStub::Generate(MacroAssembler* masm) {
|
| // specified by the function's internal formal parameter count.
|
| Label rest_parameters;
|
| __ lw(a0, MemOperand(a2, ArgumentsAdaptorFrameConstants::kLengthOffset));
|
| - __ lw(a1, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset));
|
| - __ lw(a1,
|
| - FieldMemOperand(a1, SharedFunctionInfo::kFormalParameterCountOffset));
|
| - __ Subu(a0, a0, Operand(a1));
|
| + __ lw(a3, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset));
|
| + __ lw(a3,
|
| + FieldMemOperand(a3, SharedFunctionInfo::kFormalParameterCountOffset));
|
| + __ Subu(a0, a0, Operand(a3));
|
| __ Branch(&rest_parameters, gt, a0, Operand(zero_reg));
|
|
|
| // Return an empty rest parameter array.
|
| @@ -4774,15 +4774,16 @@ void FastNewRestParameterStub::Generate(MacroAssembler* masm) {
|
| // ----------- S t a t e -------------
|
| // -- cp : context
|
| // -- a0 : number of rest parameters (tagged)
|
| + // -- a1 : function
|
| // -- a2 : pointer to first rest parameters
|
| // -- ra : return address
|
| // -----------------------------------
|
|
|
| // Allocate space for the rest parameter array plus the backing store.
|
| Label allocate, done_allocate;
|
| - __ li(a1, Operand(JSArray::kSize + FixedArray::kHeaderSize));
|
| - __ Lsa(a1, a1, a0, kPointerSizeLog2 - 1);
|
| - __ Allocate(a1, v0, a3, t0, &allocate, NO_ALLOCATION_FLAGS);
|
| + __ li(t0, Operand(JSArray::kSize + FixedArray::kHeaderSize));
|
| + __ Lsa(t0, t0, a0, kPointerSizeLog2 - 1);
|
| + __ Allocate(t0, v0, a3, t1, &allocate, NO_ALLOCATION_FLAGS);
|
| __ bind(&done_allocate);
|
|
|
| // Setup the elements array in v0.
|
| @@ -4815,16 +4816,24 @@ void FastNewRestParameterStub::Generate(MacroAssembler* masm) {
|
| __ Ret(USE_DELAY_SLOT);
|
| __ mov(v0, a3); // In delay slot
|
|
|
| - // Fall back to %AllocateInNewSpace.
|
| + // Fall back to %AllocateInNewSpace (if not too big).
|
| + Label too_big_for_new_space;
|
| __ bind(&allocate);
|
| + __ Branch(&too_big_for_new_space, gt, t0,
|
| + Operand(Page::kMaxRegularHeapObjectSize));
|
| {
|
| FrameScope scope(masm, StackFrame::INTERNAL);
|
| - __ SmiTag(a1);
|
| - __ Push(a0, a2, a1);
|
| + __ SmiTag(t0);
|
| + __ Push(a0, a2, t0);
|
| __ CallRuntime(Runtime::kAllocateInNewSpace);
|
| __ Pop(a0, a2);
|
| }
|
| __ jmp(&done_allocate);
|
| +
|
| + // Fall back to %NewStrictArguments.
|
| + __ bind(&too_big_for_new_space);
|
| + __ Push(a1);
|
| + __ TailCallRuntime(Runtime::kNewStrictArguments);
|
| }
|
| }
|
|
|
| @@ -5090,9 +5099,9 @@ void FastNewStrictArgumentsStub::Generate(MacroAssembler* masm) {
|
| __ Branch(&arguments_adaptor, eq, a0,
|
| Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)));
|
| {
|
| - __ lw(a1, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset));
|
| + __ lw(t0, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset));
|
| __ lw(a0,
|
| - FieldMemOperand(a1, SharedFunctionInfo::kFormalParameterCountOffset));
|
| + FieldMemOperand(t0, SharedFunctionInfo::kFormalParameterCountOffset));
|
| __ Lsa(a2, a2, a0, kPointerSizeLog2 - 1);
|
| __ Addu(a2, a2, Operand(StandardFrameConstants::kCallerSPOffset -
|
| 1 * kPointerSize));
|
| @@ -5110,15 +5119,16 @@ void FastNewStrictArgumentsStub::Generate(MacroAssembler* masm) {
|
| // ----------- S t a t e -------------
|
| // -- cp : context
|
| // -- a0 : number of rest parameters (tagged)
|
| + // -- a1 : function
|
| // -- a2 : pointer to first rest parameters
|
| // -- ra : return address
|
| // -----------------------------------
|
|
|
| // Allocate space for the strict arguments object plus the backing store.
|
| Label allocate, done_allocate;
|
| - __ li(a1, Operand(JSStrictArgumentsObject::kSize + FixedArray::kHeaderSize));
|
| - __ Lsa(a1, a1, a0, kPointerSizeLog2 - 1);
|
| - __ Allocate(a1, v0, a3, t0, &allocate, NO_ALLOCATION_FLAGS);
|
| + __ li(t0, Operand(JSStrictArgumentsObject::kSize + FixedArray::kHeaderSize));
|
| + __ Lsa(t0, t0, a0, kPointerSizeLog2 - 1);
|
| + __ Allocate(t0, v0, a3, t1, &allocate, NO_ALLOCATION_FLAGS);
|
| __ bind(&done_allocate);
|
|
|
| // Setup the elements array in v0.
|
| @@ -5151,16 +5161,24 @@ void FastNewStrictArgumentsStub::Generate(MacroAssembler* masm) {
|
| __ Ret(USE_DELAY_SLOT);
|
| __ mov(v0, a3); // In delay slot
|
|
|
| - // Fall back to %AllocateInNewSpace.
|
| + // Fall back to %AllocateInNewSpace (if not too big).
|
| + Label too_big_for_new_space;
|
| __ bind(&allocate);
|
| + __ Branch(&too_big_for_new_space, gt, t0,
|
| + Operand(Page::kMaxRegularHeapObjectSize));
|
| {
|
| FrameScope scope(masm, StackFrame::INTERNAL);
|
| - __ SmiTag(a1);
|
| - __ Push(a0, a2, a1);
|
| + __ SmiTag(t0);
|
| + __ Push(a0, a2, t0);
|
| __ CallRuntime(Runtime::kAllocateInNewSpace);
|
| __ Pop(a0, a2);
|
| }
|
| __ jmp(&done_allocate);
|
| +
|
| + // Fall back to %NewStrictArguments.
|
| + __ bind(&too_big_for_new_space);
|
| + __ Push(a1);
|
| + __ TailCallRuntime(Runtime::kNewStrictArguments);
|
| }
|
|
|
|
|
|
|