Commit db379e19 authored by chunyang.dai's avatar chunyang.dai Committed by Commit bot

X87: fix performance regression on intel call api stubs

port b18ad510 (r26291)

original commit message:

  additionally, make the interface match the JSFunction interface

BUG=

Review URL: https://codereview.chromium.org/906743002

Cr-Commit-Position: refs/heads/master@{#26503}
parent 27361ec6
......@@ -163,7 +163,7 @@ void PropertyHandlerCompiler::GenerateApiAccessorCall(
DCHECK(optimization.is_simple_api_call());
// Abi for CallApiFunctionStub.
Register callee = eax;
Register callee = edi;
Register data = ebx;
Register holder = ecx;
Register api_function_address = edx;
......
......@@ -4543,12 +4543,12 @@ static void CallApiFunctionStubHelper(MacroAssembler* masm,
bool return_first_arg,
bool call_data_undefined) {
// ----------- S t a t e -------------
// -- eax : callee
// -- edi : callee
// -- ebx : call_data
// -- ecx : holder
// -- edx : api_function_address
// -- esi : context
// -- edi : number of arguments if argc is a register
// -- eax : number of arguments if argc is a register
// --
// -- esp[0] : return address
// -- esp[4] : last argument
......@@ -4557,11 +4557,12 @@ static void CallApiFunctionStubHelper(MacroAssembler* masm,
// -- esp[(argc + 1) * 4] : receiver
// -----------------------------------
Register callee = eax;
Register callee = edi;
Register call_data = ebx;
Register holder = ecx;
Register api_function_address = edx;
Register context = esi;
Register return_address = eax;
typedef FunctionCallbackArguments FCA;
......@@ -4574,10 +4575,17 @@ static void CallApiFunctionStubHelper(MacroAssembler* masm,
STATIC_ASSERT(FCA::kHolderIndex == 0);
STATIC_ASSERT(FCA::kArgsLength == 7);
DCHECK(argc.is_immediate() || edi.is(argc.reg()));
DCHECK(argc.is_immediate() || eax.is(argc.reg()));
// pop return address and save context
__ xchg(context, Operand(esp, 0));
if (argc.is_immediate()) {
__ pop(return_address);
// context save.
__ push(context);
} else {
// pop return address and save context
__ xchg(context, Operand(esp, 0));
return_address = context;
}
// callee
__ push(callee);
......@@ -4605,7 +4613,7 @@ static void CallApiFunctionStubHelper(MacroAssembler* masm,
__ mov(scratch, esp);
// push return address
__ push(context);
__ push(return_address);
// load context from callee
__ mov(context, FieldOperand(callee, JSFunction::kContextOffset));
......@@ -4678,9 +4686,8 @@ static void CallApiFunctionStubHelper(MacroAssembler* masm,
void CallApiFunctionStub::Generate(MacroAssembler* masm) {
// TODO(dcarney): make eax contain the function address.
bool call_data_undefined = this->call_data_undefined();
CallApiFunctionStubHelper(masm, ParameterCount(edi), false,
CallApiFunctionStubHelper(masm, ParameterCount(eax), false,
call_data_undefined);
}
......
......@@ -306,11 +306,11 @@ void ArgumentAdaptorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
void ApiFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {
esi, // context
eax, // callee
edi, // callee
ebx, // call_data
ecx, // holder
edx, // api_function_address
edi, // actual number of arguments
eax, // actual number of arguments
};
Representation representations[] = {
Representation::Tagged(), // context
......@@ -327,7 +327,7 @@ void ApiFunctionDescriptor::Initialize(CallInterfaceDescriptorData* data) {
void ApiAccessorDescriptor::Initialize(CallInterfaceDescriptorData* data) {
Register registers[] = {
esi, // context
eax, // callee
edi, // callee
ebx, // call_data
ecx, // holder
edx, // api_function_address
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment