Chromium Code Reviews| Index: src/hydrogen-instructions.h |
| diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
| index 9d262fc811724c985c6ddc96697c218e6daab976..91e9e0390959e076a377484feffde8548f486933 100644 |
| --- a/src/hydrogen-instructions.h |
| +++ b/src/hydrogen-instructions.h |
| @@ -3946,15 +3946,25 @@ class HLoadFunctionPrototype: public HUnaryOperation { |
| virtual bool DataEquals(HValue* other) { return true; } |
| }; |
| +class ArrayInstructionInterface { |
| + public: |
| + virtual HValue* GetKey() = 0; |
| + virtual void SetKey(HValue* key) = 0; |
| + virtual void SetIndexOffset(uint32_t index_offset) = 0; |
| + virtual bool IsDehoisted() = 0; |
| + virtual void SetDehoisted(bool is_dehoisted) = 0; |
| + virtual ~ArrayInstructionInterface() { }; |
| +}; |
| -class HLoadKeyedFastElement: public HTemplateInstruction<2> { |
| +class HLoadKeyedFastElement |
| + : public HTemplateInstruction<2>, public ArrayInstructionInterface { |
| public: |
| enum HoleCheckMode { PERFORM_HOLE_CHECK, OMIT_HOLE_CHECK }; |
| HLoadKeyedFastElement(HValue* obj, |
| HValue* key, |
| HoleCheckMode hole_check_mode = PERFORM_HOLE_CHECK) |
| - : hole_check_mode_(hole_check_mode) { |
| + : hole_check_mode_(hole_check_mode), index_offset_(0) { |
|
Jakob Kummerow
2012/05/15 15:53:23
how about ", is_dehoisted_(false)"?
|
| SetOperandAt(0, obj); |
| SetOperandAt(1, key); |
| set_representation(Representation::Tagged()); |
| @@ -3964,6 +3974,12 @@ class HLoadKeyedFastElement: public HTemplateInstruction<2> { |
| HValue* object() { return OperandAt(0); } |
| HValue* key() { return OperandAt(1); } |
| + uint32_t index_offset() { return index_offset_; } |
| + void SetIndexOffset(uint32_t index_offset) { index_offset_ = index_offset; } |
| + HValue* GetKey() { return key(); } |
| + void SetKey(HValue* key) { SetOperandAt(1, key); } |
| + bool IsDehoisted() { return is_dehoisted_; } |
| + void SetDehoisted(bool is_dehoisted) { is_dehoisted_ = is_dehoisted; } |
| virtual Representation RequiredInputRepresentation(int index) { |
| // The key is supposed to be Integer32. |
| @@ -3987,12 +4003,16 @@ class HLoadKeyedFastElement: public HTemplateInstruction<2> { |
| private: |
| HoleCheckMode hole_check_mode_; |
| + uint32_t index_offset_; |
| + bool is_dehoisted_; |
| }; |
| -class HLoadKeyedFastDoubleElement: public HTemplateInstruction<2> { |
| +class HLoadKeyedFastDoubleElement |
| + : public HTemplateInstruction<2>, public ArrayInstructionInterface { |
| public: |
| - HLoadKeyedFastDoubleElement(HValue* elements, HValue* key) { |
| + HLoadKeyedFastDoubleElement(HValue* elements, HValue* key) |
| + : index_offset_(0) { |
| SetOperandAt(0, elements); |
| SetOperandAt(1, key); |
| set_representation(Representation::Double()); |
| @@ -4002,6 +4022,12 @@ class HLoadKeyedFastDoubleElement: public HTemplateInstruction<2> { |
| HValue* elements() { return OperandAt(0); } |
| HValue* key() { return OperandAt(1); } |
| + uint32_t index_offset() { return index_offset_; } |
| + void SetIndexOffset(uint32_t index_offset) { index_offset_ = index_offset; } |
| + HValue* GetKey() { return key(); } |
| + void SetKey(HValue* key) { SetOperandAt(1, key); } |
| + bool IsDehoisted() { return is_dehoisted_; } |
| + void SetDehoisted(bool is_dehoisted) { is_dehoisted_ = is_dehoisted; } |
| virtual Representation RequiredInputRepresentation(int index) { |
| // The key is supposed to be Integer32. |
| @@ -4016,15 +4042,20 @@ class HLoadKeyedFastDoubleElement: public HTemplateInstruction<2> { |
| protected: |
| virtual bool DataEquals(HValue* other) { return true; } |
| + |
| + private: |
| + uint32_t index_offset_; |
| + bool is_dehoisted_; |
| }; |
| -class HLoadKeyedSpecializedArrayElement: public HTemplateInstruction<2> { |
| +class HLoadKeyedSpecializedArrayElement |
| + : public HTemplateInstruction<2>, public ArrayInstructionInterface { |
| public: |
| HLoadKeyedSpecializedArrayElement(HValue* external_elements, |
| HValue* key, |
| ElementsKind elements_kind) |
| - : elements_kind_(elements_kind) { |
| + : elements_kind_(elements_kind), index_offset_(0) { |
| SetOperandAt(0, external_elements); |
| SetOperandAt(1, key); |
| if (elements_kind == EXTERNAL_FLOAT_ELEMENTS || |
| @@ -4052,6 +4083,12 @@ class HLoadKeyedSpecializedArrayElement: public HTemplateInstruction<2> { |
| HValue* external_pointer() { return OperandAt(0); } |
| HValue* key() { return OperandAt(1); } |
| ElementsKind elements_kind() const { return elements_kind_; } |
| + uint32_t index_offset() { return index_offset_; } |
| + void SetIndexOffset(uint32_t index_offset) { index_offset_ = index_offset; } |
| + HValue* GetKey() { return key(); } |
| + void SetKey(HValue* key) { SetOperandAt(1, key); } |
| + bool IsDehoisted() { return is_dehoisted_; } |
| + void SetDehoisted(bool is_dehoisted) { is_dehoisted_ = is_dehoisted; } |
| virtual Range* InferRange(Zone* zone); |
| @@ -4067,6 +4104,8 @@ class HLoadKeyedSpecializedArrayElement: public HTemplateInstruction<2> { |
| private: |
| ElementsKind elements_kind_; |
| + uint32_t index_offset_; |
| + bool is_dehoisted_; |
| }; |
| @@ -4188,11 +4227,12 @@ class HStoreNamedGeneric: public HTemplateInstruction<3> { |
| }; |
| -class HStoreKeyedFastElement: public HTemplateInstruction<3> { |
| +class HStoreKeyedFastElement |
| + : public HTemplateInstruction<3>, public ArrayInstructionInterface { |
| public: |
| HStoreKeyedFastElement(HValue* obj, HValue* key, HValue* val, |
| ElementsKind elements_kind = FAST_ELEMENTS) |
| - : elements_kind_(elements_kind) { |
| + : elements_kind_(elements_kind), index_offset_(0) { |
| SetOperandAt(0, obj); |
| SetOperandAt(1, key); |
| SetOperandAt(2, val); |
| @@ -4212,6 +4252,12 @@ class HStoreKeyedFastElement: public HTemplateInstruction<3> { |
| bool value_is_smi() { |
| return elements_kind_ == FAST_SMI_ONLY_ELEMENTS; |
| } |
| + uint32_t index_offset() { return index_offset_; } |
| + void SetIndexOffset(uint32_t index_offset) { index_offset_ = index_offset; } |
| + HValue* GetKey() { return key(); } |
| + void SetKey(HValue* key) { SetOperandAt(1, key); } |
| + bool IsDehoisted() { return is_dehoisted_; } |
| + void SetDehoisted(bool is_dehoisted) { is_dehoisted_ = is_dehoisted; } |
| bool NeedsWriteBarrier() { |
| if (value_is_smi()) { |
| @@ -4227,14 +4273,17 @@ class HStoreKeyedFastElement: public HTemplateInstruction<3> { |
| private: |
| ElementsKind elements_kind_; |
| + uint32_t index_offset_; |
| + bool is_dehoisted_; |
| }; |
| -class HStoreKeyedFastDoubleElement: public HTemplateInstruction<3> { |
| +class HStoreKeyedFastDoubleElement |
| + : public HTemplateInstruction<3>, public ArrayInstructionInterface { |
| public: |
| HStoreKeyedFastDoubleElement(HValue* elements, |
| HValue* key, |
| - HValue* val) { |
| + HValue* val) : index_offset_(0) { |
| SetOperandAt(0, elements); |
| SetOperandAt(1, key); |
| SetOperandAt(2, val); |
| @@ -4254,6 +4303,12 @@ class HStoreKeyedFastDoubleElement: public HTemplateInstruction<3> { |
| HValue* elements() { return OperandAt(0); } |
| HValue* key() { return OperandAt(1); } |
| HValue* value() { return OperandAt(2); } |
| + uint32_t index_offset() { return index_offset_; } |
| + void SetIndexOffset(uint32_t index_offset) { index_offset_ = index_offset; } |
| + HValue* GetKey() { return key(); } |
| + void SetKey(HValue* key) { SetOperandAt(1, key); } |
| + bool IsDehoisted() { return is_dehoisted_; } |
| + void SetDehoisted(bool is_dehoisted) { is_dehoisted_ = is_dehoisted; } |
| bool NeedsWriteBarrier() { |
| return StoringValueNeedsWriteBarrier(value()); |
| @@ -4264,16 +4319,21 @@ class HStoreKeyedFastDoubleElement: public HTemplateInstruction<3> { |
| virtual void PrintDataTo(StringStream* stream); |
| DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastDoubleElement) |
| + |
| + private: |
| + uint32_t index_offset_; |
| + bool is_dehoisted_; |
| }; |
| -class HStoreKeyedSpecializedArrayElement: public HTemplateInstruction<3> { |
| +class HStoreKeyedSpecializedArrayElement |
| + : public HTemplateInstruction<3>, public ArrayInstructionInterface { |
| public: |
| HStoreKeyedSpecializedArrayElement(HValue* external_elements, |
| HValue* key, |
| HValue* val, |
| ElementsKind elements_kind) |
| - : elements_kind_(elements_kind) { |
| + : elements_kind_(elements_kind), index_offset_(0) { |
| SetGVNFlag(kChangesSpecializedArrayElements); |
| SetOperandAt(0, external_elements); |
| SetOperandAt(1, key); |
| @@ -4301,11 +4361,19 @@ class HStoreKeyedSpecializedArrayElement: public HTemplateInstruction<3> { |
| HValue* key() { return OperandAt(1); } |
| HValue* value() { return OperandAt(2); } |
| ElementsKind elements_kind() const { return elements_kind_; } |
| + uint32_t index_offset() { return index_offset_; } |
| + void SetIndexOffset(uint32_t index_offset) { index_offset_ = index_offset; } |
| + HValue* GetKey() { return key(); } |
| + void SetKey(HValue* key) { SetOperandAt(1, key); } |
| + bool IsDehoisted() { return is_dehoisted_; } |
| + void SetDehoisted(bool is_dehoisted) { is_dehoisted_ = is_dehoisted; } |
| DECLARE_CONCRETE_INSTRUCTION(StoreKeyedSpecializedArrayElement) |
| private: |
| ElementsKind elements_kind_; |
| + uint32_t index_offset_; |
| + bool is_dehoisted_; |
| }; |