add stub for api function calls with known number of parameters
authordcarney <dcarney@chromium.org>
Mon, 19 Jan 2015 14:17:23 +0000 (06:17 -0800)
committerCommit bot <commit-bot@chromium.org>
Mon, 19 Jan 2015 14:17:33 +0000 (14:17 +0000)
BUG=449930
LOG=N

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

Cr-Commit-Position: refs/heads/master@{#26137}

src/arm/code-stubs-arm.cc
src/arm64/code-stubs-arm64.cc
src/code-stubs.h
src/hydrogen.cc
src/ia32/code-stubs-ia32.cc
src/mips/code-stubs-mips.cc
src/mips64/code-stubs-mips64.cc
src/x64/code-stubs-x64.cc

index a6af8f3..c923d48 100644 (file)
@@ -4748,7 +4748,7 @@ void CallApiFunctionStub::Generate(MacroAssembler* masm) {
 
 void CallApiAccessorStub::Generate(MacroAssembler* masm) {
   bool is_store = this->is_store();
-  int argc = is_store ? 1 : 0;
+  int argc = this->argc();
   bool call_data_undefined = this->call_data_undefined();
   CallApiFunctionStubHelper(masm, ParameterCount(argc), is_store,
                             call_data_undefined);
index fa450d7..86ad0cf 100644 (file)
@@ -5175,7 +5175,7 @@ void CallApiFunctionStub::Generate(MacroAssembler* masm) {
 
 void CallApiAccessorStub::Generate(MacroAssembler* masm) {
   bool is_store = this->is_store();
-  int argc = is_store ? 1 : 0;
+  int argc = this->argc();
   bool call_data_undefined = this->call_data_undefined();
   CallApiFunctionStubHelper(masm, ParameterCount(argc), is_store,
                             call_data_undefined);
index 4fa440b..03075d9 100644 (file)
@@ -1153,7 +1153,18 @@ class CallApiAccessorStub : public PlatformCodeStub {
   CallApiAccessorStub(Isolate* isolate, bool is_store, bool call_data_undefined)
       : PlatformCodeStub(isolate) {
     minor_key_ = IsStoreBits::encode(is_store) |
-                 CallDataUndefinedBits::encode(call_data_undefined);
+                 CallDataUndefinedBits::encode(call_data_undefined) |
+                 ArgumentBits::encode(is_store ? 1 : 0);
+  }
+
+ protected:
+  // For CallApiFunctionWithFixedArgsStub, see below.
+  static const int kArgBits = 3;
+  CallApiAccessorStub(Isolate* isolate, int argc, bool call_data_undefined)
+      : PlatformCodeStub(isolate) {
+    minor_key_ = IsStoreBits::encode(false) |
+                 CallDataUndefinedBits::encode(call_data_undefined) |
+                 ArgumentBits::encode(argc);
   }
 
  private:
@@ -1161,15 +1172,35 @@ class CallApiAccessorStub : public PlatformCodeStub {
   bool call_data_undefined() const {
     return CallDataUndefinedBits::decode(minor_key_);
   }
+  int argc() const { return ArgumentBits::decode(minor_key_); }
 
   class IsStoreBits: public BitField<bool, 0, 1> {};
   class CallDataUndefinedBits: public BitField<bool, 1, 1> {};
+  class ArgumentBits : public BitField<int, 2, kArgBits> {};
 
   DEFINE_CALL_INTERFACE_DESCRIPTOR(ApiAccessor);
   DEFINE_PLATFORM_CODE_STUB(CallApiAccessor, PlatformCodeStub);
 };
 
 
+// TODO(dcarney): see if it's possible to remove this later without performance
+// degradation.
+// This is not a real stub, but a way of generating the CallApiAccessorStub
+// (which has the same abi) which makes it clear that it is not an accessor.
+class CallApiFunctionWithFixedArgsStub : public CallApiAccessorStub {
+ public:
+  static const int kMaxFixedArgs = (1 << kArgBits) - 1;
+  CallApiFunctionWithFixedArgsStub(Isolate* isolate, int argc,
+                                   bool call_data_undefined)
+      : CallApiAccessorStub(isolate, argc, call_data_undefined) {
+    DCHECK(0 <= argc && argc <= kMaxFixedArgs);
+  }
+};
+
+
+typedef ApiAccessorDescriptor ApiFunctionWithFixedArgsDescriptor;
+
+
 class CallApiGetterStub : public PlatformCodeStub {
  public:
   explicit CallApiGetterStub(Isolate* isolate) : PlatformCodeStub(isolate) {}
index a288dbd..cfdb3c8 100644 (file)
@@ -8776,6 +8776,16 @@ bool HOptimizedGraphBuilder::TryInlineApiCall(Handle<JSFunction> function,
     call = New<HCallWithDescriptor>(
         code_value, argc + 1, descriptor,
         Vector<HValue*>(op_vals, descriptor.GetEnvironmentLength()));
+  } else if (argc <= CallApiFunctionWithFixedArgsStub::kMaxFixedArgs) {
+    CallApiFunctionWithFixedArgsStub stub(isolate(), argc, call_data_undefined);
+    Handle<Code> code = stub.GetCode();
+    HConstant* code_value = Add<HConstant>(code);
+    ApiFunctionWithFixedArgsDescriptor descriptor(isolate());
+    DCHECK(arraysize(op_vals) - 1 == descriptor.GetEnvironmentLength());
+    call = New<HCallWithDescriptor>(
+        code_value, argc + 1, descriptor,
+        Vector<HValue*>(op_vals, descriptor.GetEnvironmentLength()));
+    Drop(1);  // Drop function.
   } else {
     op_vals[arraysize(op_vals) - 1] = Add<HConstant>(argc);
     CallApiFunctionStub stub(isolate(), call_data_undefined);
index bd91cd6..d977d39 100644 (file)
@@ -4829,7 +4829,7 @@ void CallApiFunctionStub::Generate(MacroAssembler* masm) {
 
 void CallApiAccessorStub::Generate(MacroAssembler* masm) {
   bool is_store = this->is_store();
-  int argc = is_store ? 1 : 0;
+  int argc = this->argc();
   bool call_data_undefined = this->call_data_undefined();
   CallApiFunctionStubHelper(masm, ParameterCount(argc), is_store,
                             call_data_undefined);
index 894747f..29475eb 100644 (file)
@@ -4962,7 +4962,7 @@ void CallApiFunctionStub::Generate(MacroAssembler* masm) {
 
 void CallApiAccessorStub::Generate(MacroAssembler* masm) {
   bool is_store = this->is_store();
-  int argc = is_store ? 1 : 0;
+  int argc = this->argc();
   bool call_data_undefined = this->call_data_undefined();
   CallApiFunctionStubHelper(masm, ParameterCount(argc), is_store,
                             call_data_undefined);
index 944ed3c..713dd14 100644 (file)
@@ -5001,7 +5001,7 @@ void CallApiFunctionStub::Generate(MacroAssembler* masm) {
 
 void CallApiAccessorStub::Generate(MacroAssembler* masm) {
   bool is_store = this->is_store();
-  int argc = is_store ? 1 : 0;
+  int argc = this->argc();
   bool call_data_undefined = this->call_data_undefined();
   CallApiFunctionStubHelper(masm, ParameterCount(argc), is_store,
                             call_data_undefined);
index 1149348..56b4075 100644 (file)
@@ -4772,7 +4772,7 @@ void CallApiFunctionStub::Generate(MacroAssembler* masm) {
 
 void CallApiAccessorStub::Generate(MacroAssembler* masm) {
   bool is_store = this->is_store();
-  int argc = is_store ? 1 : 0;
+  int argc = this->argc();
   bool call_data_undefined = this->call_data_undefined();
   CallApiFunctionStubHelper(masm, ParameterCount(argc), is_store,
                             call_data_undefined);