Index: src/x64/lithium-x64.h |
diff --git a/src/x64/lithium-x64.h b/src/x64/lithium-x64.h |
index eea11f48d1a0c54ee6b034b9216221d588100d6f..70c86fd82d33533ce487be351e61597f155fc798 100644 |
--- a/src/x64/lithium-x64.h |
+++ b/src/x64/lithium-x64.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) \ |
@@ -299,10 +297,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); |
@@ -314,6 +310,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_; |
@@ -1781,70 +1786,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; |
+ } |
- virtual void PrintDataTo(StringStream* stream); |
+ 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; |
} |
- DECLARE_CONCRETE_INSTRUCTION(CallKeyed, "call-keyed") |
- DECLARE_HYDROGEN_ACCESSOR(CallKeyed) |
- |
- LOperand* context() { return inputs_[0]; } |
- LOperand* key() { return inputs_[1]; } |
- |
- 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; } |
}; |
@@ -1865,17 +1877,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) { |
@@ -2718,22 +2719,16 @@ 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); |
+ 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); |
// Assigns an environment to an instruction. An instruction which can |
// deoptimize must have an environment. |
LInstruction* AssignEnvironment(LInstruction* instr); |