Index: src/hydrogen-instructions.h |
=================================================================== |
--- src/hydrogen-instructions.h (revision 6891) |
+++ src/hydrogen-instructions.h (working copy) |
@@ -51,14 +51,9 @@ |
V(BinaryCall) \ |
V(BinaryOperation) \ |
V(BitwiseBinaryOperation) \ |
- V(Call) \ |
V(ControlInstruction) \ |
V(Instruction) \ |
- V(LoadKeyed) \ |
- V(MaterializedLiteral) \ |
V(Phi) \ |
- V(StoreKeyed) \ |
- V(StoreNamed) \ |
V(UnaryCall) \ |
V(UnaryControlInstruction) \ |
V(UnaryOperation) \ |
@@ -193,14 +188,6 @@ |
DECLARE_INSTRUCTION(type) |
- |
-template<int kSize> |
-class HOperandVector : public EmbeddedVector<HValue*, kSize> { |
- public: |
- HOperandVector() : EmbeddedVector<HValue*, kSize>(NULL) { } |
-}; |
- |
- |
class Range: public ZoneObject { |
public: |
Range() : lower_(kMinInt), |
@@ -544,11 +531,8 @@ |
bool IsDefinedAfter(HBasicBlock* other) const; |
// Operands. |
- virtual int OperandCount() { return 0; } |
- virtual HValue* OperandAt(int index) { |
- UNREACHABLE(); |
- return NULL; |
- } |
+ virtual int OperandCount() = 0; |
+ virtual HValue* OperandAt(int index) = 0; |
void SetOperandAt(int index, HValue* value); |
int LookupOperandIndex(int occurrence_index, HValue* op); |
@@ -626,7 +610,7 @@ |
virtual void RepresentationChanged(Representation to) { } |
virtual Range* InferRange(); |
virtual void DeleteFromGraph() = 0; |
- virtual void InternalSetOperandAt(int index, HValue* value) { UNREACHABLE(); } |
+ virtual void InternalSetOperandAt(int index, HValue* value) = 0; |
void clear_block() { |
ASSERT(block_ != NULL); |
block_ = NULL; |
@@ -690,6 +674,8 @@ |
// instruction. |
virtual bool IsCheckInstruction() const { return false; } |
+ virtual bool IsCall() { return false; } |
+ |
DECLARE_INSTRUCTION(Instruction) |
protected: |
@@ -716,17 +702,6 @@ |
}; |
-class HBlockEntry: public HInstruction { |
- public: |
- |
- virtual Representation RequiredInputRepresentation(int index) const { |
- return Representation::None(); |
- } |
- |
- DECLARE_CONCRETE_INSTRUCTION(BlockEntry, "block_entry") |
-}; |
- |
- |
class HControlInstruction: public HInstruction { |
public: |
HControlInstruction(HBasicBlock* first, HBasicBlock* second) |
@@ -746,23 +721,91 @@ |
}; |
-class HDeoptimize: public HControlInstruction { |
+template<int NumElements> |
+class HOperandContainer { |
public: |
- HDeoptimize() : HControlInstruction(NULL, NULL) { } |
+ HOperandContainer() : elems_() { } |
+ int length() { return NumElements; } |
+ HValue*& operator[](int i) { |
+ ASSERT(i < length()); |
+ return elems_[i]; |
+ } |
+ |
+ private: |
+ HValue* elems_[NumElements]; |
+}; |
+ |
+ |
+template<> |
+class HOperandContainer<0> { |
+ public: |
+ int length() { return 0; } |
+ HValue*& operator[](int i) { |
+ UNREACHABLE(); |
+ static HValue* t = 0; |
+ return t; |
+ } |
+}; |
+ |
+ |
+template<int V> |
+class HTemplateInstruction : public HInstruction { |
+ public: |
+ int OperandCount() { return V; } |
+ HValue* OperandAt(int i) { return inputs_[i]; } |
+ |
+ protected: |
+ void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; } |
+ |
+ private: |
+ HOperandContainer<V> inputs_; |
+}; |
+ |
+ |
+template<int V> |
+class HTemplateControlInstruction : public HControlInstruction { |
+ public: |
+ HTemplateControlInstruction<V>(HBasicBlock* first, HBasicBlock* second) |
+ : HControlInstruction(first, second) { } |
+ int OperandCount() { return V; } |
+ HValue* OperandAt(int i) { return inputs_[i]; } |
+ |
+ protected: |
+ void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; } |
+ |
+ private: |
+ HOperandContainer<V> inputs_; |
+}; |
+ |
+ |
+class HBlockEntry: public HTemplateInstruction<0> { |
+ public: |
virtual Representation RequiredInputRepresentation(int index) const { |
return Representation::None(); |
} |
+ DECLARE_CONCRETE_INSTRUCTION(BlockEntry, "block_entry") |
+}; |
+ |
+ |
+class HDeoptimize: public HTemplateControlInstruction<0> { |
+ public: |
+ HDeoptimize() : HTemplateControlInstruction<0>(NULL, NULL) { } |
+ |
+ virtual Representation RequiredInputRepresentation(int index) const { |
+ return Representation::None(); |
+ } |
+ |
DECLARE_CONCRETE_INSTRUCTION(Deoptimize, "deoptimize") |
}; |
-class HGoto: public HControlInstruction { |
+class HGoto: public HTemplateControlInstruction<0> { |
public: |
explicit HGoto(HBasicBlock* target) |
- : HControlInstruction(target, NULL), include_stack_check_(false) { |
- } |
+ : HTemplateControlInstruction<0>(target, NULL), |
+ include_stack_check_(false) { } |
void set_include_stack_check(bool include_stack_check) { |
include_stack_check_ = include_stack_check; |
@@ -780,30 +823,20 @@ |
}; |
-class HUnaryControlInstruction: public HControlInstruction { |
+class HUnaryControlInstruction: public HTemplateControlInstruction<1> { |
public: |
explicit HUnaryControlInstruction(HValue* value, |
HBasicBlock* true_target, |
HBasicBlock* false_target) |
- : HControlInstruction(true_target, false_target) { |
+ : HTemplateControlInstruction<1>(true_target, false_target) { |
SetOperandAt(0, value); |
} |
virtual void PrintDataTo(StringStream* stream); |
HValue* value() { return OperandAt(0); } |
- virtual int OperandCount() { return 1; } |
- virtual HValue* OperandAt(int index) { return operands_[index]; } |
DECLARE_INSTRUCTION(UnaryControlInstruction) |
- |
- protected: |
- virtual void InternalSetOperandAt(int index, HValue* value) { |
- operands_[index] = value; |
- } |
- |
- private: |
- HOperandVector<1> operands_; |
}; |
@@ -864,9 +897,9 @@ |
}; |
-class HAbnormalExit: public HControlInstruction { |
+class HAbnormalExit: public HTemplateControlInstruction<0> { |
public: |
- HAbnormalExit() : HControlInstruction(NULL, NULL) { } |
+ HAbnormalExit() : HTemplateControlInstruction<0>(NULL, NULL) { } |
virtual Representation RequiredInputRepresentation(int index) const { |
return Representation::None(); |
@@ -876,7 +909,7 @@ |
}; |
-class HUnaryOperation: public HInstruction { |
+class HUnaryOperation: public HTemplateInstruction<1> { |
public: |
explicit HUnaryOperation(HValue* value) { |
SetOperandAt(0, value); |
@@ -884,18 +917,8 @@ |
HValue* value() { return OperandAt(0); } |
virtual void PrintDataTo(StringStream* stream); |
- virtual int OperandCount() { return 1; } |
- virtual HValue* OperandAt(int index) { return operands_[index]; } |
DECLARE_INSTRUCTION(UnaryOperation) |
- |
- protected: |
- virtual void InternalSetOperandAt(int index, HValue* value) { |
- operands_[index] = value; |
- } |
- |
- private: |
- HOperandVector<1> operands_; |
}; |
@@ -1036,7 +1059,7 @@ |
}; |
-class HStackCheck: public HInstruction { |
+class HStackCheck: public HTemplateInstruction<0> { |
public: |
HStackCheck() { } |
@@ -1048,7 +1071,7 @@ |
}; |
-class HEnterInlined: public HInstruction { |
+class HEnterInlined: public HTemplateInstruction<0> { |
public: |
HEnterInlined(Handle<JSFunction> closure, FunctionLiteral* function) |
: closure_(closure), function_(function) { |
@@ -1071,7 +1094,7 @@ |
}; |
-class HLeaveInlined: public HInstruction { |
+class HLeaveInlined: public HTemplateInstruction<0> { |
public: |
HLeaveInlined() {} |
@@ -1099,7 +1122,7 @@ |
}; |
-class HContext: public HInstruction { |
+class HContext: public HTemplateInstruction<0> { |
public: |
HContext() { |
set_representation(Representation::Tagged()); |
@@ -1172,89 +1195,70 @@ |
}; |
-class HCall: public HInstruction { |
+template <int V> |
+class HCall: public HTemplateInstruction<V> { |
public: |
// The argument count includes the receiver. |
- explicit HCall(int argument_count) : argument_count_(argument_count) { |
- set_representation(Representation::Tagged()); |
- SetAllSideEffects(); |
+ explicit HCall<V>(int argument_count) : argument_count_(argument_count) { |
+ this->set_representation(Representation::Tagged()); |
+ this->SetAllSideEffects(); |
} |
virtual HType CalculateInferredType() { return HType::Tagged(); } |
virtual int argument_count() const { return argument_count_; } |
- virtual void PrintDataTo(StringStream* stream); |
+ virtual bool IsCall() { return true; } |
- DECLARE_INSTRUCTION(Call) |
- |
private: |
int argument_count_; |
}; |
-class HUnaryCall: public HCall { |
+class HUnaryCall: public HCall<1> { |
public: |
HUnaryCall(HValue* value, int argument_count) |
- : HCall(argument_count), value_(NULL) { |
+ : HCall<1>(argument_count) { |
SetOperandAt(0, value); |
} |
- virtual void PrintDataTo(StringStream* stream); |
- |
- HValue* value() { return value_; } |
- |
- virtual int OperandCount() { return 1; } |
- virtual HValue* OperandAt(int index) { |
- ASSERT(index == 0); |
- return value_; |
+ virtual Representation RequiredInputRepresentation(int index) const { |
+ return Representation::Tagged(); |
} |
- DECLARE_INSTRUCTION(UnaryCall) |
+ virtual void PrintDataTo(StringStream* stream); |
- protected: |
- virtual void InternalSetOperandAt(int index, HValue* value) { |
- ASSERT(index == 0); |
- value_ = value; |
- } |
+ HValue* value() { return OperandAt(0); } |
- private: |
- HValue* value_; |
+ DECLARE_INSTRUCTION(UnaryCall) |
}; |
-class HBinaryCall: public HCall { |
+class HBinaryCall: public HCall<2> { |
public: |
HBinaryCall(HValue* first, HValue* second, int argument_count) |
- : HCall(argument_count) { |
+ : HCall<2>(argument_count) { |
SetOperandAt(0, first); |
SetOperandAt(1, second); |
} |
virtual void PrintDataTo(StringStream* stream); |
- HValue* first() const { return operands_[0]; } |
- HValue* second() const { return operands_[1]; } |
+ virtual Representation RequiredInputRepresentation(int index) const { |
+ return Representation::Tagged(); |
+ } |
- virtual int OperandCount() { return 2; } |
- virtual HValue* OperandAt(int index) { return operands_[index]; } |
+ HValue* first() { return OperandAt(0); } |
+ HValue* second() { return OperandAt(1); } |
DECLARE_INSTRUCTION(BinaryCall) |
- |
- protected: |
- virtual void InternalSetOperandAt(int index, HValue* value) { |
- operands_[index] = value; |
- } |
- |
- private: |
- HOperandVector<2> operands_; |
}; |
-class HCallConstantFunction: public HCall { |
+class HCallConstantFunction: public HCall<0> { |
public: |
HCallConstantFunction(Handle<JSFunction> function, int argument_count) |
- : HCall(argument_count), function_(function) { } |
+ : HCall<0>(argument_count), function_(function) { } |
Handle<JSFunction> function() const { return function_; } |
@@ -1285,8 +1289,8 @@ |
return Representation::Tagged(); |
} |
- HValue* context() const { return first(); } |
- HValue* key() const { return second(); } |
+ HValue* context() { return first(); } |
+ HValue* key() { return second(); } |
DECLARE_CONCRETE_INSTRUCTION(CallKeyed, "call_keyed") |
}; |
@@ -1352,10 +1356,10 @@ |
}; |
-class HCallKnownGlobal: public HCall { |
+class HCallKnownGlobal: public HCall<0> { |
public: |
HCallKnownGlobal(Handle<JSFunction> target, int argument_count) |
- : HCall(argument_count), target_(target) { } |
+ : HCall<0>(argument_count), target_(target) { } |
virtual void PrintDataTo(StringStream* stream); |
@@ -1382,19 +1386,19 @@ |
return Representation::Tagged(); |
} |
- HValue* context() const { return first(); } |
- HValue* constructor() const { return second(); } |
+ HValue* context() { return first(); } |
+ HValue* constructor() { return second(); } |
DECLARE_CONCRETE_INSTRUCTION(CallNew, "call_new") |
}; |
-class HCallRuntime: public HCall { |
+class HCallRuntime: public HCall<0> { |
public: |
HCallRuntime(Handle<String> name, |
Runtime::Function* c_function, |
int argument_count) |
- : HCall(argument_count), c_function_(c_function), name_(name) { } |
+ : HCall<0>(argument_count), c_function_(c_function), name_(name) { } |
virtual void PrintDataTo(StringStream* stream); |
Runtime::Function* function() const { return c_function_; } |
@@ -1761,7 +1765,7 @@ |
}; |
-class HCheckPrototypeMaps: public HInstruction { |
+class HCheckPrototypeMaps: public HTemplateInstruction<0> { |
public: |
HCheckPrototypeMaps(Handle<JSObject> prototype, Handle<JSObject> holder) |
: prototype_(prototype), holder_(holder) { |
@@ -1923,7 +1927,7 @@ |
}; |
-class HArgumentsObject: public HInstruction { |
+class HArgumentsObject: public HTemplateInstruction<0> { |
public: |
HArgumentsObject() { |
set_representation(Representation::Tagged()); |
@@ -1938,7 +1942,7 @@ |
}; |
-class HConstant: public HInstruction { |
+class HConstant: public HTemplateInstruction<0> { |
public: |
HConstant(Handle<Object> handle, Representation r); |
@@ -2001,7 +2005,7 @@ |
}; |
-class HBinaryOperation: public HInstruction { |
+class HBinaryOperation: public HTemplateInstruction<2> { |
public: |
HBinaryOperation(HValue* left, HValue* right) { |
ASSERT(left != NULL && right != NULL); |
@@ -2026,21 +2030,12 @@ |
virtual bool IsCommutative() const { return false; } |
virtual void PrintDataTo(StringStream* stream); |
- virtual int OperandCount() { return operands_.length(); } |
- virtual HValue* OperandAt(int index) { return operands_[index]; } |
DECLARE_INSTRUCTION(BinaryOperation) |
- |
- protected: |
- virtual void InternalSetOperandAt(int index, HValue* value) { |
- operands_[index] = value; |
- } |
- |
- HOperandVector<2> operands_; |
}; |
-class HApplyArguments: public HInstruction { |
+class HApplyArguments: public HTemplateInstruction<4> { |
public: |
HApplyArguments(HValue* function, |
HValue* receiver, |
@@ -2066,22 +2061,11 @@ |
HValue* length() { return OperandAt(2); } |
HValue* elements() { return OperandAt(3); } |
- virtual int OperandCount() { return operands_.length(); } |
- virtual HValue* OperandAt(int index) { return operands_[index]; } |
- |
DECLARE_CONCRETE_INSTRUCTION(ApplyArguments, "apply_arguments") |
- |
- protected: |
- virtual void InternalSetOperandAt(int index, HValue* value) { |
- operands_[index] = value; |
- } |
- |
- private: |
- HOperandVector<4> operands_; |
}; |
-class HArgumentsElements: public HInstruction { |
+class HArgumentsElements: public HTemplateInstruction<0> { |
public: |
HArgumentsElements() { |
// The value produced by this instruction is a pointer into the stack |
@@ -2108,18 +2092,18 @@ |
SetFlag(kUseGVN); |
} |
- DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength, "arguments_length") |
- |
virtual Representation RequiredInputRepresentation(int index) const { |
return Representation::Tagged(); |
} |
+ DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength, "arguments_length") |
+ |
protected: |
virtual bool DataEquals(HValue* other) { return true; } |
}; |
-class HAccessArgumentsAt: public HInstruction { |
+class HAccessArgumentsAt: public HTemplateInstruction<3> { |
public: |
HAccessArgumentsAt(HValue* arguments, HValue* length, HValue* index) { |
set_representation(Representation::Tagged()); |
@@ -2138,24 +2122,13 @@ |
: Representation::Integer32(); |
} |
- HValue* arguments() { return operands_[0]; } |
- HValue* length() { return operands_[1]; } |
- HValue* index() { return operands_[2]; } |
+ HValue* arguments() { return OperandAt(0); } |
+ HValue* length() { return OperandAt(1); } |
+ HValue* index() { return OperandAt(2); } |
- virtual int OperandCount() { return operands_.length(); } |
- virtual HValue* OperandAt(int index) { return operands_[index]; } |
- |
DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt, "access_arguments_at") |
- protected: |
- virtual void InternalSetOperandAt(int index, HValue* value) { |
- operands_[index] = value; |
- } |
- |
virtual bool DataEquals(HValue* other) { return true; } |
- |
- private: |
- HOperandVector<3> operands_; |
}; |
@@ -2373,7 +2346,7 @@ |
}; |
-class HIsConstructCall: public HInstruction { |
+class HIsConstructCall: public HTemplateInstruction<0> { |
public: |
HIsConstructCall() { |
set_representation(Representation::Tagged()); |
@@ -2488,7 +2461,7 @@ |
}; |
-class HInstanceOf: public HInstruction { |
+class HInstanceOf: public HTemplateInstruction<3> { |
public: |
HInstanceOf(HValue* context, HValue* left, HValue* right) { |
SetOperandAt(0, context); |
@@ -2498,9 +2471,9 @@ |
SetAllSideEffects(); |
} |
- HValue* context() { return operands_[0]; } |
- HValue* left() { return operands_[1]; } |
- HValue* right() { return operands_[2]; } |
+ HValue* context() { return OperandAt(0); } |
+ HValue* left() { return OperandAt(1); } |
+ HValue* right() { return OperandAt(2); } |
virtual bool EmitAtUses() const { |
return !HasSideEffects() && (uses()->length() <= 1); |
@@ -2512,18 +2485,7 @@ |
virtual void PrintDataTo(StringStream* stream); |
- virtual int OperandCount() { return 3; } |
- virtual HValue* OperandAt(int index) { return operands_[index]; } |
- |
DECLARE_CONCRETE_INSTRUCTION(InstanceOf, "instance_of") |
- |
- protected: |
- virtual void InternalSetOperandAt(int index, HValue* value) { |
- operands_[index] = value; |
- } |
- |
- private: |
- HOperandVector<3> operands_; |
}; |
@@ -2760,7 +2722,7 @@ |
}; |
-class HOsrEntry: public HInstruction { |
+class HOsrEntry: public HTemplateInstruction<0> { |
public: |
explicit HOsrEntry(int ast_id) : ast_id_(ast_id) { |
SetFlag(kChangesOsrEntries); |
@@ -2779,7 +2741,7 @@ |
}; |
-class HParameter: public HInstruction { |
+class HParameter: public HTemplateInstruction<0> { |
public: |
explicit HParameter(unsigned index) : index_(index) { |
set_representation(Representation::Tagged()); |
@@ -2833,7 +2795,7 @@ |
}; |
-class HUnknownOSRValue: public HInstruction { |
+class HUnknownOSRValue: public HTemplateInstruction<0> { |
public: |
HUnknownOSRValue() { set_representation(Representation::Tagged()); } |
@@ -2845,7 +2807,7 @@ |
}; |
-class HLoadGlobal: public HInstruction { |
+class HLoadGlobal: public HTemplateInstruction<0> { |
public: |
HLoadGlobal(Handle<JSGlobalPropertyCell> cell, bool check_hole_value) |
: cell_(cell), check_hole_value_(check_hole_value) { |
@@ -3056,37 +3018,25 @@ |
}; |
-class HLoadKeyed: public HBinaryOperation { |
+class HLoadKeyedFastElement: public HBinaryOperation { |
public: |
- HLoadKeyed(HValue* obj, HValue* key) : HBinaryOperation(obj, key) { |
+ HLoadKeyedFastElement(HValue* obj, HValue* key) : HBinaryOperation(obj, key) { |
set_representation(Representation::Tagged()); |
+ SetFlag(kDependsOnArrayElements); |
+ SetFlag(kUseGVN); |
} |
- virtual void PrintDataTo(StringStream* stream); |
- |
- virtual Representation RequiredInputRepresentation(int index) const { |
- return Representation::Tagged(); |
- } |
HValue* object() { return OperandAt(0); } |
HValue* key() { return OperandAt(1); } |
- DECLARE_INSTRUCTION(LoadKeyed) |
-}; |
- |
- |
-class HLoadKeyedFastElement: public HLoadKeyed { |
- public: |
- HLoadKeyedFastElement(HValue* obj, HValue* key) : HLoadKeyed(obj, key) { |
- SetFlag(kDependsOnArrayElements); |
- SetFlag(kUseGVN); |
- } |
- |
virtual Representation RequiredInputRepresentation(int index) const { |
// The key is supposed to be Integer32. |
return (index == 1) ? Representation::Integer32() |
: Representation::Tagged(); |
} |
+ virtual void PrintDataTo(StringStream* stream); |
+ |
DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastElement, |
"load_keyed_fast_element") |
@@ -3126,65 +3076,39 @@ |
}; |
-class HLoadKeyedGeneric: public HLoadKeyed { |
+class HLoadKeyedGeneric: public HTemplateInstruction<3> { |
public: |
- HLoadKeyedGeneric(HContext* context, HValue* obj, HValue* key) |
- : HLoadKeyed(obj, key), context_(NULL) { |
+ HLoadKeyedGeneric(HContext* context, HValue* obj, HValue* key) { |
+ set_representation(Representation::Tagged()); |
+ SetOperandAt(0, obj); |
+ SetOperandAt(1, key); |
SetOperandAt(2, context); |
SetAllSideEffects(); |
} |
- HValue* context() const { return context_; } |
- HValue* object() { return operands_[0]; } |
- HValue* key() { return operands_[1]; } |
+ HValue* object() { return OperandAt(0); } |
+ HValue* key() { return OperandAt(1); } |
+ HValue* context() { return OperandAt(2); } |
- virtual int OperandCount() { return 3; } |
- virtual HValue* OperandAt(int index) { |
- return (index < 2) ? operands_[index] : context_; |
- } |
+ virtual void PrintDataTo(StringStream* stream); |
- DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric, "load_keyed_generic") |
- |
- protected: |
- virtual void InternalSetOperandAt(int index, HValue* value); |
- |
- private: |
- HValue* context_; |
-}; |
- |
- |
-class HStoreNamed: public HBinaryOperation { |
- public: |
- HStoreNamed(HValue* obj, Handle<String> name, HValue* val) |
- : HBinaryOperation(obj, val), name_(name) { |
- } |
- |
virtual Representation RequiredInputRepresentation(int index) const { |
return Representation::Tagged(); |
} |
- virtual void PrintDataTo(StringStream* stream); |
- |
- HValue* object() { return OperandAt(0); } |
- Handle<String> name() const { return name_; } |
- HValue* value() { return OperandAt(1); } |
- void set_value(HValue* value) { SetOperandAt(1, value); } |
- |
- DECLARE_INSTRUCTION(StoreNamed) |
- |
- private: |
- Handle<String> name_; |
+ DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric, "load_keyed_generic") |
}; |
-class HStoreNamedField: public HStoreNamed { |
+class HStoreNamedField: public HBinaryOperation { |
public: |
HStoreNamedField(HValue* obj, |
Handle<String> name, |
HValue* val, |
bool in_object, |
int offset) |
- : HStoreNamed(obj, name, val), |
+ : HBinaryOperation(obj, val), |
+ name_(name), |
is_in_object_(in_object), |
offset_(offset) { |
if (is_in_object_) { |
@@ -3201,6 +3125,10 @@ |
} |
virtual void PrintDataTo(StringStream* stream); |
+ HValue* object() { return OperandAt(0); } |
+ HValue* value() { return OperandAt(1); } |
+ |
+ Handle<String> name() const { return name_; } |
bool is_in_object() const { return is_in_object_; } |
int offset() const { return offset_; } |
Handle<Map> transition() const { return transition_; } |
@@ -3211,57 +3139,57 @@ |
} |
private: |
+ Handle<String> name_; |
bool is_in_object_; |
int offset_; |
Handle<Map> transition_; |
}; |
-class HStoreNamedGeneric: public HStoreNamed { |
+class HStoreNamedGeneric: public HTemplateInstruction<3> { |
public: |
HStoreNamedGeneric(HValue* context, |
HValue* object, |
Handle<String> name, |
HValue* value) |
- : HStoreNamed(object, name, value), context_(NULL) { |
+ : name_(name) { |
+ SetOperandAt(0, object); |
+ SetOperandAt(1, value); |
SetOperandAt(2, context); |
SetAllSideEffects(); |
} |
- HValue* context() const { return context_; } |
- HValue* object() const { return operands_[0]; } |
- HValue* value() const { return operands_[1]; } |
+ HValue* object() { return OperandAt(0); } |
+ HValue* value() { return OperandAt(1); } |
+ HValue* context() { return OperandAt(2); } |
+ Handle<String> name() { return name_; } |
- virtual int OperandCount() { return 3; } |
+ virtual void PrintDataTo(StringStream* stream); |
- virtual HValue* OperandAt(int index) { |
- return (index < 2) ? operands_[index] : context_; |
+ virtual Representation RequiredInputRepresentation(int index) const { |
+ return Representation::Tagged(); |
} |
DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric, "store_named_generic") |
- protected: |
- virtual void InternalSetOperandAt(int index, HValue* value); |
- |
private: |
- HValue* context_; |
+ Handle<String> name_; |
}; |
-class HStoreKeyed: public HInstruction { |
+class HStoreKeyedFastElement: public HTemplateInstruction<3> { |
public: |
- HStoreKeyed(HValue* obj, HValue* key, HValue* val) { |
+ HStoreKeyedFastElement(HValue* obj, HValue* key, HValue* val) { |
SetOperandAt(0, obj); |
SetOperandAt(1, key); |
SetOperandAt(2, val); |
+ SetFlag(kChangesArrayElements); |
} |
- virtual void PrintDataTo(StringStream* stream); |
- virtual int OperandCount() { return operands_.length(); } |
- virtual HValue* OperandAt(int index) { return operands_[index]; } |
- |
virtual Representation RequiredInputRepresentation(int index) const { |
- return Representation::Tagged(); |
+ // The key is supposed to be Integer32. |
+ return (index == 1) ? Representation::Integer32() |
+ : Representation::Tagged(); |
} |
HValue* object() { return OperandAt(0); } |
@@ -3272,36 +3200,14 @@ |
return StoringValueNeedsWriteBarrier(value()); |
} |
- DECLARE_INSTRUCTION(StoreKeyed) |
+ virtual void PrintDataTo(StringStream* stream); |
- protected: |
- virtual void InternalSetOperandAt(int index, HValue* value) { |
- operands_[index] = value; |
- } |
- |
- HOperandVector<3> operands_; |
-}; |
- |
- |
-class HStoreKeyedFastElement: public HStoreKeyed { |
- public: |
- HStoreKeyedFastElement(HValue* obj, HValue* key, HValue* val) |
- : HStoreKeyed(obj, key, val) { |
- SetFlag(kChangesArrayElements); |
- } |
- |
- virtual Representation RequiredInputRepresentation(int index) const { |
- // The key is supposed to be Integer32. |
- return (index == 1) ? Representation::Integer32() |
- : Representation::Tagged(); |
- } |
- |
DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastElement, |
"store_keyed_fast_element") |
}; |
-class HStorePixelArrayElement: public HInstruction { |
+class HStorePixelArrayElement: public HTemplateInstruction<3> { |
public: |
HStorePixelArrayElement(HValue* external_elements, HValue* key, HValue* val) { |
SetFlag(kChangesPixelArrayElements); |
@@ -3311,8 +3217,6 @@ |
} |
virtual void PrintDataTo(StringStream* stream); |
- virtual int OperandCount() { return operands_.length(); } |
- virtual HValue* OperandAt(int index) { return operands_[index]; } |
virtual Representation RequiredInputRepresentation(int index) const { |
if (index == 0) { |
@@ -3322,51 +3226,40 @@ |
} |
} |
- HValue* external_pointer() { return operands_[0]; } |
- HValue* key() { return operands_[1]; } |
- HValue* value() { return operands_[2]; } |
+ HValue* external_pointer() { return OperandAt(0); } |
+ HValue* key() { return OperandAt(1); } |
+ HValue* value() { return OperandAt(2); } |
DECLARE_CONCRETE_INSTRUCTION(StorePixelArrayElement, |
"store_pixel_array_element") |
- |
- protected: |
- virtual void InternalSetOperandAt(int index, HValue* value) { |
- operands_[index] = value; |
- } |
- |
- HOperandVector<3> operands_; |
}; |
-class HStoreKeyedGeneric: public HStoreKeyed { |
+class HStoreKeyedGeneric: public HTemplateInstruction<4> { |
public: |
HStoreKeyedGeneric(HValue* context, |
HValue* object, |
HValue* key, |
- HValue* value) |
- : HStoreKeyed(object, key, value), context_(NULL) { |
+ HValue* value) { |
+ SetOperandAt(0, object); |
+ SetOperandAt(1, key); |
+ SetOperandAt(2, value); |
SetOperandAt(3, context); |
SetAllSideEffects(); |
} |
- HValue* context() { return context_; } |
- HValue* object() { return operands_[0]; } |
- HValue* key() { return operands_[1]; } |
- HValue* value() { return operands_[2]; } |
+ HValue* object() { return OperandAt(0); } |
+ HValue* key() { return OperandAt(1); } |
+ HValue* value() { return OperandAt(2); } |
+ HValue* context() { return OperandAt(3); } |
- virtual int OperandCount() { return 4; } |
- |
- virtual HValue* OperandAt(int index) { |
- return (index < 3) ? operands_[index] : context_; |
+ virtual Representation RequiredInputRepresentation(int index) const { |
+ return Representation::Tagged(); |
} |
- DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric, "store_keyed_generic") |
+ virtual void PrintDataTo(StringStream* stream); |
- protected: |
- virtual void InternalSetOperandAt(int index, HValue* value); |
- |
- private: |
- HValue* context_; |
+ DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric, "store_keyed_generic") |
}; |
@@ -3425,31 +3318,30 @@ |
}; |
-class HMaterializedLiteral: public HInstruction { |
+template <int V> |
+class HMaterializedLiteral: public HTemplateInstruction<V> { |
public: |
- HMaterializedLiteral(int index, int depth) |
+ HMaterializedLiteral<V>(int index, int depth) |
: literal_index_(index), depth_(depth) { |
- set_representation(Representation::Tagged()); |
+ this->set_representation(Representation::Tagged()); |
} |
int literal_index() const { return literal_index_; } |
int depth() const { return depth_; } |
- DECLARE_INSTRUCTION(MaterializedLiteral) |
- |
private: |
int literal_index_; |
int depth_; |
}; |
-class HArrayLiteral: public HMaterializedLiteral { |
+class HArrayLiteral: public HMaterializedLiteral<0> { |
public: |
HArrayLiteral(Handle<FixedArray> constant_elements, |
int length, |
int literal_index, |
int depth) |
- : HMaterializedLiteral(literal_index, depth), |
+ : HMaterializedLiteral<0>(literal_index, depth), |
length_(length), |
constant_elements_(constant_elements) {} |
@@ -3470,53 +3362,43 @@ |
}; |
-class HObjectLiteral: public HMaterializedLiteral { |
+class HObjectLiteral: public HMaterializedLiteral<1> { |
public: |
HObjectLiteral(HValue* context, |
Handle<FixedArray> constant_properties, |
bool fast_elements, |
int literal_index, |
int depth) |
- : HMaterializedLiteral(literal_index, depth), |
- context_(NULL), |
+ : HMaterializedLiteral<1>(literal_index, depth), |
constant_properties_(constant_properties), |
fast_elements_(fast_elements) { |
SetOperandAt(0, context); |
} |
- HValue* context() const { return context_; } |
+ HValue* context() { return OperandAt(0); } |
Handle<FixedArray> constant_properties() const { |
return constant_properties_; |
} |
bool fast_elements() const { return fast_elements_; } |
- virtual int OperandCount() { return 1; } |
- virtual HValue* OperandAt(int index) { return context_; } |
- |
virtual Representation RequiredInputRepresentation(int index) const { |
return Representation::Tagged(); |
} |
DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral, "object_literal") |
- protected: |
- virtual void InternalSetOperandAt(int index, HValue* value) { |
- context_ = value; |
- } |
- |
private: |
- HValue* context_; |
Handle<FixedArray> constant_properties_; |
bool fast_elements_; |
}; |
-class HRegExpLiteral: public HMaterializedLiteral { |
+class HRegExpLiteral: public HMaterializedLiteral<0> { |
public: |
HRegExpLiteral(Handle<String> pattern, |
Handle<String> flags, |
int literal_index) |
- : HMaterializedLiteral(literal_index, 0), |
+ : HMaterializedLiteral<0>(literal_index, 0), |
pattern_(pattern), |
flags_(flags) { } |
@@ -3535,7 +3417,7 @@ |
}; |
-class HFunctionLiteral: public HInstruction { |
+class HFunctionLiteral: public HTemplateInstruction<0> { |
public: |
HFunctionLiteral(Handle<SharedFunctionInfo> shared, bool pretenure) |
: shared_info_(shared), pretenure_(pretenure) { |