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

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

Issue 906743002: X87: 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/x87/handler-compiler-x87.cc ('k') | src/x87/interface-descriptors-x87.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 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #if V8_TARGET_ARCH_X87 7 #if V8_TARGET_ARCH_X87
8 8
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/bootstrapper.h" 10 #include "src/bootstrapper.h"
(...skipping 4525 matching lines...) Expand 10 before | Expand all | Expand 10 after
4536 __ mov(eax, edi); 4536 __ mov(eax, edi);
4537 __ jmp(&leave_exit_frame); 4537 __ jmp(&leave_exit_frame);
4538 } 4538 }
4539 4539
4540 4540
4541 static void CallApiFunctionStubHelper(MacroAssembler* masm, 4541 static void CallApiFunctionStubHelper(MacroAssembler* masm,
4542 const ParameterCount& argc, 4542 const ParameterCount& argc,
4543 bool return_first_arg, 4543 bool return_first_arg,
4544 bool call_data_undefined) { 4544 bool call_data_undefined) {
4545 // ----------- S t a t e ------------- 4545 // ----------- S t a t e -------------
4546 // -- eax : callee 4546 // -- edi : callee
4547 // -- ebx : call_data 4547 // -- ebx : call_data
4548 // -- ecx : holder 4548 // -- ecx : holder
4549 // -- edx : api_function_address 4549 // -- edx : api_function_address
4550 // -- esi : context 4550 // -- esi : context
4551 // -- edi : number of arguments if argc is a register 4551 // -- eax : number of arguments if argc is a register
4552 // -- 4552 // --
4553 // -- esp[0] : return address 4553 // -- esp[0] : return address
4554 // -- esp[4] : last argument 4554 // -- esp[4] : last argument
4555 // -- ... 4555 // -- ...
4556 // -- esp[argc * 4] : first argument 4556 // -- esp[argc * 4] : first argument
4557 // -- esp[(argc + 1) * 4] : receiver 4557 // -- esp[(argc + 1) * 4] : receiver
4558 // ----------------------------------- 4558 // -----------------------------------
4559 4559
4560 Register callee = eax; 4560 Register callee = edi;
4561 Register call_data = ebx; 4561 Register call_data = ebx;
4562 Register holder = ecx; 4562 Register holder = ecx;
4563 Register api_function_address = edx; 4563 Register api_function_address = edx;
4564 Register context = esi; 4564 Register context = esi;
4565 Register return_address = eax;
4565 4566
4566 typedef FunctionCallbackArguments FCA; 4567 typedef FunctionCallbackArguments FCA;
4567 4568
4568 STATIC_ASSERT(FCA::kContextSaveIndex == 6); 4569 STATIC_ASSERT(FCA::kContextSaveIndex == 6);
4569 STATIC_ASSERT(FCA::kCalleeIndex == 5); 4570 STATIC_ASSERT(FCA::kCalleeIndex == 5);
4570 STATIC_ASSERT(FCA::kDataIndex == 4); 4571 STATIC_ASSERT(FCA::kDataIndex == 4);
4571 STATIC_ASSERT(FCA::kReturnValueOffset == 3); 4572 STATIC_ASSERT(FCA::kReturnValueOffset == 3);
4572 STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2); 4573 STATIC_ASSERT(FCA::kReturnValueDefaultValueIndex == 2);
4573 STATIC_ASSERT(FCA::kIsolateIndex == 1); 4574 STATIC_ASSERT(FCA::kIsolateIndex == 1);
4574 STATIC_ASSERT(FCA::kHolderIndex == 0); 4575 STATIC_ASSERT(FCA::kHolderIndex == 0);
4575 STATIC_ASSERT(FCA::kArgsLength == 7); 4576 STATIC_ASSERT(FCA::kArgsLength == 7);
4576 4577
4577 DCHECK(argc.is_immediate() || edi.is(argc.reg())); 4578 DCHECK(argc.is_immediate() || eax.is(argc.reg()));
4578 4579
4579 // pop return address and save context 4580 if (argc.is_immediate()) {
4580 __ xchg(context, Operand(esp, 0)); 4581 __ pop(return_address);
4582 // context save.
4583 __ push(context);
4584 } else {
4585 // pop return address and save context
4586 __ xchg(context, Operand(esp, 0));
4587 return_address = context;
4588 }
4581 4589
4582 // callee 4590 // callee
4583 __ push(callee); 4591 __ push(callee);
4584 4592
4585 // call data 4593 // call data
4586 __ push(call_data); 4594 __ push(call_data);
4587 4595
4588 Register scratch = call_data; 4596 Register scratch = call_data;
4589 if (!call_data_undefined) { 4597 if (!call_data_undefined) {
4590 // return value 4598 // return value
4591 __ push(Immediate(masm->isolate()->factory()->undefined_value())); 4599 __ push(Immediate(masm->isolate()->factory()->undefined_value()));
4592 // return value default 4600 // return value default
4593 __ push(Immediate(masm->isolate()->factory()->undefined_value())); 4601 __ push(Immediate(masm->isolate()->factory()->undefined_value()));
4594 } else { 4602 } else {
4595 // return value 4603 // return value
4596 __ push(scratch); 4604 __ push(scratch);
4597 // return value default 4605 // return value default
4598 __ push(scratch); 4606 __ push(scratch);
4599 } 4607 }
4600 // isolate 4608 // isolate
4601 __ push(Immediate(reinterpret_cast<int>(masm->isolate()))); 4609 __ push(Immediate(reinterpret_cast<int>(masm->isolate())));
4602 // holder 4610 // holder
4603 __ push(holder); 4611 __ push(holder);
4604 4612
4605 __ mov(scratch, esp); 4613 __ mov(scratch, esp);
4606 4614
4607 // push return address 4615 // push return address
4608 __ push(context); 4616 __ push(return_address);
4609 4617
4610 // load context from callee 4618 // load context from callee
4611 __ mov(context, FieldOperand(callee, JSFunction::kContextOffset)); 4619 __ mov(context, FieldOperand(callee, JSFunction::kContextOffset));
4612 4620
4613 // API function gets reference to the v8::Arguments. If CPU profiler 4621 // API function gets reference to the v8::Arguments. If CPU profiler
4614 // is enabled wrapper function will be called and we need to pass 4622 // is enabled wrapper function will be called and we need to pass
4615 // address of the callback as additional parameter, always allocate 4623 // address of the callback as additional parameter, always allocate
4616 // space for it. 4624 // space for it.
4617 const int kApiArgc = 1 + 1; 4625 const int kApiArgc = 1 + 1;
4618 4626
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
4671 stack_space_operand = nullptr; 4679 stack_space_operand = nullptr;
4672 } 4680 }
4673 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, 4681 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref,
4674 ApiParameterOperand(1), stack_space, 4682 ApiParameterOperand(1), stack_space,
4675 stack_space_operand, return_value_operand, 4683 stack_space_operand, return_value_operand,
4676 &context_restore_operand); 4684 &context_restore_operand);
4677 } 4685 }
4678 4686
4679 4687
4680 void CallApiFunctionStub::Generate(MacroAssembler* masm) { 4688 void CallApiFunctionStub::Generate(MacroAssembler* masm) {
4681 // TODO(dcarney): make eax contain the function address.
4682 bool call_data_undefined = this->call_data_undefined(); 4689 bool call_data_undefined = this->call_data_undefined();
4683 CallApiFunctionStubHelper(masm, ParameterCount(edi), false, 4690 CallApiFunctionStubHelper(masm, ParameterCount(eax), false,
4684 call_data_undefined); 4691 call_data_undefined);
4685 } 4692 }
4686 4693
4687 4694
4688 void CallApiAccessorStub::Generate(MacroAssembler* masm) { 4695 void CallApiAccessorStub::Generate(MacroAssembler* masm) {
4689 bool is_store = this->is_store(); 4696 bool is_store = this->is_store();
4690 int argc = this->argc(); 4697 int argc = this->argc();
4691 bool call_data_undefined = this->call_data_undefined(); 4698 bool call_data_undefined = this->call_data_undefined();
4692 CallApiFunctionStubHelper(masm, ParameterCount(argc), is_store, 4699 CallApiFunctionStubHelper(masm, ParameterCount(argc), is_store,
4693 call_data_undefined); 4700 call_data_undefined);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
4729 ApiParameterOperand(2), kStackSpace, nullptr, 4736 ApiParameterOperand(2), kStackSpace, nullptr,
4730 Operand(ebp, 7 * kPointerSize), NULL); 4737 Operand(ebp, 7 * kPointerSize), NULL);
4731 } 4738 }
4732 4739
4733 4740
4734 #undef __ 4741 #undef __
4735 4742
4736 } } // namespace v8::internal 4743 } } // namespace v8::internal
4737 4744
4738 #endif // V8_TARGET_ARCH_X87 4745 #endif // V8_TARGET_ARCH_X87
OLDNEW
« no previous file with comments | « src/ic/x87/handler-compiler-x87.cc ('k') | src/x87/interface-descriptors-x87.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698