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); |
} |