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

Side by Side Diff: src/arm/code-stubs-arm.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 unified diff | Download patch
« no previous file with comments | « no previous file | src/arm64/code-stubs-arm64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #if V8_TARGET_ARCH_ARM 5 #if V8_TARGET_ARCH_ARM
6 6
7 #include "src/code-stubs.h" 7 #include "src/code-stubs.h"
8 #include "src/api-arguments.h" 8 #include "src/api-arguments.h"
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/bootstrapper.h" 10 #include "src/bootstrapper.h"
(...skipping 4516 matching lines...) Expand 10 before | Expand all | Expand 10 after
4527 Label no_rest_parameters; 4527 Label no_rest_parameters;
4528 __ ldr(r2, MemOperand(r2, StandardFrameConstants::kCallerFPOffset)); 4528 __ ldr(r2, MemOperand(r2, StandardFrameConstants::kCallerFPOffset));
4529 __ ldr(ip, MemOperand(r2, CommonFrameConstants::kContextOrFrameTypeOffset)); 4529 __ ldr(ip, MemOperand(r2, CommonFrameConstants::kContextOrFrameTypeOffset));
4530 __ cmp(ip, Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); 4530 __ cmp(ip, Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)));
4531 __ b(ne, &no_rest_parameters); 4531 __ b(ne, &no_rest_parameters);
4532 4532
4533 // Check if the arguments adaptor frame contains more arguments than 4533 // Check if the arguments adaptor frame contains more arguments than
4534 // specified by the function's internal formal parameter count. 4534 // specified by the function's internal formal parameter count.
4535 Label rest_parameters; 4535 Label rest_parameters;
4536 __ ldr(r0, MemOperand(r2, ArgumentsAdaptorFrameConstants::kLengthOffset)); 4536 __ ldr(r0, MemOperand(r2, ArgumentsAdaptorFrameConstants::kLengthOffset));
4537 __ ldr(r1, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset)); 4537 __ ldr(r3, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset));
4538 __ ldr(r1, 4538 __ ldr(r3,
4539 FieldMemOperand(r1, SharedFunctionInfo::kFormalParameterCountOffset)); 4539 FieldMemOperand(r3, SharedFunctionInfo::kFormalParameterCountOffset));
4540 __ sub(r0, r0, r1, SetCC); 4540 __ sub(r0, r0, r3, SetCC);
4541 __ b(gt, &rest_parameters); 4541 __ b(gt, &rest_parameters);
4542 4542
4543 // Return an empty rest parameter array. 4543 // Return an empty rest parameter array.
4544 __ bind(&no_rest_parameters); 4544 __ bind(&no_rest_parameters);
4545 { 4545 {
4546 // ----------- S t a t e ------------- 4546 // ----------- S t a t e -------------
4547 // -- cp : context 4547 // -- cp : context
4548 // -- lr : return address 4548 // -- lr : return address
4549 // ----------------------------------- 4549 // -----------------------------------
4550 4550
(...skipping 26 matching lines...) Expand all
4577 __ bind(&rest_parameters); 4577 __ bind(&rest_parameters);
4578 { 4578 {
4579 // Compute the pointer to the first rest parameter (skippping the receiver). 4579 // Compute the pointer to the first rest parameter (skippping the receiver).
4580 __ add(r2, r2, Operand(r0, LSL, kPointerSizeLog2 - 1)); 4580 __ add(r2, r2, Operand(r0, LSL, kPointerSizeLog2 - 1));
4581 __ add(r2, r2, 4581 __ add(r2, r2,
4582 Operand(StandardFrameConstants::kCallerSPOffset - 1 * kPointerSize)); 4582 Operand(StandardFrameConstants::kCallerSPOffset - 1 * kPointerSize));
4583 4583
4584 // ----------- S t a t e ------------- 4584 // ----------- S t a t e -------------
4585 // -- cp : context 4585 // -- cp : context
4586 // -- r0 : number of rest parameters (tagged) 4586 // -- r0 : number of rest parameters (tagged)
4587 // -- r1 : function
4587 // -- r2 : pointer to first rest parameters 4588 // -- r2 : pointer to first rest parameters
4588 // -- lr : return address 4589 // -- lr : return address
4589 // ----------------------------------- 4590 // -----------------------------------
4590 4591
4591 // Allocate space for the rest parameter array plus the backing store. 4592 // Allocate space for the rest parameter array plus the backing store.
4592 Label allocate, done_allocate; 4593 Label allocate, done_allocate;
4593 __ mov(r1, Operand(JSArray::kSize + FixedArray::kHeaderSize)); 4594 __ mov(r6, Operand(JSArray::kSize + FixedArray::kHeaderSize));
4594 __ add(r1, r1, Operand(r0, LSL, kPointerSizeLog2 - 1)); 4595 __ add(r6, r6, Operand(r0, LSL, kPointerSizeLog2 - 1));
4595 __ Allocate(r1, r3, r4, r5, &allocate, NO_ALLOCATION_FLAGS); 4596 __ Allocate(r6, r3, r4, r5, &allocate, NO_ALLOCATION_FLAGS);
4596 __ bind(&done_allocate); 4597 __ bind(&done_allocate);
4597 4598
4598 // Setup the elements array in r3. 4599 // Setup the elements array in r3.
4599 __ LoadRoot(r1, Heap::kFixedArrayMapRootIndex); 4600 __ LoadRoot(r1, Heap::kFixedArrayMapRootIndex);
4600 __ str(r1, FieldMemOperand(r3, FixedArray::kMapOffset)); 4601 __ str(r1, FieldMemOperand(r3, FixedArray::kMapOffset));
4601 __ str(r0, FieldMemOperand(r3, FixedArray::kLengthOffset)); 4602 __ str(r0, FieldMemOperand(r3, FixedArray::kLengthOffset));
4602 __ add(r4, r3, Operand(FixedArray::kHeaderSize)); 4603 __ add(r4, r3, Operand(FixedArray::kHeaderSize));
4603 { 4604 {
4604 Label loop, done_loop; 4605 Label loop, done_loop;
4605 __ add(r1, r4, Operand(r0, LSL, kPointerSizeLog2 - 1)); 4606 __ add(r1, r4, Operand(r0, LSL, kPointerSizeLog2 - 1));
(...skipping 11 matching lines...) Expand all
4617 __ LoadNativeContextSlot(Context::JS_ARRAY_FAST_ELEMENTS_MAP_INDEX, r1); 4618 __ LoadNativeContextSlot(Context::JS_ARRAY_FAST_ELEMENTS_MAP_INDEX, r1);
4618 __ str(r1, FieldMemOperand(r4, JSArray::kMapOffset)); 4619 __ str(r1, FieldMemOperand(r4, JSArray::kMapOffset));
4619 __ LoadRoot(r1, Heap::kEmptyFixedArrayRootIndex); 4620 __ LoadRoot(r1, Heap::kEmptyFixedArrayRootIndex);
4620 __ str(r1, FieldMemOperand(r4, JSArray::kPropertiesOffset)); 4621 __ str(r1, FieldMemOperand(r4, JSArray::kPropertiesOffset));
4621 __ str(r3, FieldMemOperand(r4, JSArray::kElementsOffset)); 4622 __ str(r3, FieldMemOperand(r4, JSArray::kElementsOffset));
4622 __ str(r0, FieldMemOperand(r4, JSArray::kLengthOffset)); 4623 __ str(r0, FieldMemOperand(r4, JSArray::kLengthOffset));
4623 STATIC_ASSERT(JSArray::kSize == 4 * kPointerSize); 4624 STATIC_ASSERT(JSArray::kSize == 4 * kPointerSize);
4624 __ mov(r0, r4); 4625 __ mov(r0, r4);
4625 __ Ret(); 4626 __ Ret();
4626 4627
4627 // Fall back to %AllocateInNewSpace. 4628 // Fall back to %AllocateInNewSpace (if not too big).
4629 Label too_big_for_new_space;
4628 __ bind(&allocate); 4630 __ bind(&allocate);
4631 __ cmp(r1, Operand(Page::kMaxRegularHeapObjectSize));
4632 __ b(gt, &too_big_for_new_space);
4629 { 4633 {
4630 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); 4634 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL);
4631 __ SmiTag(r1); 4635 __ SmiTag(r1);
4632 __ Push(r0, r2, r1); 4636 __ Push(r0, r2, r1);
4633 __ CallRuntime(Runtime::kAllocateInNewSpace); 4637 __ CallRuntime(Runtime::kAllocateInNewSpace);
4634 __ mov(r3, r0); 4638 __ mov(r3, r0);
4635 __ Pop(r0, r2); 4639 __ Pop(r0, r2);
4636 } 4640 }
4637 __ jmp(&done_allocate); 4641 __ jmp(&done_allocate);
4642
4643 // Fall back to %NewRestParameter.
4644 __ bind(&too_big_for_new_space);
4645 __ push(r1);
4646 __ TailCallRuntime(Runtime::kNewRestParameter);
4638 } 4647 }
4639 } 4648 }
4640 4649
4641 4650
4642 void FastNewSloppyArgumentsStub::Generate(MacroAssembler* masm) { 4651 void FastNewSloppyArgumentsStub::Generate(MacroAssembler* masm) {
4643 // ----------- S t a t e ------------- 4652 // ----------- S t a t e -------------
4644 // -- r1 : function 4653 // -- r1 : function
4645 // -- cp : context 4654 // -- cp : context
4646 // -- fp : frame pointer 4655 // -- fp : frame pointer
4647 // -- lr : return address 4656 // -- lr : return address
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
4886 __ bind(&ok); 4895 __ bind(&ok);
4887 } 4896 }
4888 4897
4889 // Check if we have an arguments adaptor frame below the function frame. 4898 // Check if we have an arguments adaptor frame below the function frame.
4890 Label arguments_adaptor, arguments_done; 4899 Label arguments_adaptor, arguments_done;
4891 __ ldr(r3, MemOperand(r2, StandardFrameConstants::kCallerFPOffset)); 4900 __ ldr(r3, MemOperand(r2, StandardFrameConstants::kCallerFPOffset));
4892 __ ldr(ip, MemOperand(r3, CommonFrameConstants::kContextOrFrameTypeOffset)); 4901 __ ldr(ip, MemOperand(r3, CommonFrameConstants::kContextOrFrameTypeOffset));
4893 __ cmp(ip, Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); 4902 __ cmp(ip, Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)));
4894 __ b(eq, &arguments_adaptor); 4903 __ b(eq, &arguments_adaptor);
4895 { 4904 {
4896 __ ldr(r1, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset)); 4905 __ ldr(r4, FieldMemOperand(r1, JSFunction::kSharedFunctionInfoOffset));
4897 __ ldr(r0, FieldMemOperand( 4906 __ ldr(r0, FieldMemOperand(
4898 r1, SharedFunctionInfo::kFormalParameterCountOffset)); 4907 r4, SharedFunctionInfo::kFormalParameterCountOffset));
4899 __ add(r2, r2, Operand(r0, LSL, kPointerSizeLog2 - 1)); 4908 __ add(r2, r2, Operand(r0, LSL, kPointerSizeLog2 - 1));
4900 __ add(r2, r2, 4909 __ add(r2, r2,
4901 Operand(StandardFrameConstants::kCallerSPOffset - 1 * kPointerSize)); 4910 Operand(StandardFrameConstants::kCallerSPOffset - 1 * kPointerSize));
4902 } 4911 }
4903 __ b(&arguments_done); 4912 __ b(&arguments_done);
4904 __ bind(&arguments_adaptor); 4913 __ bind(&arguments_adaptor);
4905 { 4914 {
4906 __ ldr(r0, MemOperand(r3, ArgumentsAdaptorFrameConstants::kLengthOffset)); 4915 __ ldr(r0, MemOperand(r3, ArgumentsAdaptorFrameConstants::kLengthOffset));
4907 __ add(r2, r3, Operand(r0, LSL, kPointerSizeLog2 - 1)); 4916 __ add(r2, r3, Operand(r0, LSL, kPointerSizeLog2 - 1));
4908 __ add(r2, r2, 4917 __ add(r2, r2,
4909 Operand(StandardFrameConstants::kCallerSPOffset - 1 * kPointerSize)); 4918 Operand(StandardFrameConstants::kCallerSPOffset - 1 * kPointerSize));
4910 } 4919 }
4911 __ bind(&arguments_done); 4920 __ bind(&arguments_done);
4912 4921
4913 // ----------- S t a t e ------------- 4922 // ----------- S t a t e -------------
4914 // -- cp : context 4923 // -- cp : context
4915 // -- r0 : number of rest parameters (tagged) 4924 // -- r0 : number of rest parameters (tagged)
4925 // -- r1 : function
4916 // -- r2 : pointer to first rest parameters 4926 // -- r2 : pointer to first rest parameters
4917 // -- lr : return address 4927 // -- lr : return address
4918 // ----------------------------------- 4928 // -----------------------------------
4919 4929
4920 // Allocate space for the strict arguments object plus the backing store. 4930 // Allocate space for the strict arguments object plus the backing store.
4921 Label allocate, done_allocate; 4931 Label allocate, done_allocate;
4922 __ mov(r1, Operand(JSStrictArgumentsObject::kSize + FixedArray::kHeaderSize)); 4932 __ mov(r6, Operand(JSStrictArgumentsObject::kSize + FixedArray::kHeaderSize));
4923 __ add(r1, r1, Operand(r0, LSL, kPointerSizeLog2 - 1)); 4933 __ add(r6, r6, Operand(r0, LSL, kPointerSizeLog2 - 1));
4924 __ Allocate(r1, r3, r4, r5, &allocate, NO_ALLOCATION_FLAGS); 4934 __ Allocate(r6, r3, r4, r5, &allocate, NO_ALLOCATION_FLAGS);
4925 __ bind(&done_allocate); 4935 __ bind(&done_allocate);
4926 4936
4927 // Setup the elements array in r3. 4937 // Setup the elements array in r3.
4928 __ LoadRoot(r1, Heap::kFixedArrayMapRootIndex); 4938 __ LoadRoot(r1, Heap::kFixedArrayMapRootIndex);
4929 __ str(r1, FieldMemOperand(r3, FixedArray::kMapOffset)); 4939 __ str(r1, FieldMemOperand(r3, FixedArray::kMapOffset));
4930 __ str(r0, FieldMemOperand(r3, FixedArray::kLengthOffset)); 4940 __ str(r0, FieldMemOperand(r3, FixedArray::kLengthOffset));
4931 __ add(r4, r3, Operand(FixedArray::kHeaderSize)); 4941 __ add(r4, r3, Operand(FixedArray::kHeaderSize));
4932 { 4942 {
4933 Label loop, done_loop; 4943 Label loop, done_loop;
4934 __ add(r1, r4, Operand(r0, LSL, kPointerSizeLog2 - 1)); 4944 __ add(r1, r4, Operand(r0, LSL, kPointerSizeLog2 - 1));
(...skipping 11 matching lines...) Expand all
4946 __ LoadNativeContextSlot(Context::STRICT_ARGUMENTS_MAP_INDEX, r1); 4956 __ LoadNativeContextSlot(Context::STRICT_ARGUMENTS_MAP_INDEX, r1);
4947 __ str(r1, FieldMemOperand(r4, JSStrictArgumentsObject::kMapOffset)); 4957 __ str(r1, FieldMemOperand(r4, JSStrictArgumentsObject::kMapOffset));
4948 __ LoadRoot(r1, Heap::kEmptyFixedArrayRootIndex); 4958 __ LoadRoot(r1, Heap::kEmptyFixedArrayRootIndex);
4949 __ str(r1, FieldMemOperand(r4, JSStrictArgumentsObject::kPropertiesOffset)); 4959 __ str(r1, FieldMemOperand(r4, JSStrictArgumentsObject::kPropertiesOffset));
4950 __ str(r3, FieldMemOperand(r4, JSStrictArgumentsObject::kElementsOffset)); 4960 __ str(r3, FieldMemOperand(r4, JSStrictArgumentsObject::kElementsOffset));
4951 __ str(r0, FieldMemOperand(r4, JSStrictArgumentsObject::kLengthOffset)); 4961 __ str(r0, FieldMemOperand(r4, JSStrictArgumentsObject::kLengthOffset));
4952 STATIC_ASSERT(JSStrictArgumentsObject::kSize == 4 * kPointerSize); 4962 STATIC_ASSERT(JSStrictArgumentsObject::kSize == 4 * kPointerSize);
4953 __ mov(r0, r4); 4963 __ mov(r0, r4);
4954 __ Ret(); 4964 __ Ret();
4955 4965
4956 // Fall back to %AllocateInNewSpace. 4966 // Fall back to %AllocateInNewSpace (if not too big).
4967 Label too_big_for_new_space;
4957 __ bind(&allocate); 4968 __ bind(&allocate);
4969 __ cmp(r6, Operand(Page::kMaxRegularHeapObjectSize));
4970 __ b(gt, &too_big_for_new_space);
4958 { 4971 {
4959 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); 4972 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL);
4960 __ SmiTag(r1); 4973 __ SmiTag(r6);
4961 __ Push(r0, r2, r1); 4974 __ Push(r0, r2, r6);
4962 __ CallRuntime(Runtime::kAllocateInNewSpace); 4975 __ CallRuntime(Runtime::kAllocateInNewSpace);
4963 __ mov(r3, r0); 4976 __ mov(r3, r0);
4964 __ Pop(r0, r2); 4977 __ Pop(r0, r2);
4965 } 4978 }
4966 __ b(&done_allocate); 4979 __ b(&done_allocate);
4980
4981 // Fall back to %NewStrictArguments.
4982 __ bind(&too_big_for_new_space);
4983 __ push(r1);
4984 __ TailCallRuntime(Runtime::kNewStrictArguments);
4967 } 4985 }
4968 4986
4969 4987
4970 void LoadGlobalViaContextStub::Generate(MacroAssembler* masm) { 4988 void LoadGlobalViaContextStub::Generate(MacroAssembler* masm) {
4971 Register context = cp; 4989 Register context = cp;
4972 Register result = r0; 4990 Register result = r0;
4973 Register slot = r2; 4991 Register slot = r2;
4974 4992
4975 // Go up the context chain to the script context. 4993 // Go up the context chain to the script context.
4976 for (int i = 0; i < depth(); ++i) { 4994 for (int i = 0; i < depth(); ++i) {
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after
5426 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, 5444 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref,
5427 kStackUnwindSpace, NULL, return_value_operand, NULL); 5445 kStackUnwindSpace, NULL, return_value_operand, NULL);
5428 } 5446 }
5429 5447
5430 #undef __ 5448 #undef __
5431 5449
5432 } // namespace internal 5450 } // namespace internal
5433 } // namespace v8 5451 } // namespace v8
5434 5452
5435 #endif // V8_TARGET_ARCH_ARM 5453 #endif // V8_TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « no previous file | src/arm64/code-stubs-arm64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698