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

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

Issue 883613003: fix performance regression on intel call api stubs (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 10 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 | « src/ic/x64/handler-compiler-x64.cc ('k') | src/x64/interface-descriptors-x64.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 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #if V8_TARGET_ARCH_X64 7 #if V8_TARGET_ARCH_X64
8 8
9 #include "src/bootstrapper.h" 9 #include "src/bootstrapper.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 4799 matching lines...) Expand 10 before | Expand all | Expand 10 after
4810 __ movp(rax, prev_limit_reg); 4810 __ movp(rax, prev_limit_reg);
4811 __ jmp(&leave_exit_frame); 4811 __ jmp(&leave_exit_frame);
4812 } 4812 }
4813 4813
4814 4814
4815 static void CallApiFunctionStubHelper(MacroAssembler* masm, 4815 static void CallApiFunctionStubHelper(MacroAssembler* masm,
4816 const ParameterCount& argc, 4816 const ParameterCount& argc,
4817 bool return_first_arg, 4817 bool return_first_arg,
4818 bool call_data_undefined) { 4818 bool call_data_undefined) {
4819 // ----------- S t a t e ------------- 4819 // ----------- S t a t e -------------
4820 // -- rax : callee 4820 // -- rdi : callee
4821 // -- rbx : call_data 4821 // -- rbx : call_data
4822 // -- rcx : holder 4822 // -- rcx : holder
4823 // -- rdx : api_function_address 4823 // -- rdx : api_function_address
4824 // -- rsi : context 4824 // -- rsi : context
4825 // -- rdi : number of arguments if argc is a register 4825 // -- rax : number of arguments if argc is a register
4826 // -- rsp[0] : return address 4826 // -- rsp[0] : return address
4827 // -- rsp[8] : last argument 4827 // -- rsp[8] : last argument
4828 // -- ... 4828 // -- ...
4829 // -- rsp[argc * 8] : first argument 4829 // -- rsp[argc * 8] : first argument
4830 // -- rsp[(argc + 1) * 8] : receiver 4830 // -- rsp[(argc + 1) * 8] : receiver
4831 // ----------------------------------- 4831 // -----------------------------------
4832 4832
4833 Register callee = rax; 4833 Register callee = rdi;
4834 Register call_data = rbx; 4834 Register call_data = rbx;
4835 Register holder = rcx; 4835 Register holder = rcx;
4836 Register api_function_address = rdx; 4836 Register api_function_address = rdx;
4837 Register context = rsi; 4837 Register context = rsi;
4838 Register return_address = r8;
4838 4839
4839 typedef FunctionCallbackArguments FCA; 4840 typedef FunctionCallbackArguments FCA;
4840 4841
4841 STATIC_ASSERT(FCA::kContextSaveIndex == 6); 4842 STATIC_ASSERT(FCA::kContextSaveIndex == 6);
4842 STATIC_ASSERT(FCA::kCalleeIndex == 5); 4843 STATIC_ASSERT(FCA::kCalleeIndex == 5);
4843 STATIC_ASSERT(FCA::kDataIndex == 4); 4844 STATIC_ASSERT(FCA::kDataIndex == 4);
4844 STATIC_ASSERT(FCA::kReturnValueOffset == 3); 4845 STATIC_ASSERT(FCA::kReturnValueOffset == 3);
4845 STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2); 4846 STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2);
4846 STATIC_ASSERT(FCA::kIsolateIndex == 1); 4847 STATIC_ASSERT(FCA::kIsolateIndex == 1);
4847 STATIC_ASSERT(FCA::kHolderIndex == 0); 4848 STATIC_ASSERT(FCA::kHolderIndex == 0);
4848 STATIC_ASSERT(FCA::kArgsLength == 7); 4849 STATIC_ASSERT(FCA::kArgsLength == 7);
4849 4850
4850 DCHECK(argc.is_immediate() || rdi.is(argc.reg())); 4851 DCHECK(argc.is_immediate() || rax.is(argc.reg()));
4851 4852
4852 if (kPointerSize == kInt64Size) { 4853 __ PopReturnAddressTo(return_address);
4853 // pop return address and save context 4854
4854 __ xchgq(context, Operand(rsp, 0)); 4855 // context save
4855 } else { 4856 __ Push(context);
4856 // x32 handling.
4857 __ PopReturnAddressTo(kScratchRegister);
4858 __ Push(context);
4859 __ movq(context, kScratchRegister);
4860 }
4861 4857
4862 // callee 4858 // callee
4863 __ Push(callee); 4859 __ Push(callee);
4864 4860
4865 // call data 4861 // call data
4866 __ Push(call_data); 4862 __ Push(call_data);
4867 Register scratch = call_data; 4863 Register scratch = call_data;
4868 if (!call_data_undefined) { 4864 if (!call_data_undefined) {
4869 __ LoadRoot(scratch, Heap::kUndefinedValueRootIndex); 4865 __ LoadRoot(scratch, Heap::kUndefinedValueRootIndex);
4870 } 4866 }
4871 // return value 4867 // return value
4872 __ Push(scratch); 4868 __ Push(scratch);
4873 // return value default 4869 // return value default
4874 __ Push(scratch); 4870 __ Push(scratch);
4875 // isolate 4871 // isolate
4876 __ Move(scratch, ExternalReference::isolate_address(masm->isolate())); 4872 __ Move(scratch, ExternalReference::isolate_address(masm->isolate()));
4877 __ Push(scratch); 4873 __ Push(scratch);
4878 // holder 4874 // holder
4879 __ Push(holder); 4875 __ Push(holder);
4880 4876
4881 __ movp(scratch, rsp); 4877 __ movp(scratch, rsp);
4882 // Push return address back on stack. 4878 // Push return address back on stack.
4883 __ PushReturnAddressFrom(context); 4879 __ PushReturnAddressFrom(return_address);
4884 4880
4885 // load context from callee 4881 // load context from callee
4886 __ movp(context, FieldOperand(callee, JSFunction::kContextOffset)); 4882 __ movp(context, FieldOperand(callee, JSFunction::kContextOffset));
4887 4883
4888 // Allocate the v8::Arguments structure in the arguments' space since 4884 // Allocate the v8::Arguments structure in the arguments' space since
4889 // it's not controlled by GC. 4885 // it's not controlled by GC.
4890 const int kApiStackSpace = 4; 4886 const int kApiStackSpace = 4;
4891 4887
4892 PrepareCallApiFunction(masm, kApiStackSpace); 4888 PrepareCallApiFunction(masm, kApiStackSpace);
4893 4889
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
4947 stack_space = argc.immediate() + FCA::kArgsLength + 1; 4943 stack_space = argc.immediate() + FCA::kArgsLength + 1;
4948 stack_space_operand = nullptr; 4944 stack_space_operand = nullptr;
4949 } 4945 }
4950 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, callback_arg, 4946 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, callback_arg,
4951 stack_space, stack_space_operand, 4947 stack_space, stack_space_operand,
4952 return_value_operand, &context_restore_operand); 4948 return_value_operand, &context_restore_operand);
4953 } 4949 }
4954 4950
4955 4951
4956 void CallApiFunctionStub::Generate(MacroAssembler* masm) { 4952 void CallApiFunctionStub::Generate(MacroAssembler* masm) {
4957 // TODO(dcarney): make rax contain the function address.
4958 bool call_data_undefined = this->call_data_undefined(); 4953 bool call_data_undefined = this->call_data_undefined();
4959 CallApiFunctionStubHelper(masm, ParameterCount(rdi), false, 4954 CallApiFunctionStubHelper(masm, ParameterCount(rax), false,
4960 call_data_undefined); 4955 call_data_undefined);
4961 } 4956 }
4962 4957
4963 4958
4964 void CallApiAccessorStub::Generate(MacroAssembler* masm) { 4959 void CallApiAccessorStub::Generate(MacroAssembler* masm) {
4965 bool is_store = this->is_store(); 4960 bool is_store = this->is_store();
4966 int argc = this->argc(); 4961 int argc = this->argc();
4967 bool call_data_undefined = this->call_data_undefined(); 4962 bool call_data_undefined = this->call_data_undefined();
4968 CallApiFunctionStubHelper(masm, ParameterCount(argc), is_store, 4963 CallApiFunctionStubHelper(masm, ParameterCount(argc), is_store,
4969 call_data_undefined); 4964 call_data_undefined);
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
5026 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, getter_arg, 5021 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, getter_arg,
5027 kStackSpace, nullptr, return_value_operand, NULL); 5022 kStackSpace, nullptr, return_value_operand, NULL);
5028 } 5023 }
5029 5024
5030 5025
5031 #undef __ 5026 #undef __
5032 5027
5033 } } // namespace v8::internal 5028 } } // namespace v8::internal
5034 5029
5035 #endif // V8_TARGET_ARCH_X64 5030 #endif // V8_TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « src/ic/x64/handler-compiler-x64.cc ('k') | src/x64/interface-descriptors-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698