Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index 810a2fdd520d26e0d636e97ee470681210f293ac..5723d4a322adb96682fd07f674f64bde0f65f27c 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -1497,13 +1497,18 @@ class HCompareMap FINAL : public HUnaryControlInstruction { |
virtual std::ostream& PrintDataTo(std::ostream& os) const OVERRIDE; // NOLINT |
static const int kNoKnownSuccessorIndex = -1; |
- int known_successor_index() const { return known_successor_index_; } |
- void set_known_successor_index(int known_successor_index) { |
- known_successor_index_ = known_successor_index; |
+ int known_successor_index() const { |
+ return KnownSuccessorIndexField::decode(bit_field_) - |
+ kInternalKnownSuccessorOffset; |
+ } |
+ void set_known_successor_index(int index) { |
+ DCHECK(index >= 0 - kInternalKnownSuccessorOffset); |
+ bit_field_ = KnownSuccessorIndexField::update( |
+ bit_field_, index + kInternalKnownSuccessorOffset); |
} |
Unique<Map> map() const { return map_; } |
- bool map_is_stable() const { return map_is_stable_; } |
+ bool map_is_stable() const { return MapIsStableField::decode(bit_field_); } |
virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
return Representation::Tagged(); |
@@ -1515,19 +1520,25 @@ class HCompareMap FINAL : public HUnaryControlInstruction { |
virtual int RedefinedOperandIndex() OVERRIDE { return 0; } |
private: |
- HCompareMap(HValue* value, |
- Handle<Map> map, |
- HBasicBlock* true_target = NULL, |
+ HCompareMap(HValue* value, Handle<Map> map, HBasicBlock* true_target = NULL, |
HBasicBlock* false_target = NULL) |
: HUnaryControlInstruction(value, true_target, false_target), |
- known_successor_index_(kNoKnownSuccessorIndex), |
- map_is_stable_(map->is_stable()), |
+ bit_field_(KnownSuccessorIndexField::encode( |
+ kNoKnownSuccessorIndex + kInternalKnownSuccessorOffset) | |
+ MapIsStableField::encode(map->is_stable())), |
map_(Unique<Map>::CreateImmovable(map)) { |
set_representation(Representation::Tagged()); |
} |
- int known_successor_index_ : 31; |
- bool map_is_stable_ : 1; |
+ // BitFields can only store unsigned values, so use an offset. |
+ // Adding kInternalKnownSuccessorOffset must yield an unsigned value. |
+ static const int kInternalKnownSuccessorOffset = 1; |
+ STATIC_ASSERT(kNoKnownSuccessorIndex + kInternalKnownSuccessorOffset >= 0); |
+ |
+ class KnownSuccessorIndexField : public BitField<int, 0, 31> {}; |
+ class MapIsStableField : public BitField<bool, 31, 1> {}; |
+ |
+ uint32_t bit_field_; |
Unique<Map> map_; |
}; |
@@ -1803,17 +1814,15 @@ enum RemovableSimulate { |
class HSimulate FINAL : public HInstruction { |
public: |
- HSimulate(BailoutId ast_id, |
- int pop_count, |
- Zone* zone, |
+ HSimulate(BailoutId ast_id, int pop_count, Zone* zone, |
RemovableSimulate removable) |
: ast_id_(ast_id), |
pop_count_(pop_count), |
values_(2, zone), |
assigned_indexes_(2, zone), |
zone_(zone), |
- removable_(removable), |
- done_with_replay_(false) {} |
+ bit_field_(RemovableField::encode(removable) | |
+ DoneWithReplayField::encode(false)) {} |
~HSimulate() {} |
virtual std::ostream& PrintDataTo(std::ostream& os) const OVERRIDE; // NOLINT |
@@ -1857,7 +1866,9 @@ class HSimulate FINAL : public HInstruction { |
} |
void MergeWith(ZoneList<HSimulate*>* list); |
- bool is_candidate_for_removal() { return removable_ == REMOVABLE_SIMULATE; } |
+ bool is_candidate_for_removal() { |
+ return RemovableField::decode(bit_field_) == REMOVABLE_SIMULATE; |
+ } |
// Replay effects of this instruction on the given environment. |
void ReplayEnvironment(HEnvironment* env); |
@@ -1891,13 +1902,22 @@ class HSimulate FINAL : public HInstruction { |
} |
return false; |
} |
+ bool is_done_with_replay() const { |
+ return DoneWithReplayField::decode(bit_field_); |
+ } |
+ void set_done_with_replay() { |
+ bit_field_ = DoneWithReplayField::update(bit_field_, true); |
+ } |
+ |
+ class RemovableField : public BitField<RemovableSimulate, 0, 1> {}; |
+ class DoneWithReplayField : public BitField<bool, 1, 1> {}; |
+ |
BailoutId ast_id_; |
int pop_count_; |
ZoneList<HValue*> values_; |
ZoneList<int> assigned_indexes_; |
Zone* zone_; |
- RemovableSimulate removable_ : 2; |
- bool done_with_replay_ : 1; |
+ uint32_t bit_field_; |
#ifdef DEBUG |
Handle<JSFunction> closure_; |
@@ -2742,11 +2762,13 @@ class HCheckMaps FINAL : public HTemplateInstruction<2> { |
return new(zone) HCheckMaps(value, maps, typecheck); |
} |
- bool IsStabilityCheck() const { return is_stability_check_; } |
+ bool IsStabilityCheck() const { |
+ return IsStabilityCheckField::decode(bit_field_); |
+ } |
void MarkAsStabilityCheck() { |
- maps_are_stable_ = true; |
- has_migration_target_ = false; |
- is_stability_check_ = true; |
+ bit_field_ = MapsAreStableField::encode(true) | |
+ HasMigrationTargetField::encode(false) | |
+ IsStabilityCheckField::encode(true); |
ClearChangesFlag(kNewSpacePromotion); |
ClearDependsOnFlag(kElementsKind); |
ClearDependsOnFlag(kMaps); |
@@ -2770,9 +2792,13 @@ class HCheckMaps FINAL : public HTemplateInstruction<2> { |
const UniqueSet<Map>* maps() const { return maps_; } |
void set_maps(const UniqueSet<Map>* maps) { maps_ = maps; } |
- bool maps_are_stable() const { return maps_are_stable_; } |
+ bool maps_are_stable() const { |
+ return MapsAreStableField::decode(bit_field_); |
+ } |
- bool HasMigrationTarget() const { return has_migration_target_; } |
+ bool HasMigrationTarget() const { |
+ return HasMigrationTargetField::decode(bit_field_); |
+ } |
virtual HValue* Canonicalize() OVERRIDE; |
@@ -2804,9 +2830,11 @@ class HCheckMaps FINAL : public HTemplateInstruction<2> { |
private: |
HCheckMaps(HValue* value, const UniqueSet<Map>* maps, bool maps_are_stable) |
- : HTemplateInstruction<2>(HType::HeapObject()), maps_(maps), |
- has_migration_target_(false), is_stability_check_(false), |
- maps_are_stable_(maps_are_stable) { |
+ : HTemplateInstruction<2>(HType::HeapObject()), |
+ maps_(maps), |
+ bit_field_(HasMigrationTargetField::encode(false) | |
+ IsStabilityCheckField::encode(false) | |
+ MapsAreStableField::encode(maps_are_stable)) { |
DCHECK_NE(0, maps->size()); |
SetOperandAt(0, value); |
// Use the object value for the dependency. |
@@ -2818,9 +2846,11 @@ class HCheckMaps FINAL : public HTemplateInstruction<2> { |
} |
HCheckMaps(HValue* value, const UniqueSet<Map>* maps, HValue* typecheck) |
- : HTemplateInstruction<2>(HType::HeapObject()), maps_(maps), |
- has_migration_target_(false), is_stability_check_(false), |
- maps_are_stable_(true) { |
+ : HTemplateInstruction<2>(HType::HeapObject()), |
+ maps_(maps), |
+ bit_field_(HasMigrationTargetField::encode(false) | |
+ IsStabilityCheckField::encode(false) | |
+ MapsAreStableField::encode(true)) { |
DCHECK_NE(0, maps->size()); |
SetOperandAt(0, value); |
// Use the object value for the dependency if NULL is passed. |
@@ -2831,16 +2861,22 @@ class HCheckMaps FINAL : public HTemplateInstruction<2> { |
SetDependsOnFlag(kElementsKind); |
for (int i = 0; i < maps->size(); ++i) { |
Handle<Map> map = maps->at(i).handle(); |
- if (map->is_migration_target()) has_migration_target_ = true; |
- if (!map->is_stable()) maps_are_stable_ = false; |
+ if (map->is_migration_target()) { |
+ bit_field_ = HasMigrationTargetField::update(bit_field_, true); |
+ } |
+ if (!map->is_stable()) { |
+ bit_field_ = MapsAreStableField::update(bit_field_, false); |
+ } |
} |
- if (has_migration_target_) SetChangesFlag(kNewSpacePromotion); |
+ if (HasMigrationTarget()) SetChangesFlag(kNewSpacePromotion); |
} |
+ class HasMigrationTargetField : public BitField<bool, 0, 1> {}; |
+ class IsStabilityCheckField : public BitField<bool, 1, 1> {}; |
+ class MapsAreStableField : public BitField<bool, 2, 1> {}; |
+ |
const UniqueSet<Map>* maps_; |
- bool has_migration_target_ : 1; |
- bool is_stability_check_ : 1; |
- bool maps_are_stable_ : 1; |
+ uint32_t bit_field_; |
}; |
@@ -3537,29 +3573,26 @@ class HConstant FINAL : public HTemplateInstruction<0> { |
isolate->factory()->NewNumber(double_value_, TENURED)); |
} |
AllowDeferredHandleDereference smi_check; |
- DCHECK(has_int32_value_ || !object_.handle()->IsSmi()); |
+ DCHECK(HasInteger32Value() || !object_.handle()->IsSmi()); |
return object_.handle(); |
} |
bool IsSpecialDouble() const { |
- return has_double_value_ && |
+ return HasDoubleValue() && |
(bit_cast<int64_t>(double_value_) == bit_cast<int64_t>(-0.0) || |
FixedDoubleArray::is_the_hole_nan(double_value_) || |
std::isnan(double_value_)); |
} |
bool NotInNewSpace() const { |
- return is_not_in_new_space_; |
+ return IsNotInNewSpaceField::decode(bit_field_); |
} |
bool ImmortalImmovable() const; |
bool IsCell() const { |
- return instance_type_ == CELL_TYPE || instance_type_ == PROPERTY_CELL_TYPE; |
- } |
- |
- bool IsMap() const { |
- return instance_type_ == MAP_TYPE; |
+ InstanceType instance_type = GetInstanceType(); |
+ return instance_type == CELL_TYPE || instance_type == PROPERTY_CELL_TYPE; |
} |
virtual Representation RequiredInputRepresentation(int index) OVERRIDE { |
@@ -3579,13 +3612,17 @@ class HConstant FINAL : public HTemplateInstruction<0> { |
HConstant* CopyToRepresentation(Representation r, Zone* zone) const; |
Maybe<HConstant*> CopyToTruncatedInt32(Zone* zone); |
Maybe<HConstant*> CopyToTruncatedNumber(Zone* zone); |
- bool HasInteger32Value() const { return has_int32_value_; } |
+ bool HasInteger32Value() const { |
+ return HasInt32ValueField::decode(bit_field_); |
+ } |
int32_t Integer32Value() const { |
DCHECK(HasInteger32Value()); |
return int32_value_; |
} |
- bool HasSmiValue() const { return has_smi_value_; } |
- bool HasDoubleValue() const { return has_double_value_; } |
+ bool HasSmiValue() const { return HasSmiValueField::decode(bit_field_); } |
+ bool HasDoubleValue() const { |
+ return HasDoubleValueField::decode(bit_field_); |
+ } |
double DoubleValue() const { |
DCHECK(HasDoubleValue()); |
return double_value_; |
@@ -3597,7 +3634,7 @@ class HConstant FINAL : public HTemplateInstruction<0> { |
return object_.IsInitialized() && |
object_.IsKnownGlobal(isolate()->heap()->the_hole_value()); |
} |
- bool HasNumberValue() const { return has_double_value_; } |
+ bool HasNumberValue() const { return HasDoubleValue(); } |
int32_t NumberValueAsInteger32() const { |
DCHECK(HasNumberValue()); |
// Irrespective of whether a numeric HConstant can be safely |
@@ -3606,38 +3643,42 @@ class HConstant FINAL : public HTemplateInstruction<0> { |
return int32_value_; |
} |
bool HasStringValue() const { |
- if (has_double_value_ || has_int32_value_) return false; |
+ if (HasNumberValue()) return false; |
DCHECK(!object_.handle().is_null()); |
- return instance_type_ < FIRST_NONSTRING_TYPE; |
+ return GetInstanceType() < FIRST_NONSTRING_TYPE; |
} |
Handle<String> StringValue() const { |
DCHECK(HasStringValue()); |
return Handle<String>::cast(object_.handle()); |
} |
bool HasInternalizedStringValue() const { |
- return HasStringValue() && StringShape(instance_type_).IsInternalized(); |
+ return HasStringValue() && StringShape(GetInstanceType()).IsInternalized(); |
} |
bool HasExternalReferenceValue() const { |
- return has_external_reference_value_; |
+ return HasExternalReferenceValueField::decode(bit_field_); |
} |
ExternalReference ExternalReferenceValue() const { |
return external_reference_value_; |
} |
bool HasBooleanValue() const { return type_.IsBoolean(); } |
- bool BooleanValue() const { return boolean_value_; } |
- bool IsUndetectable() const { return is_undetectable_; } |
- InstanceType GetInstanceType() const { return instance_type_; } |
+ bool BooleanValue() const { return BooleanValueField::decode(bit_field_); } |
+ bool IsUndetectable() const { |
+ return IsUndetectableField::decode(bit_field_); |
+ } |
+ InstanceType GetInstanceType() const { |
+ return InstanceTypeField::decode(bit_field_); |
+ } |
- bool HasMapValue() const { return instance_type_ == MAP_TYPE; } |
+ bool HasMapValue() const { return GetInstanceType() == MAP_TYPE; } |
Unique<Map> MapValue() const { |
DCHECK(HasMapValue()); |
return Unique<Map>::cast(GetUnique()); |
} |
bool HasStableMapValue() const { |
- DCHECK(HasMapValue() || !has_stable_map_value_); |
- return has_stable_map_value_; |
+ DCHECK(HasMapValue() || !HasStableMapValueField::decode(bit_field_)); |
+ return HasStableMapValueField::decode(bit_field_); |
} |
bool HasObjectMap() const { return !object_map_.IsNull(); } |
@@ -3647,11 +3688,11 @@ class HConstant FINAL : public HTemplateInstruction<0> { |
} |
virtual intptr_t Hashcode() OVERRIDE { |
- if (has_int32_value_) { |
+ if (HasInteger32Value()) { |
return static_cast<intptr_t>(int32_value_); |
- } else if (has_double_value_) { |
+ } else if (HasDoubleValue()) { |
return static_cast<intptr_t>(bit_cast<int64_t>(double_value_)); |
- } else if (has_external_reference_value_) { |
+ } else if (HasExternalReferenceValue()) { |
return reinterpret_cast<intptr_t>(external_reference_value_.address()); |
} else { |
DCHECK(!object_.handle().is_null()); |
@@ -3660,7 +3701,7 @@ class HConstant FINAL : public HTemplateInstruction<0> { |
} |
virtual void FinalizeUniqueness() OVERRIDE { |
- if (!has_double_value_ && !has_external_reference_value_) { |
+ if (!HasDoubleValue() && !HasExternalReferenceValue()) { |
DCHECK(!object_.handle().is_null()); |
object_ = Unique<Object>(object_.handle()); |
} |
@@ -3676,21 +3717,21 @@ class HConstant FINAL : public HTemplateInstruction<0> { |
virtual bool DataEquals(HValue* other) OVERRIDE { |
HConstant* other_constant = HConstant::cast(other); |
- if (has_int32_value_) { |
- return other_constant->has_int32_value_ && |
- int32_value_ == other_constant->int32_value_; |
- } else if (has_double_value_) { |
- return other_constant->has_double_value_ && |
+ if (HasInteger32Value()) { |
+ return other_constant->HasInteger32Value() && |
+ int32_value_ == other_constant->int32_value_; |
+ } else if (HasDoubleValue()) { |
+ return other_constant->HasDoubleValue() && |
bit_cast<int64_t>(double_value_) == |
bit_cast<int64_t>(other_constant->double_value_); |
- } else if (has_external_reference_value_) { |
- return other_constant->has_external_reference_value_ && |
- external_reference_value_ == |
- other_constant->external_reference_value_; |
+ } else if (HasExternalReferenceValue()) { |
+ return other_constant->HasExternalReferenceValue() && |
+ external_reference_value_ == |
+ other_constant->external_reference_value_; |
} else { |
- if (other_constant->has_int32_value_ || |
- other_constant->has_double_value_ || |
- other_constant->has_external_reference_value_) { |
+ if (other_constant->HasInteger32Value() || |
+ other_constant->HasDoubleValue() || |
+ other_constant->HasExternalReferenceValue()) { |
return false; |
} |
DCHECK(!object_.handle().is_null()); |
@@ -3735,6 +3776,25 @@ class HConstant FINAL : public HTemplateInstruction<0> { |
virtual bool IsDeletable() const OVERRIDE { return true; } |
+ // If object_ is a map, this indicates whether the map is stable. |
+ class HasStableMapValueField : public BitField<bool, 0, 1> {}; |
+ |
+ // We store the HConstant in the most specific form safely possible. |
+ // These flags tell us if the respective member fields hold valid, safe |
+ // representations of the constant. More specific flags imply more general |
+ // flags, but not the converse (i.e. smi => int32 => double). |
+ class HasSmiValueField : public BitField<bool, 1, 1> {}; |
+ class HasInt32ValueField : public BitField<bool, 2, 1> {}; |
+ class HasDoubleValueField : public BitField<bool, 3, 1> {}; |
+ |
+ class HasExternalReferenceValueField : public BitField<bool, 4, 1> {}; |
+ class IsNotInNewSpaceField : public BitField<bool, 5, 1> {}; |
+ class BooleanValueField : public BitField<bool, 6, 1> {}; |
+ class IsUndetectableField : public BitField<bool, 7, 1> {}; |
+ |
+ static const InstanceType kUnknownInstanceType = FILLER_TYPE; |
+ class InstanceTypeField : public BitField<InstanceType, 8, 8> {}; |
+ |
// If this is a numerical constant, object_ either points to the |
// HeapObject the constant originated from or is null. If the |
// constant is non-numeric, object_ always points to a valid |
@@ -3744,27 +3804,11 @@ class HConstant FINAL : public HTemplateInstruction<0> { |
// If object_ is a heap object, this points to the stable map of the object. |
Unique<Map> object_map_; |
- // If object_ is a map, this indicates whether the map is stable. |
- bool has_stable_map_value_ : 1; |
+ uint32_t bit_field_; |
- // We store the HConstant in the most specific form safely possible. |
- // The two flags, has_int32_value_ and has_double_value_ tell us if |
- // int32_value_ and double_value_ hold valid, safe representations |
- // of the constant. has_int32_value_ implies has_double_value_ but |
- // not the converse. |
- bool has_smi_value_ : 1; |
- bool has_int32_value_ : 1; |
- bool has_double_value_ : 1; |
- bool has_external_reference_value_ : 1; |
- bool is_not_in_new_space_ : 1; |
- bool boolean_value_ : 1; |
- bool is_undetectable_: 1; |
int32_t int32_value_; |
double double_value_; |
ExternalReference external_reference_value_; |
- |
- static const InstanceType kUnknownInstanceType = FILLER_TYPE; |
- InstanceType instance_type_; |
}; |
@@ -6739,8 +6783,8 @@ class HLoadKeyed FINAL |
kStartIsDehoisted = kStartBaseOffset + kBitsForBaseOffset |
}; |
- STATIC_ASSERT((kBitsForElementsKind + kBitsForBaseOffset + |
- kBitsForIsDehoisted) <= sizeof(uint32_t)*8); |
+ STATIC_ASSERT((kBitsForElementsKind + kBitsForHoleMode + kBitsForBaseOffset + |
+ kBitsForIsDehoisted) <= sizeof(uint32_t) * 8); |
STATIC_ASSERT(kElementsKindCount <= (1 << kBitsForElementsKind)); |
class ElementsKindField: |
public BitField<ElementsKind, kStartElementsKind, kBitsForElementsKind> |
@@ -6845,7 +6889,8 @@ class HStoreNamedField FINAL : public HTemplateInstruction<3> { |
} else if (field_representation().IsDouble()) { |
return field_representation(); |
} else if (field_representation().IsSmi()) { |
- if (SmiValuesAre32Bits() && store_mode_ == STORE_TO_INITIALIZED_ENTRY) { |
+ if (SmiValuesAre32Bits() && |
+ store_mode() == STORE_TO_INITIALIZED_ENTRY) { |
return Representation::Integer32(); |
} |
return field_representation(); |
@@ -6870,8 +6915,10 @@ class HStoreNamedField FINAL : public HTemplateInstruction<3> { |
HObjectAccess access() const { return access_; } |
HValue* dominator() const { return dominator_; } |
- bool has_transition() const { return has_transition_; } |
- StoreFieldOrKeyedMode store_mode() const { return store_mode_; } |
+ bool has_transition() const { return HasTransitionField::decode(bit_field_); } |
+ StoreFieldOrKeyedMode store_mode() const { |
+ return StoreModeField::decode(bit_field_); |
+ } |
Handle<Map> transition_map() const { |
if (has_transition()) { |
@@ -6885,7 +6932,7 @@ class HStoreNamedField FINAL : public HTemplateInstruction<3> { |
void SetTransition(HConstant* transition) { |
DCHECK(!has_transition()); // Only set once. |
SetOperandAt(2, transition); |
- has_transition_ = true; |
+ bit_field_ = HasTransitionField::update(bit_field_, true); |
SetChangesFlag(kMaps); |
} |
@@ -6936,14 +6983,12 @@ class HStoreNamedField FINAL : public HTemplateInstruction<3> { |
} |
private: |
- HStoreNamedField(HValue* obj, |
- HObjectAccess access, |
- HValue* val, |
+ HStoreNamedField(HValue* obj, HObjectAccess access, HValue* val, |
StoreFieldOrKeyedMode store_mode = INITIALIZING_STORE) |
: access_(access), |
dominator_(NULL), |
- has_transition_(false), |
- store_mode_(store_mode) { |
+ bit_field_(HasTransitionField::encode(false) | |
+ StoreModeField::encode(store_mode)) { |
// Stores to a non existing in-object property are allowed only to the |
// newly allocated objects (via HAllocate or HInnerAllocatedObject). |
DCHECK(!access.IsInobject() || access.existing_inobject_property() || |
@@ -6954,10 +6999,12 @@ class HStoreNamedField FINAL : public HTemplateInstruction<3> { |
access.SetGVNFlags(this, STORE); |
} |
+ class HasTransitionField : public BitField<bool, 0, 1> {}; |
+ class StoreModeField : public BitField<StoreFieldOrKeyedMode, 1, 1> {}; |
+ |
HObjectAccess access_; |
HValue* dominator_; |
- bool has_transition_ : 1; |
- StoreFieldOrKeyedMode store_mode_ : 1; |
+ uint32_t bit_field_; |
}; |
@@ -7024,7 +7071,7 @@ class HStoreKeyed FINAL |
} |
DCHECK_EQ(index, 2); |
- return RequiredValueRepresentation(elements_kind_, store_mode_); |
+ return RequiredValueRepresentation(elements_kind(), store_mode()); |
} |
static Representation RequiredValueRepresentation( |
@@ -7065,7 +7112,8 @@ class HStoreKeyed FINAL |
if (IsUninitialized()) { |
return Representation::None(); |
} |
- Representation r = RequiredValueRepresentation(elements_kind_, store_mode_); |
+ Representation r = |
+ RequiredValueRepresentation(elements_kind(), store_mode()); |
// For fast object elements kinds, don't assume anything. |
if (r.IsTagged()) return Representation::None(); |
return r; |
@@ -7074,22 +7122,26 @@ class HStoreKeyed FINAL |
HValue* elements() const { return OperandAt(0); } |
HValue* key() const { return OperandAt(1); } |
HValue* value() const { return OperandAt(2); } |
- bool value_is_smi() const { |
- return IsFastSmiElementsKind(elements_kind_); |
+ bool value_is_smi() const { return IsFastSmiElementsKind(elements_kind()); } |
+ StoreFieldOrKeyedMode store_mode() const { |
+ return StoreModeField::decode(bit_field_); |
+ } |
+ ElementsKind elements_kind() const OVERRIDE { |
+ return ElementsKindField::decode(bit_field_); |
} |
- StoreFieldOrKeyedMode store_mode() const { return store_mode_; } |
- ElementsKind elements_kind() const OVERRIDE { return elements_kind_; } |
uint32_t base_offset() const { return base_offset_; } |
bool TryIncreaseBaseOffset(uint32_t increase_by_value) OVERRIDE; |
HValue* GetKey() OVERRIDE { return key(); } |
void SetKey(HValue* key) OVERRIDE { SetOperandAt(1, key); } |
- bool IsDehoisted() const OVERRIDE { return is_dehoisted_; } |
+ bool IsDehoisted() const OVERRIDE { |
+ return IsDehoistedField::decode(bit_field_); |
+ } |
void SetDehoisted(bool is_dehoisted) OVERRIDE { |
- is_dehoisted_ = is_dehoisted; |
+ bit_field_ = IsDehoistedField::update(bit_field_, is_dehoisted); |
} |
- bool IsUninitialized() { return is_uninitialized_; } |
+ bool IsUninitialized() { return IsUninitializedField::decode(bit_field_); } |
void SetUninitialized(bool is_uninitialized) { |
- is_uninitialized_ = is_uninitialized; |
+ bit_field_ = IsUninitializedField::update(bit_field_, is_uninitialized); |
} |
bool IsConstantHoleStore() { |
@@ -7125,18 +7177,17 @@ class HStoreKeyed FINAL |
DECLARE_CONCRETE_INSTRUCTION(StoreKeyed) |
private: |
- HStoreKeyed(HValue* obj, HValue* key, HValue* val, |
- ElementsKind elements_kind, |
+ HStoreKeyed(HValue* obj, HValue* key, HValue* val, ElementsKind elements_kind, |
StoreFieldOrKeyedMode store_mode = INITIALIZING_STORE, |
int offset = kDefaultKeyedHeaderOffsetSentinel) |
- : elements_kind_(elements_kind), |
- base_offset_(offset == kDefaultKeyedHeaderOffsetSentinel |
- ? GetDefaultHeaderSizeForElementsKind(elements_kind) |
- : offset), |
- is_dehoisted_(false), |
- is_uninitialized_(false), |
- store_mode_(store_mode), |
- dominator_(NULL) { |
+ : base_offset_(offset == kDefaultKeyedHeaderOffsetSentinel |
+ ? GetDefaultHeaderSizeForElementsKind(elements_kind) |
+ : offset), |
+ bit_field_(IsDehoistedField::encode(false) | |
+ IsUninitializedField::encode(false) | |
+ StoreModeField::encode(store_mode) | |
+ ElementsKindField::encode(elements_kind)), |
+ dominator_(NULL) { |
SetOperandAt(0, obj); |
SetOperandAt(1, key); |
SetOperandAt(2, val); |
@@ -7168,11 +7219,13 @@ class HStoreKeyed FINAL |
} |
} |
- ElementsKind elements_kind_; |
+ class IsDehoistedField : public BitField<bool, 0, 1> {}; |
+ class IsUninitializedField : public BitField<bool, 1, 1> {}; |
+ class StoreModeField : public BitField<StoreFieldOrKeyedMode, 2, 1> {}; |
+ class ElementsKindField : public BitField<ElementsKind, 3, 5> {}; |
+ |
uint32_t base_offset_; |
- bool is_dehoisted_ : 1; |
- bool is_uninitialized_ : 1; |
- StoreFieldOrKeyedMode store_mode_: 1; |
+ uint32_t bit_field_; |
HValue* dominator_; |
}; |
@@ -7496,23 +7549,25 @@ class HFunctionLiteral FINAL : public HTemplateInstruction<1> { |
DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral) |
Handle<SharedFunctionInfo> shared_info() const { return shared_info_; } |
- bool pretenure() const { return pretenure_; } |
- bool has_no_literals() const { return has_no_literals_; } |
- bool is_arrow() const { return IsArrowFunction(kind_); } |
- bool is_generator() const { return IsGeneratorFunction(kind_); } |
- bool is_concise_method() const { return IsConciseMethod(kind_); } |
- FunctionKind kind() const { return kind_; } |
- StrictMode strict_mode() const { return strict_mode_; } |
+ bool pretenure() const { return PretenureField::decode(bit_field_); } |
+ bool has_no_literals() const { |
+ return HasNoLiteralsField::decode(bit_field_); |
+ } |
+ bool is_arrow() const { return IsArrowFunction(kind()); } |
+ bool is_generator() const { return IsGeneratorFunction(kind()); } |
+ bool is_concise_method() const { return IsConciseMethod(kind()); } |
+ FunctionKind kind() const { return FunctionKindField::decode(bit_field_); } |
+ StrictMode strict_mode() const { return StrictModeField::decode(bit_field_); } |
private: |
HFunctionLiteral(HValue* context, Handle<SharedFunctionInfo> shared, |
bool pretenure) |
: HTemplateInstruction<1>(HType::JSObject()), |
shared_info_(shared), |
- kind_(shared->kind()), |
- pretenure_(pretenure), |
- has_no_literals_(shared->num_literals() == 0), |
- strict_mode_(shared->strict_mode()) { |
+ bit_field_(FunctionKindField::encode(shared->kind()) | |
+ PretenureField::encode(pretenure) | |
+ HasNoLiteralsField::encode(shared->num_literals() == 0) | |
+ StrictModeField::encode(shared->strict_mode())) { |
SetOperandAt(0, context); |
set_representation(Representation::Tagged()); |
SetChangesFlag(kNewSpacePromotion); |
@@ -7520,11 +7575,13 @@ class HFunctionLiteral FINAL : public HTemplateInstruction<1> { |
virtual bool IsDeletable() const OVERRIDE { return true; } |
+ class FunctionKindField : public BitField<FunctionKind, 0, 3> {}; |
+ class PretenureField : public BitField<bool, 3, 1> {}; |
+ class HasNoLiteralsField : public BitField<bool, 4, 1> {}; |
+ class StrictModeField : public BitField<StrictMode, 5, 1> {}; |
+ |
Handle<SharedFunctionInfo> shared_info_; |
- FunctionKind kind_; |
- bool pretenure_ : 1; |
- bool has_no_literals_ : 1; |
- StrictMode strict_mode_; |
+ uint32_t bit_field_; |
}; |