Index: src/ia32/lithium-ia32.h |
diff --git a/src/ia32/lithium-ia32.h b/src/ia32/lithium-ia32.h |
index a9b444245431059009c00bc6b45cece863672937..44210b0963c5a1a5e56106dbad3cdd95b891d6a2 100644 |
--- a/src/ia32/lithium-ia32.h |
+++ b/src/ia32/lithium-ia32.h |
@@ -52,11 +52,9 @@ class LCodeGen; |
V(BitI) \ |
V(BoundsCheck) \ |
V(Branch) \ |
- V(CallConstantFunction) \ |
+ V(CallJSFunction) \ |
+ V(CallWithDescriptor) \ |
V(CallFunction) \ |
- V(CallKeyed) \ |
- V(CallKnownGlobal) \ |
- V(CallNamed) \ |
V(CallNew) \ |
V(CallNewArray) \ |
V(CallRuntime) \ |
@@ -307,10 +305,8 @@ class LInstruction : public ZoneObject { |
// R = number of result operands (0 or 1). |
-// I = number of input operands. |
-// T = number of temporary operands. |
-template<int R, int I, int T> |
-class LTemplateInstruction : public LInstruction { |
+template<int R> |
+class LTemplateResultInstruction : public LInstruction { |
public: |
// Allow 0 or 1 output operands. |
STATIC_ASSERT(R == 0 || R == 1); |
@@ -322,6 +318,15 @@ class LTemplateInstruction : public LInstruction { |
protected: |
EmbeddedContainer<LOperand*, R> results_; |
+}; |
+ |
+ |
+// R = number of result operands (0 or 1). |
+// I = number of input operands. |
+// T = number of temporary operands. |
+template<int R, int I, int T> |
+class LTemplateInstruction : public LTemplateResultInstruction<R> { |
+ protected: |
EmbeddedContainer<LOperand*, I> inputs_; |
EmbeddedContainer<LOperand*, T> temps_; |
@@ -1836,70 +1841,77 @@ class LGlobalReceiver V8_FINAL : public LTemplateInstruction<1, 1, 0> { |
}; |
-class LCallConstantFunction V8_FINAL : public LTemplateInstruction<1, 0, 0> { |
+class LCallJSFunction V8_FINAL : public LTemplateInstruction<1, 1, 0> { |
public: |
- DECLARE_CONCRETE_INSTRUCTION(CallConstantFunction, "call-constant-function") |
- DECLARE_HYDROGEN_ACCESSOR(CallConstantFunction) |
+ explicit LCallJSFunction(LOperand* function) { |
+ inputs_[0] = function; |
+ } |
+ |
+ LOperand* function() { return inputs_[0]; } |
+ |
+ DECLARE_CONCRETE_INSTRUCTION(CallJSFunction, "call-js-function") |
+ DECLARE_HYDROGEN_ACCESSOR(CallJSFunction) |
virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; |
- Handle<JSFunction> function() { return hydrogen()->function(); } |
int arity() const { return hydrogen()->argument_count() - 1; } |
}; |
-class LInvokeFunction V8_FINAL : public LTemplateInstruction<1, 2, 0> { |
+class LCallWithDescriptor V8_FINAL : public LTemplateResultInstruction<1> { |
public: |
- LInvokeFunction(LOperand* context, LOperand* function) { |
- inputs_[0] = context; |
- inputs_[1] = function; |
+ LCallWithDescriptor(const CallInterfaceDescriptor* descriptor, |
+ ZoneList<LOperand*>& operands, |
+ Zone* zone) |
+ : descriptor_(descriptor), |
+ inputs_(descriptor->environment_length() + 1, zone) { |
+ ASSERT(descriptor->environment_length() + 1 == operands.length()); |
+ inputs_.AddAll(operands, zone); |
} |
- LOperand* context() { return inputs_[0]; } |
- LOperand* function() { return inputs_[1]; } |
+ LOperand* target() const { return inputs_[0]; } |
- DECLARE_CONCRETE_INSTRUCTION(InvokeFunction, "invoke-function") |
- DECLARE_HYDROGEN_ACCESSOR(InvokeFunction) |
+ |
+ private: |
+ DECLARE_CONCRETE_INSTRUCTION(CallWithDescriptor, "call-with-descriptor") |
+ DECLARE_HYDROGEN_ACCESSOR(CallWithDescriptor) |
virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; |
int arity() const { return hydrogen()->argument_count() - 1; } |
-}; |
+ const CallInterfaceDescriptor* descriptor_; |
+ ZoneList<LOperand*> inputs_; |
-class LCallKeyed V8_FINAL : public LTemplateInstruction<1, 2, 0> { |
- public: |
- LCallKeyed(LOperand* context, LOperand* key) { |
- inputs_[0] = context; |
- inputs_[1] = key; |
+ virtual void InternalSetOperandAt(int index, |
+ LOperand* value) V8_FINAL V8_OVERRIDE { |
+ inputs_[index] = value; |
} |
- LOperand* context() { return inputs_[0]; } |
- LOperand* key() { return inputs_[1]; } |
- |
- DECLARE_CONCRETE_INSTRUCTION(CallKeyed, "call-keyed") |
- DECLARE_HYDROGEN_ACCESSOR(CallKeyed) |
- |
- virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; |
+ // Iterator support. |
+ virtual int InputCount() V8_FINAL V8_OVERRIDE { return inputs_.length(); } |
+ virtual LOperand* InputAt(int i) V8_FINAL V8_OVERRIDE { return inputs_[i]; } |
- int arity() const { return hydrogen()->argument_count() - 1; } |
+ virtual int TempCount() V8_FINAL V8_OVERRIDE { return 0; } |
+ virtual LOperand* TempAt(int i) V8_FINAL V8_OVERRIDE { return NULL; } |
}; |
-class LCallNamed V8_FINAL : public LTemplateInstruction<1, 1, 0> { |
+class LInvokeFunction V8_FINAL : public LTemplateInstruction<1, 2, 0> { |
public: |
- explicit LCallNamed(LOperand* context) { |
+ LInvokeFunction(LOperand* context, LOperand* function) { |
inputs_[0] = context; |
+ inputs_[1] = function; |
} |
LOperand* context() { return inputs_[0]; } |
+ LOperand* function() { return inputs_[1]; } |
- DECLARE_CONCRETE_INSTRUCTION(CallNamed, "call-named") |
- DECLARE_HYDROGEN_ACCESSOR(CallNamed) |
+ DECLARE_CONCRETE_INSTRUCTION(InvokeFunction, "invoke-function") |
+ DECLARE_HYDROGEN_ACCESSOR(InvokeFunction) |
virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; |
- Handle<String> name() const { return hydrogen()->name(); } |
int arity() const { return hydrogen()->argument_count() - 1; } |
}; |
@@ -1921,17 +1933,6 @@ class LCallFunction V8_FINAL : public LTemplateInstruction<1, 2, 0> { |
}; |
-class LCallKnownGlobal V8_FINAL : public LTemplateInstruction<1, 0, 0> { |
- public: |
- DECLARE_CONCRETE_INSTRUCTION(CallKnownGlobal, "call-known-global") |
- DECLARE_HYDROGEN_ACCESSOR(CallKnownGlobal) |
- |
- virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; |
- |
- int arity() const { return hydrogen()->argument_count() - 1; } |
-}; |
- |
- |
class LCallNew V8_FINAL : public LTemplateInstruction<1, 2, 0> { |
public: |
LCallNew(LOperand* context, LOperand* constructor) { |
@@ -2802,24 +2803,17 @@ class LChunkBuilder V8_FINAL : public LChunkBuilderBase { |
// Methods for setting up define-use relationships. |
// Return the same instruction that they are passed. |
- template<int I, int T> |
- LInstruction* Define(LTemplateInstruction<1, I, T>* instr, |
- LUnallocated* result); |
- template<int I, int T> |
- LInstruction* DefineAsRegister(LTemplateInstruction<1, I, T>* instr); |
- template<int I, int T> |
- LInstruction* DefineAsSpilled(LTemplateInstruction<1, I, T>* instr, |
- int index); |
- template<int I, int T> |
- LInstruction* DefineSameAsFirst(LTemplateInstruction<1, I, T>* instr); |
- template<int I, int T> |
- LInstruction* DefineFixed(LTemplateInstruction<1, I, T>* instr, |
- Register reg); |
- template<int I, int T> |
- LInstruction* DefineFixedDouble(LTemplateInstruction<1, I, T>* instr, |
- XMMRegister reg); |
- template<int I, int T> |
- LInstruction* DefineX87TOS(LTemplateInstruction<1, I, T>* instr); |
+ LInstruction* Define(LTemplateResultInstruction<1>* instr, |
+ LUnallocated* result); |
+ LInstruction* DefineAsRegister(LTemplateResultInstruction<1>* instr); |
+ LInstruction* DefineAsSpilled(LTemplateResultInstruction<1>* instr, |
+ int index); |
+ LInstruction* DefineSameAsFirst(LTemplateResultInstruction<1>* instr); |
+ LInstruction* DefineFixed(LTemplateResultInstruction<1>* instr, |
+ Register reg); |
+ LInstruction* DefineFixedDouble(LTemplateResultInstruction<1>* instr, |
+ XMMRegister reg); |
+ LInstruction* DefineX87TOS(LTemplateResultInstruction<1>* instr); |
// Assigns an environment to an instruction. An instruction which can |
// deoptimize must have an environment. |
LInstruction* AssignEnvironment(LInstruction* instr); |