X87: fix performance regression on intel call api stubs
authorchunyang.dai <chunyang.dai@intel.com>
Sat, 7 Feb 2015 08:43:40 +0000 (00:43 -0800)
committerCommit bot <commit-bot@chromium.org>
Sat, 7 Feb 2015 08:43:57 +0000 (08:43 +0000)
port b18ad510798d3a5e75f6b68656d8f8826571e782 (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}

src/ic/x87/handler-compiler-x87.cc
src/x87/code-stubs-x87.cc
src/x87/interface-descriptors-x87.cc

index 1718c19..105e49a 100644 (file)
@@ -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;
index 28baf49..c2bf5e9 100644 (file)
@@ -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);
 }
 
index 9ab630f..45a1279 100644 (file)
@@ -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