| Index: src/mips64/code-stubs-mips64.cc
|
| diff --git a/src/mips64/code-stubs-mips64.cc b/src/mips64/code-stubs-mips64.cc
|
| index 117d5c899dd8570b3395fe3412d996e6f9922559..57e02177c68967311e8300b27f31f4872ebfd480 100644
|
| --- a/src/mips64/code-stubs-mips64.cc
|
| +++ b/src/mips64/code-stubs-mips64.cc
|
| @@ -4739,10 +4739,10 @@ void FastNewRestParameterStub::Generate(MacroAssembler* masm) {
|
| Label rest_parameters;
|
| __ SmiLoadUntag(
|
| a0, MemOperand(a2, ArgumentsAdaptorFrameConstants::kLengthOffset));
|
| - __ ld(a1, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset));
|
| - __ lw(a1,
|
| - FieldMemOperand(a1, SharedFunctionInfo::kFormalParameterCountOffset));
|
| - __ Dsubu(a0, a0, Operand(a1));
|
| + __ ld(a3, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset));
|
| + __ lw(a3,
|
| + FieldMemOperand(a3, SharedFunctionInfo::kFormalParameterCountOffset));
|
| + __ Dsubu(a0, a0, Operand(a3));
|
| __ Branch(&rest_parameters, gt, a0, Operand(zero_reg));
|
|
|
| // Return an empty rest parameter array.
|
| @@ -4789,15 +4789,16 @@ void FastNewRestParameterStub::Generate(MacroAssembler* masm) {
|
| // ----------- S t a t e -------------
|
| // -- cp : context
|
| // -- a0 : number of rest parameters
|
| + // -- 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));
|
| - __ Dlsa(a1, a1, a0, kPointerSizeLog2);
|
| - __ Allocate(a1, v0, a3, a4, &allocate, NO_ALLOCATION_FLAGS);
|
| + __ li(a5, Operand(JSArray::kSize + FixedArray::kHeaderSize));
|
| + __ Dlsa(a5, a5, a0, kPointerSizeLog2);
|
| + __ Allocate(a5, v0, a3, a4, &allocate, NO_ALLOCATION_FLAGS);
|
| __ bind(&done_allocate);
|
|
|
| // Compute arguments.length in a4.
|
| @@ -4832,18 +4833,26 @@ 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, a5,
|
| + Operand(Page::kMaxRegularHeapObjectSize));
|
| {
|
| FrameScope scope(masm, StackFrame::INTERNAL);
|
| __ SmiTag(a0);
|
| - __ SmiTag(a1);
|
| - __ Push(a0, a2, a1);
|
| + __ SmiTag(a5);
|
| + __ Push(a0, a2, a5);
|
| __ CallRuntime(Runtime::kAllocateInNewSpace);
|
| __ Pop(a0, a2);
|
| __ SmiUntag(a0);
|
| }
|
| __ jmp(&done_allocate);
|
| +
|
| + // Fall back to %NewStrictArguments.
|
| + __ bind(&too_big_for_new_space);
|
| + __ Push(a1);
|
| + __ TailCallRuntime(Runtime::kNewStrictArguments);
|
| }
|
| }
|
|
|
| @@ -5115,9 +5124,9 @@ void FastNewStrictArgumentsStub::Generate(MacroAssembler* masm) {
|
| __ Branch(&arguments_adaptor, eq, a0,
|
| Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)));
|
| {
|
| - __ ld(a1, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset));
|
| + __ ld(a4, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset));
|
| __ lw(a0,
|
| - FieldMemOperand(a1, SharedFunctionInfo::kFormalParameterCountOffset));
|
| + FieldMemOperand(a4, SharedFunctionInfo::kFormalParameterCountOffset));
|
| __ Dlsa(a2, a2, a0, kPointerSizeLog2);
|
| __ Daddu(a2, a2, Operand(StandardFrameConstants::kCallerSPOffset -
|
| 1 * kPointerSize));
|
| @@ -5136,15 +5145,16 @@ void FastNewStrictArgumentsStub::Generate(MacroAssembler* masm) {
|
| // ----------- S t a t e -------------
|
| // -- cp : context
|
| // -- a0 : number of rest parameters
|
| + // -- 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(JSStrictArgumentsObject::kSize + FixedArray::kHeaderSize));
|
| - __ Dlsa(a1, a1, a0, kPointerSizeLog2);
|
| - __ Allocate(a1, v0, a3, a4, &allocate, NO_ALLOCATION_FLAGS);
|
| + __ li(a5, Operand(JSStrictArgumentsObject::kSize + FixedArray::kHeaderSize));
|
| + __ Dlsa(a5, a5, a0, kPointerSizeLog2);
|
| + __ Allocate(a5, v0, a3, a4, &allocate, NO_ALLOCATION_FLAGS);
|
| __ bind(&done_allocate);
|
|
|
| // Compute arguments.length in a4.
|
| @@ -5179,18 +5189,26 @@ 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, a5,
|
| + Operand(Page::kMaxRegularHeapObjectSize));
|
| {
|
| FrameScope scope(masm, StackFrame::INTERNAL);
|
| __ SmiTag(a0);
|
| - __ SmiTag(a1);
|
| - __ Push(a0, a2, a1);
|
| + __ SmiTag(a5);
|
| + __ Push(a0, a2, a5);
|
| __ CallRuntime(Runtime::kAllocateInNewSpace);
|
| __ Pop(a0, a2);
|
| __ SmiUntag(a0);
|
| }
|
| __ jmp(&done_allocate);
|
| +
|
| + // Fall back to %NewStrictArguments.
|
| + __ bind(&too_big_for_new_space);
|
| + __ Push(a1);
|
| + __ TailCallRuntime(Runtime::kNewStrictArguments);
|
| }
|
|
|
|
|
|
|