Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(716)

Unified Diff: src/arm64/code-stubs-arm64.cc

Issue 2054853002: Fix arguments object stubs for large arrays. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Port to most architectures. Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/arm/code-stubs-arm.cc ('k') | src/compiler/js-create-lowering.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/arm64/code-stubs-arm64.cc
diff --git a/src/arm64/code-stubs-arm64.cc b/src/arm64/code-stubs-arm64.cc
index 8788f19b274b0b5b3c06fc75b5d38a3d3f5de596..f8d6d40a5f6bb1cab04d6f0ea068e34e7b612c20 100644
--- a/src/arm64/code-stubs-arm64.cc
+++ b/src/arm64/code-stubs-arm64.cc
@@ -4813,10 +4813,10 @@ void FastNewRestParameterStub::Generate(MacroAssembler* masm) {
Label rest_parameters;
__ Ldrsw(x0, UntagSmiMemOperand(
x2, ArgumentsAdaptorFrameConstants::kLengthOffset));
- __ Ldr(x1, FieldMemOperand(x1, JSFunction::kSharedFunctionInfoOffset));
+ __ Ldr(x3, FieldMemOperand(x1, JSFunction::kSharedFunctionInfoOffset));
__ Ldrsw(
- x1, FieldMemOperand(x1, SharedFunctionInfo::kFormalParameterCountOffset));
- __ Subs(x0, x0, x1);
+ x3, FieldMemOperand(x3, SharedFunctionInfo::kFormalParameterCountOffset));
+ __ Subs(x0, x0, x3);
__ B(gt, &rest_parameters);
// Return an empty rest parameter array.
@@ -4862,15 +4862,16 @@ void FastNewRestParameterStub::Generate(MacroAssembler* masm) {
// ----------- S t a t e -------------
// -- cp : context
// -- x0 : number of rest parameters
+ // -- x1 : function
// -- x2 : pointer to first rest parameters
// -- lr : return address
// -----------------------------------
// Allocate space for the rest parameter array plus the backing store.
Label allocate, done_allocate;
- __ Mov(x1, JSArray::kSize + FixedArray::kHeaderSize);
- __ Add(x1, x1, Operand(x0, LSL, kPointerSizeLog2));
- __ Allocate(x1, x3, x4, x5, &allocate, NO_ALLOCATION_FLAGS);
+ __ Mov(x6, JSArray::kSize + FixedArray::kHeaderSize);
+ __ Add(x6, x6, Operand(x0, LSL, kPointerSizeLog2));
+ __ Allocate(x6, x3, x4, x5, &allocate, NO_ALLOCATION_FLAGS);
__ Bind(&done_allocate);
// Compute arguments.length in x6.
@@ -4905,19 +4906,27 @@ 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);
+ __ Cmp(x6, Operand(Page::kMaxRegularHeapObjectSize));
+ __ B(gt, &too_big_for_new_space);
{
FrameScope scope(masm, StackFrame::INTERNAL);
__ SmiTag(x0);
- __ SmiTag(x1);
- __ Push(x0, x2, x1);
+ __ SmiTag(x6);
+ __ Push(x0, x2, x6);
__ CallRuntime(Runtime::kAllocateInNewSpace);
__ Mov(x3, x0);
__ Pop(x2, x0);
__ SmiUntag(x0);
}
__ B(&done_allocate);
+
+ // Fall back to %NewRestParameter.
+ __ Bind(&too_big_for_new_space);
+ __ Push(x1);
+ __ TailCallRuntime(Runtime::kNewRestParameter);
}
}
@@ -5254,9 +5263,9 @@ void FastNewStrictArgumentsStub::Generate(MacroAssembler* masm) {
__ Cmp(x4, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR));
__ B(eq, &arguments_adaptor);
{
- __ Ldr(x1, FieldMemOperand(x1, JSFunction::kSharedFunctionInfoOffset));
+ __ Ldr(x4, FieldMemOperand(x1, JSFunction::kSharedFunctionInfoOffset));
__ Ldrsw(x0, FieldMemOperand(
- x1, SharedFunctionInfo::kFormalParameterCountOffset));
+ x4, SharedFunctionInfo::kFormalParameterCountOffset));
__ Add(x2, x2, Operand(x0, LSL, kPointerSizeLog2));
__ Add(x2, x2, StandardFrameConstants::kCallerSPOffset - 1 * kPointerSize);
}
@@ -5273,15 +5282,16 @@ void FastNewStrictArgumentsStub::Generate(MacroAssembler* masm) {
// ----------- S t a t e -------------
// -- cp : context
// -- x0 : number of rest parameters
+ // -- x1 : function
// -- x2 : pointer to first rest parameters
// -- lr : return address
// -----------------------------------
// Allocate space for the strict arguments object plus the backing store.
Label allocate, done_allocate;
- __ Mov(x1, JSStrictArgumentsObject::kSize + FixedArray::kHeaderSize);
- __ Add(x1, x1, Operand(x0, LSL, kPointerSizeLog2));
- __ Allocate(x1, x3, x4, x5, &allocate, NO_ALLOCATION_FLAGS);
+ __ Mov(x6, JSStrictArgumentsObject::kSize + FixedArray::kHeaderSize);
+ __ Add(x6, x6, Operand(x0, LSL, kPointerSizeLog2));
+ __ Allocate(x6, x3, x4, x5, &allocate, NO_ALLOCATION_FLAGS);
__ Bind(&done_allocate);
// Compute arguments.length in x6.
@@ -5316,19 +5326,27 @@ 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);
+ __ Cmp(x6, Operand(Page::kMaxRegularHeapObjectSize));
+ __ B(gt, &too_big_for_new_space);
{
FrameScope scope(masm, StackFrame::INTERNAL);
__ SmiTag(x0);
- __ SmiTag(x1);
- __ Push(x0, x2, x1);
+ __ SmiTag(x6);
+ __ Push(x0, x2, x6);
__ CallRuntime(Runtime::kAllocateInNewSpace);
__ Mov(x3, x0);
__ Pop(x2, x0);
__ SmiUntag(x0);
}
__ B(&done_allocate);
+
+ // Fall back to %NewStrictArguments.
+ __ Bind(&too_big_for_new_space);
+ __ Push(x1);
+ __ TailCallRuntime(Runtime::kNewStrictArguments);
}
« no previous file with comments | « src/arm/code-stubs-arm.cc ('k') | src/compiler/js-create-lowering.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698