| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 #ifndef V8_HYDROGEN_INSTRUCTIONS_H_ | 5 #ifndef V8_HYDROGEN_INSTRUCTIONS_H_ |
| 6 #define V8_HYDROGEN_INSTRUCTIONS_H_ | 6 #define V8_HYDROGEN_INSTRUCTIONS_H_ |
| 7 | 7 |
| 8 #include "v8.h" | 8 #include "v8.h" |
| 9 | 9 |
| 10 #include "allocation.h" | 10 #include "allocation.h" |
| (...skipping 1552 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1563 | 1563 |
| 1564 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 1564 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; |
| 1565 | 1565 |
| 1566 static const int kNoKnownSuccessorIndex = -1; | 1566 static const int kNoKnownSuccessorIndex = -1; |
| 1567 int known_successor_index() const { return known_successor_index_; } | 1567 int known_successor_index() const { return known_successor_index_; } |
| 1568 void set_known_successor_index(int known_successor_index) { | 1568 void set_known_successor_index(int known_successor_index) { |
| 1569 known_successor_index_ = known_successor_index; | 1569 known_successor_index_ = known_successor_index; |
| 1570 } | 1570 } |
| 1571 | 1571 |
| 1572 Unique<Map> map() const { return map_; } | 1572 Unique<Map> map() const { return map_; } |
| 1573 bool map_is_stable() const { return map_is_stable_; } |
| 1573 | 1574 |
| 1574 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1575 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
| 1575 return Representation::Tagged(); | 1576 return Representation::Tagged(); |
| 1576 } | 1577 } |
| 1577 | 1578 |
| 1578 DECLARE_CONCRETE_INSTRUCTION(CompareMap) | 1579 DECLARE_CONCRETE_INSTRUCTION(CompareMap) |
| 1579 | 1580 |
| 1580 protected: | 1581 protected: |
| 1581 virtual int RedefinedOperandIndex() { return 0; } | 1582 virtual int RedefinedOperandIndex() { return 0; } |
| 1582 | 1583 |
| 1583 private: | 1584 private: |
| 1584 HCompareMap(HValue* value, | 1585 HCompareMap(HValue* value, |
| 1585 Handle<Map> map, | 1586 Handle<Map> map, |
| 1586 HBasicBlock* true_target = NULL, | 1587 HBasicBlock* true_target = NULL, |
| 1587 HBasicBlock* false_target = NULL) | 1588 HBasicBlock* false_target = NULL) |
| 1588 : HUnaryControlInstruction(value, true_target, false_target), | 1589 : HUnaryControlInstruction(value, true_target, false_target), |
| 1589 known_successor_index_(kNoKnownSuccessorIndex), map_(Unique<Map>(map)) { | 1590 known_successor_index_(kNoKnownSuccessorIndex), |
| 1590 ASSERT(!map.is_null()); | 1591 map_is_stable_(map->is_stable()), |
| 1592 map_(Unique<Map>::CreateImmovable(map)) { |
| 1591 set_representation(Representation::Tagged()); | 1593 set_representation(Representation::Tagged()); |
| 1592 } | 1594 } |
| 1593 | 1595 |
| 1594 int known_successor_index_; | 1596 int known_successor_index_ : 31; |
| 1597 bool map_is_stable_ : 1; |
| 1595 Unique<Map> map_; | 1598 Unique<Map> map_; |
| 1596 }; | 1599 }; |
| 1597 | 1600 |
| 1598 | 1601 |
| 1599 class HContext V8_FINAL : public HTemplateInstruction<0> { | 1602 class HContext V8_FINAL : public HTemplateInstruction<0> { |
| 1600 public: | 1603 public: |
| 1601 static HContext* New(Zone* zone) { | 1604 static HContext* New(Zone* zone) { |
| 1602 return new(zone) HContext(); | 1605 return new(zone) HContext(); |
| 1603 } | 1606 } |
| 1604 | 1607 |
| (...skipping 1152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2757 HValue* typecheck = NULL) { | 2760 HValue* typecheck = NULL) { |
| 2758 UniqueSet<Map>* maps = new(zone) UniqueSet<Map>(map_list->length(), zone); | 2761 UniqueSet<Map>* maps = new(zone) UniqueSet<Map>(map_list->length(), zone); |
| 2759 for (int i = 0; i < map_list->length(); ++i) { | 2762 for (int i = 0; i < map_list->length(); ++i) { |
| 2760 maps->Add(Unique<Map>::CreateImmovable(map_list->at(i)), zone); | 2763 maps->Add(Unique<Map>::CreateImmovable(map_list->at(i)), zone); |
| 2761 } | 2764 } |
| 2762 return new(zone) HCheckMaps(value, maps, typecheck); | 2765 return new(zone) HCheckMaps(value, maps, typecheck); |
| 2763 } | 2766 } |
| 2764 | 2767 |
| 2765 bool IsStabilityCheck() const { return is_stability_check_; } | 2768 bool IsStabilityCheck() const { return is_stability_check_; } |
| 2766 void MarkAsStabilityCheck() { | 2769 void MarkAsStabilityCheck() { |
| 2770 maps_are_stable_ = true; |
| 2767 has_migration_target_ = false; | 2771 has_migration_target_ = false; |
| 2768 is_stability_check_ = true; | 2772 is_stability_check_ = true; |
| 2769 ClearChangesFlag(kNewSpacePromotion); | 2773 ClearChangesFlag(kNewSpacePromotion); |
| 2770 ClearDependsOnFlag(kElementsKind); | 2774 ClearDependsOnFlag(kElementsKind); |
| 2771 ClearDependsOnFlag(kMaps); | 2775 ClearDependsOnFlag(kMaps); |
| 2772 } | 2776 } |
| 2773 | 2777 |
| 2774 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE { return false; } | 2778 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE { return false; } |
| 2775 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 2779 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
| 2776 return Representation::Tagged(); | 2780 return Representation::Tagged(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2787 | 2791 |
| 2788 bool HasMigrationTarget() const { return has_migration_target_; } | 2792 bool HasMigrationTarget() const { return has_migration_target_; } |
| 2789 | 2793 |
| 2790 virtual HValue* Canonicalize() V8_OVERRIDE; | 2794 virtual HValue* Canonicalize() V8_OVERRIDE; |
| 2791 | 2795 |
| 2792 static HCheckMaps* CreateAndInsertAfter(Zone* zone, | 2796 static HCheckMaps* CreateAndInsertAfter(Zone* zone, |
| 2793 HValue* value, | 2797 HValue* value, |
| 2794 Unique<Map> map, | 2798 Unique<Map> map, |
| 2795 bool map_is_stable, | 2799 bool map_is_stable, |
| 2796 HInstruction* instr) { | 2800 HInstruction* instr) { |
| 2797 return CreateAndInsertAfter(zone, value, new(zone) UniqueSet<Map>( | 2801 return instr->Append(new(zone) HCheckMaps( |
| 2798 map, zone), map_is_stable, instr); | 2802 value, new(zone) UniqueSet<Map>(map, zone), map_is_stable)); |
| 2799 } | 2803 } |
| 2800 | 2804 |
| 2801 static HCheckMaps* CreateAndInsertAfter(Zone* zone, | 2805 static HCheckMaps* CreateAndInsertBefore(Zone* zone, |
| 2802 HValue* value, | 2806 HValue* value, |
| 2803 const UniqueSet<Map>* maps, | 2807 const UniqueSet<Map>* maps, |
| 2804 bool maps_are_stable, | 2808 bool maps_are_stable, |
| 2805 HInstruction* instr) { | 2809 HInstruction* instr) { |
| 2806 return instr->Append(new(zone) HCheckMaps(value, maps, maps_are_stable)); | 2810 return instr->Prepend(new(zone) HCheckMaps(value, maps, maps_are_stable)); |
| 2807 } | 2811 } |
| 2808 | 2812 |
| 2809 DECLARE_CONCRETE_INSTRUCTION(CheckMaps) | 2813 DECLARE_CONCRETE_INSTRUCTION(CheckMaps) |
| 2810 | 2814 |
| 2811 protected: | 2815 protected: |
| 2812 virtual bool DataEquals(HValue* other) V8_OVERRIDE { | 2816 virtual bool DataEquals(HValue* other) V8_OVERRIDE { |
| 2813 return this->maps()->Equals(HCheckMaps::cast(other)->maps()); | 2817 return this->maps()->Equals(HCheckMaps::cast(other)->maps()); |
| 2814 } | 2818 } |
| 2815 | 2819 |
| 2816 virtual int RedefinedOperandIndex() { return 0; } | 2820 virtual int RedefinedOperandIndex() { return 0; } |
| (...skipping 673 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3490 static HConstant* CreateAndInsertBefore(Zone* zone, | 3494 static HConstant* CreateAndInsertBefore(Zone* zone, |
| 3491 HValue* context, | 3495 HValue* context, |
| 3492 int32_t value, | 3496 int32_t value, |
| 3493 Representation representation, | 3497 Representation representation, |
| 3494 HInstruction* instruction) { | 3498 HInstruction* instruction) { |
| 3495 return instruction->Prepend(HConstant::New( | 3499 return instruction->Prepend(HConstant::New( |
| 3496 zone, context, value, representation)); | 3500 zone, context, value, representation)); |
| 3497 } | 3501 } |
| 3498 | 3502 |
| 3499 static HConstant* CreateAndInsertBefore(Zone* zone, | 3503 static HConstant* CreateAndInsertBefore(Zone* zone, |
| 3500 Unique<Object> object, | 3504 Unique<Map> map, |
| 3501 bool is_not_in_new_space, | 3505 bool map_is_stable, |
| 3502 HInstruction* instruction) { | 3506 HInstruction* instruction) { |
| 3503 return instruction->Prepend(new(zone) HConstant( | 3507 return instruction->Prepend(new(zone) HConstant( |
| 3504 object, Unique<Map>(Handle<Map>::null()), false, | 3508 map, Unique<Map>(Handle<Map>::null()), map_is_stable, |
| 3505 Representation::Tagged(), HType::Tagged(), is_not_in_new_space, | 3509 Representation::Tagged(), HType::Tagged(), true, |
| 3506 false, false, kUnknownInstanceType)); | 3510 false, false, MAP_TYPE)); |
| 3507 } | 3511 } |
| 3508 | 3512 |
| 3509 static HConstant* CreateAndInsertAfter(Zone* zone, | 3513 static HConstant* CreateAndInsertAfter(Zone* zone, |
| 3510 Unique<Map> map, | 3514 Unique<Map> map, |
| 3515 bool map_is_stable, |
| 3511 HInstruction* instruction) { | 3516 HInstruction* instruction) { |
| 3512 return instruction->Append(new(zone) HConstant( | 3517 return instruction->Append(new(zone) HConstant( |
| 3513 map, Unique<Map>(Handle<Map>::null()), false, | 3518 map, Unique<Map>(Handle<Map>::null()), map_is_stable, |
| 3514 Representation::Tagged(), HType::Tagged(), true, | 3519 Representation::Tagged(), HType::Tagged(), true, |
| 3515 false, false, MAP_TYPE)); | 3520 false, false, MAP_TYPE)); |
| 3516 } | 3521 } |
| 3517 | 3522 |
| 3518 Handle<Object> handle(Isolate* isolate) { | 3523 Handle<Object> handle(Isolate* isolate) { |
| 3519 if (object_.handle().is_null()) { | 3524 if (object_.handle().is_null()) { |
| 3520 // Default arguments to is_not_in_new_space depend on this heap number | 3525 // Default arguments to is_not_in_new_space depend on this heap number |
| 3521 // to be tenured so that it's guaranteed not to be located in new space. | 3526 // to be tenured so that it's guaranteed not to be located in new space. |
| 3522 object_ = Unique<Object>::CreateUninitialized( | 3527 object_ = Unique<Object>::CreateUninitialized( |
| 3523 isolate->factory()->NewNumber(double_value_, TENURED)); | 3528 isolate->factory()->NewNumber(double_value_, TENURED)); |
| (...skipping 4127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7651 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 7656 virtual bool IsDeletable() const V8_OVERRIDE { return true; } |
| 7652 }; | 7657 }; |
| 7653 | 7658 |
| 7654 | 7659 |
| 7655 #undef DECLARE_INSTRUCTION | 7660 #undef DECLARE_INSTRUCTION |
| 7656 #undef DECLARE_CONCRETE_INSTRUCTION | 7661 #undef DECLARE_CONCRETE_INSTRUCTION |
| 7657 | 7662 |
| 7658 } } // namespace v8::internal | 7663 } } // namespace v8::internal |
| 7659 | 7664 |
| 7660 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 7665 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
| OLD | NEW |