| Index: src/hydrogen-instructions.cc
|
| diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc
|
| index 188119d66bf9e08254098d9f0b89cb4881dac118..ce76fbecac93a909854dfe53c8604e52a170f06e 100644
|
| --- a/src/hydrogen-instructions.cc
|
| +++ b/src/hydrogen-instructions.cc
|
| @@ -1789,7 +1789,7 @@ Range* HChange::InferRange(Zone* zone) {
|
|
|
|
|
| Range* HConstant::InferRange(Zone* zone) {
|
| - if (has_int32_value_) {
|
| + if (HasInteger32Value()) {
|
| Range* result = new(zone) Range(int32_value_, int32_value_);
|
| result->set_can_be_minus_zero(false);
|
| return result;
|
| @@ -2606,7 +2606,7 @@ std::ostream& HSimulate::PrintDataTo(std::ostream& os) const { // NOLINT
|
|
|
|
|
| void HSimulate::ReplayEnvironment(HEnvironment* env) {
|
| - if (done_with_replay_) return;
|
| + if (is_done_with_replay()) return;
|
| DCHECK(env != NULL);
|
| env->set_ast_id(ast_id());
|
| env->Drop(pop_count());
|
| @@ -2618,7 +2618,7 @@ void HSimulate::ReplayEnvironment(HEnvironment* env) {
|
| env->Push(value);
|
| }
|
| }
|
| - done_with_replay_ = true;
|
| + set_done_with_replay();
|
| }
|
|
|
|
|
| @@ -2674,36 +2674,41 @@ static bool IsInteger32(double value) {
|
|
|
|
|
| HConstant::HConstant(Handle<Object> object, Representation r)
|
| - : HTemplateInstruction<0>(HType::FromValue(object)),
|
| - object_(Unique<Object>::CreateUninitialized(object)),
|
| - object_map_(Handle<Map>::null()),
|
| - has_stable_map_value_(false),
|
| - has_smi_value_(false),
|
| - has_int32_value_(false),
|
| - has_double_value_(false),
|
| - has_external_reference_value_(false),
|
| - is_not_in_new_space_(true),
|
| - boolean_value_(object->BooleanValue()),
|
| - is_undetectable_(false),
|
| - instance_type_(kUnknownInstanceType) {
|
| + : HTemplateInstruction<0>(HType::FromValue(object)),
|
| + object_(Unique<Object>::CreateUninitialized(object)),
|
| + object_map_(Handle<Map>::null()),
|
| + bit_field_(HasStableMapValueField::encode(false) |
|
| + HasSmiValueField::encode(false) |
|
| + HasInt32ValueField::encode(false) |
|
| + HasDoubleValueField::encode(false) |
|
| + HasExternalReferenceValueField::encode(false) |
|
| + IsNotInNewSpaceField::encode(true) |
|
| + BooleanValueField::encode(object->BooleanValue()) |
|
| + IsUndetectableField::encode(false) |
|
| + InstanceTypeField::encode(kUnknownInstanceType)) {
|
| if (object->IsHeapObject()) {
|
| Handle<HeapObject> heap_object = Handle<HeapObject>::cast(object);
|
| Isolate* isolate = heap_object->GetIsolate();
|
| Handle<Map> map(heap_object->map(), isolate);
|
| - is_not_in_new_space_ = !isolate->heap()->InNewSpace(*object);
|
| - instance_type_ = map->instance_type();
|
| - is_undetectable_ = map->is_undetectable();
|
| + bit_field_ = IsNotInNewSpaceField::update(
|
| + bit_field_, !isolate->heap()->InNewSpace(*object));
|
| + bit_field_ = InstanceTypeField::update(bit_field_, map->instance_type());
|
| + bit_field_ =
|
| + IsUndetectableField::update(bit_field_, map->is_undetectable());
|
| if (map->is_stable()) object_map_ = Unique<Map>::CreateImmovable(map);
|
| - has_stable_map_value_ = (instance_type_ == MAP_TYPE &&
|
| - Handle<Map>::cast(heap_object)->is_stable());
|
| + bit_field_ = HasStableMapValueField::update(
|
| + bit_field_,
|
| + HasMapValue() && Handle<Map>::cast(heap_object)->is_stable());
|
| }
|
| if (object->IsNumber()) {
|
| double n = object->Number();
|
| - has_int32_value_ = IsInteger32(n);
|
| + bool has_int32_value = IsInteger32(n);
|
| + bit_field_ = HasInt32ValueField::update(bit_field_, has_int32_value);
|
| int32_value_ = DoubleToInt32(n);
|
| - has_smi_value_ = has_int32_value_ && Smi::IsValid(int32_value_);
|
| + bit_field_ = HasSmiValueField::update(
|
| + bit_field_, has_int32_value && Smi::IsValid(int32_value_));
|
| double_value_ = n;
|
| - has_double_value_ = true;
|
| + bit_field_ = HasDoubleValueField::update(bit_field_, true);
|
| // TODO(titzer): if this heap number is new space, tenure a new one.
|
| }
|
|
|
| @@ -2711,112 +2716,104 @@ HConstant::HConstant(Handle<Object> object, Representation r)
|
| }
|
|
|
|
|
| -HConstant::HConstant(Unique<Object> object,
|
| - Unique<Map> object_map,
|
| - bool has_stable_map_value,
|
| - Representation r,
|
| - HType type,
|
| - bool is_not_in_new_space,
|
| - bool boolean_value,
|
| - bool is_undetectable,
|
| - InstanceType instance_type)
|
| - : HTemplateInstruction<0>(type),
|
| - object_(object),
|
| - object_map_(object_map),
|
| - has_stable_map_value_(has_stable_map_value),
|
| - has_smi_value_(false),
|
| - has_int32_value_(false),
|
| - has_double_value_(false),
|
| - has_external_reference_value_(false),
|
| - is_not_in_new_space_(is_not_in_new_space),
|
| - boolean_value_(boolean_value),
|
| - is_undetectable_(is_undetectable),
|
| - instance_type_(instance_type) {
|
| +HConstant::HConstant(Unique<Object> object, Unique<Map> object_map,
|
| + bool has_stable_map_value, Representation r, HType type,
|
| + bool is_not_in_new_space, bool boolean_value,
|
| + bool is_undetectable, InstanceType instance_type)
|
| + : HTemplateInstruction<0>(type),
|
| + object_(object),
|
| + object_map_(object_map),
|
| + bit_field_(HasStableMapValueField::encode(has_stable_map_value) |
|
| + HasSmiValueField::encode(false) |
|
| + HasInt32ValueField::encode(false) |
|
| + HasDoubleValueField::encode(false) |
|
| + HasExternalReferenceValueField::encode(false) |
|
| + IsNotInNewSpaceField::encode(is_not_in_new_space) |
|
| + BooleanValueField::encode(boolean_value) |
|
| + IsUndetectableField::encode(is_undetectable) |
|
| + InstanceTypeField::encode(instance_type)) {
|
| DCHECK(!object.handle().is_null());
|
| DCHECK(!type.IsTaggedNumber() || type.IsNone());
|
| Initialize(r);
|
| }
|
|
|
|
|
| -HConstant::HConstant(int32_t integer_value,
|
| - Representation r,
|
| - bool is_not_in_new_space,
|
| - Unique<Object> object)
|
| - : object_(object),
|
| - object_map_(Handle<Map>::null()),
|
| - has_stable_map_value_(false),
|
| - has_smi_value_(Smi::IsValid(integer_value)),
|
| - has_int32_value_(true),
|
| - has_double_value_(true),
|
| - has_external_reference_value_(false),
|
| - is_not_in_new_space_(is_not_in_new_space),
|
| - boolean_value_(integer_value != 0),
|
| - is_undetectable_(false),
|
| - int32_value_(integer_value),
|
| - double_value_(FastI2D(integer_value)),
|
| - instance_type_(kUnknownInstanceType) {
|
| +HConstant::HConstant(int32_t integer_value, Representation r,
|
| + bool is_not_in_new_space, Unique<Object> object)
|
| + : object_(object),
|
| + object_map_(Handle<Map>::null()),
|
| + bit_field_(HasStableMapValueField::encode(false) |
|
| + HasSmiValueField::encode(Smi::IsValid(integer_value)) |
|
| + HasInt32ValueField::encode(true) |
|
| + HasDoubleValueField::encode(true) |
|
| + HasExternalReferenceValueField::encode(false) |
|
| + IsNotInNewSpaceField::encode(is_not_in_new_space) |
|
| + BooleanValueField::encode(integer_value != 0) |
|
| + IsUndetectableField::encode(false) |
|
| + InstanceTypeField::encode(kUnknownInstanceType)),
|
| + int32_value_(integer_value),
|
| + double_value_(FastI2D(integer_value)) {
|
| // It's possible to create a constant with a value in Smi-range but stored
|
| // in a (pre-existing) HeapNumber. See crbug.com/349878.
|
| bool could_be_heapobject = r.IsTagged() && !object.handle().is_null();
|
| - bool is_smi = has_smi_value_ && !could_be_heapobject;
|
| + bool is_smi = HasSmiValue() && !could_be_heapobject;
|
| set_type(is_smi ? HType::Smi() : HType::TaggedNumber());
|
| Initialize(r);
|
| }
|
|
|
|
|
| -HConstant::HConstant(double double_value,
|
| - Representation r,
|
| - bool is_not_in_new_space,
|
| - Unique<Object> object)
|
| - : object_(object),
|
| - object_map_(Handle<Map>::null()),
|
| - has_stable_map_value_(false),
|
| - has_int32_value_(IsInteger32(double_value)),
|
| - has_double_value_(true),
|
| - has_external_reference_value_(false),
|
| - is_not_in_new_space_(is_not_in_new_space),
|
| - boolean_value_(double_value != 0 && !std::isnan(double_value)),
|
| - is_undetectable_(false),
|
| - int32_value_(DoubleToInt32(double_value)),
|
| - double_value_(double_value),
|
| - instance_type_(kUnknownInstanceType) {
|
| - has_smi_value_ = has_int32_value_ && Smi::IsValid(int32_value_);
|
| +HConstant::HConstant(double double_value, Representation r,
|
| + bool is_not_in_new_space, Unique<Object> object)
|
| + : object_(object),
|
| + object_map_(Handle<Map>::null()),
|
| + bit_field_(HasStableMapValueField::encode(false) |
|
| + HasInt32ValueField::encode(IsInteger32(double_value)) |
|
| + HasDoubleValueField::encode(true) |
|
| + HasExternalReferenceValueField::encode(false) |
|
| + IsNotInNewSpaceField::encode(is_not_in_new_space) |
|
| + BooleanValueField::encode(double_value != 0 &&
|
| + !std::isnan(double_value)) |
|
| + IsUndetectableField::encode(false) |
|
| + InstanceTypeField::encode(kUnknownInstanceType)),
|
| + int32_value_(DoubleToInt32(double_value)),
|
| + double_value_(double_value) {
|
| + bit_field_ = HasSmiValueField::update(
|
| + bit_field_, HasInteger32Value() && Smi::IsValid(int32_value_));
|
| // It's possible to create a constant with a value in Smi-range but stored
|
| // in a (pre-existing) HeapNumber. See crbug.com/349878.
|
| bool could_be_heapobject = r.IsTagged() && !object.handle().is_null();
|
| - bool is_smi = has_smi_value_ && !could_be_heapobject;
|
| + bool is_smi = HasSmiValue() && !could_be_heapobject;
|
| set_type(is_smi ? HType::Smi() : HType::TaggedNumber());
|
| Initialize(r);
|
| }
|
|
|
|
|
| HConstant::HConstant(ExternalReference reference)
|
| - : HTemplateInstruction<0>(HType::Any()),
|
| - object_(Unique<Object>(Handle<Object>::null())),
|
| - object_map_(Handle<Map>::null()),
|
| - has_stable_map_value_(false),
|
| - has_smi_value_(false),
|
| - has_int32_value_(false),
|
| - has_double_value_(false),
|
| - has_external_reference_value_(true),
|
| - is_not_in_new_space_(true),
|
| - boolean_value_(true),
|
| - is_undetectable_(false),
|
| - external_reference_value_(reference),
|
| - instance_type_(kUnknownInstanceType) {
|
| + : HTemplateInstruction<0>(HType::Any()),
|
| + object_(Unique<Object>(Handle<Object>::null())),
|
| + object_map_(Handle<Map>::null()),
|
| + bit_field_(
|
| + HasStableMapValueField::encode(false) |
|
| + HasSmiValueField::encode(false) | HasInt32ValueField::encode(false) |
|
| + HasDoubleValueField::encode(false) |
|
| + HasExternalReferenceValueField::encode(true) |
|
| + IsNotInNewSpaceField::encode(true) | BooleanValueField::encode(true) |
|
| + IsUndetectableField::encode(false) |
|
| + InstanceTypeField::encode(kUnknownInstanceType)),
|
| + external_reference_value_(reference) {
|
| Initialize(Representation::External());
|
| }
|
|
|
|
|
| void HConstant::Initialize(Representation r) {
|
| if (r.IsNone()) {
|
| - if (has_smi_value_ && SmiValuesAre31Bits()) {
|
| + if (HasSmiValue() && SmiValuesAre31Bits()) {
|
| r = Representation::Smi();
|
| - } else if (has_int32_value_) {
|
| + } else if (HasInteger32Value()) {
|
| r = Representation::Integer32();
|
| - } else if (has_double_value_) {
|
| + } else if (HasDoubleValue()) {
|
| r = Representation::Double();
|
| - } else if (has_external_reference_value_) {
|
| + } else if (HasExternalReferenceValue()) {
|
| r = Representation::External();
|
| } else {
|
| Handle<Object> object = object_.handle();
|
| @@ -2843,16 +2840,16 @@ void HConstant::Initialize(Representation r) {
|
|
|
|
|
| bool HConstant::ImmortalImmovable() const {
|
| - if (has_int32_value_) {
|
| + if (HasInteger32Value()) {
|
| return false;
|
| }
|
| - if (has_double_value_) {
|
| + if (HasDoubleValue()) {
|
| if (IsSpecialDouble()) {
|
| return true;
|
| }
|
| return false;
|
| }
|
| - if (has_external_reference_value_) {
|
| + if (HasExternalReferenceValue()) {
|
| return false;
|
| }
|
|
|
| @@ -2893,44 +2890,35 @@ bool HConstant::EmitAtUses() {
|
|
|
|
|
| HConstant* HConstant::CopyToRepresentation(Representation r, Zone* zone) const {
|
| - if (r.IsSmi() && !has_smi_value_) return NULL;
|
| - if (r.IsInteger32() && !has_int32_value_) return NULL;
|
| - if (r.IsDouble() && !has_double_value_) return NULL;
|
| - if (r.IsExternal() && !has_external_reference_value_) return NULL;
|
| - if (has_int32_value_) {
|
| - return new(zone) HConstant(int32_value_, r, is_not_in_new_space_, object_);
|
| + if (r.IsSmi() && !HasSmiValue()) return NULL;
|
| + if (r.IsInteger32() && !HasInteger32Value()) return NULL;
|
| + if (r.IsDouble() && !HasDoubleValue()) return NULL;
|
| + if (r.IsExternal() && !HasExternalReferenceValue()) return NULL;
|
| + if (HasInteger32Value()) {
|
| + return new (zone) HConstant(int32_value_, r, NotInNewSpace(), object_);
|
| }
|
| - if (has_double_value_) {
|
| - return new(zone) HConstant(double_value_, r, is_not_in_new_space_, object_);
|
| + if (HasDoubleValue()) {
|
| + return new (zone) HConstant(double_value_, r, NotInNewSpace(), object_);
|
| }
|
| - if (has_external_reference_value_) {
|
| + if (HasExternalReferenceValue()) {
|
| return new(zone) HConstant(external_reference_value_);
|
| }
|
| DCHECK(!object_.handle().is_null());
|
| - return new(zone) HConstant(object_,
|
| - object_map_,
|
| - has_stable_map_value_,
|
| - r,
|
| - type_,
|
| - is_not_in_new_space_,
|
| - boolean_value_,
|
| - is_undetectable_,
|
| - instance_type_);
|
| + return new (zone) HConstant(object_, object_map_, HasStableMapValue(), r,
|
| + type_, NotInNewSpace(), BooleanValue(),
|
| + IsUndetectable(), GetInstanceType());
|
| }
|
|
|
|
|
| Maybe<HConstant*> HConstant::CopyToTruncatedInt32(Zone* zone) {
|
| HConstant* res = NULL;
|
| - if (has_int32_value_) {
|
| - res = new(zone) HConstant(int32_value_,
|
| - Representation::Integer32(),
|
| - is_not_in_new_space_,
|
| - object_);
|
| - } else if (has_double_value_) {
|
| - res = new(zone) HConstant(DoubleToInt32(double_value_),
|
| - Representation::Integer32(),
|
| - is_not_in_new_space_,
|
| - object_);
|
| + if (HasInteger32Value()) {
|
| + res = new (zone) HConstant(int32_value_, Representation::Integer32(),
|
| + NotInNewSpace(), object_);
|
| + } else if (HasDoubleValue()) {
|
| + res = new (zone)
|
| + HConstant(DoubleToInt32(double_value_), Representation::Integer32(),
|
| + NotInNewSpace(), object_);
|
| }
|
| return Maybe<HConstant*>(res != NULL, res);
|
| }
|
| @@ -2952,11 +2940,11 @@ Maybe<HConstant*> HConstant::CopyToTruncatedNumber(Zone* zone) {
|
|
|
|
|
| std::ostream& HConstant::PrintDataTo(std::ostream& os) const { // NOLINT
|
| - if (has_int32_value_) {
|
| + if (HasInteger32Value()) {
|
| os << int32_value_ << " ";
|
| - } else if (has_double_value_) {
|
| + } else if (HasDoubleValue()) {
|
| os << double_value_ << " ";
|
| - } else if (has_external_reference_value_) {
|
| + } else if (HasExternalReferenceValue()) {
|
| os << reinterpret_cast<void*>(external_reference_value_.address()) << " ";
|
| } else {
|
| // The handle() method is silently and lazily mutating the object.
|
| @@ -2965,7 +2953,7 @@ std::ostream& HConstant::PrintDataTo(std::ostream& os) const { // NOLINT
|
| if (HasStableMapValue()) os << "[stable-map] ";
|
| if (HasObjectMap()) os << "[map " << *ObjectMap().handle() << "] ";
|
| }
|
| - if (!is_not_in_new_space_) os << "[new space] ";
|
| + if (!NotInNewSpace()) os << "[new space] ";
|
| return os;
|
| }
|
|
|
|
|