Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index decc62705b28808de6ca0f78b66fc503421dbc5e..ebb5e5024885ed647ad3e3468f82bb4cd2e512ef 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -206,6 +206,7 @@ class LChunkBuilder; |
V(Calls) \ |
V(InobjectFields) \ |
V(BackingStoreFields) \ |
+ V(DoubleFields) \ |
V(ElementsKind) \ |
V(ElementsPointer) \ |
V(ArrayElements) \ |
@@ -5207,11 +5208,16 @@ class HLoadNamedField: public HTemplateInstruction<2> { |
set_representation(Representation::Tagged()); |
} |
SetFlag(kUseGVN); |
- SetGVNFlag(kDependsOnMaps); |
- if (is_in_object) { |
+ if (FLAG_track_double_fields && representation().IsDouble()) { |
+ ASSERT(is_in_object); |
+ ASSERT(offset == HeapNumber::kValueOffset); |
+ SetGVNFlag(kDependsOnDoubleFields); |
+ } else if (is_in_object) { |
SetGVNFlag(kDependsOnInobjectFields); |
+ SetGVNFlag(kDependsOnMaps); |
} else { |
SetGVNFlag(kDependsOnBackingStoreFields); |
+ SetGVNFlag(kDependsOnMaps); |
} |
} |
@@ -5551,7 +5557,7 @@ class HLoadKeyedGeneric: public HTemplateInstruction<3> { |
class HStoreNamedField: public HTemplateInstruction<2> { |
public: |
HStoreNamedField(HValue* obj, |
- Handle<String> name, |
+ Handle<Name> name, |
HValue* val, |
bool in_object, |
Representation field_representation, |
@@ -5565,18 +5571,25 @@ class HStoreNamedField: public HTemplateInstruction<2> { |
SetOperandAt(0, obj); |
SetOperandAt(1, val); |
SetFlag(kTrackSideEffectDominators); |
- SetGVNFlag(kDependsOnNewSpacePromotion); |
- if (is_in_object_) { |
+ if (FLAG_track_double_fields && field_representation.IsDouble()) { |
+ SetGVNFlag(kChangesDoubleFields); |
+ } else if (is_in_object_) { |
SetGVNFlag(kChangesInobjectFields); |
+ SetGVNFlag(kDependsOnNewSpacePromotion); |
} else { |
SetGVNFlag(kChangesBackingStoreFields); |
+ SetGVNFlag(kDependsOnNewSpacePromotion); |
} |
} |
DECLARE_CONCRETE_INSTRUCTION(StoreNamedField) |
virtual Representation RequiredInputRepresentation(int index) { |
- if (FLAG_track_fields && index == 1 && field_representation_.IsSmi()) { |
+ if (FLAG_track_double_fields && |
+ index == 1 && field_representation_.IsDouble()) { |
+ return field_representation_; |
+ } else if (FLAG_track_fields && |
+ index == 1 && field_representation_.IsSmi()) { |
return Representation::Integer32(); |
} |
return Representation::Tagged(); |
@@ -5590,7 +5603,7 @@ class HStoreNamedField: public HTemplateInstruction<2> { |
HValue* object() { return OperandAt(0); } |
HValue* value() { return OperandAt(1); } |
- Handle<String> name() const { return name_; } |
+ Handle<Name> name() const { return name_; } |
bool is_in_object() const { return is_in_object_; } |
int offset() const { return offset_; } |
Handle<Map> transition() const { return transition_; } |
@@ -5599,7 +5612,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()) || |
+ 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()) && |
ReceiverObjectNeedsWriteBarrier(object(), new_space_dominator()); |
} |
@@ -5617,7 +5634,7 @@ class HStoreNamedField: public HTemplateInstruction<2> { |
} |
private: |
- Handle<String> name_; |
+ Handle<Name> name_; |
bool is_in_object_; |
Representation field_representation_; |
int offset_; |