Chromium Code Reviews| Index: src/hydrogen-instructions.h |
| diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
| index 26bda87caa9b726e91a923ccacde00f9ac4c4c0e..a6f4211df77cdd82714b58c2c08249e259821559 100644 |
| --- a/src/hydrogen-instructions.h |
| +++ b/src/hydrogen-instructions.h |
| @@ -5281,24 +5281,37 @@ class HObjectAccess { |
| return OffsetField::decode(value_); |
| } |
| + inline Representation representation() const { |
| + return Representation::FromKind(RepresentationField::decode(value_)); |
| + } |
| + |
| inline Handle<String> name() const { |
| return name_; |
| } |
| + inline HObjectAccess WithRepresentation(Representation representation) { |
| + return HObjectAccess(portion(), offset(), representation, name()); |
| + } |
| + |
| static HObjectAccess ForHeapNumberValue() { |
| - return HObjectAccess(kDouble, HeapNumber::kValueOffset); |
| + return HObjectAccess( |
| + kDouble, HeapNumber::kValueOffset, Representation::Double()); |
| } |
| static HObjectAccess ForElementsPointer() { |
| return HObjectAccess(kElementsPointer, JSObject::kElementsOffset); |
| } |
| - static HObjectAccess ForArrayLength() { |
| - return HObjectAccess(kArrayLengths, JSArray::kLengthOffset); |
| + static HObjectAccess ForArrayLength(bool is_fast_elements = false) { |
| + return HObjectAccess( |
| + kArrayLengths, JSArray::kLengthOffset, is_fast_elements ? |
| + Representation::Smi() : Representation::Tagged()); |
|
danno
2013/07/08 11:12:25
You should probably gate using ::Smi() here and be
|
| } |
| - static HObjectAccess ForFixedArrayLength() { |
| - return HObjectAccess(kArrayLengths, FixedArray::kLengthOffset); |
| + static HObjectAccess ForFixedArrayLength(bool is_fast_elements = false) { |
| + return HObjectAccess( |
| + kArrayLengths, FixedArray::kLengthOffset, is_fast_elements ? |
| + Representation::Smi() : Representation::Tagged()); |
|
danno
2013/07/08 11:12:25
It's _always_ ::Smi() for FixedArrays, no need to
|
| } |
| static HObjectAccess ForPropertiesPointer() { |
| @@ -5321,13 +5334,15 @@ class HObjectAccess { |
| static HObjectAccess ForFixedArrayHeader(int offset); |
| // Create an access to an in-object property in a JSObject. |
| - static HObjectAccess ForJSObjectOffset(int offset); |
| + static HObjectAccess ForJSObjectOffset(int offset, |
| + Representation representation = Representation::Tagged()); |
| // Create an access to an in-object property in a JSArray. |
| static HObjectAccess ForJSArrayOffset(int offset); |
| // Create an access to the backing store of an object. |
| - static HObjectAccess ForBackingStoreOffset(int offset); |
| + static HObjectAccess ForBackingStoreOffset(int offset, |
| + Representation representation = Representation::Tagged()); |
| // Create an access to a resolved field (in-object or backing store). |
| static HObjectAccess ForField(Handle<Map> map, |
| @@ -5354,17 +5369,23 @@ class HObjectAccess { |
| }; |
| HObjectAccess(Portion portion, int offset, |
| - Handle<String> name = Handle<String>::null()) |
| - : value_(PortionField::encode(portion) | OffsetField::encode(offset)), |
| + Representation representation = Representation::Tagged(), |
| + Handle<String> name = Handle<String>::null()) |
| + : value_(PortionField::encode(portion) | |
| + RepresentationField::encode(representation.kind()) | |
| + OffsetField::encode(offset)), |
| name_(name) { |
| - ASSERT(this->offset() == offset); // offset should decode correctly |
| - ASSERT(this->portion() == portion); // portion should decode correctly |
| + // assert that the fields decode correctly |
| + ASSERT(this->offset() == offset); |
| + ASSERT(this->portion() == portion); |
| + ASSERT(RepresentationField::decode(value_) == representation.kind()); |
| } |
| class PortionField : public BitField<Portion, 0, 3> {}; |
| - class OffsetField : public BitField<int, 3, 29> {}; |
| + class RepresentationField : public BitField<Representation::Kind, 3, 3> {}; |
| + class OffsetField : public BitField<int, 6, 26> {}; |
| - uint32_t value_; // encodes both portion and offset |
| + uint32_t value_; // encodes portion, representation, and offset |
| Handle<String> name_; |
| friend class HLoadNamedField; |
| @@ -5380,22 +5401,20 @@ class HLoadNamedField: public HTemplateInstruction<2> { |
| public: |
| HLoadNamedField(HValue* object, |
| HObjectAccess access, |
| - HValue* typecheck = NULL, |
| - Representation field_representation |
| - = Representation::Tagged()) |
| - : access_(access), |
| - field_representation_(field_representation) { |
| + HValue* typecheck = NULL) |
| + : access_(access) { |
| ASSERT(object != NULL); |
| SetOperandAt(0, object); |
| SetOperandAt(1, typecheck != NULL ? typecheck : object); |
| - if (FLAG_track_fields && field_representation.IsSmi()) { |
| + Representation representation = access.representation(); |
| + if (representation.IsSmi()) { |
| set_type(HType::Smi()); |
| - set_representation(field_representation); |
| - } else if (FLAG_track_double_fields && field_representation.IsDouble()) { |
| - set_representation(field_representation); |
| + set_representation(representation); |
| + } else if (representation.IsDouble()) { |
| + set_representation(representation); |
| } else if (FLAG_track_heap_object_fields && |
| - field_representation.IsHeapObject()) { |
| + representation.IsHeapObject()) { |
| set_type(HType::NonPrimitive()); |
| set_representation(Representation::Tagged()); |
| } else { |
| @@ -5412,7 +5431,9 @@ class HLoadNamedField: public HTemplateInstruction<2> { |
| bool HasTypeCheck() const { return OperandAt(0) != OperandAt(1); } |
| HObjectAccess access() const { return access_; } |
| - Representation field_representation() const { return representation_; } |
| + Representation field_representation() const { |
| + return access_.representation(); |
| + } |
| virtual bool HasEscapingOperandAt(int index) { return false; } |
| virtual Representation RequiredInputRepresentation(int index) { |
| @@ -5432,7 +5453,6 @@ class HLoadNamedField: public HTemplateInstruction<2> { |
| virtual bool IsDeletable() const { return true; } |
| HObjectAccess access_; |
| - Representation field_representation_; |
| }; |
| @@ -5732,11 +5752,8 @@ class HStoreNamedField: public HTemplateInstruction<2> { |
| public: |
| HStoreNamedField(HValue* obj, |
| HObjectAccess access, |
| - HValue* val, |
| - Representation field_representation |
| - = Representation::Tagged()) |
| + HValue* val) |
| : access_(access), |
| - field_representation_(field_representation), |
| transition_(), |
| transition_unique_id_(), |
| new_space_dominator_(NULL) { |
| @@ -5749,12 +5766,10 @@ class HStoreNamedField: public HTemplateInstruction<2> { |
| virtual bool HasEscapingOperandAt(int index) { return index == 1; } |
| virtual Representation RequiredInputRepresentation(int index) { |
| - if (FLAG_track_double_fields && |
| - index == 1 && field_representation_.IsDouble()) { |
| - return field_representation_; |
| - } else if (FLAG_track_fields && |
| - index == 1 && field_representation_.IsSmi()) { |
| - return field_representation_; |
| + if (index == 1 && field_representation().IsDouble()) { |
| + return field_representation(); |
| + } else if (index == 1 && field_representation().IsSmi()) { |
| + return field_representation(); |
| } |
| return Representation::Tagged(); |
| } |
| @@ -5780,12 +5795,11 @@ class HStoreNamedField: public HTemplateInstruction<2> { |
| HValue* new_space_dominator() const { return new_space_dominator_; } |
| bool NeedsWriteBarrier() { |
| - ASSERT(!(FLAG_track_double_fields && field_representation_.IsDouble()) || |
| + ASSERT(!(FLAG_track_double_fields && field_representation().IsDouble()) || |
| transition_.is_null()); |
| - return (!FLAG_track_fields || !field_representation_.IsSmi()) && |
| - // If there is a transition, a new storage object needs to be allocated. |
| - !(FLAG_track_double_fields && field_representation_.IsDouble()) && |
| - StoringValueNeedsWriteBarrier(value()) && |
| + if (field_representation().IsDouble()) return false; |
| + if (field_representation().IsSmi()) return false; |
| + return StoringValueNeedsWriteBarrier(value()) && |
| ReceiverObjectNeedsWriteBarrier(object(), new_space_dominator()); |
| } |
| @@ -5798,12 +5812,11 @@ class HStoreNamedField: public HTemplateInstruction<2> { |
| } |
| Representation field_representation() const { |
| - return field_representation_; |
| + return access_.representation(); |
| } |
| private: |
| HObjectAccess access_; |
| - Representation field_representation_; |
| Handle<Map> transition_; |
| UniqueValueId transition_unique_id_; |
| HValue* new_space_dominator_; |