| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 : lower_(lower), | 220 : lower_(lower), |
| 221 upper_(upper), | 221 upper_(upper), |
| 222 next_(NULL), | 222 next_(NULL), |
| 223 can_be_minus_zero_(false) { } | 223 can_be_minus_zero_(false) { } |
| 224 | 224 |
| 225 int32_t upper() const { return upper_; } | 225 int32_t upper() const { return upper_; } |
| 226 int32_t lower() const { return lower_; } | 226 int32_t lower() const { return lower_; } |
| 227 Range* next() const { return next_; } | 227 Range* next() const { return next_; } |
| 228 Range* CopyClearLower() const { return new Range(kMinInt, upper_); } | 228 Range* CopyClearLower() const { return new Range(kMinInt, upper_); } |
| 229 Range* CopyClearUpper() const { return new Range(lower_, kMaxInt); } | 229 Range* CopyClearUpper() const { return new Range(lower_, kMaxInt); } |
| 230 Range* Copy() const { return new Range(lower_, upper_); } | 230 Range* Copy() const { |
| 231 Range* result = new Range(lower_, upper_); |
| 232 result->set_can_be_minus_zero(CanBeMinusZero()); |
| 233 return result; |
| 234 } |
| 231 int32_t Mask() const; | 235 int32_t Mask() const; |
| 232 void set_can_be_minus_zero(bool b) { can_be_minus_zero_ = b; } | 236 void set_can_be_minus_zero(bool b) { can_be_minus_zero_ = b; } |
| 233 bool CanBeMinusZero() const { return CanBeZero() && can_be_minus_zero_; } | 237 bool CanBeMinusZero() const { return CanBeZero() && can_be_minus_zero_; } |
| 234 bool CanBeZero() const { return upper_ >= 0 && lower_ <= 0; } | 238 bool CanBeZero() const { return upper_ >= 0 && lower_ <= 0; } |
| 235 bool CanBeNegative() const { return lower_ < 0; } | 239 bool CanBeNegative() const { return lower_ < 0; } |
| 236 bool Includes(int value) const { return lower_ <= value && upper_ >= value; } | 240 bool Includes(int value) const { return lower_ <= value && upper_ >= value; } |
| 237 bool IsMostGeneric() const { return lower_ == kMinInt && upper_ == kMaxInt; } | 241 bool IsMostGeneric() const { |
| 242 return lower_ == kMinInt && upper_ == kMaxInt && CanBeMinusZero(); |
| 243 } |
| 238 bool IsInSmiRange() const { | 244 bool IsInSmiRange() const { |
| 239 return lower_ >= Smi::kMinValue && upper_ <= Smi::kMaxValue; | 245 return lower_ >= Smi::kMinValue && upper_ <= Smi::kMaxValue; |
| 240 } | 246 } |
| 241 void KeepOrder(); | 247 void KeepOrder(); |
| 242 void Verify() const; | 248 void Verify() const; |
| 243 | 249 |
| 244 void StackUpon(Range* other) { | 250 void StackUpon(Range* other) { |
| 245 Intersect(other); | 251 Intersect(other); |
| 246 next_ = other; | 252 next_ = other; |
| 247 } | 253 } |
| (...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 571 ASSERT(!r.IsNone()); | 577 ASSERT(!r.IsNone()); |
| 572 ASSERT(CheckFlag(kFlexibleRepresentation)); | 578 ASSERT(CheckFlag(kFlexibleRepresentation)); |
| 573 RepresentationChanged(r); | 579 RepresentationChanged(r); |
| 574 representation_ = r; | 580 representation_ = r; |
| 575 } | 581 } |
| 576 void AssumeRepresentation(Representation r); | 582 void AssumeRepresentation(Representation r); |
| 577 | 583 |
| 578 virtual bool IsConvertibleToInteger() const { return true; } | 584 virtual bool IsConvertibleToInteger() const { return true; } |
| 579 | 585 |
| 580 HType type() const { return type_; } | 586 HType type() const { return type_; } |
| 581 void set_type(HType type) { | 587 void set_type(HType new_type) { |
| 582 ASSERT(HasNoUses()); | 588 ASSERT(new_type.IsSubtypeOf(type_)); |
| 583 type_ = type; | 589 type_ = new_type; |
| 584 } | 590 } |
| 585 | 591 |
| 586 // An operation needs to override this function iff: | 592 // An operation needs to override this function iff: |
| 587 // 1) it can produce an int32 output. | 593 // 1) it can produce an int32 output. |
| 588 // 2) the true value of its output can potentially be minus zero. | 594 // 2) the true value of its output can potentially be minus zero. |
| 589 // The implementation must set a flag so that it bails out in the case where | 595 // The implementation must set a flag so that it bails out in the case where |
| 590 // it would otherwise output what should be a minus zero as an int32 zero. | 596 // it would otherwise output what should be a minus zero as an int32 zero. |
| 591 // If the operation also exists in a form that takes int32 and outputs int32 | 597 // If the operation also exists in a form that takes int32 and outputs int32 |
| 592 // then the operation should return its input value so that we can propagate | 598 // then the operation should return its input value so that we can propagate |
| 593 // back. There are three operations that need to propagate back to more than | 599 // back. There are three operations that need to propagate back to more than |
| (...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1093 bool is_truncating, | 1099 bool is_truncating, |
| 1094 bool deoptimize_on_undefined) | 1100 bool deoptimize_on_undefined) |
| 1095 : HUnaryOperation(value), | 1101 : HUnaryOperation(value), |
| 1096 from_(from), | 1102 from_(from), |
| 1097 deoptimize_on_undefined_(deoptimize_on_undefined) { | 1103 deoptimize_on_undefined_(deoptimize_on_undefined) { |
| 1098 ASSERT(!from.IsNone() && !to.IsNone()); | 1104 ASSERT(!from.IsNone() && !to.IsNone()); |
| 1099 ASSERT(!from.Equals(to)); | 1105 ASSERT(!from.Equals(to)); |
| 1100 set_representation(to); | 1106 set_representation(to); |
| 1101 SetFlag(kUseGVN); | 1107 SetFlag(kUseGVN); |
| 1102 if (is_truncating) SetFlag(kTruncatingToInt32); | 1108 if (is_truncating) SetFlag(kTruncatingToInt32); |
| 1103 if (from.IsInteger32() && to.IsTagged() && value->range() != NULL && | |
| 1104 value->range()->IsInSmiRange()) { | |
| 1105 set_type(HType::Smi()); | |
| 1106 } | |
| 1107 } | 1109 } |
| 1108 | 1110 |
| 1109 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); | 1111 virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); |
| 1110 | 1112 |
| 1111 Representation from() const { return from_; } | 1113 Representation from() const { return from_; } |
| 1112 Representation to() const { return representation(); } | 1114 Representation to() const { return representation(); } |
| 1113 bool deoptimize_on_undefined() const { return deoptimize_on_undefined_; } | 1115 bool deoptimize_on_undefined() const { return deoptimize_on_undefined_; } |
| 1114 virtual Representation RequiredInputRepresentation(int index) const { | 1116 virtual Representation RequiredInputRepresentation(int index) const { |
| 1115 return from_; | 1117 return from_; |
| 1116 } | 1118 } |
| 1117 | 1119 |
| 1120 virtual Range* InferRange(); |
| 1121 |
| 1118 virtual void PrintDataTo(StringStream* stream); | 1122 virtual void PrintDataTo(StringStream* stream); |
| 1119 | 1123 |
| 1120 DECLARE_CONCRETE_INSTRUCTION(Change) | 1124 DECLARE_CONCRETE_INSTRUCTION(Change) |
| 1121 | 1125 |
| 1122 protected: | 1126 protected: |
| 1123 virtual bool DataEquals(HValue* other) { | 1127 virtual bool DataEquals(HValue* other) { |
| 1124 if (!other->IsChange()) return false; | 1128 if (!other->IsChange()) return false; |
| 1125 HChange* change = HChange::cast(other); | 1129 HChange* change = HChange::cast(other); |
| 1126 return to().Equals(change->to()) | 1130 return to().Equals(change->to()) |
| 1127 && deoptimize_on_undefined() == change->deoptimize_on_undefined(); | 1131 && deoptimize_on_undefined() == change->deoptimize_on_undefined(); |
| (...skipping 3059 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4187 | 4191 |
| 4188 DECLARE_CONCRETE_INSTRUCTION(In) | 4192 DECLARE_CONCRETE_INSTRUCTION(In) |
| 4189 }; | 4193 }; |
| 4190 | 4194 |
| 4191 #undef DECLARE_INSTRUCTION | 4195 #undef DECLARE_INSTRUCTION |
| 4192 #undef DECLARE_CONCRETE_INSTRUCTION | 4196 #undef DECLARE_CONCRETE_INSTRUCTION |
| 4193 | 4197 |
| 4194 } } // namespace v8::internal | 4198 } } // namespace v8::internal |
| 4195 | 4199 |
| 4196 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 4200 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
| OLD | NEW |