Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index 5396c53926f6c10cd3f87e305d16f67d47759515..780d57d61a795308aa5f20e11302733f73e77217 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -1848,7 +1848,9 @@ class HCallRuntime: public HCall<1> { |
class HJSArrayLength: public HTemplateInstruction<2> { |
public: |
- HJSArrayLength(HValue* value, HValue* typecheck) { |
+ HJSArrayLength(HValue* value, HValue* typecheck, |
+ HType type = HType::Tagged()) { |
+ set_type(type); |
// The length of an array is stored as a tagged value in the array |
// object. It is guaranteed to be 32 bit integer, but it can be |
// represented as either a smi or heap number. |
@@ -1872,7 +1874,7 @@ class HJSArrayLength: public HTemplateInstruction<2> { |
DECLARE_CONCRETE_INSTRUCTION(JSArrayLength) |
protected: |
- virtual bool DataEquals(HValue* other) { return true; } |
+ virtual bool DataEquals(HValue* other_raw) { return true; } |
}; |
@@ -3980,18 +3982,19 @@ class ArrayInstructionInterface { |
virtual ~ArrayInstructionInterface() { }; |
}; |
- |
-enum HoleCheckMode { PERFORM_HOLE_CHECK, OMIT_HOLE_CHECK }; |
- |
class HLoadKeyedFastElement |
: public HTemplateInstruction<2>, public ArrayInstructionInterface { |
public: |
HLoadKeyedFastElement(HValue* obj, |
HValue* key, |
- HoleCheckMode hole_check_mode = PERFORM_HOLE_CHECK) |
- : hole_check_mode_(hole_check_mode), |
- index_offset_(0), |
- is_dehoisted_(false) { |
+ ElementsKind elements_kind = FAST_ELEMENTS) |
+ : bit_field_(0) { |
+ ASSERT(IsFastSmiOrObjectElementsKind(elements_kind)); |
+ bit_field_ = ElementsKindField::encode(elements_kind); |
+ if (IsFastSmiElementsKind(elements_kind) && |
+ IsFastPackedElementsKind(elements_kind)) { |
+ set_type(HType::Smi()); |
+ } |
SetOperandAt(0, obj); |
SetOperandAt(1, key); |
set_representation(Representation::Tagged()); |
@@ -4001,12 +4004,19 @@ class HLoadKeyedFastElement |
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; } |
+ uint32_t index_offset() { return IndexOffsetField::decode(bit_field_); } |
+ void SetIndexOffset(uint32_t index_offset) { |
+ bit_field_ = IndexOffsetField::update(bit_field_, 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 IsDehoisted() { return IsDehoistedField::decode(bit_field_); } |
+ void SetDehoisted(bool is_dehoisted) { |
+ bit_field_ = IsDehoistedField::update(bit_field_, is_dehoisted); |
+ } |
+ ElementsKind elements_kind() const { |
+ return ElementsKindField::decode(bit_field_); |
+ } |
virtual Representation RequiredInputRepresentation(int index) { |
// The key is supposed to be Integer32. |
@@ -4025,18 +4035,22 @@ class HLoadKeyedFastElement |
virtual bool DataEquals(HValue* other) { |
if (!other->IsLoadKeyedFastElement()) return false; |
HLoadKeyedFastElement* other_load = HLoadKeyedFastElement::cast(other); |
- if (is_dehoisted_ && index_offset_ != other_load->index_offset_) |
+ if (IsDehoisted() && index_offset() != other_load->index_offset()) |
return false; |
- return hole_check_mode_ == other_load->hole_check_mode_; |
+ return elements_kind() == other_load->elements_kind(); |
} |
private: |
- HoleCheckMode hole_check_mode_; |
- uint32_t index_offset_; |
- bool is_dehoisted_; |
+ class ElementsKindField: public BitField<ElementsKind, 0, 4> {}; |
+ class IndexOffsetField: public BitField<uint32_t, 4, 27> {}; |
+ class IsDehoistedField: public BitField<bool, 31, 1> {}; |
+ uint32_t bit_field_; |
}; |
+enum HoleCheckMode { PERFORM_HOLE_CHECK, OMIT_HOLE_CHECK }; |
+ |
+ |
class HLoadKeyedFastDoubleElement |
: public HTemplateInstruction<2>, public ArrayInstructionInterface { |
public: |
@@ -4044,15 +4058,15 @@ class HLoadKeyedFastDoubleElement |
HValue* elements, |
HValue* key, |
HoleCheckMode hole_check_mode = PERFORM_HOLE_CHECK) |
- : index_offset_(0), |
- is_dehoisted_(false), |
- hole_check_mode_(hole_check_mode) { |
- SetOperandAt(0, elements); |
- SetOperandAt(1, key); |
- set_representation(Representation::Double()); |
+ : index_offset_(0), |
+ is_dehoisted_(false), |
+ hole_check_mode_(hole_check_mode) { |
+ SetOperandAt(0, elements); |
+ SetOperandAt(1, key); |
+ set_representation(Representation::Double()); |
SetGVNFlag(kDependsOnDoubleArrayElements); |
SetFlag(kUseGVN); |
- } |
+ } |
HValue* elements() { return OperandAt(0); } |
HValue* key() { return OperandAt(1); } |