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_; |