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

Side by Side Diff: src/s390/code-stubs-s390.cc

Issue 2064023002: S390: Fix arguments object stubs for large arrays. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: S390: Fix arguments object stubs for large arrays. 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 | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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_S390 5 #if V8_TARGET_ARCH_S390
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 4517 matching lines...) Expand 10 before | Expand all | Expand 10 after
4528 Label no_rest_parameters; 4528 Label no_rest_parameters;
4529 __ LoadP(r4, MemOperand(r4, StandardFrameConstants::kCallerFPOffset)); 4529 __ LoadP(r4, MemOperand(r4, StandardFrameConstants::kCallerFPOffset));
4530 __ LoadP(ip, MemOperand(r4, CommonFrameConstants::kContextOrFrameTypeOffset)); 4530 __ LoadP(ip, MemOperand(r4, CommonFrameConstants::kContextOrFrameTypeOffset));
4531 __ CmpSmiLiteral(ip, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR), r0); 4531 __ CmpSmiLiteral(ip, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR), r0);
4532 __ bne(&no_rest_parameters); 4532 __ bne(&no_rest_parameters);
4533 4533
4534 // Check if the arguments adaptor frame contains more arguments than 4534 // Check if the arguments adaptor frame contains more arguments than
4535 // specified by the function's internal formal parameter count. 4535 // specified by the function's internal formal parameter count.
4536 Label rest_parameters; 4536 Label rest_parameters;
4537 __ LoadP(r2, MemOperand(r4, ArgumentsAdaptorFrameConstants::kLengthOffset)); 4537 __ LoadP(r2, MemOperand(r4, ArgumentsAdaptorFrameConstants::kLengthOffset));
4538 __ LoadP(r3, FieldMemOperand(r3, JSFunction::kSharedFunctionInfoOffset)); 4538 __ LoadP(r5, FieldMemOperand(r3, JSFunction::kSharedFunctionInfoOffset));
4539 __ LoadW( 4539 __ LoadW(
4540 r3, FieldMemOperand(r3, SharedFunctionInfo::kFormalParameterCountOffset)); 4540 r5, FieldMemOperand(r5, SharedFunctionInfo::kFormalParameterCountOffset));
4541 #if V8_TARGET_ARCH_S390X 4541 #if V8_TARGET_ARCH_S390X
4542 __ SmiTag(r3); 4542 __ SmiTag(r5);
4543 #endif 4543 #endif
4544 __ SubP(r2, r2, r3); 4544 __ SubP(r2, r2, r5);
4545 __ bgt(&rest_parameters); 4545 __ bgt(&rest_parameters);
4546 4546
4547 // Return an empty rest parameter array. 4547 // Return an empty rest parameter array.
4548 __ bind(&no_rest_parameters); 4548 __ bind(&no_rest_parameters);
4549 { 4549 {
4550 // ----------- S t a t e ------------- 4550 // ----------- S t a t e -------------
4551 // -- cp : context 4551 // -- cp : context
4552 // -- lr : return address 4552 // -- lr : return address
4553 // ----------------------------------- 4553 // -----------------------------------
4554 4554
(...skipping 26 matching lines...) Expand all
4581 __ bind(&rest_parameters); 4581 __ bind(&rest_parameters);
4582 { 4582 {
4583 // Compute the pointer to the first rest parameter (skippping the receiver). 4583 // Compute the pointer to the first rest parameter (skippping the receiver).
4584 __ SmiToPtrArrayOffset(r8, r2); 4584 __ SmiToPtrArrayOffset(r8, r2);
4585 __ AddP(r4, r4, r8); 4585 __ AddP(r4, r4, r8);
4586 __ AddP(r4, r4, Operand(StandardFrameConstants::kCallerSPOffset)); 4586 __ AddP(r4, r4, Operand(StandardFrameConstants::kCallerSPOffset));
4587 4587
4588 // ----------- S t a t e ------------- 4588 // ----------- S t a t e -------------
4589 // -- cp : context 4589 // -- cp : context
4590 // -- r2 : number of rest parameters (tagged) 4590 // -- r2 : number of rest parameters (tagged)
4591 // -- r3 : function
4591 // -- r4 : pointer just past first rest parameters 4592 // -- r4 : pointer just past first rest parameters
4592 // -- r8 : size of rest parameters 4593 // -- r8 : size of rest parameters
4593 // -- lr : return address 4594 // -- lr : return address
4594 // ----------------------------------- 4595 // -----------------------------------
4595 4596
4596 // Allocate space for the rest parameter array plus the backing store. 4597 // Allocate space for the rest parameter array plus the backing store.
4597 Label allocate, done_allocate; 4598 Label allocate, done_allocate;
4598 __ mov(r3, Operand(JSArray::kSize + FixedArray::kHeaderSize)); 4599 __ mov(r9, Operand(JSArray::kSize + FixedArray::kHeaderSize));
4599 __ AddP(r3, r3, r8); 4600 __ AddP(r9, r9, r8);
4600 __ Allocate(r3, r5, r6, r7, &allocate, NO_ALLOCATION_FLAGS); 4601 __ Allocate(r9, r5, r6, r7, &allocate, NO_ALLOCATION_FLAGS);
4601 __ bind(&done_allocate); 4602 __ bind(&done_allocate);
4602 4603
4603 // Setup the elements array in r5. 4604 // Setup the elements array in r5.
4604 __ LoadRoot(r3, Heap::kFixedArrayMapRootIndex); 4605 __ LoadRoot(r3, Heap::kFixedArrayMapRootIndex);
4605 __ StoreP(r3, FieldMemOperand(r5, FixedArray::kMapOffset), r0); 4606 __ StoreP(r3, FieldMemOperand(r5, FixedArray::kMapOffset), r0);
4606 __ StoreP(r2, FieldMemOperand(r5, FixedArray::kLengthOffset), r0); 4607 __ StoreP(r2, FieldMemOperand(r5, FixedArray::kLengthOffset), r0);
4607 __ AddP(r6, r5, 4608 __ AddP(r6, r5,
4608 Operand(FixedArray::kHeaderSize - kHeapObjectTag - kPointerSize)); 4609 Operand(FixedArray::kHeaderSize - kHeapObjectTag - kPointerSize));
4609 { 4610 {
4610 Label loop; 4611 Label loop;
(...skipping 13 matching lines...) Expand all
4624 __ LoadNativeContextSlot(Context::JS_ARRAY_FAST_ELEMENTS_MAP_INDEX, r3); 4625 __ LoadNativeContextSlot(Context::JS_ARRAY_FAST_ELEMENTS_MAP_INDEX, r3);
4625 __ StoreP(r3, MemOperand(r6, JSArray::kMapOffset)); 4626 __ StoreP(r3, MemOperand(r6, JSArray::kMapOffset));
4626 __ LoadRoot(r3, Heap::kEmptyFixedArrayRootIndex); 4627 __ LoadRoot(r3, Heap::kEmptyFixedArrayRootIndex);
4627 __ StoreP(r3, MemOperand(r6, JSArray::kPropertiesOffset)); 4628 __ StoreP(r3, MemOperand(r6, JSArray::kPropertiesOffset));
4628 __ StoreP(r5, MemOperand(r6, JSArray::kElementsOffset)); 4629 __ StoreP(r5, MemOperand(r6, JSArray::kElementsOffset));
4629 __ StoreP(r2, MemOperand(r6, JSArray::kLengthOffset)); 4630 __ StoreP(r2, MemOperand(r6, JSArray::kLengthOffset));
4630 STATIC_ASSERT(JSArray::kSize == 4 * kPointerSize); 4631 STATIC_ASSERT(JSArray::kSize == 4 * kPointerSize);
4631 __ AddP(r2, r6, Operand(kHeapObjectTag)); 4632 __ AddP(r2, r6, Operand(kHeapObjectTag));
4632 __ Ret(); 4633 __ Ret();
4633 4634
4634 // Fall back to %AllocateInNewSpace. 4635 // Fall back to %AllocateInNewSpace (if not too big).
4636 Label too_big_for_new_space;
4635 __ bind(&allocate); 4637 __ bind(&allocate);
4638 __ CmpP(r9, Operand(Page::kMaxRegularHeapObjectSize));
4639 __ bgt(&too_big_for_new_space);
4636 { 4640 {
4637 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); 4641 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL);
4638 __ SmiTag(r3); 4642 __ SmiTag(r9);
4639 __ Push(r2, r4, r3); 4643 __ Push(r2, r4, r9);
4640 __ CallRuntime(Runtime::kAllocateInNewSpace); 4644 __ CallRuntime(Runtime::kAllocateInNewSpace);
4641 __ LoadRR(r5, r2); 4645 __ LoadRR(r5, r2);
4642 __ Pop(r2, r4); 4646 __ Pop(r2, r4);
4643 } 4647 }
4644 __ b(&done_allocate); 4648 __ b(&done_allocate);
4649
4650 // Fall back to %NewRestParameter.
4651 __ bind(&too_big_for_new_space);
4652 __ push(r3);
4653 __ TailCallRuntime(Runtime::kNewRestParameter);
4645 } 4654 }
4646 } 4655 }
4647 4656
4648 void FastNewSloppyArgumentsStub::Generate(MacroAssembler* masm) { 4657 void FastNewSloppyArgumentsStub::Generate(MacroAssembler* masm) {
4649 // ----------- S t a t e ------------- 4658 // ----------- S t a t e -------------
4650 // -- r3 : function 4659 // -- r3 : function
4651 // -- cp : context 4660 // -- cp : context
4652 // -- fp : frame pointer 4661 // -- fp : frame pointer
4653 // -- lr : return address 4662 // -- lr : return address
4654 // ----------------------------------- 4663 // -----------------------------------
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
4924 __ bind(&ok); 4933 __ bind(&ok);
4925 } 4934 }
4926 4935
4927 // Check if we have an arguments adaptor frame below the function frame. 4936 // Check if we have an arguments adaptor frame below the function frame.
4928 Label arguments_adaptor, arguments_done; 4937 Label arguments_adaptor, arguments_done;
4929 __ LoadP(r5, MemOperand(r4, StandardFrameConstants::kCallerFPOffset)); 4938 __ LoadP(r5, MemOperand(r4, StandardFrameConstants::kCallerFPOffset));
4930 __ LoadP(ip, MemOperand(r5, CommonFrameConstants::kContextOrFrameTypeOffset)); 4939 __ LoadP(ip, MemOperand(r5, CommonFrameConstants::kContextOrFrameTypeOffset));
4931 __ CmpSmiLiteral(ip, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR), r0); 4940 __ CmpSmiLiteral(ip, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR), r0);
4932 __ beq(&arguments_adaptor); 4941 __ beq(&arguments_adaptor);
4933 { 4942 {
4934 __ LoadP(r3, FieldMemOperand(r3, JSFunction::kSharedFunctionInfoOffset)); 4943 __ LoadP(r6, FieldMemOperand(r3, JSFunction::kSharedFunctionInfoOffset));
4935 __ LoadW(r2, FieldMemOperand( 4944 __ LoadW(r2, FieldMemOperand(
4936 r3, SharedFunctionInfo::kFormalParameterCountOffset)); 4945 r6, SharedFunctionInfo::kFormalParameterCountOffset));
4937 #if V8_TARGET_ARCH_S390X 4946 #if V8_TARGET_ARCH_S390X
4938 __ SmiTag(r2); 4947 __ SmiTag(r2);
4939 #endif 4948 #endif
4940 __ SmiToPtrArrayOffset(r8, r2); 4949 __ SmiToPtrArrayOffset(r8, r2);
4941 __ AddP(r4, r4, r8); 4950 __ AddP(r4, r4, r8);
4942 } 4951 }
4943 __ b(&arguments_done); 4952 __ b(&arguments_done);
4944 __ bind(&arguments_adaptor); 4953 __ bind(&arguments_adaptor);
4945 { 4954 {
4946 __ LoadP(r2, MemOperand(r5, ArgumentsAdaptorFrameConstants::kLengthOffset)); 4955 __ LoadP(r2, MemOperand(r5, ArgumentsAdaptorFrameConstants::kLengthOffset));
4947 __ SmiToPtrArrayOffset(r8, r2); 4956 __ SmiToPtrArrayOffset(r8, r2);
4948 __ AddP(r4, r5, r8); 4957 __ AddP(r4, r5, r8);
4949 } 4958 }
4950 __ bind(&arguments_done); 4959 __ bind(&arguments_done);
4951 __ AddP(r4, r4, Operand(StandardFrameConstants::kCallerSPOffset)); 4960 __ AddP(r4, r4, Operand(StandardFrameConstants::kCallerSPOffset));
4952 4961
4953 // ----------- S t a t e ------------- 4962 // ----------- S t a t e -------------
4954 // -- cp : context 4963 // -- cp : context
4955 // -- r2 : number of rest parameters (tagged) 4964 // -- r2 : number of rest parameters (tagged)
4965 // -- r3 : function
4956 // -- r4 : pointer just past first rest parameters 4966 // -- r4 : pointer just past first rest parameters
4957 // -- r8 : size of rest parameters 4967 // -- r8 : size of rest parameters
4958 // -- lr : return address 4968 // -- lr : return address
4959 // ----------------------------------- 4969 // -----------------------------------
4960 4970
4961 // Allocate space for the strict arguments object plus the backing store. 4971 // Allocate space for the strict arguments object plus the backing store.
4962 Label allocate, done_allocate; 4972 Label allocate, done_allocate;
4963 __ mov(r3, Operand(JSStrictArgumentsObject::kSize + FixedArray::kHeaderSize)); 4973 __ mov(r9, Operand(JSStrictArgumentsObject::kSize + FixedArray::kHeaderSize));
4964 __ AddP(r3, r3, r8); 4974 __ AddP(r9, r9, r8);
4965 __ Allocate(r3, r5, r6, r7, &allocate, NO_ALLOCATION_FLAGS); 4975 __ Allocate(r9, r5, r6, r7, &allocate, NO_ALLOCATION_FLAGS);
4966 __ bind(&done_allocate); 4976 __ bind(&done_allocate);
4967 4977
4968 // Setup the elements array in r5. 4978 // Setup the elements array in r5.
4969 __ LoadRoot(r3, Heap::kFixedArrayMapRootIndex); 4979 __ LoadRoot(r3, Heap::kFixedArrayMapRootIndex);
4970 __ StoreP(r3, FieldMemOperand(r5, FixedArray::kMapOffset), r0); 4980 __ StoreP(r3, FieldMemOperand(r5, FixedArray::kMapOffset), r0);
4971 __ StoreP(r2, FieldMemOperand(r5, FixedArray::kLengthOffset), r0); 4981 __ StoreP(r2, FieldMemOperand(r5, FixedArray::kLengthOffset), r0);
4972 __ AddP(r6, r5, 4982 __ AddP(r6, r5,
4973 Operand(FixedArray::kHeaderSize - kHeapObjectTag - kPointerSize)); 4983 Operand(FixedArray::kHeaderSize - kHeapObjectTag - kPointerSize));
4974 { 4984 {
4975 Label loop, done_loop; 4985 Label loop, done_loop;
(...skipping 14 matching lines...) Expand all
4990 __ LoadNativeContextSlot(Context::STRICT_ARGUMENTS_MAP_INDEX, r3); 5000 __ LoadNativeContextSlot(Context::STRICT_ARGUMENTS_MAP_INDEX, r3);
4991 __ StoreP(r3, MemOperand(r6, JSStrictArgumentsObject::kMapOffset)); 5001 __ StoreP(r3, MemOperand(r6, JSStrictArgumentsObject::kMapOffset));
4992 __ LoadRoot(r3, Heap::kEmptyFixedArrayRootIndex); 5002 __ LoadRoot(r3, Heap::kEmptyFixedArrayRootIndex);
4993 __ StoreP(r3, MemOperand(r6, JSStrictArgumentsObject::kPropertiesOffset)); 5003 __ StoreP(r3, MemOperand(r6, JSStrictArgumentsObject::kPropertiesOffset));
4994 __ StoreP(r5, MemOperand(r6, JSStrictArgumentsObject::kElementsOffset)); 5004 __ StoreP(r5, MemOperand(r6, JSStrictArgumentsObject::kElementsOffset));
4995 __ StoreP(r2, MemOperand(r6, JSStrictArgumentsObject::kLengthOffset)); 5005 __ StoreP(r2, MemOperand(r6, JSStrictArgumentsObject::kLengthOffset));
4996 STATIC_ASSERT(JSStrictArgumentsObject::kSize == 4 * kPointerSize); 5006 STATIC_ASSERT(JSStrictArgumentsObject::kSize == 4 * kPointerSize);
4997 __ AddP(r2, r6, Operand(kHeapObjectTag)); 5007 __ AddP(r2, r6, Operand(kHeapObjectTag));
4998 __ Ret(); 5008 __ Ret();
4999 5009
5000 // Fall back to %AllocateInNewSpace. 5010 // Fall back to %AllocateInNewSpace (if not too big).
5011 Label too_big_for_new_space;
5001 __ bind(&allocate); 5012 __ bind(&allocate);
5013 __ CmpP(r9, Operand(Page::kMaxRegularHeapObjectSize));
5014 __ bgt(&too_big_for_new_space);
5002 { 5015 {
5003 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); 5016 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL);
5004 __ SmiTag(r3); 5017 __ SmiTag(r9);
5005 __ Push(r2, r4, r3); 5018 __ Push(r2, r4, r9);
5006 __ CallRuntime(Runtime::kAllocateInNewSpace); 5019 __ CallRuntime(Runtime::kAllocateInNewSpace);
5007 __ LoadRR(r5, r2); 5020 __ LoadRR(r5, r2);
5008 __ Pop(r2, r4); 5021 __ Pop(r2, r4);
5009 } 5022 }
5010 __ b(&done_allocate); 5023 __ b(&done_allocate);
5024
5025 // Fall back to %NewStrictArguments.
5026 __ bind(&too_big_for_new_space);
5027 __ push(r3);
5028 __ TailCallRuntime(Runtime::kNewStrictArguments);
5011 } 5029 }
5012 5030
5013 void LoadGlobalViaContextStub::Generate(MacroAssembler* masm) { 5031 void LoadGlobalViaContextStub::Generate(MacroAssembler* masm) {
5014 Register context = cp; 5032 Register context = cp;
5015 Register result = r2; 5033 Register result = r2;
5016 Register slot = r4; 5034 Register slot = r4;
5017 5035
5018 // Go up the context chain to the script context. 5036 // Go up the context chain to the script context.
5019 for (int i = 0; i < depth(); ++i) { 5037 for (int i = 0; i < depth(); ++i) {
5020 __ LoadP(result, ContextMemOperand(context, Context::PREVIOUS_INDEX)); 5038 __ LoadP(result, ContextMemOperand(context, Context::PREVIOUS_INDEX));
(...skipping 492 matching lines...) Expand 10 before | Expand all | Expand 10 after
5513 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, 5531 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref,
5514 kStackUnwindSpace, NULL, return_value_operand, NULL); 5532 kStackUnwindSpace, NULL, return_value_operand, NULL);
5515 } 5533 }
5516 5534
5517 #undef __ 5535 #undef __
5518 5536
5519 } // namespace internal 5537 } // namespace internal
5520 } // namespace v8 5538 } // namespace v8
5521 5539
5522 #endif // V8_TARGET_ARCH_S390 5540 #endif // V8_TARGET_ARCH_S390
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698