Index: src/arm/lithium-arm.h |
=================================================================== |
--- src/arm/lithium-arm.h (revision 6433) |
+++ src/arm/lithium-arm.h (working copy) |
@@ -43,10 +43,22 @@ |
// Type hierarchy: |
// |
// LInstruction |
-// LAccessArgumentsAt |
-// LArgumentsElements |
-// LArgumentsLength |
-// LBinaryOperation |
+// LTemplateInstruction |
+// LControlInstruction |
+// LBranch |
+// LClassOfTestAndBranch |
+// LCmpJSObjectEqAndBranch |
+// LCmpIDAndBranch |
+// LHasCachedArrayIndexAndBranch |
+// LHasInstanceTypeAndBranch |
+// LInstanceOfAndBranch |
+// LIsNullAndBranch |
+// LIsObjectAndBranch |
+// LIsSmiAndBranch |
+// LTypeofIsAndBranch |
+// LAccessArgumentsAt |
+// LArgumentsElements |
+// LArgumentsLength |
// LAddI |
// LApplyArguments |
// LArithmeticD |
@@ -54,80 +66,73 @@ |
// LBitI |
// LBoundsCheck |
// LCmpID |
-// LCmpIDAndBranch |
// LCmpJSObjectEq |
-// LCmpJSObjectEqAndBranch |
// LCmpT |
// LDivI |
// LInstanceOf |
-// LInstanceOfAndBranch |
// LInstanceOfKnownGlobal |
// LLoadKeyedFastElement |
// LLoadKeyedGeneric |
// LModI |
// LMulI |
+// LPower |
// LShiftI |
-// LStringCharCodeAt |
// LSubI |
-// LCallConstantFunction |
-// LCallFunction |
-// LCallGlobal |
-// LCallKeyed |
-// LCallKnownGlobal |
-// LCallNamed |
-// LCallRuntime |
-// LCallStub |
-// LCheckPrototypeMaps |
-// LConstant |
-// LConstantD |
-// LConstantI |
-// LConstantT |
-// LDeoptimize |
-// LFunctionLiteral |
-// LGlobalObject |
-// LGlobalReceiver |
-// LLabel |
-// LLazyBailout |
-// LLoadContextSlot |
-// LLoadGlobal |
-// LMaterializedLiteral |
+// LCallConstantFunction |
+// LCallFunction |
+// LCallGlobal |
+// LCallKeyed |
+// LCallKnownGlobal |
+// LCallNamed |
+// LCallRuntime |
+// LCallStub |
+// LConstant |
+// LConstantD |
+// LConstantI |
+// LConstantT |
+// LDeoptimize |
+// LFunctionLiteral |
+// LGap |
+// LLabel |
+// LGlobalObject |
+// LGlobalReceiver |
+// LGoto |
+// LLazyBailout |
+// LLoadGlobal |
+// LCheckPrototypeMaps |
+// LLoadContextSlot |
// LArrayLiteral |
// LObjectLiteral |
// LRegExpLiteral |
-// LOsrEntry |
-// LParameter |
-// LStackCheck |
-// LStoreKeyed |
-// LStoreKeyedFastElement |
-// LStoreKeyedGeneric |
-// LStoreNamed |
-// LStoreNamedField |
-// LStoreNamedGeneric |
-// LUnaryOperation |
-// LJSArrayLength |
-// LFixedArrayLength |
+// LOsrEntry |
+// LParameter |
+// LRegExpConstructResult |
+// LStackCheck |
+// LStoreKeyed |
+// LStoreKeyedFastElement |
+// LStoreKeyedGeneric |
+// LStoreNamed |
+// LStoreNamedField |
+// LStoreNamedGeneric |
+// LStringCharCodeAt |
// LBitNotI |
-// LBranch |
// LCallNew |
// LCheckFunction |
+// LCheckPrototypeMaps |
// LCheckInstanceType |
// LCheckMap |
// LCheckSmi |
// LClassOfTest |
-// LClassOfTestAndBranch |
// LDeleteProperty |
// LDoubleToI |
+// LFixedArrayLength |
// LHasCachedArrayIndex |
-// LHasCachedArrayIndexAndBranch |
// LHasInstanceType |
-// LHasInstanceTypeAndBranch |
// LInteger32ToDouble |
// LIsNull |
-// LIsNullAndBranch |
// LIsObject |
-// LIsObjectAndBranch |
// LIsSmi |
-// LIsSmiAndBranch |
+// LJSArrayLength |
// LLoadNamedField |
// LLoadNamedGeneric |
// LLoadFunctionPrototype |
@@ -142,19 +147,16 @@ |
// LThrow |
// LTypeof |
// LTypeofIs |
-// LTypeofIsAndBranch |
// LUnaryMathOperation |
// LValueOf |
-// LUnknownOSRValue |
+// LUnknownOSRValue |
#define LITHIUM_ALL_INSTRUCTION_LIST(V) \ |
- V(BinaryOperation) \ |
+ V(ControlInstruction) \ |
V(Constant) \ |
V(Call) \ |
- V(MaterializedLiteral) \ |
V(StoreKeyed) \ |
V(StoreNamed) \ |
- V(UnaryOperation) \ |
LITHIUM_CONCRETE_INSTRUCTION_LIST(V) |
@@ -293,14 +295,17 @@ |
virtual void CompileToNative(LCodeGen* generator) = 0; |
virtual const char* Mnemonic() const = 0; |
- virtual void PrintTo(StringStream* stream) const; |
- virtual void PrintDataTo(StringStream* stream) const { } |
+ virtual void PrintTo(StringStream* stream); |
+ virtual void PrintDataTo(StringStream* stream) = 0; |
+ virtual void PrintOutputOperandTo(StringStream* stream) = 0; |
// Declare virtual type testers. |
#define DECLARE_DO(type) virtual bool Is##type() const { return false; } |
LITHIUM_ALL_INSTRUCTION_LIST(DECLARE_DO) |
#undef DECLARE_DO |
+ |
virtual bool IsControl() const { return false; } |
+ virtual void SetBranchTargets(int true_block_id, int false_block_id) { } |
void set_environment(LEnvironment* env) { environment_.set(env); } |
LEnvironment* environment() const { return environment_.get(); } |
@@ -310,9 +315,7 @@ |
LPointerMap* pointer_map() const { return pointer_map_.get(); } |
bool HasPointerMap() const { return pointer_map_.is_set(); } |
- void set_result(LOperand* operand) { result_.set(operand); } |
- LOperand* result() const { return result_.get(); } |
- bool HasResult() const { return result_.is_set(); } |
+ virtual bool HasResult() const = 0; |
void set_hydrogen_value(HValue* value) { hydrogen_value_ = value; } |
HValue* hydrogen_value() const { return hydrogen_value_; } |
@@ -330,14 +333,67 @@ |
private: |
SetOncePointer<LEnvironment> environment_; |
SetOncePointer<LPointerMap> pointer_map_; |
- SetOncePointer<LOperand> result_; |
HValue* hydrogen_value_; |
SetOncePointer<LEnvironment> deoptimization_environment_; |
}; |
-class LGap: public LInstruction { |
+template<typename ElementType, int NumElements> |
+class OperandContainer { |
public: |
+ OperandContainer() { |
+ for (int i = 0; i < NumElements; i++) elems_[i] = NULL; |
+ } |
+ int length() { return NumElements; } |
+ ElementType& operator[](int i) { |
+ ASSERT(i < length()); |
+ return elems_[i]; |
+ } |
+ void PrintOperandsTo(StringStream* stream); |
+ |
+ private: |
+ ElementType elems_[NumElements]; |
+}; |
+ |
+ |
+template<typename ElementType> |
+class OperandContainer<ElementType, 0> { |
+ public: |
+ int length() { return 0; } |
+ void PrintOperandsTo(StringStream* stream) { } |
+}; |
+ |
+ |
+// 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 { |
+ public: |
+ // Allow 0 or 1 output operands. |
+ STATIC_ASSERT(R == 0 || R == 1); |
+ virtual bool HasResult() const { return R != 0; } |
+ void set_result(LOperand* operand) { results_[0] = operand; } |
+ LOperand* result() { return results_[0]; } |
+ |
+ int InputCount() { return I; } |
+ LOperand* InputAt(int i) { return inputs_[i]; } |
+ |
+ int TempCount() { return T; } |
+ LOperand* TempAt(int i) { return temps_[i]; } |
+ |
+ virtual void PrintDataTo(StringStream* stream); |
+ virtual void PrintOutputOperandTo(StringStream* stream); |
+ |
+ protected: |
+ OperandContainer<LOperand*, R> results_; |
+ OperandContainer<LOperand*, I> inputs_; |
+ OperandContainer<LOperand*, T> temps_; |
+}; |
+ |
+ |
+class LGap: public LTemplateInstruction<0, 0, 0> { |
+ public: |
explicit LGap(HBasicBlock* block) |
: block_(block) { |
parallel_moves_[BEFORE] = NULL; |
@@ -377,13 +433,13 @@ |
}; |
-class LGoto: public LInstruction { |
+class LGoto: public LTemplateInstruction<0, 0, 0> { |
public: |
LGoto(int block_id, bool include_stack_check = false) |
: block_id_(block_id), include_stack_check_(include_stack_check) { } |
DECLARE_CONCRETE_INSTRUCTION(Goto, "goto") |
- virtual void PrintDataTo(StringStream* stream) const; |
+ virtual void PrintDataTo(StringStream* stream); |
virtual bool IsControl() const { return true; } |
int block_id() const { return block_id_; } |
@@ -395,7 +451,7 @@ |
}; |
-class LLazyBailout: public LInstruction { |
+class LLazyBailout: public LTemplateInstruction<0, 0, 0> { |
public: |
LLazyBailout() : gap_instructions_size_(0) { } |
@@ -411,7 +467,7 @@ |
}; |
-class LDeoptimize: public LInstruction { |
+class LDeoptimize: public LTemplateInstruction<0, 0, 0> { |
public: |
DECLARE_CONCRETE_INSTRUCTION(Deoptimize, "deoptimize") |
}; |
@@ -424,7 +480,7 @@ |
DECLARE_CONCRETE_INSTRUCTION(Label, "label") |
- virtual void PrintDataTo(StringStream* stream) const; |
+ virtual void PrintDataTo(StringStream* stream); |
int block_id() const { return block()->block_id(); } |
bool is_loop_header() const { return block()->IsLoopHeader(); } |
@@ -439,13 +495,13 @@ |
}; |
-class LParameter: public LInstruction { |
+class LParameter: public LTemplateInstruction<1, 0, 0> { |
public: |
DECLARE_CONCRETE_INSTRUCTION(Parameter, "parameter") |
}; |
-class LCallStub: public LInstruction { |
+class LCallStub: public LTemplateInstruction<1, 0, 0> { |
public: |
DECLARE_CONCRETE_INSTRUCTION(CallStub, "call-stub") |
DECLARE_HYDROGEN_ACCESSOR(CallStub) |
@@ -456,96 +512,81 @@ |
}; |
-class LUnknownOSRValue: public LInstruction { |
+class LUnknownOSRValue: public LTemplateInstruction<1, 0, 0> { |
public: |
DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue, "unknown-osr-value") |
}; |
-class LUnaryOperation: public LInstruction { |
+template<int I, int T> |
+class LControlInstruction: public LTemplateInstruction<0, I, T> { |
public: |
- explicit LUnaryOperation(LOperand* input) : input_(input) { } |
+ DECLARE_INSTRUCTION(ControlInstruction) |
+ virtual bool IsControl() const { return true; } |
- DECLARE_INSTRUCTION(UnaryOperation) |
+ int true_block_id() const { return true_block_id_; } |
+ int false_block_id() const { return false_block_id_; } |
+ void SetBranchTargets(int true_block_id, int false_block_id) { |
+ true_block_id_ = true_block_id; |
+ false_block_id_ = false_block_id; |
+ } |
- LOperand* input() const { return input_; } |
- |
- virtual void PrintDataTo(StringStream* stream) const; |
- |
private: |
- LOperand* input_; |
+ int true_block_id_; |
+ int false_block_id_; |
}; |
-class LBinaryOperation: public LInstruction { |
+class LApplyArguments: public LTemplateInstruction<1, 4, 0> { |
public: |
- LBinaryOperation(LOperand* left, LOperand* right) |
- : left_(left), right_(right) { } |
- |
- DECLARE_INSTRUCTION(BinaryOperation) |
- |
- LOperand* left() const { return left_; } |
- LOperand* right() const { return right_; } |
- virtual void PrintDataTo(StringStream* stream) const; |
- |
- private: |
- LOperand* left_; |
- LOperand* right_; |
-}; |
- |
- |
-class LApplyArguments: public LBinaryOperation { |
- public: |
LApplyArguments(LOperand* function, |
LOperand* receiver, |
LOperand* length, |
- LOperand* elements) |
- : LBinaryOperation(function, receiver), |
- length_(length), |
- elements_(elements) { } |
+ LOperand* elements) { |
+ inputs_[0] = function; |
+ inputs_[1] = receiver; |
+ inputs_[2] = length; |
+ inputs_[3] = elements; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(ApplyArguments, "apply-arguments") |
- LOperand* function() const { return left(); } |
- LOperand* receiver() const { return right(); } |
- LOperand* length() const { return length_; } |
- LOperand* elements() const { return elements_; } |
- |
- private: |
- LOperand* length_; |
- LOperand* elements_; |
+ LOperand* function() { return inputs_[0]; } |
+ LOperand* receiver() { return inputs_[1]; } |
+ LOperand* length() { return inputs_[2]; } |
+ LOperand* elements() { return inputs_[3]; } |
}; |
-class LAccessArgumentsAt: public LInstruction { |
+class LAccessArgumentsAt: public LTemplateInstruction<1, 3, 0> { |
public: |
- LAccessArgumentsAt(LOperand* arguments, LOperand* length, LOperand* index) |
- : arguments_(arguments), length_(length), index_(index) { } |
+ LAccessArgumentsAt(LOperand* arguments, LOperand* length, LOperand* index) { |
+ inputs_[0] = arguments; |
+ inputs_[1] = length; |
+ inputs_[2] = index; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt, "access-arguments-at") |
- LOperand* arguments() const { return arguments_; } |
- LOperand* length() const { return length_; } |
- LOperand* index() const { return index_; } |
+ LOperand* arguments() { return inputs_[0]; } |
+ LOperand* length() { return inputs_[1]; } |
+ LOperand* index() { return inputs_[2]; } |
- virtual void PrintDataTo(StringStream* stream) const; |
- |
- private: |
- LOperand* arguments_; |
- LOperand* length_; |
- LOperand* index_; |
+ virtual void PrintDataTo(StringStream* stream); |
}; |
-class LArgumentsLength: public LUnaryOperation { |
+class LArgumentsLength: public LTemplateInstruction<1, 1, 0> { |
public: |
- explicit LArgumentsLength(LOperand* elements) : LUnaryOperation(elements) {} |
+ explicit LArgumentsLength(LOperand* elements) { |
+ inputs_[0] = elements; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength, "arguments-length") |
}; |
-class LArgumentsElements: public LInstruction { |
+class LArgumentsElements: public LTemplateInstruction<1, 0, 0> { |
public: |
LArgumentsElements() { } |
@@ -553,341 +594,274 @@ |
}; |
-class LModI: public LBinaryOperation { |
+class LModI: public LTemplateInstruction<1, 2, 0> { |
public: |
- LModI(LOperand* left, LOperand* right) : LBinaryOperation(left, right) { } |
+ LModI(LOperand* left, LOperand* right) { |
+ inputs_[0] = left; |
+ inputs_[1] = right; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(ModI, "mod-i") |
DECLARE_HYDROGEN_ACCESSOR(Mod) |
}; |
-class LDivI: public LBinaryOperation { |
+class LDivI: public LTemplateInstruction<1, 2, 0> { |
public: |
- LDivI(LOperand* left, LOperand* right) |
- : LBinaryOperation(left, right) { } |
+ LDivI(LOperand* left, LOperand* right) { |
+ inputs_[0] = left; |
+ inputs_[1] = right; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(DivI, "div-i") |
DECLARE_HYDROGEN_ACCESSOR(Div) |
}; |
-class LMulI: public LBinaryOperation { |
+class LMulI: public LTemplateInstruction<1, 2, 1> { |
public: |
- LMulI(LOperand* left, LOperand* right, LOperand* temp) |
- : LBinaryOperation(left, right), temp_(temp) { } |
+ LMulI(LOperand* left, LOperand* right, LOperand* temp) { |
+ inputs_[0] = left; |
+ inputs_[1] = right; |
+ temps_[0] = temp; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(MulI, "mul-i") |
DECLARE_HYDROGEN_ACCESSOR(Mul) |
- |
- LOperand* temp() const { return temp_; } |
- |
- private: |
- LOperand* temp_; |
}; |
-class LCmpID: public LBinaryOperation { |
+class LCmpID: public LTemplateInstruction<1, 2, 0> { |
public: |
- LCmpID(LOperand* left, LOperand* right) |
- : LBinaryOperation(left, right) { } |
+ LCmpID(LOperand* left, LOperand* right) { |
+ inputs_[0] = left; |
+ inputs_[1] = right; |
+ } |
+ DECLARE_CONCRETE_INSTRUCTION(CmpID, "cmp-id") |
+ DECLARE_HYDROGEN_ACCESSOR(Compare) |
+ |
Token::Value op() const { return hydrogen()->token(); } |
bool is_double() const { |
return hydrogen()->GetInputRepresentation().IsDouble(); |
} |
- |
- DECLARE_CONCRETE_INSTRUCTION(CmpID, "cmp-id") |
- DECLARE_HYDROGEN_ACCESSOR(Compare) |
}; |
-class LCmpIDAndBranch: public LCmpID { |
+class LCmpIDAndBranch: public LControlInstruction<2, 0> { |
public: |
- LCmpIDAndBranch(LOperand* left, |
- LOperand* right, |
- int true_block_id, |
- int false_block_id) |
- : LCmpID(left, right), |
- true_block_id_(true_block_id), |
- false_block_id_(false_block_id) { } |
+ LCmpIDAndBranch(LOperand* left, LOperand* right) { |
+ inputs_[0] = left; |
+ inputs_[1] = right; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(CmpIDAndBranch, "cmp-id-and-branch") |
- virtual void PrintDataTo(StringStream* stream) const; |
- virtual bool IsControl() const { return true; } |
+ DECLARE_HYDROGEN_ACCESSOR(Compare) |
- int true_block_id() const { return true_block_id_; } |
- int false_block_id() const { return false_block_id_; } |
+ Token::Value op() const { return hydrogen()->token(); } |
+ bool is_double() const { |
+ return hydrogen()->GetInputRepresentation().IsDouble(); |
+ } |
- private: |
- int true_block_id_; |
- int false_block_id_; |
+ virtual void PrintDataTo(StringStream* stream); |
}; |
-class LUnaryMathOperation: public LUnaryOperation { |
+class LUnaryMathOperation: public LTemplateInstruction<1, 1, 1> { |
public: |
- explicit LUnaryMathOperation(LOperand* value, LOperand* temp) |
- : LUnaryOperation(value), temp_(temp) { } |
+ LUnaryMathOperation(LOperand* value, LOperand* temp) { |
+ inputs_[0] = value; |
+ temps_[0] = temp; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation, "unary-math-operation") |
DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation) |
- virtual void PrintDataTo(StringStream* stream) const; |
+ virtual void PrintDataTo(StringStream* stream); |
BuiltinFunctionId op() const { return hydrogen()->op(); } |
- LOperand* temp() const { return temp_; } |
- |
- private: |
- LOperand* temp_; |
}; |
-class LCmpJSObjectEq: public LBinaryOperation { |
+class LCmpJSObjectEq: public LTemplateInstruction<1, 2, 0> { |
public: |
- LCmpJSObjectEq(LOperand* left, LOperand* right) |
- : LBinaryOperation(left, right) {} |
+ LCmpJSObjectEq(LOperand* left, LOperand* right) { |
+ inputs_[0] = left; |
+ inputs_[1] = right; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(CmpJSObjectEq, "cmp-jsobject-eq") |
}; |
-class LCmpJSObjectEqAndBranch: public LCmpJSObjectEq { |
+class LCmpJSObjectEqAndBranch: public LControlInstruction<2, 0> { |
public: |
- LCmpJSObjectEqAndBranch(LOperand* left, |
- LOperand* right, |
- int true_block_id, |
- int false_block_id) |
- : LCmpJSObjectEq(left, right), |
- true_block_id_(true_block_id), |
- false_block_id_(false_block_id) { } |
+ LCmpJSObjectEqAndBranch(LOperand* left, LOperand* right) { |
+ inputs_[0] = left; |
+ inputs_[1] = right; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(CmpJSObjectEqAndBranch, |
"cmp-jsobject-eq-and-branch") |
- |
- int true_block_id() const { return true_block_id_; } |
- int false_block_id() const { return false_block_id_; } |
- |
- private: |
- int true_block_id_; |
- int false_block_id_; |
}; |
-class LIsNull: public LUnaryOperation { |
+class LIsNull: public LTemplateInstruction<1, 1, 0> { |
public: |
- explicit LIsNull(LOperand* value) : LUnaryOperation(value) {} |
+ explicit LIsNull(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(IsNull, "is-null") |
- DECLARE_HYDROGEN_ACCESSOR(IsNull); |
+ DECLARE_HYDROGEN_ACCESSOR(IsNull) |
bool is_strict() const { return hydrogen()->is_strict(); } |
}; |
- |
-class LIsNullAndBranch: public LIsNull { |
+class LIsNullAndBranch: public LControlInstruction<1, 0> { |
public: |
- LIsNullAndBranch(LOperand* value, |
- int true_block_id, |
- int false_block_id) |
- : LIsNull(value), |
- true_block_id_(true_block_id), |
- false_block_id_(false_block_id) { } |
+ explicit LIsNullAndBranch(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(IsNullAndBranch, "is-null-and-branch") |
- virtual void PrintDataTo(StringStream* stream) const; |
- virtual bool IsControl() const { return true; } |
+ DECLARE_HYDROGEN_ACCESSOR(IsNull) |
- int true_block_id() const { return true_block_id_; } |
- int false_block_id() const { return false_block_id_; } |
+ bool is_strict() const { return hydrogen()->is_strict(); } |
- private: |
- int true_block_id_; |
- int false_block_id_; |
+ virtual void PrintDataTo(StringStream* stream); |
}; |
-class LIsObject: public LUnaryOperation { |
+class LIsObject: public LTemplateInstruction<1, 1, 1> { |
public: |
- LIsObject(LOperand* value, LOperand* temp) |
- : LUnaryOperation(value), temp_(temp) {} |
+ LIsObject(LOperand* value, LOperand* temp) { |
+ inputs_[0] = value; |
+ temps_[0] = temp; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(IsObject, "is-object") |
- |
- LOperand* temp() const { return temp_; } |
- |
- private: |
- LOperand* temp_; |
}; |
-class LIsObjectAndBranch: public LIsObject { |
+class LIsObjectAndBranch: public LControlInstruction<1, 2> { |
public: |
- LIsObjectAndBranch(LOperand* value, |
- LOperand* temp, |
- LOperand* temp2, |
- int true_block_id, |
- int false_block_id) |
- : LIsObject(value, temp), |
- temp2_(temp2), |
- true_block_id_(true_block_id), |
- false_block_id_(false_block_id) { } |
+ LIsObjectAndBranch(LOperand* value, LOperand* temp, LOperand* temp2) { |
+ inputs_[0] = value; |
+ temps_[0] = temp; |
+ temps_[1] = temp2; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch, "is-object-and-branch") |
- virtual void PrintDataTo(StringStream* stream) const; |
- virtual bool IsControl() const { return true; } |
- int true_block_id() const { return true_block_id_; } |
- int false_block_id() const { return false_block_id_; } |
- |
- LOperand* temp2() const { return temp2_; } |
- |
- private: |
- LOperand* temp2_; |
- int true_block_id_; |
- int false_block_id_; |
+ virtual void PrintDataTo(StringStream* stream); |
}; |
-class LIsSmi: public LUnaryOperation { |
+class LIsSmi: public LTemplateInstruction<1, 1, 0> { |
public: |
- explicit LIsSmi(LOperand* value) : LUnaryOperation(value) {} |
+ explicit LIsSmi(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(IsSmi, "is-smi") |
DECLARE_HYDROGEN_ACCESSOR(IsSmi) |
}; |
-class LIsSmiAndBranch: public LIsSmi { |
+class LIsSmiAndBranch: public LControlInstruction<1, 0> { |
public: |
- LIsSmiAndBranch(LOperand* value, |
- int true_block_id, |
- int false_block_id) |
- : LIsSmi(value), |
- true_block_id_(true_block_id), |
- false_block_id_(false_block_id) { } |
+ explicit LIsSmiAndBranch(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch, "is-smi-and-branch") |
- virtual void PrintDataTo(StringStream* stream) const; |
- virtual bool IsControl() const { return true; } |
- int true_block_id() const { return true_block_id_; } |
- int false_block_id() const { return false_block_id_; } |
- |
- private: |
- int true_block_id_; |
- int false_block_id_; |
+ virtual void PrintDataTo(StringStream* stream); |
}; |
-class LHasInstanceType: public LUnaryOperation { |
+class LHasInstanceType: public LTemplateInstruction<1, 1, 0> { |
public: |
- explicit LHasInstanceType(LOperand* value) |
- : LUnaryOperation(value) { } |
+ explicit LHasInstanceType(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(HasInstanceType, "has-instance-type") |
DECLARE_HYDROGEN_ACCESSOR(HasInstanceType) |
- |
- InstanceType TestType(); // The type to test against when generating code. |
- Condition BranchCondition(); // The branch condition for 'true'. |
}; |
-class LHasInstanceTypeAndBranch: public LHasInstanceType { |
+class LHasInstanceTypeAndBranch: public LControlInstruction<1, 0> { |
public: |
- LHasInstanceTypeAndBranch(LOperand* value, |
- int true_block_id, |
- int false_block_id) |
- : LHasInstanceType(value), |
- true_block_id_(true_block_id), |
- false_block_id_(false_block_id) { } |
+ explicit LHasInstanceTypeAndBranch(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch, |
"has-instance-type-and-branch") |
- virtual void PrintDataTo(StringStream* stream) const; |
- virtual bool IsControl() const { return true; } |
+ DECLARE_HYDROGEN_ACCESSOR(HasInstanceType) |
- int true_block_id() const { return true_block_id_; } |
- int false_block_id() const { return false_block_id_; } |
- |
- private: |
- int true_block_id_; |
- int false_block_id_; |
+ virtual void PrintDataTo(StringStream* stream); |
}; |
-class LHasCachedArrayIndex: public LUnaryOperation { |
+class LHasCachedArrayIndex: public LTemplateInstruction<1, 1, 0> { |
public: |
- explicit LHasCachedArrayIndex(LOperand* value) : LUnaryOperation(value) {} |
+ explicit LHasCachedArrayIndex(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndex, "has-cached-array-index") |
DECLARE_HYDROGEN_ACCESSOR(HasCachedArrayIndex) |
}; |
-class LHasCachedArrayIndexAndBranch: public LHasCachedArrayIndex { |
+class LHasCachedArrayIndexAndBranch: public LControlInstruction<1, 0> { |
public: |
- LHasCachedArrayIndexAndBranch(LOperand* value, |
- int true_block_id, |
- int false_block_id) |
- : LHasCachedArrayIndex(value), |
- true_block_id_(true_block_id), |
- false_block_id_(false_block_id) { } |
+ explicit LHasCachedArrayIndexAndBranch(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch, |
"has-cached-array-index-and-branch") |
- virtual void PrintDataTo(StringStream* stream) const; |
- virtual bool IsControl() const { return true; } |
- |
- int true_block_id() const { return true_block_id_; } |
- int false_block_id() const { return false_block_id_; } |
- |
- private: |
- int true_block_id_; |
- int false_block_id_; |
+ virtual void PrintDataTo(StringStream* stream); |
}; |
-class LClassOfTest: public LUnaryOperation { |
+class LClassOfTest: public LTemplateInstruction<1, 1, 0> { |
public: |
- explicit LClassOfTest(LOperand* value) : LUnaryOperation(value) {} |
+ explicit LClassOfTest(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(ClassOfTest, "class-of-test") |
DECLARE_HYDROGEN_ACCESSOR(ClassOfTest) |
- virtual void PrintDataTo(StringStream* stream) const; |
+ virtual void PrintDataTo(StringStream* stream); |
}; |
-class LClassOfTestAndBranch: public LClassOfTest { |
+class LClassOfTestAndBranch: public LControlInstruction<1, 1> { |
public: |
- LClassOfTestAndBranch(LOperand* value, |
- LOperand* temporary, |
- int true_block_id, |
- int false_block_id) |
- : LClassOfTest(value), |
- temporary_(temporary), |
- true_block_id_(true_block_id), |
- false_block_id_(false_block_id) { } |
+ LClassOfTestAndBranch(LOperand* value, LOperand* temp) { |
+ inputs_[0] = value; |
+ temps_[0] = temp; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch, |
"class-of-test-and-branch") |
- virtual void PrintDataTo(StringStream* stream) const; |
- virtual bool IsControl() const { return true; } |
+ DECLARE_HYDROGEN_ACCESSOR(ClassOfTest) |
- int true_block_id() const { return true_block_id_; } |
- int false_block_id() const { return false_block_id_; } |
- LOperand* temporary() { return temporary_; } |
- |
- private: |
- LOperand* temporary_; |
- int true_block_id_; |
- int false_block_id_; |
+ virtual void PrintDataTo(StringStream* stream); |
}; |
-class LCmpT: public LBinaryOperation { |
+class LCmpT: public LTemplateInstruction<1, 2, 0> { |
public: |
- LCmpT(LOperand* left, LOperand* right) : LBinaryOperation(left, right) {} |
+ LCmpT(LOperand* left, LOperand* right) { |
+ inputs_[0] = left; |
+ inputs_[1] = right; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(CmpT, "cmp-t") |
DECLARE_HYDROGEN_ACCESSOR(Compare) |
@@ -896,90 +870,78 @@ |
}; |
-class LCmpTAndBranch: public LCmpT { |
+class LCmpTAndBranch: public LControlInstruction<2, 0> { |
public: |
- LCmpTAndBranch(LOperand* left, |
- LOperand* right, |
- int true_block_id, |
- int false_block_id) |
- : LCmpT(left, right), |
- true_block_id_(true_block_id), |
- false_block_id_(false_block_id) { } |
+ LCmpTAndBranch(LOperand* left, LOperand* right) { |
+ inputs_[0] = left; |
+ inputs_[1] = right; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(CmpTAndBranch, "cmp-t-and-branch") |
+ DECLARE_HYDROGEN_ACCESSOR(Compare) |
- int true_block_id() const { return true_block_id_; } |
- int false_block_id() const { return false_block_id_; } |
- |
- private: |
- int true_block_id_; |
- int false_block_id_; |
+ Token::Value op() const { return hydrogen()->token(); } |
}; |
-class LInstanceOf: public LBinaryOperation { |
+class LInstanceOf: public LTemplateInstruction<1, 2, 0> { |
public: |
- LInstanceOf(LOperand* left, LOperand* right) |
- : LBinaryOperation(left, right) { } |
+ LInstanceOf(LOperand* left, LOperand* right) { |
+ inputs_[0] = left; |
+ inputs_[1] = right; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(InstanceOf, "instance-of") |
}; |
-class LInstanceOfAndBranch: public LInstanceOf { |
+class LInstanceOfAndBranch: public LControlInstruction<2, 0> { |
public: |
- LInstanceOfAndBranch(LOperand* left, |
- LOperand* right, |
- int true_block_id, |
- int false_block_id) |
- : LInstanceOf(left, right), |
- true_block_id_(true_block_id), |
- false_block_id_(false_block_id) { } |
+ LInstanceOfAndBranch(LOperand* left, LOperand* right) { |
+ inputs_[0] = left; |
+ inputs_[1] = right; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(InstanceOfAndBranch, "instance-of-and-branch") |
- |
- int true_block_id() const { return true_block_id_; } |
- int false_block_id() const { return false_block_id_; } |
- |
- private: |
- int true_block_id_; |
- int false_block_id_; |
}; |
-class LInstanceOfKnownGlobal: public LUnaryOperation { |
+class LInstanceOfKnownGlobal: public LTemplateInstruction<1, 1, 1> { |
public: |
- explicit LInstanceOfKnownGlobal(LOperand* left, LOperand* temp) |
- : LUnaryOperation(left), temp_(temp) { } |
+ LInstanceOfKnownGlobal(LOperand* value, LOperand* temp) { |
+ inputs_[0] = value; |
+ temps_[0] = temp; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal, |
"instance-of-known-global") |
DECLARE_HYDROGEN_ACCESSOR(InstanceOfKnownGlobal) |
Handle<JSFunction> function() const { return hydrogen()->function(); } |
- LOperand* temp() const { return temp_; } |
- |
- private: |
- LOperand* temp_; |
}; |
-class LBoundsCheck: public LBinaryOperation { |
+class LBoundsCheck: public LTemplateInstruction<0, 2, 0> { |
public: |
- LBoundsCheck(LOperand* index, LOperand* length) |
- : LBinaryOperation(index, length) { } |
+ LBoundsCheck(LOperand* index, LOperand* length) { |
+ inputs_[0] = index; |
+ inputs_[1] = length; |
+ } |
- LOperand* index() const { return left(); } |
- LOperand* length() const { return right(); } |
+ LOperand* index() { return inputs_[0]; } |
+ LOperand* length() { return inputs_[1]; } |
DECLARE_CONCRETE_INSTRUCTION(BoundsCheck, "bounds-check") |
}; |
-class LBitI: public LBinaryOperation { |
+class LBitI: public LTemplateInstruction<1, 2, 0> { |
public: |
LBitI(Token::Value op, LOperand* left, LOperand* right) |
- : LBinaryOperation(left, right), op_(op) { } |
+ : op_(op) { |
+ inputs_[0] = left; |
+ inputs_[1] = right; |
+ } |
Token::Value op() const { return op_; } |
@@ -990,10 +952,13 @@ |
}; |
-class LShiftI: public LBinaryOperation { |
+class LShiftI: public LTemplateInstruction<1, 2, 0> { |
public: |
LShiftI(Token::Value op, LOperand* left, LOperand* right, bool can_deopt) |
- : LBinaryOperation(left, right), op_(op), can_deopt_(can_deopt) { } |
+ : op_(op), can_deopt_(can_deopt) { |
+ inputs_[0] = left; |
+ inputs_[1] = right; |
+ } |
Token::Value op() const { return op_; } |
@@ -1007,17 +972,19 @@ |
}; |
-class LSubI: public LBinaryOperation { |
+class LSubI: public LTemplateInstruction<1, 2, 0> { |
public: |
- LSubI(LOperand* left, LOperand* right) |
- : LBinaryOperation(left, right) { } |
+ LSubI(LOperand* left, LOperand* right) { |
+ inputs_[0] = left; |
+ inputs_[1] = right; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(SubI, "sub-i") |
DECLARE_HYDROGEN_ACCESSOR(Sub) |
}; |
-class LConstant: public LInstruction { |
+class LConstant: public LTemplateInstruction<1, 0, 0> { |
DECLARE_INSTRUCTION(Constant) |
}; |
@@ -1058,39 +1025,31 @@ |
}; |
-class LBranch: public LUnaryOperation { |
+class LBranch: public LControlInstruction<1, 0> { |
public: |
- LBranch(LOperand* input, int true_block_id, int false_block_id) |
- : LUnaryOperation(input), |
- true_block_id_(true_block_id), |
- false_block_id_(false_block_id) { } |
+ explicit LBranch(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(Branch, "branch") |
DECLARE_HYDROGEN_ACCESSOR(Value) |
- virtual void PrintDataTo(StringStream* stream) const; |
- virtual bool IsControl() const { return true; } |
- |
- int true_block_id() const { return true_block_id_; } |
- int false_block_id() const { return false_block_id_; } |
- |
- private: |
- int true_block_id_; |
- int false_block_id_; |
+ virtual void PrintDataTo(StringStream* stream); |
}; |
-class LCmpMapAndBranch: public LUnaryOperation { |
+class LCmpMapAndBranch: public LTemplateInstruction<0, 1, 1> { |
public: |
- LCmpMapAndBranch(LOperand* value, LOperand* temp) |
- : LUnaryOperation(value), temp_(temp) { } |
+ LCmpMapAndBranch(LOperand* value, LOperand* temp) { |
+ inputs_[0] = value; |
+ temps_[0] = temp; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(CmpMapAndBranch, "cmp-map-and-branch") |
DECLARE_HYDROGEN_ACCESSOR(CompareMap) |
virtual bool IsControl() const { return true; } |
- LOperand* temp() const { return temp_; } |
Handle<Map> map() const { return hydrogen()->map(); } |
int true_block_id() const { |
return hydrogen()->FirstSuccessor()->block_id(); |
@@ -1098,75 +1057,82 @@ |
int false_block_id() const { |
return hydrogen()->SecondSuccessor()->block_id(); |
} |
- |
- private: |
- LOperand* temp_; |
}; |
-class LJSArrayLength: public LUnaryOperation { |
+class LJSArrayLength: public LTemplateInstruction<1, 1, 0> { |
public: |
- explicit LJSArrayLength(LOperand* input) : LUnaryOperation(input) { } |
+ explicit LJSArrayLength(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(JSArrayLength, "js-array-length") |
DECLARE_HYDROGEN_ACCESSOR(JSArrayLength) |
}; |
-class LFixedArrayLength: public LUnaryOperation { |
+class LFixedArrayLength: public LTemplateInstruction<1, 1, 0> { |
public: |
- explicit LFixedArrayLength(LOperand* input) : LUnaryOperation(input) { } |
+ explicit LFixedArrayLength(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(FixedArrayLength, "fixed-array-length") |
DECLARE_HYDROGEN_ACCESSOR(FixedArrayLength) |
}; |
-class LValueOf: public LUnaryOperation { |
+class LValueOf: public LTemplateInstruction<1, 1, 1> { |
public: |
- LValueOf(LOperand* input, LOperand* temporary) |
- : LUnaryOperation(input), temporary_(temporary) { } |
+ LValueOf(LOperand* value, LOperand* temp) { |
+ inputs_[0] = value; |
+ temps_[0] = temp; |
+ } |
- LOperand* temporary() const { return temporary_; } |
- |
DECLARE_CONCRETE_INSTRUCTION(ValueOf, "value-of") |
DECLARE_HYDROGEN_ACCESSOR(ValueOf) |
- |
- private: |
- LOperand* temporary_; |
}; |
-class LThrow: public LUnaryOperation { |
+class LThrow: public LTemplateInstruction<0, 1, 0> { |
public: |
- explicit LThrow(LOperand* value) : LUnaryOperation(value) { } |
+ explicit LThrow(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(Throw, "throw") |
}; |
-class LBitNotI: public LUnaryOperation { |
+class LBitNotI: public LTemplateInstruction<1, 1, 0> { |
public: |
- explicit LBitNotI(LOperand* use) : LUnaryOperation(use) { } |
+ explicit LBitNotI(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(BitNotI, "bit-not-i") |
}; |
-class LAddI: public LBinaryOperation { |
+class LAddI: public LTemplateInstruction<1, 2, 0> { |
public: |
- LAddI(LOperand* left, LOperand* right) |
- : LBinaryOperation(left, right) { } |
+ LAddI(LOperand* left, LOperand* right) { |
+ inputs_[0] = left; |
+ inputs_[1] = right; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(AddI, "add-i") |
DECLARE_HYDROGEN_ACCESSOR(Add) |
}; |
-class LArithmeticD: public LBinaryOperation { |
+class LArithmeticD: public LTemplateInstruction<1, 2, 0> { |
public: |
LArithmeticD(Token::Value op, LOperand* left, LOperand* right) |
- : LBinaryOperation(left, right), op_(op) { } |
+ : op_(op) { |
+ inputs_[0] = left; |
+ inputs_[1] = right; |
+ } |
Token::Value op() const { return op_; } |
@@ -1178,10 +1144,13 @@ |
}; |
-class LArithmeticT: public LBinaryOperation { |
+class LArithmeticT: public LTemplateInstruction<1, 2, 0> { |
public: |
LArithmeticT(Token::Value op, LOperand* left, LOperand* right) |
- : LBinaryOperation(left, right), op_(op) { } |
+ : op_(op) { |
+ inputs_[0] = left; |
+ inputs_[1] = right; |
+ } |
virtual void CompileToNative(LCodeGen* generator); |
virtual const char* Mnemonic() const; |
@@ -1193,166 +1162,186 @@ |
}; |
-class LReturn: public LUnaryOperation { |
+class LReturn: public LTemplateInstruction<0, 1, 0> { |
public: |
- explicit LReturn(LOperand* use) : LUnaryOperation(use) { } |
+ explicit LReturn(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(Return, "return") |
}; |
-class LLoadNamedField: public LUnaryOperation { |
+class LLoadNamedField: public LTemplateInstruction<1, 1, 0> { |
public: |
- explicit LLoadNamedField(LOperand* object) : LUnaryOperation(object) { } |
+ explicit LLoadNamedField(LOperand* object) { |
+ inputs_[0] = object; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field") |
DECLARE_HYDROGEN_ACCESSOR(LoadNamedField) |
}; |
-class LLoadNamedGeneric: public LUnaryOperation { |
+class LLoadNamedGeneric: public LTemplateInstruction<1, 1, 0> { |
public: |
- explicit LLoadNamedGeneric(LOperand* object) : LUnaryOperation(object) { } |
+ explicit LLoadNamedGeneric(LOperand* object) { |
+ inputs_[0] = object; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric, "load-named-generic") |
DECLARE_HYDROGEN_ACCESSOR(LoadNamedGeneric) |
- LOperand* object() const { return input(); } |
+ LOperand* object() { return inputs_[0]; } |
Handle<Object> name() const { return hydrogen()->name(); } |
}; |
-class LLoadFunctionPrototype: public LUnaryOperation { |
+class LLoadFunctionPrototype: public LTemplateInstruction<1, 1, 0> { |
public: |
- explicit LLoadFunctionPrototype(LOperand* function) |
- : LUnaryOperation(function) { } |
+ explicit LLoadFunctionPrototype(LOperand* function) { |
+ inputs_[0] = function; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype, "load-function-prototype") |
DECLARE_HYDROGEN_ACCESSOR(LoadFunctionPrototype) |
- LOperand* function() const { return input(); } |
+ LOperand* function() { return inputs_[0]; } |
}; |
-class LLoadElements: public LUnaryOperation { |
+class LLoadElements: public LTemplateInstruction<1, 1, 0> { |
public: |
- explicit LLoadElements(LOperand* obj) : LUnaryOperation(obj) { } |
+ explicit LLoadElements(LOperand* object) { |
+ inputs_[0] = object; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(LoadElements, "load-elements") |
}; |
-class LLoadKeyedFastElement: public LBinaryOperation { |
+class LLoadKeyedFastElement: public LTemplateInstruction<1, 2, 0> { |
public: |
- LLoadKeyedFastElement(LOperand* elements, LOperand* key) |
- : LBinaryOperation(elements, key) { } |
+ LLoadKeyedFastElement(LOperand* elements, LOperand* key) { |
+ inputs_[0] = elements; |
+ inputs_[1] = key; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastElement, "load-keyed-fast-element") |
DECLARE_HYDROGEN_ACCESSOR(LoadKeyedFastElement) |
- LOperand* elements() const { return left(); } |
- LOperand* key() const { return right(); } |
+ LOperand* elements() { return inputs_[0]; } |
+ LOperand* key() { return inputs_[1]; } |
}; |
-class LLoadKeyedGeneric: public LBinaryOperation { |
+class LLoadKeyedGeneric: public LTemplateInstruction<1, 2, 0> { |
public: |
- LLoadKeyedGeneric(LOperand* obj, LOperand* key) |
- : LBinaryOperation(obj, key) { } |
+ LLoadKeyedGeneric(LOperand* obj, LOperand* key) { |
+ inputs_[0] = obj; |
+ inputs_[1] = key; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric, "load-keyed-generic") |
- LOperand* object() const { return left(); } |
- LOperand* key() const { return right(); } |
+ LOperand* object() { return inputs_[0]; } |
+ LOperand* key() { return inputs_[1]; } |
}; |
-class LLoadGlobal: public LInstruction { |
+class LLoadGlobal: public LTemplateInstruction<1, 0, 0> { |
public: |
DECLARE_CONCRETE_INSTRUCTION(LoadGlobal, "load-global") |
DECLARE_HYDROGEN_ACCESSOR(LoadGlobal) |
}; |
-class LStoreGlobal: public LUnaryOperation { |
+class LStoreGlobal: public LTemplateInstruction<0, 1, 0> { |
public: |
- explicit LStoreGlobal(LOperand* value) : LUnaryOperation(value) {} |
+ explicit LStoreGlobal(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(StoreGlobal, "store-global") |
DECLARE_HYDROGEN_ACCESSOR(StoreGlobal) |
}; |
-class LLoadContextSlot: public LInstruction { |
+class LLoadContextSlot: public LTemplateInstruction<1, 0, 0> { |
public: |
DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot, "load-context-slot") |
DECLARE_HYDROGEN_ACCESSOR(LoadContextSlot) |
- int context_chain_length() const { |
- return hydrogen()->context_chain_length(); |
- } |
- int slot_index() const { return hydrogen()->slot_index(); } |
+ int context_chain_length() { return hydrogen()->context_chain_length(); } |
+ int slot_index() { return hydrogen()->slot_index(); } |
virtual void PrintDataTo(StringStream* stream); |
}; |
-class LPushArgument: public LUnaryOperation { |
+class LPushArgument: public LTemplateInstruction<0, 1, 0> { |
public: |
- explicit LPushArgument(LOperand* argument) : LUnaryOperation(argument) {} |
+ explicit LPushArgument(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(PushArgument, "push-argument") |
}; |
-class LGlobalObject: public LInstruction { |
+class LGlobalObject: public LTemplateInstruction<1, 0, 0> { |
public: |
DECLARE_CONCRETE_INSTRUCTION(GlobalObject, "global-object") |
}; |
-class LGlobalReceiver: public LInstruction { |
+class LGlobalReceiver: public LTemplateInstruction<1, 0, 0> { |
public: |
DECLARE_CONCRETE_INSTRUCTION(GlobalReceiver, "global-receiver") |
}; |
-class LCallConstantFunction: public LInstruction { |
+class LCallConstantFunction: public LTemplateInstruction<1, 0, 0> { |
public: |
DECLARE_CONCRETE_INSTRUCTION(CallConstantFunction, "call-constant-function") |
DECLARE_HYDROGEN_ACCESSOR(CallConstantFunction) |
- virtual void PrintDataTo(StringStream* stream) const; |
+ virtual void PrintDataTo(StringStream* stream); |
- Handle<JSFunction> function() const { return hydrogen()->function(); } |
+ Handle<JSFunction> function() { return hydrogen()->function(); } |
int arity() const { return hydrogen()->argument_count() - 1; } |
}; |
-class LCallKeyed: public LInstruction { |
+class LCallKeyed: public LTemplateInstruction<1, 1, 0> { |
public: |
+ explicit LCallKeyed(LOperand* key) { |
+ inputs_[0] = key; |
+ } |
+ |
DECLARE_CONCRETE_INSTRUCTION(CallKeyed, "call-keyed") |
DECLARE_HYDROGEN_ACCESSOR(CallKeyed) |
- virtual void PrintDataTo(StringStream* stream) const; |
+ virtual void PrintDataTo(StringStream* stream); |
int arity() const { return hydrogen()->argument_count() - 1; } |
}; |
-class LCallNamed: public LInstruction { |
+ |
+class LCallNamed: public LTemplateInstruction<1, 0, 0> { |
public: |
DECLARE_CONCRETE_INSTRUCTION(CallNamed, "call-named") |
DECLARE_HYDROGEN_ACCESSOR(CallNamed) |
- virtual void PrintDataTo(StringStream* stream) const; |
+ virtual void PrintDataTo(StringStream* stream); |
Handle<String> name() const { return hydrogen()->name(); } |
int arity() const { return hydrogen()->argument_count() - 1; } |
}; |
-class LCallFunction: public LInstruction { |
+class LCallFunction: public LTemplateInstruction<1, 0, 0> { |
public: |
DECLARE_CONCRETE_INSTRUCTION(CallFunction, "call-function") |
DECLARE_HYDROGEN_ACCESSOR(CallFunction) |
@@ -1361,44 +1350,46 @@ |
}; |
-class LCallGlobal: public LInstruction { |
+class LCallGlobal: public LTemplateInstruction<1, 0, 0> { |
public: |
DECLARE_CONCRETE_INSTRUCTION(CallGlobal, "call-global") |
DECLARE_HYDROGEN_ACCESSOR(CallGlobal) |
- virtual void PrintDataTo(StringStream* stream) const; |
+ virtual void PrintDataTo(StringStream* stream); |
Handle<String> name() const {return hydrogen()->name(); } |
int arity() const { return hydrogen()->argument_count() - 1; } |
}; |
-class LCallKnownGlobal: public LInstruction { |
+class LCallKnownGlobal: public LTemplateInstruction<1, 0, 0> { |
public: |
DECLARE_CONCRETE_INSTRUCTION(CallKnownGlobal, "call-known-global") |
DECLARE_HYDROGEN_ACCESSOR(CallKnownGlobal) |
- virtual void PrintDataTo(StringStream* stream) const; |
+ virtual void PrintDataTo(StringStream* stream); |
Handle<JSFunction> target() const { return hydrogen()->target(); } |
int arity() const { return hydrogen()->argument_count() - 1; } |
}; |
-class LCallNew: public LUnaryOperation { |
+class LCallNew: public LTemplateInstruction<1, 1, 0> { |
public: |
- explicit LCallNew(LOperand* constructor) : LUnaryOperation(constructor) { } |
+ explicit LCallNew(LOperand* constructor) { |
+ inputs_[0] = constructor; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(CallNew, "call-new") |
DECLARE_HYDROGEN_ACCESSOR(CallNew) |
- virtual void PrintDataTo(StringStream* stream) const; |
+ virtual void PrintDataTo(StringStream* stream); |
int arity() const { return hydrogen()->argument_count() - 1; } |
}; |
-class LCallRuntime: public LInstruction { |
+class LCallRuntime: public LTemplateInstruction<1, 0, 0> { |
public: |
DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call-runtime") |
DECLARE_HYDROGEN_ACCESSOR(CallRuntime) |
@@ -1408,42 +1399,44 @@ |
}; |
-class LInteger32ToDouble: public LUnaryOperation { |
+class LInteger32ToDouble: public LTemplateInstruction<1, 1, 0> { |
public: |
- explicit LInteger32ToDouble(LOperand* use) : LUnaryOperation(use) { } |
+ explicit LInteger32ToDouble(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(Integer32ToDouble, "int32-to-double") |
}; |
-class LNumberTagI: public LUnaryOperation { |
+class LNumberTagI: public LTemplateInstruction<1, 1, 0> { |
public: |
- explicit LNumberTagI(LOperand* use) : LUnaryOperation(use) { } |
+ explicit LNumberTagI(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(NumberTagI, "number-tag-i") |
}; |
-class LNumberTagD: public LUnaryOperation { |
+class LNumberTagD: public LTemplateInstruction<1, 1, 2> { |
public: |
- LNumberTagD(LOperand* value, LOperand* temp1, LOperand* temp2) |
- : LUnaryOperation(value), temp1_(temp1), temp2_(temp2) { } |
+ LNumberTagD(LOperand* value, LOperand* temp1, LOperand* temp2) { |
+ inputs_[0] = value; |
+ temps_[0] = temp1; |
+ temps_[1] = temp2; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(NumberTagD, "number-tag-d") |
- |
- LOperand* temp1() const { return temp1_; } |
- LOperand* temp2() const { return temp2_; } |
- |
- private: |
- LOperand* temp1_; |
- LOperand* temp2_; |
}; |
// Sometimes truncating conversion from a tagged value to an int32. |
-class LDoubleToI: public LUnaryOperation { |
+class LDoubleToI: public LTemplateInstruction<1, 1, 0> { |
public: |
- explicit LDoubleToI(LOperand* value) : LUnaryOperation(value) { } |
+ explicit LDoubleToI(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(DoubleToI, "double-to-i") |
DECLARE_HYDROGEN_ACCESSOR(Change) |
@@ -1453,42 +1446,46 @@ |
// Truncating conversion from a tagged value to an int32. |
-class LTaggedToI: public LUnaryOperation { |
+class LTaggedToI: public LTemplateInstruction<1, 1, 1> { |
public: |
- LTaggedToI(LOperand* value, LOperand* temp) |
- : LUnaryOperation(value), temp_(temp) { } |
+ LTaggedToI(LOperand* value, LOperand* temp) { |
+ inputs_[0] = value; |
+ temps_[0] = temp; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(TaggedToI, "tagged-to-i") |
DECLARE_HYDROGEN_ACCESSOR(Change) |
bool truncating() { return hydrogen()->CanTruncateToInt32(); } |
- LOperand* temp() const { return temp_; } |
- |
- private: |
- LOperand* temp_; |
}; |
-class LSmiTag: public LUnaryOperation { |
+class LSmiTag: public LTemplateInstruction<1, 1, 0> { |
public: |
- explicit LSmiTag(LOperand* use) : LUnaryOperation(use) { } |
+ explicit LSmiTag(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(SmiTag, "smi-tag") |
}; |
-class LNumberUntagD: public LUnaryOperation { |
+class LNumberUntagD: public LTemplateInstruction<1, 1, 0> { |
public: |
- explicit LNumberUntagD(LOperand* value) : LUnaryOperation(value) { } |
+ explicit LNumberUntagD(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(NumberUntagD, "double-untag") |
}; |
-class LSmiUntag: public LUnaryOperation { |
+class LSmiUntag: public LTemplateInstruction<1, 1, 0> { |
public: |
- LSmiUntag(LOperand* use, bool needs_check) |
- : LUnaryOperation(use), needs_check_(needs_check) { } |
+ LSmiUntag(LOperand* value, bool needs_check) |
+ : needs_check_(needs_check) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(SmiUntag, "smi-untag") |
@@ -1499,23 +1496,21 @@ |
}; |
-class LStoreNamed: public LInstruction { |
+class LStoreNamed: public LTemplateInstruction<0, 2, 0> { |
public: |
- LStoreNamed(LOperand* obj, LOperand* val) |
- : object_(obj), value_(val) { } |
+ LStoreNamed(LOperand* obj, LOperand* val) { |
+ inputs_[0] = obj; |
+ inputs_[1] = val; |
+ } |
DECLARE_INSTRUCTION(StoreNamed) |
DECLARE_HYDROGEN_ACCESSOR(StoreNamed) |
- virtual void PrintDataTo(StringStream* stream) const; |
+ virtual void PrintDataTo(StringStream* stream); |
- LOperand* object() const { return object_; } |
+ LOperand* object() { return inputs_[0]; } |
+ LOperand* value() { return inputs_[1]; } |
Handle<Object> name() const { return hydrogen()->name(); } |
- LOperand* value() const { return value_; } |
- |
- private: |
- LOperand* object_; |
- LOperand* value_; |
}; |
@@ -1530,7 +1525,7 @@ |
bool is_in_object() { return hydrogen()->is_in_object(); } |
int offset() { return hydrogen()->offset(); } |
bool needs_write_barrier() { return hydrogen()->NeedsWriteBarrier(); } |
- Handle<Map> transition() { return hydrogen()->transition(); } |
+ Handle<Map> transition() const { return hydrogen()->transition(); } |
}; |
@@ -1544,23 +1539,21 @@ |
}; |
-class LStoreKeyed: public LInstruction { |
+class LStoreKeyed: public LTemplateInstruction<0, 3, 0> { |
public: |
- LStoreKeyed(LOperand* obj, LOperand* key, LOperand* val) |
- : object_(obj), key_(key), value_(val) { } |
+ LStoreKeyed(LOperand* obj, LOperand* key, LOperand* val) { |
+ inputs_[0] = obj; |
+ inputs_[1] = key; |
+ inputs_[2] = val; |
+ } |
DECLARE_INSTRUCTION(StoreKeyed) |
- virtual void PrintDataTo(StringStream* stream) const; |
+ virtual void PrintDataTo(StringStream* stream); |
- LOperand* object() const { return object_; } |
- LOperand* key() const { return key_; } |
- LOperand* value() const { return value_; } |
- |
- private: |
- LOperand* object_; |
- LOperand* key_; |
- LOperand* value_; |
+ LOperand* object() { return inputs_[0]; } |
+ LOperand* key() { return inputs_[1]; } |
+ LOperand* value() { return inputs_[2]; } |
}; |
@@ -1584,84 +1577,88 @@ |
}; |
-class LStringCharCodeAt: public LBinaryOperation { |
+class LStringCharCodeAt: public LTemplateInstruction<1, 2, 0> { |
public: |
- LStringCharCodeAt(LOperand* string, LOperand* index) |
- : LBinaryOperation(string, index) {} |
+ LStringCharCodeAt(LOperand* string, LOperand* index) { |
+ inputs_[0] = string; |
+ inputs_[1] = index; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt, "string-char-code-at") |
DECLARE_HYDROGEN_ACCESSOR(StringCharCodeAt) |
- LOperand* string() { return left(); } |
- LOperand* index() { return right(); } |
+ LOperand* string() { return inputs_[0]; } |
+ LOperand* index() { return inputs_[1]; } |
}; |
-class LStringLength: public LUnaryOperation { |
+class LStringLength: public LTemplateInstruction<1, 1, 0> { |
public: |
- explicit LStringLength(LOperand* string) : LUnaryOperation(string) {} |
+ explicit LStringLength(LOperand* string) { |
+ inputs_[0] = string; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(StringLength, "string-length") |
DECLARE_HYDROGEN_ACCESSOR(StringLength) |
+ |
+ LOperand* string() { return inputs_[0]; } |
}; |
-class LCheckFunction: public LUnaryOperation { |
+class LCheckFunction: public LTemplateInstruction<0, 1, 0> { |
public: |
- explicit LCheckFunction(LOperand* use) : LUnaryOperation(use) { } |
+ explicit LCheckFunction(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(CheckFunction, "check-function") |
DECLARE_HYDROGEN_ACCESSOR(CheckFunction) |
}; |
-class LCheckInstanceType: public LUnaryOperation { |
+class LCheckInstanceType: public LTemplateInstruction<0, 1, 0> { |
public: |
- explicit LCheckInstanceType(LOperand* use) : LUnaryOperation(use) { } |
+ explicit LCheckInstanceType(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType, "check-instance-type") |
DECLARE_HYDROGEN_ACCESSOR(CheckInstanceType) |
- |
- LOperand* temp() const { return temp_; } |
- |
- private: |
- LOperand* temp_; |
}; |
-class LCheckMap: public LUnaryOperation { |
+class LCheckMap: public LTemplateInstruction<0, 1, 0> { |
public: |
- explicit LCheckMap(LOperand* use) : LUnaryOperation(use) { } |
+ explicit LCheckMap(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(CheckMap, "check-map") |
DECLARE_HYDROGEN_ACCESSOR(CheckMap) |
}; |
-class LCheckPrototypeMaps: public LInstruction { |
+class LCheckPrototypeMaps: public LTemplateInstruction<0, 0, 2> { |
public: |
- LCheckPrototypeMaps(LOperand* temp1, LOperand* temp2) |
- : temp1_(temp1), temp2_(temp2) { } |
+ LCheckPrototypeMaps(LOperand* temp1, LOperand* temp2) { |
+ temps_[0] = temp1; |
+ temps_[1] = temp2; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps, "check-prototype-maps") |
DECLARE_HYDROGEN_ACCESSOR(CheckPrototypeMaps) |
Handle<JSObject> prototype() const { return hydrogen()->prototype(); } |
Handle<JSObject> holder() const { return hydrogen()->holder(); } |
- |
- LOperand* temp1() const { return temp1_; } |
- LOperand* temp2() const { return temp2_; } |
- |
- private: |
- LOperand* temp1_; |
- LOperand* temp2_; |
}; |
-class LCheckSmi: public LUnaryOperation { |
+class LCheckSmi: public LTemplateInstruction<0, 1, 0> { |
public: |
- LCheckSmi(LOperand* use, Condition condition) |
- : LUnaryOperation(use), condition_(condition) { } |
+ LCheckSmi(LOperand* value, Condition condition) |
+ : condition_(condition) { |
+ inputs_[0] = value; |
+ } |
Condition condition() const { return condition_; } |
@@ -1675,34 +1672,28 @@ |
}; |
-class LMaterializedLiteral: public LInstruction { |
+class LArrayLiteral: public LTemplateInstruction<1, 0, 0> { |
public: |
- DECLARE_INSTRUCTION(MaterializedLiteral) |
-}; |
- |
- |
-class LArrayLiteral: public LMaterializedLiteral { |
- public: |
DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral, "array-literal") |
DECLARE_HYDROGEN_ACCESSOR(ArrayLiteral) |
}; |
-class LObjectLiteral: public LMaterializedLiteral { |
+class LObjectLiteral: public LTemplateInstruction<1, 0, 0> { |
public: |
DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral, "object-literal") |
DECLARE_HYDROGEN_ACCESSOR(ObjectLiteral) |
}; |
-class LRegExpLiteral: public LMaterializedLiteral { |
+class LRegExpLiteral: public LTemplateInstruction<1, 0, 0> { |
public: |
DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral, "regexp-literal") |
DECLARE_HYDROGEN_ACCESSOR(RegExpLiteral) |
}; |
-class LFunctionLiteral: public LInstruction { |
+class LFunctionLiteral: public LTemplateInstruction<1, 0, 0> { |
public: |
DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral, "function-literal") |
DECLARE_HYDROGEN_ACCESSOR(FunctionLiteral) |
@@ -1711,61 +1702,61 @@ |
}; |
-class LTypeof: public LUnaryOperation { |
+class LTypeof: public LTemplateInstruction<1, 1, 0> { |
public: |
- explicit LTypeof(LOperand* input) : LUnaryOperation(input) { } |
+ explicit LTypeof(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(Typeof, "typeof") |
}; |
-class LTypeofIs: public LUnaryOperation { |
+class LTypeofIs: public LTemplateInstruction<1, 1, 0> { |
public: |
- explicit LTypeofIs(LOperand* input) : LUnaryOperation(input) { } |
- virtual void PrintDataTo(StringStream* stream) const; |
+ explicit LTypeofIs(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(TypeofIs, "typeof-is") |
DECLARE_HYDROGEN_ACCESSOR(TypeofIs) |
Handle<String> type_literal() { return hydrogen()->type_literal(); } |
+ |
+ virtual void PrintDataTo(StringStream* stream); |
}; |
-class LTypeofIsAndBranch: public LTypeofIs { |
+class LTypeofIsAndBranch: public LControlInstruction<1, 0> { |
public: |
- LTypeofIsAndBranch(LOperand* value, |
- int true_block_id, |
- int false_block_id) |
- : LTypeofIs(value), |
- true_block_id_(true_block_id), |
- false_block_id_(false_block_id) { } |
+ explicit LTypeofIsAndBranch(LOperand* value) { |
+ inputs_[0] = value; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch, "typeof-is-and-branch") |
+ DECLARE_HYDROGEN_ACCESSOR(TypeofIs) |
- virtual void PrintDataTo(StringStream* stream) const; |
- virtual bool IsControl() const { return true; } |
+ Handle<String> type_literal() { return hydrogen()->type_literal(); } |
- int true_block_id() const { return true_block_id_; } |
- int false_block_id() const { return false_block_id_; } |
- |
- private: |
- int true_block_id_; |
- int false_block_id_; |
+ virtual void PrintDataTo(StringStream* stream); |
}; |
-class LDeleteProperty: public LBinaryOperation { |
+class LDeleteProperty: public LTemplateInstruction<1, 2, 0> { |
public: |
- LDeleteProperty(LOperand* obj, LOperand* key) : LBinaryOperation(obj, key) {} |
+ LDeleteProperty(LOperand* obj, LOperand* key) { |
+ inputs_[0] = obj; |
+ inputs_[1] = key; |
+ } |
DECLARE_CONCRETE_INSTRUCTION(DeleteProperty, "delete-property") |
- LOperand* object() const { return left(); } |
- LOperand* key() const { return right(); } |
+ LOperand* object() { return inputs_[0]; } |
+ LOperand* key() { return inputs_[1]; } |
}; |
-class LOsrEntry: public LInstruction { |
+class LOsrEntry: public LTemplateInstruction<0, 0, 0> { |
public: |
LOsrEntry(); |
@@ -1788,7 +1779,7 @@ |
}; |
-class LStackCheck: public LInstruction { |
+class LStackCheck: public LTemplateInstruction<0, 0, 0> { |
public: |
DECLARE_CONCRETE_INSTRUCTION(StackCheck, "stack-check") |
}; |
@@ -1844,8 +1835,6 @@ |
inlined_closures_.Add(closure); |
} |
- void Verify() const; |
- |
private: |
int spill_slot_count_; |
HGraph* const graph_; |
@@ -1902,9 +1891,10 @@ |
LUnallocated* ToUnallocated(DoubleRegister reg); |
// Methods for setting up define-use relationships. |
- LOperand* Use(HValue* value, LUnallocated* operand); |
- LOperand* UseFixed(HValue* value, Register fixed_register); |
- LOperand* UseFixedDouble(HValue* value, DoubleRegister fixed_register); |
+ MUST_USE_RESULT LOperand* Use(HValue* value, LUnallocated* operand); |
+ MUST_USE_RESULT LOperand* UseFixed(HValue* value, Register fixed_register); |
+ MUST_USE_RESULT LOperand* UseFixedDouble(HValue* value, |
+ DoubleRegister fixed_register); |
// A value that is guaranteed to be allocated to a register. |
// Operand created by UseRegister is guaranteed to be live until the end of |
@@ -1914,37 +1904,53 @@ |
// instruction start. Register allocator is free to assign the same register |
// to some other operand used inside instruction (i.e. temporary or |
// output). |
- LOperand* UseRegister(HValue* value); |
- LOperand* UseRegisterAtStart(HValue* value); |
+ MUST_USE_RESULT LOperand* UseRegister(HValue* value); |
+ MUST_USE_RESULT LOperand* UseRegisterAtStart(HValue* value); |
// An input operand in a register that may be trashed. |
- LOperand* UseTempRegister(HValue* value); |
+ MUST_USE_RESULT LOperand* UseTempRegister(HValue* value); |
// An input operand in a register or stack slot. |
- LOperand* Use(HValue* value); |
- LOperand* UseAtStart(HValue* value); |
+ MUST_USE_RESULT LOperand* Use(HValue* value); |
+ MUST_USE_RESULT LOperand* UseAtStart(HValue* value); |
// An input operand in a register, stack slot or a constant operand. |
- LOperand* UseOrConstant(HValue* value); |
- LOperand* UseOrConstantAtStart(HValue* value); |
+ MUST_USE_RESULT LOperand* UseOrConstant(HValue* value); |
+ MUST_USE_RESULT LOperand* UseOrConstantAtStart(HValue* value); |
// An input operand in a register or a constant operand. |
- LOperand* UseRegisterOrConstant(HValue* value); |
- LOperand* UseRegisterOrConstantAtStart(HValue* value); |
+ MUST_USE_RESULT LOperand* UseRegisterOrConstant(HValue* value); |
+ MUST_USE_RESULT LOperand* UseRegisterOrConstantAtStart(HValue* value); |
// An input operand in register, stack slot or a constant operand. |
// Will not be moved to a register even if one is freely available. |
- LOperand* UseAny(HValue* value); |
+ MUST_USE_RESULT LOperand* UseAny(HValue* value); |
+ // Temporary operand that must be in a register. |
+ MUST_USE_RESULT LUnallocated* TempRegister(); |
+ MUST_USE_RESULT LOperand* FixedTemp(Register reg); |
+ MUST_USE_RESULT LOperand* FixedTemp(DoubleRegister reg); |
+ |
// Methods for setting up define-use relationships. |
// Return the same instruction that they are passed. |
- LInstruction* Define(LInstruction* instr, LUnallocated* result); |
- LInstruction* Define(LInstruction* instr); |
- LInstruction* DefineAsRegister(LInstruction* instr); |
- LInstruction* DefineAsSpilled(LInstruction* instr, int index); |
- LInstruction* DefineSameAsFirst(LInstruction* instr); |
- LInstruction* DefineFixed(LInstruction* instr, Register reg); |
- LInstruction* DefineFixedDouble(LInstruction* instr, DoubleRegister reg); |
+ template<int I, int T> |
+ LInstruction* Define(LTemplateInstruction<1, I, T>* instr, |
+ LUnallocated* result); |
+ template<int I, int T> |
+ LInstruction* Define(LTemplateInstruction<1, I, T>* instr); |
+ 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, |
+ DoubleRegister reg); |
LInstruction* AssignEnvironment(LInstruction* instr); |
LInstruction* AssignPointerMap(LInstruction* instr); |
@@ -1965,11 +1971,6 @@ |
LEnvironment* CreateEnvironment(HEnvironment* hydrogen_env); |
- // Temporary operand that must be in a register. |
- LUnallocated* TempRegister(); |
- LOperand* FixedTemp(Register reg); |
- LOperand* FixedTemp(DoubleRegister reg); |
- |
void VisitInstruction(HInstruction* current); |
void DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block); |