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

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

Issue 2060893002: PPC: Fix arguments object stubs for large arrays. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix typo in FastNewRestParameterStub::Generate 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_PPC 5 #if V8_TARGET_ARCH_PPC
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 4580 matching lines...) Expand 10 before | Expand all | Expand 10 after
4591 Label no_rest_parameters; 4591 Label no_rest_parameters;
4592 __ LoadP(r5, MemOperand(r5, StandardFrameConstants::kCallerFPOffset)); 4592 __ LoadP(r5, MemOperand(r5, StandardFrameConstants::kCallerFPOffset));
4593 __ LoadP(ip, MemOperand(r5, CommonFrameConstants::kContextOrFrameTypeOffset)); 4593 __ LoadP(ip, MemOperand(r5, CommonFrameConstants::kContextOrFrameTypeOffset));
4594 __ CmpSmiLiteral(ip, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR), r0); 4594 __ CmpSmiLiteral(ip, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR), r0);
4595 __ bne(&no_rest_parameters); 4595 __ bne(&no_rest_parameters);
4596 4596
4597 // Check if the arguments adaptor frame contains more arguments than 4597 // Check if the arguments adaptor frame contains more arguments than
4598 // specified by the function's internal formal parameter count. 4598 // specified by the function's internal formal parameter count.
4599 Label rest_parameters; 4599 Label rest_parameters;
4600 __ LoadP(r3, MemOperand(r5, ArgumentsAdaptorFrameConstants::kLengthOffset)); 4600 __ LoadP(r3, MemOperand(r5, ArgumentsAdaptorFrameConstants::kLengthOffset));
4601 __ LoadP(r4, FieldMemOperand(r4, JSFunction::kSharedFunctionInfoOffset)); 4601 __ LoadP(r6, FieldMemOperand(r4, JSFunction::kSharedFunctionInfoOffset));
4602 __ LoadWordArith( 4602 __ LoadWordArith(
4603 r4, FieldMemOperand(r4, SharedFunctionInfo::kFormalParameterCountOffset)); 4603 r6, FieldMemOperand(r6, SharedFunctionInfo::kFormalParameterCountOffset));
4604 #if V8_TARGET_ARCH_PPC64 4604 #if V8_TARGET_ARCH_PPC64
4605 __ SmiTag(r4); 4605 __ SmiTag(r6);
4606 #endif 4606 #endif
4607 __ sub(r3, r3, r4, LeaveOE, SetRC); 4607 __ sub(r3, r3, r6, LeaveOE, SetRC);
4608 __ bgt(&rest_parameters, cr0); 4608 __ bgt(&rest_parameters, cr0);
4609 4609
4610 // Return an empty rest parameter array. 4610 // Return an empty rest parameter array.
4611 __ bind(&no_rest_parameters); 4611 __ bind(&no_rest_parameters);
4612 { 4612 {
4613 // ----------- S t a t e ------------- 4613 // ----------- S t a t e -------------
4614 // -- cp : context 4614 // -- cp : context
4615 // -- lr : return address 4615 // -- lr : return address
4616 // ----------------------------------- 4616 // -----------------------------------
4617 4617
(...skipping 26 matching lines...) Expand all
4644 __ bind(&rest_parameters); 4644 __ bind(&rest_parameters);
4645 { 4645 {
4646 // Compute the pointer to the first rest parameter (skippping the receiver). 4646 // Compute the pointer to the first rest parameter (skippping the receiver).
4647 __ SmiToPtrArrayOffset(r9, r3); 4647 __ SmiToPtrArrayOffset(r9, r3);
4648 __ add(r5, r5, r9); 4648 __ add(r5, r5, r9);
4649 __ addi(r5, r5, Operand(StandardFrameConstants::kCallerSPOffset)); 4649 __ addi(r5, r5, Operand(StandardFrameConstants::kCallerSPOffset));
4650 4650
4651 // ----------- S t a t e ------------- 4651 // ----------- S t a t e -------------
4652 // -- cp : context 4652 // -- cp : context
4653 // -- r3 : number of rest parameters (tagged) 4653 // -- r3 : number of rest parameters (tagged)
4654 // -- r4 : function
4654 // -- r5 : pointer just past first rest parameters 4655 // -- r5 : pointer just past first rest parameters
4655 // -- r9 : size of rest parameters 4656 // -- r9 : size of rest parameters
4656 // -- lr : return address 4657 // -- lr : return address
4657 // ----------------------------------- 4658 // -----------------------------------
4658 4659
4659 // Allocate space for the rest parameter array plus the backing store. 4660 // Allocate space for the rest parameter array plus the backing store.
4660 Label allocate, done_allocate; 4661 Label allocate, done_allocate;
4661 __ mov(r4, Operand(JSArray::kSize + FixedArray::kHeaderSize)); 4662 __ mov(r10, Operand(JSArray::kSize + FixedArray::kHeaderSize));
4662 __ add(r4, r4, r9); 4663 __ add(r10, r10, r9);
4663 __ Allocate(r4, r6, r7, r8, &allocate, NO_ALLOCATION_FLAGS); 4664 __ Allocate(r10, r6, r7, r8, &allocate, NO_ALLOCATION_FLAGS);
4664 __ bind(&done_allocate); 4665 __ bind(&done_allocate);
4665 4666
4666 // Setup the elements array in r6. 4667 // Setup the elements array in r6.
4667 __ LoadRoot(r4, Heap::kFixedArrayMapRootIndex); 4668 __ LoadRoot(r4, Heap::kFixedArrayMapRootIndex);
4668 __ StoreP(r4, FieldMemOperand(r6, FixedArray::kMapOffset), r0); 4669 __ StoreP(r4, FieldMemOperand(r6, FixedArray::kMapOffset), r0);
4669 __ StoreP(r3, FieldMemOperand(r6, FixedArray::kLengthOffset), r0); 4670 __ StoreP(r3, FieldMemOperand(r6, FixedArray::kLengthOffset), r0);
4670 __ addi(r7, r6, 4671 __ addi(r7, r6,
4671 Operand(FixedArray::kHeaderSize - kHeapObjectTag - kPointerSize)); 4672 Operand(FixedArray::kHeaderSize - kHeapObjectTag - kPointerSize));
4672 { 4673 {
4673 Label loop; 4674 Label loop;
(...skipping 10 matching lines...) Expand all
4684 __ LoadNativeContextSlot(Context::JS_ARRAY_FAST_ELEMENTS_MAP_INDEX, r4); 4685 __ LoadNativeContextSlot(Context::JS_ARRAY_FAST_ELEMENTS_MAP_INDEX, r4);
4685 __ StoreP(r4, MemOperand(r7, JSArray::kMapOffset)); 4686 __ StoreP(r4, MemOperand(r7, JSArray::kMapOffset));
4686 __ LoadRoot(r4, Heap::kEmptyFixedArrayRootIndex); 4687 __ LoadRoot(r4, Heap::kEmptyFixedArrayRootIndex);
4687 __ StoreP(r4, MemOperand(r7, JSArray::kPropertiesOffset)); 4688 __ StoreP(r4, MemOperand(r7, JSArray::kPropertiesOffset));
4688 __ StoreP(r6, MemOperand(r7, JSArray::kElementsOffset)); 4689 __ StoreP(r6, MemOperand(r7, JSArray::kElementsOffset));
4689 __ StoreP(r3, MemOperand(r7, JSArray::kLengthOffset)); 4690 __ StoreP(r3, MemOperand(r7, JSArray::kLengthOffset));
4690 STATIC_ASSERT(JSArray::kSize == 4 * kPointerSize); 4691 STATIC_ASSERT(JSArray::kSize == 4 * kPointerSize);
4691 __ addi(r3, r7, Operand(kHeapObjectTag)); 4692 __ addi(r3, r7, Operand(kHeapObjectTag));
4692 __ Ret(); 4693 __ Ret();
4693 4694
4694 // Fall back to %AllocateInNewSpace. 4695 // Fall back to %AllocateInNewSpace (if not too big).
4696 Label too_big_for_new_space;
4695 __ bind(&allocate); 4697 __ bind(&allocate);
4698 __ cmpi(r10, Operand(Page::kMaxRegularHeapObjectSize));
4699 __ bgt(&too_big_for_new_space);
4696 { 4700 {
4697 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); 4701 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL);
4698 __ SmiTag(r4); 4702 __ SmiTag(r10);
4699 __ Push(r3, r5, r4); 4703 __ Push(r3, r5, r10);
4700 __ CallRuntime(Runtime::kAllocateInNewSpace); 4704 __ CallRuntime(Runtime::kAllocateInNewSpace);
4701 __ mr(r6, r3); 4705 __ mr(r6, r3);
4702 __ Pop(r3, r5); 4706 __ Pop(r3, r5);
4703 } 4707 }
4704 __ b(&done_allocate); 4708 __ b(&done_allocate);
4709
4710 // Fall back to %NewRestParameter.
4711 __ bind(&too_big_for_new_space);
4712 __ push(r4);
4713 __ TailCallRuntime(Runtime::kNewRestParameter);
4705 } 4714 }
4706 } 4715 }
4707 4716
4708 void FastNewSloppyArgumentsStub::Generate(MacroAssembler* masm) { 4717 void FastNewSloppyArgumentsStub::Generate(MacroAssembler* masm) {
4709 // ----------- S t a t e ------------- 4718 // ----------- S t a t e -------------
4710 // -- r4 : function 4719 // -- r4 : function
4711 // -- cp : context 4720 // -- cp : context
4712 // -- fp : frame pointer 4721 // -- fp : frame pointer
4713 // -- lr : return address 4722 // -- lr : return address
4714 // ----------------------------------- 4723 // -----------------------------------
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
5000 __ bind(&ok); 5009 __ bind(&ok);
5001 } 5010 }
5002 5011
5003 // Check if we have an arguments adaptor frame below the function frame. 5012 // Check if we have an arguments adaptor frame below the function frame.
5004 Label arguments_adaptor, arguments_done; 5013 Label arguments_adaptor, arguments_done;
5005 __ LoadP(r6, MemOperand(r5, StandardFrameConstants::kCallerFPOffset)); 5014 __ LoadP(r6, MemOperand(r5, StandardFrameConstants::kCallerFPOffset));
5006 __ LoadP(ip, MemOperand(r6, CommonFrameConstants::kContextOrFrameTypeOffset)); 5015 __ LoadP(ip, MemOperand(r6, CommonFrameConstants::kContextOrFrameTypeOffset));
5007 __ CmpSmiLiteral(ip, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR), r0); 5016 __ CmpSmiLiteral(ip, Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR), r0);
5008 __ beq(&arguments_adaptor); 5017 __ beq(&arguments_adaptor);
5009 { 5018 {
5010 __ LoadP(r4, FieldMemOperand(r4, JSFunction::kSharedFunctionInfoOffset)); 5019 __ LoadP(r7, FieldMemOperand(r4, JSFunction::kSharedFunctionInfoOffset));
5011 __ LoadWordArith( 5020 __ LoadWordArith(
5012 r3, 5021 r3,
5013 FieldMemOperand(r4, SharedFunctionInfo::kFormalParameterCountOffset)); 5022 FieldMemOperand(r7, SharedFunctionInfo::kFormalParameterCountOffset));
5014 #if V8_TARGET_ARCH_PPC64 5023 #if V8_TARGET_ARCH_PPC64
5015 __ SmiTag(r3); 5024 __ SmiTag(r3);
5016 #endif 5025 #endif
5017 __ SmiToPtrArrayOffset(r9, r3); 5026 __ SmiToPtrArrayOffset(r9, r3);
5018 __ add(r5, r5, r9); 5027 __ add(r5, r5, r9);
5019 } 5028 }
5020 __ b(&arguments_done); 5029 __ b(&arguments_done);
5021 __ bind(&arguments_adaptor); 5030 __ bind(&arguments_adaptor);
5022 { 5031 {
5023 __ LoadP(r3, MemOperand(r6, ArgumentsAdaptorFrameConstants::kLengthOffset)); 5032 __ LoadP(r3, MemOperand(r6, ArgumentsAdaptorFrameConstants::kLengthOffset));
5024 __ SmiToPtrArrayOffset(r9, r3); 5033 __ SmiToPtrArrayOffset(r9, r3);
5025 __ add(r5, r6, r9); 5034 __ add(r5, r6, r9);
5026 } 5035 }
5027 __ bind(&arguments_done); 5036 __ bind(&arguments_done);
5028 __ addi(r5, r5, Operand(StandardFrameConstants::kCallerSPOffset)); 5037 __ addi(r5, r5, Operand(StandardFrameConstants::kCallerSPOffset));
5029 5038
5030 // ----------- S t a t e ------------- 5039 // ----------- S t a t e -------------
5031 // -- cp : context 5040 // -- cp : context
5032 // -- r3 : number of rest parameters (tagged) 5041 // -- r3 : number of rest parameters (tagged)
5042 // -- r4 : function
5033 // -- r5 : pointer just past first rest parameters 5043 // -- r5 : pointer just past first rest parameters
5034 // -- r9 : size of rest parameters 5044 // -- r9 : size of rest parameters
5035 // -- lr : return address 5045 // -- lr : return address
5036 // ----------------------------------- 5046 // -----------------------------------
5037 5047
5038 // Allocate space for the strict arguments object plus the backing store. 5048 // Allocate space for the strict arguments object plus the backing store.
5039 Label allocate, done_allocate; 5049 Label allocate, done_allocate;
5040 __ mov(r4, Operand(JSStrictArgumentsObject::kSize + FixedArray::kHeaderSize)); 5050 __ mov(r10,
5041 __ add(r4, r4, r9); 5051 Operand(JSStrictArgumentsObject::kSize + FixedArray::kHeaderSize));
5042 __ Allocate(r4, r6, r7, r8, &allocate, NO_ALLOCATION_FLAGS); 5052 __ add(r10, r10, r9);
5053 __ Allocate(r10, r6, r7, r8, &allocate, NO_ALLOCATION_FLAGS);
5043 __ bind(&done_allocate); 5054 __ bind(&done_allocate);
5044 5055
5045 // Setup the elements array in r6. 5056 // Setup the elements array in r6.
5046 __ LoadRoot(r4, Heap::kFixedArrayMapRootIndex); 5057 __ LoadRoot(r4, Heap::kFixedArrayMapRootIndex);
5047 __ StoreP(r4, FieldMemOperand(r6, FixedArray::kMapOffset), r0); 5058 __ StoreP(r4, FieldMemOperand(r6, FixedArray::kMapOffset), r0);
5048 __ StoreP(r3, FieldMemOperand(r6, FixedArray::kLengthOffset), r0); 5059 __ StoreP(r3, FieldMemOperand(r6, FixedArray::kLengthOffset), r0);
5049 __ addi(r7, r6, 5060 __ addi(r7, r6,
5050 Operand(FixedArray::kHeaderSize - kHeapObjectTag - kPointerSize)); 5061 Operand(FixedArray::kHeaderSize - kHeapObjectTag - kPointerSize));
5051 { 5062 {
5052 Label loop, done_loop; 5063 Label loop, done_loop;
(...skipping 12 matching lines...) Expand all
5065 __ LoadNativeContextSlot(Context::STRICT_ARGUMENTS_MAP_INDEX, r4); 5076 __ LoadNativeContextSlot(Context::STRICT_ARGUMENTS_MAP_INDEX, r4);
5066 __ StoreP(r4, MemOperand(r7, JSStrictArgumentsObject::kMapOffset)); 5077 __ StoreP(r4, MemOperand(r7, JSStrictArgumentsObject::kMapOffset));
5067 __ LoadRoot(r4, Heap::kEmptyFixedArrayRootIndex); 5078 __ LoadRoot(r4, Heap::kEmptyFixedArrayRootIndex);
5068 __ StoreP(r4, MemOperand(r7, JSStrictArgumentsObject::kPropertiesOffset)); 5079 __ StoreP(r4, MemOperand(r7, JSStrictArgumentsObject::kPropertiesOffset));
5069 __ StoreP(r6, MemOperand(r7, JSStrictArgumentsObject::kElementsOffset)); 5080 __ StoreP(r6, MemOperand(r7, JSStrictArgumentsObject::kElementsOffset));
5070 __ StoreP(r3, MemOperand(r7, JSStrictArgumentsObject::kLengthOffset)); 5081 __ StoreP(r3, MemOperand(r7, JSStrictArgumentsObject::kLengthOffset));
5071 STATIC_ASSERT(JSStrictArgumentsObject::kSize == 4 * kPointerSize); 5082 STATIC_ASSERT(JSStrictArgumentsObject::kSize == 4 * kPointerSize);
5072 __ addi(r3, r7, Operand(kHeapObjectTag)); 5083 __ addi(r3, r7, Operand(kHeapObjectTag));
5073 __ Ret(); 5084 __ Ret();
5074 5085
5075 // Fall back to %AllocateInNewSpace. 5086 // Fall back to %AllocateInNewSpace (if not too big).
5087 Label too_big_for_new_space;
5076 __ bind(&allocate); 5088 __ bind(&allocate);
5089 __ cmpi(r10, Operand(Page::kMaxRegularHeapObjectSize));
5090 __ bgt(&too_big_for_new_space);
5077 { 5091 {
5078 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); 5092 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL);
5079 __ SmiTag(r4); 5093 __ SmiTag(r10);
5080 __ Push(r3, r5, r4); 5094 __ Push(r3, r5, r10);
5081 __ CallRuntime(Runtime::kAllocateInNewSpace); 5095 __ CallRuntime(Runtime::kAllocateInNewSpace);
5082 __ mr(r6, r3); 5096 __ mr(r6, r3);
5083 __ Pop(r3, r5); 5097 __ Pop(r3, r5);
5084 } 5098 }
5085 __ b(&done_allocate); 5099 __ b(&done_allocate);
5100
5101 // Fall back to %NewStrictArguments.
5102 __ bind(&too_big_for_new_space);
5103 __ push(r4);
5104 __ TailCallRuntime(Runtime::kNewStrictArguments);
5086 } 5105 }
5087 5106
5088 void LoadGlobalViaContextStub::Generate(MacroAssembler* masm) { 5107 void LoadGlobalViaContextStub::Generate(MacroAssembler* masm) {
5089 Register context = cp; 5108 Register context = cp;
5090 Register result = r3; 5109 Register result = r3;
5091 Register slot = r5; 5110 Register slot = r5;
5092 5111
5093 // Go up the context chain to the script context. 5112 // Go up the context chain to the script context.
5094 for (int i = 0; i < depth(); ++i) { 5113 for (int i = 0; i < depth(); ++i) {
5095 __ LoadP(result, ContextMemOperand(context, Context::PREVIOUS_INDEX)); 5114 __ LoadP(result, ContextMemOperand(context, Context::PREVIOUS_INDEX));
(...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after
5595 fp, (PropertyCallbackArguments::kReturnValueOffset + 3) * kPointerSize); 5614 fp, (PropertyCallbackArguments::kReturnValueOffset + 3) * kPointerSize);
5596 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, 5615 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref,
5597 kStackUnwindSpace, NULL, return_value_operand, NULL); 5616 kStackUnwindSpace, NULL, return_value_operand, NULL);
5598 } 5617 }
5599 5618
5600 #undef __ 5619 #undef __
5601 } // namespace internal 5620 } // namespace internal
5602 } // namespace v8 5621 } // namespace v8
5603 5622
5604 #endif // V8_TARGET_ARCH_PPC 5623 #endif // V8_TARGET_ARCH_PPC
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