| Index: src/x64/code-stubs-x64.cc
|
| diff --git a/src/x64/code-stubs-x64.cc b/src/x64/code-stubs-x64.cc
|
| index f72708d91e6eb7a66935627e0c92d7440722f70b..a67c40d53a70e5d485048c65ed57062a3e3f66cd 100644
|
| --- a/src/x64/code-stubs-x64.cc
|
| +++ b/src/x64/code-stubs-x64.cc
|
| @@ -4468,6 +4468,7 @@ void FastNewRestParameterStub::Generate(MacroAssembler* masm) {
|
| 1 * kPointerSize));
|
|
|
| // ----------- S t a t e -------------
|
| + // -- rdi : function
|
| // -- rsi : context
|
| // -- rax : number of rest parameters
|
| // -- rbx : pointer to first rest parameters
|
| @@ -4478,7 +4479,7 @@ void FastNewRestParameterStub::Generate(MacroAssembler* masm) {
|
| Label allocate, done_allocate;
|
| __ leal(rcx, Operand(rax, times_pointer_size,
|
| JSArray::kSize + FixedArray::kHeaderSize));
|
| - __ Allocate(rcx, rdx, rdi, no_reg, &allocate, NO_ALLOCATION_FLAGS);
|
| + __ Allocate(rcx, rdx, r8, no_reg, &allocate, NO_ALLOCATION_FLAGS);
|
| __ bind(&done_allocate);
|
|
|
| // Compute the arguments.length in rdi.
|
| @@ -4516,8 +4517,11 @@ void FastNewRestParameterStub::Generate(MacroAssembler* masm) {
|
| STATIC_ASSERT(JSArray::kSize == 4 * kPointerSize);
|
| __ Ret();
|
|
|
| - // Fall back to %AllocateInNewSpace.
|
| + // Fall back to %AllocateInNewSpace (if not too big).
|
| + Label too_big_for_new_space;
|
| __ bind(&allocate);
|
| + __ cmpl(rcx, Immediate(Page::kMaxRegularHeapObjectSize));
|
| + __ j(greater, &too_big_for_new_space);
|
| {
|
| FrameScope scope(masm, StackFrame::INTERNAL);
|
| __ Integer32ToSmi(rax, rax);
|
| @@ -4532,6 +4536,13 @@ void FastNewRestParameterStub::Generate(MacroAssembler* masm) {
|
| __ SmiToInteger32(rax, rax);
|
| }
|
| __ jmp(&done_allocate);
|
| +
|
| + // Fall back to %NewRestParameter.
|
| + __ bind(&too_big_for_new_space);
|
| + __ PopReturnAddressTo(kScratchRegister);
|
| + __ Push(rdi);
|
| + __ PushReturnAddressFrom(kScratchRegister);
|
| + __ TailCallRuntime(Runtime::kNewRestParameter);
|
| }
|
| }
|
|
|
| @@ -4822,6 +4833,7 @@ void FastNewStrictArgumentsStub::Generate(MacroAssembler* masm) {
|
| // ----------- S t a t e -------------
|
| // -- rax : number of arguments
|
| // -- rbx : pointer to the first argument
|
| + // -- rdi : function
|
| // -- rsi : context
|
| // -- rsp[0] : return address
|
| // -----------------------------------
|
| @@ -4830,7 +4842,7 @@ void FastNewStrictArgumentsStub::Generate(MacroAssembler* masm) {
|
| Label allocate, done_allocate;
|
| __ leal(rcx, Operand(rax, times_pointer_size, JSStrictArgumentsObject::kSize +
|
| FixedArray::kHeaderSize));
|
| - __ Allocate(rcx, rdx, rdi, no_reg, &allocate, NO_ALLOCATION_FLAGS);
|
| + __ Allocate(rcx, rdx, r8, no_reg, &allocate, NO_ALLOCATION_FLAGS);
|
| __ bind(&done_allocate);
|
|
|
| // Compute the arguments.length in rdi.
|
| @@ -4868,8 +4880,11 @@ void FastNewStrictArgumentsStub::Generate(MacroAssembler* masm) {
|
| STATIC_ASSERT(JSStrictArgumentsObject::kSize == 4 * kPointerSize);
|
| __ Ret();
|
|
|
| - // Fall back to %AllocateInNewSpace.
|
| + // Fall back to %AllocateInNewSpace (if not too big).
|
| + Label too_big_for_new_space;
|
| __ bind(&allocate);
|
| + __ cmpl(rcx, Immediate(Page::kMaxRegularHeapObjectSize));
|
| + __ j(greater, &too_big_for_new_space);
|
| {
|
| FrameScope scope(masm, StackFrame::INTERNAL);
|
| __ Integer32ToSmi(rax, rax);
|
| @@ -4884,6 +4899,13 @@ void FastNewStrictArgumentsStub::Generate(MacroAssembler* masm) {
|
| __ SmiToInteger32(rax, rax);
|
| }
|
| __ jmp(&done_allocate);
|
| +
|
| + // Fall back to %NewStrictArguments.
|
| + __ bind(&too_big_for_new_space);
|
| + __ PopReturnAddressTo(kScratchRegister);
|
| + __ Push(rdi);
|
| + __ PushReturnAddressFrom(kScratchRegister);
|
| + __ TailCallRuntime(Runtime::kNewStrictArguments);
|
| }
|
|
|
|
|
|
|