OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <iomanip> | 5 #include <iomanip> |
6 | 6 |
7 #include "src/compiler/types.h" | 7 #include "src/compiler/types.h" |
8 | 8 |
9 #include "src/handles-inl.h" | 9 #include "src/handles-inl.h" |
10 #include "src/ostreams.h" | 10 #include "src/ostreams.h" |
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
395 !i::IsMinusZero(value); | 395 !i::IsMinusZero(value); |
396 } | 396 } |
397 | 397 |
398 // static | 398 // static |
399 bool OtherNumberConstantType::IsOtherNumberConstant(Object* value) { | 399 bool OtherNumberConstantType::IsOtherNumberConstant(Object* value) { |
400 return value->IsHeapNumber() && | 400 return value->IsHeapNumber() && |
401 IsOtherNumberConstant(HeapNumber::cast(value)->value()); | 401 IsOtherNumberConstant(HeapNumber::cast(value)->value()); |
402 } | 402 } |
403 | 403 |
404 HeapConstantType::HeapConstantType(BitsetType::bitset bitset, | 404 HeapConstantType::HeapConstantType(BitsetType::bitset bitset, |
405 i::Handle<i::Object> object) | 405 i::Handle<i::HeapObject> object) |
406 : TypeBase(kHeapConstant), bitset_(bitset), object_(object) { | 406 : TypeBase(kHeapConstant), bitset_(bitset), object_(object) { |
407 // All number types should be expressed as Ranges, OtherNumberConstants, | 407 DCHECK(!object->IsHeapNumber()); |
408 // or bitsets (nan, negative-zero). | |
409 DCHECK(!object->IsSmi() && !object->IsHeapNumber()); | |
410 } | 408 } |
411 | 409 |
412 // ----------------------------------------------------------------------------- | 410 // ----------------------------------------------------------------------------- |
413 // Predicates. | 411 // Predicates. |
414 | 412 |
415 bool Type::SimplyEquals(Type* that) { | 413 bool Type::SimplyEquals(Type* that) { |
416 DisallowHeapAllocation no_allocation; | 414 DisallowHeapAllocation no_allocation; |
417 if (this->IsHeapConstant()) { | 415 if (this->IsHeapConstant()) { |
418 return that->IsHeapConstant() && | 416 return that->IsHeapConstant() && |
419 *this->AsHeapConstant()->Value() == *that->AsHeapConstant()->Value(); | 417 this->AsHeapConstant()->Value().address() == |
| 418 that->AsHeapConstant()->Value().address(); |
420 } | 419 } |
421 if (this->IsOtherNumberConstant()) { | 420 if (this->IsOtherNumberConstant()) { |
422 return that->IsOtherNumberConstant() && | 421 return that->IsOtherNumberConstant() && |
423 this->AsOtherNumberConstant()->Value() == | 422 this->AsOtherNumberConstant()->Value() == |
424 that->AsOtherNumberConstant()->Value(); | 423 that->AsOtherNumberConstant()->Value(); |
425 } | 424 } |
426 if (this->IsRange()) { | 425 if (this->IsRange()) { |
427 if (that->IsHeapConstant() || that->IsOtherNumberConstant()) return false; | 426 if (that->IsHeapConstant() || that->IsOtherNumberConstant()) return false; |
428 } | 427 } |
429 if (this->IsTuple()) { | 428 if (this->IsTuple()) { |
(...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
775 return OtherNumberConstant(value, zone); | 774 return OtherNumberConstant(value, zone); |
776 } | 775 } |
777 | 776 |
778 Type* Type::NewConstant(i::Handle<i::Object> value, Zone* zone) { | 777 Type* Type::NewConstant(i::Handle<i::Object> value, Zone* zone) { |
779 if (IsInteger(*value)) { | 778 if (IsInteger(*value)) { |
780 double v = value->Number(); | 779 double v = value->Number(); |
781 return Range(v, v, zone); | 780 return Range(v, v, zone); |
782 } else if (value->IsHeapNumber()) { | 781 } else if (value->IsHeapNumber()) { |
783 return NewConstant(value->Number(), zone); | 782 return NewConstant(value->Number(), zone); |
784 } | 783 } |
785 return HeapConstant(value, zone); | 784 return HeapConstant(i::Handle<i::HeapObject>::cast(value), zone); |
786 } | 785 } |
787 | 786 |
788 Type* Type::Union(Type* type1, Type* type2, Zone* zone) { | 787 Type* Type::Union(Type* type1, Type* type2, Zone* zone) { |
789 // Fast case: bit sets. | 788 // Fast case: bit sets. |
790 if (type1->IsBitset() && type2->IsBitset()) { | 789 if (type1->IsBitset() && type2->IsBitset()) { |
791 return BitsetType::New(type1->AsBitset() | type2->AsBitset()); | 790 return BitsetType::New(type1->AsBitset() | type2->AsBitset()); |
792 } | 791 } |
793 | 792 |
794 // Fast case: top or bottom types. | 793 // Fast case: top or bottom types. |
795 if (type1->IsAny() || type2->IsNone()) return type1; | 794 if (type1->IsAny() || type2->IsNone()) return type1; |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
994 return i::SmiValuesAre31Bits() ? kSigned31 : kSigned32; | 993 return i::SmiValuesAre31Bits() ? kSigned31 : kSigned32; |
995 } | 994 } |
996 | 995 |
997 BitsetType::bitset BitsetType::UnsignedSmall() { | 996 BitsetType::bitset BitsetType::UnsignedSmall() { |
998 return i::SmiValuesAre31Bits() ? kUnsigned30 : kUnsigned31; | 997 return i::SmiValuesAre31Bits() ? kUnsigned30 : kUnsigned31; |
999 } | 998 } |
1000 | 999 |
1001 } // namespace compiler | 1000 } // namespace compiler |
1002 } // namespace internal | 1001 } // namespace internal |
1003 } // namespace v8 | 1002 } // namespace v8 |
OLD | NEW |