OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 1546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1557 expected_input_types_(expected_input_types) { | 1557 expected_input_types_(expected_input_types) { |
1558 SetFlag(kAllowUndefinedAsNaN); | 1558 SetFlag(kAllowUndefinedAsNaN); |
1559 } | 1559 } |
1560 | 1560 |
1561 ToBooleanStub::Types expected_input_types_; | 1561 ToBooleanStub::Types expected_input_types_; |
1562 }; | 1562 }; |
1563 | 1563 |
1564 | 1564 |
1565 class HCompareMap V8_FINAL : public HUnaryControlInstruction { | 1565 class HCompareMap V8_FINAL : public HUnaryControlInstruction { |
1566 public: | 1566 public: |
1567 DECLARE_INSTRUCTION_FACTORY_P3(HCompareMap, HValue*, Handle<Map>, | 1567 DECLARE_INSTRUCTION_FACTORY_P2(HCompareMap, HValue*, Handle<Map>); |
1568 CompilationInfo*); | 1568 DECLARE_INSTRUCTION_FACTORY_P4(HCompareMap, HValue*, Handle<Map>, |
1569 DECLARE_INSTRUCTION_FACTORY_P5(HCompareMap, HValue*, Handle<Map>, | |
1570 CompilationInfo*, | |
1571 HBasicBlock*, HBasicBlock*); | 1569 HBasicBlock*, HBasicBlock*); |
1572 | 1570 |
1573 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE { | 1571 virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE { |
1574 if (known_successor_index() != kNoKnownSuccessorIndex) { | 1572 if (known_successor_index() != kNoKnownSuccessorIndex) { |
1575 *block = SuccessorAt(known_successor_index()); | 1573 *block = SuccessorAt(known_successor_index()); |
1576 return true; | 1574 return true; |
1577 } | 1575 } |
1578 *block = NULL; | 1576 *block = NULL; |
1579 return false; | 1577 return false; |
1580 } | 1578 } |
1581 | 1579 |
1582 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 1580 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; |
1583 | 1581 |
1584 static const int kNoKnownSuccessorIndex = -1; | 1582 static const int kNoKnownSuccessorIndex = -1; |
1585 int known_successor_index() const { return known_successor_index_; } | 1583 int known_successor_index() const { return known_successor_index_; } |
1586 void set_known_successor_index(int known_successor_index) { | 1584 void set_known_successor_index(int known_successor_index) { |
1587 known_successor_index_ = known_successor_index; | 1585 known_successor_index_ = known_successor_index; |
1588 } | 1586 } |
1589 | 1587 |
1590 Unique<Map> map() const { return map_; } | 1588 Unique<Map> map() const { return map_; } |
1591 | 1589 |
1592 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 1590 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
1593 return Representation::Tagged(); | 1591 return Representation::Tagged(); |
1594 } | 1592 } |
1595 | 1593 |
1596 bool is_stable() const { | |
1597 return is_stable_; | |
1598 } | |
1599 | |
1600 DECLARE_CONCRETE_INSTRUCTION(CompareMap) | 1594 DECLARE_CONCRETE_INSTRUCTION(CompareMap) |
1601 | 1595 |
1602 protected: | 1596 protected: |
1603 virtual int RedefinedOperandIndex() { return 0; } | 1597 virtual int RedefinedOperandIndex() { return 0; } |
1604 | 1598 |
1605 private: | 1599 private: |
1606 HCompareMap(HValue* value, | 1600 HCompareMap(HValue* value, |
1607 Handle<Map> map, | 1601 Handle<Map> map, |
1608 CompilationInfo* info, | |
1609 HBasicBlock* true_target = NULL, | 1602 HBasicBlock* true_target = NULL, |
1610 HBasicBlock* false_target = NULL) | 1603 HBasicBlock* false_target = NULL) |
1611 : HUnaryControlInstruction(value, true_target, false_target), | 1604 : HUnaryControlInstruction(value, true_target, false_target), |
1612 known_successor_index_(kNoKnownSuccessorIndex), map_(Unique<Map>(map)) { | 1605 known_successor_index_(kNoKnownSuccessorIndex), map_(Unique<Map>(map)) { |
1613 ASSERT(!map.is_null()); | 1606 ASSERT(!map.is_null()); |
1614 is_stable_ = map->is_stable(); | |
1615 | |
1616 if (is_stable_) { | |
1617 map->AddDependentCompilationInfo( | |
1618 DependentCode::kPrototypeCheckGroup, info); | |
1619 } | |
1620 set_representation(Representation::Tagged()); | 1607 set_representation(Representation::Tagged()); |
1621 } | 1608 } |
1622 | 1609 |
1623 int known_successor_index_; | 1610 int known_successor_index_; |
1624 bool is_stable_; | |
1625 Unique<Map> map_; | 1611 Unique<Map> map_; |
1626 }; | 1612 }; |
1627 | 1613 |
1628 | 1614 |
1629 class HContext V8_FINAL : public HTemplateInstruction<0> { | 1615 class HContext V8_FINAL : public HTemplateInstruction<0> { |
1630 public: | 1616 public: |
1631 static HContext* New(Zone* zone) { | 1617 static HContext* New(Zone* zone) { |
1632 return new(zone) HContext(); | 1618 return new(zone) HContext(); |
1633 } | 1619 } |
1634 | 1620 |
(...skipping 1065 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2700 }; | 2686 }; |
2701 | 2687 |
2702 | 2688 |
2703 class HCheckMaps V8_FINAL : public HTemplateInstruction<2> { | 2689 class HCheckMaps V8_FINAL : public HTemplateInstruction<2> { |
2704 public: | 2690 public: |
2705 static HCheckMaps* New(Zone* zone, HValue* context, HValue* value, | 2691 static HCheckMaps* New(Zone* zone, HValue* context, HValue* value, |
2706 Handle<Map> map, CompilationInfo* info, | 2692 Handle<Map> map, CompilationInfo* info, |
2707 HValue* typecheck = NULL); | 2693 HValue* typecheck = NULL); |
2708 static HCheckMaps* New(Zone* zone, HValue* context, | 2694 static HCheckMaps* New(Zone* zone, HValue* context, |
2709 HValue* value, SmallMapList* maps, | 2695 HValue* value, SmallMapList* maps, |
2710 CompilationInfo* info, | |
2711 HValue* typecheck = NULL) { | 2696 HValue* typecheck = NULL) { |
2712 HCheckMaps* check_map = new(zone) HCheckMaps(value, zone, typecheck); | 2697 HCheckMaps* check_map = new(zone) HCheckMaps(value, zone, typecheck); |
2713 for (int i = 0; i < maps->length(); i++) { | 2698 for (int i = 0; i < maps->length(); i++) { |
2714 check_map->Add(maps->at(i), info, zone); | 2699 check_map->Add(maps->at(i), zone); |
2715 } | 2700 } |
2716 return check_map; | 2701 return check_map; |
2717 } | 2702 } |
2718 | 2703 |
2719 bool CanOmitMapChecks() { return omit_; } | 2704 bool CanOmitMapChecks() { return omit_; } |
2720 | 2705 |
2721 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE { return false; } | 2706 virtual bool HasEscapingOperandAt(int index) V8_OVERRIDE { return false; } |
2722 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { | 2707 virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
2723 return Representation::Tagged(); | 2708 return Representation::Tagged(); |
2724 } | 2709 } |
(...skipping 11 matching lines...) Expand all Loading... |
2736 map_set_.Clear(); | 2721 map_set_.Clear(); |
2737 for (int i = 0; i < maps->size(); i++) { | 2722 for (int i = 0; i < maps->size(); i++) { |
2738 map_set_.Add(maps->at(i), zone); | 2723 map_set_.Add(maps->at(i), zone); |
2739 } | 2724 } |
2740 } | 2725 } |
2741 | 2726 |
2742 bool has_migration_target() const { | 2727 bool has_migration_target() const { |
2743 return has_migration_target_; | 2728 return has_migration_target_; |
2744 } | 2729 } |
2745 | 2730 |
2746 bool is_stable() const { | |
2747 return is_stable_; | |
2748 } | |
2749 | |
2750 DECLARE_CONCRETE_INSTRUCTION(CheckMaps) | 2731 DECLARE_CONCRETE_INSTRUCTION(CheckMaps) |
2751 | 2732 |
2752 protected: | 2733 protected: |
2753 virtual bool DataEquals(HValue* other) V8_OVERRIDE { | 2734 virtual bool DataEquals(HValue* other) V8_OVERRIDE { |
2754 return this->map_set_.Equals(&HCheckMaps::cast(other)->map_set_); | 2735 return this->map_set_.Equals(&HCheckMaps::cast(other)->map_set_); |
2755 } | 2736 } |
2756 | 2737 |
2757 virtual int RedefinedOperandIndex() { return 0; } | 2738 virtual int RedefinedOperandIndex() { return 0; } |
2758 | 2739 |
2759 private: | 2740 private: |
2760 void Add(Handle<Map> map, CompilationInfo* info, Zone* zone) { | 2741 void Add(Handle<Map> map, Zone* zone) { |
2761 map_set_.Add(Unique<Map>(map), zone); | 2742 map_set_.Add(Unique<Map>(map), zone); |
2762 is_stable_ = is_stable_ && map->is_stable(); | 2743 SetDependsOnFlag(kMaps); |
2763 if (is_stable_) { | 2744 SetDependsOnFlag(kElementsKind); |
2764 map->AddDependentCompilationInfo( | |
2765 DependentCode::kPrototypeCheckGroup, info); | |
2766 } else { | |
2767 SetDependsOnFlag(kMaps); | |
2768 SetDependsOnFlag(kElementsKind); | |
2769 } | |
2770 | 2745 |
2771 if (!has_migration_target_ && map->is_migration_target()) { | 2746 if (!has_migration_target_ && map->is_migration_target()) { |
2772 has_migration_target_ = true; | 2747 has_migration_target_ = true; |
2773 SetChangesFlag(kNewSpacePromotion); | 2748 SetChangesFlag(kNewSpacePromotion); |
2774 } | 2749 } |
2775 } | 2750 } |
2776 | 2751 |
2777 // Clients should use one of the static New* methods above. | 2752 // Clients should use one of the static New* methods above. |
2778 HCheckMaps(HValue* value, Zone *zone, HValue* typecheck) | 2753 HCheckMaps(HValue* value, Zone *zone, HValue* typecheck) |
2779 : HTemplateInstruction<2>(value->type()), | 2754 : HTemplateInstruction<2>(value->type()), |
2780 omit_(false), has_migration_target_(false), is_stable_(true) { | 2755 omit_(false), has_migration_target_(false) { |
2781 SetOperandAt(0, value); | 2756 SetOperandAt(0, value); |
2782 // Use the object value for the dependency if NULL is passed. | 2757 // Use the object value for the dependency if NULL is passed. |
2783 SetOperandAt(1, typecheck != NULL ? typecheck : value); | 2758 SetOperandAt(1, typecheck != NULL ? typecheck : value); |
2784 set_representation(Representation::Tagged()); | 2759 set_representation(Representation::Tagged()); |
2785 SetFlag(kUseGVN); | 2760 SetFlag(kUseGVN); |
2786 SetFlag(kTrackSideEffectDominators); | 2761 SetFlag(kTrackSideEffectDominators); |
2787 } | 2762 } |
2788 | 2763 |
2789 bool omit_; | 2764 bool omit_; |
2790 bool has_migration_target_; | 2765 bool has_migration_target_; |
2791 bool is_stable_; | |
2792 UniqueSet<Map> map_set_; | 2766 UniqueSet<Map> map_set_; |
2793 }; | 2767 }; |
2794 | 2768 |
2795 | 2769 |
2796 class HCheckValue V8_FINAL : public HUnaryOperation { | 2770 class HCheckValue V8_FINAL : public HUnaryOperation { |
2797 public: | 2771 public: |
2798 static HCheckValue* New(Zone* zone, HValue* context, | 2772 static HCheckValue* New(Zone* zone, HValue* context, |
2799 HValue* value, Handle<JSFunction> func) { | 2773 HValue* value, Handle<JSFunction> func) { |
2800 bool in_new_space = zone->isolate()->heap()->InNewSpace(*func); | 2774 bool in_new_space = zone->isolate()->heap()->InNewSpace(*func); |
2801 // NOTE: We create an uninitialized Unique and initialize it later. | 2775 // NOTE: We create an uninitialized Unique and initialize it later. |
(...skipping 3760 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6562 } | 6536 } |
6563 | 6537 |
6564 void SetTransition(HConstant* map_constant, CompilationInfo* info) { | 6538 void SetTransition(HConstant* map_constant, CompilationInfo* info) { |
6565 ASSERT(!has_transition()); // Only set once. | 6539 ASSERT(!has_transition()); // Only set once. |
6566 Handle<Map> map = Handle<Map>::cast(map_constant->handle(info->isolate())); | 6540 Handle<Map> map = Handle<Map>::cast(map_constant->handle(info->isolate())); |
6567 if (map->CanBeDeprecated()) { | 6541 if (map->CanBeDeprecated()) { |
6568 map->AddDependentCompilationInfo(DependentCode::kTransitionGroup, info); | 6542 map->AddDependentCompilationInfo(DependentCode::kTransitionGroup, info); |
6569 } | 6543 } |
6570 SetOperandAt(2, map_constant); | 6544 SetOperandAt(2, map_constant); |
6571 has_transition_ = true; | 6545 has_transition_ = true; |
6572 is_stable_ = map->is_stable(); | |
6573 | |
6574 if (is_stable_) { | |
6575 map->AddDependentCompilationInfo( | |
6576 DependentCode::kPrototypeCheckGroup, info); | |
6577 } | |
6578 } | |
6579 | |
6580 bool is_stable() const { | |
6581 return is_stable_; | |
6582 } | 6546 } |
6583 | 6547 |
6584 bool NeedsWriteBarrier() { | 6548 bool NeedsWriteBarrier() { |
6585 ASSERT(!(FLAG_track_double_fields && field_representation().IsDouble()) || | 6549 ASSERT(!(FLAG_track_double_fields && field_representation().IsDouble()) || |
6586 !has_transition()); | 6550 !has_transition()); |
6587 if (IsSkipWriteBarrier()) return false; | 6551 if (IsSkipWriteBarrier()) return false; |
6588 if (field_representation().IsDouble()) return false; | 6552 if (field_representation().IsDouble()) return false; |
6589 if (field_representation().IsSmi()) return false; | 6553 if (field_representation().IsSmi()) return false; |
6590 if (field_representation().IsInteger32()) return false; | 6554 if (field_representation().IsInteger32()) return false; |
6591 if (field_representation().IsExternal()) return false; | 6555 if (field_representation().IsExternal()) return false; |
(...skipping 18 matching lines...) Expand all Loading... |
6610 | 6574 |
6611 private: | 6575 private: |
6612 HStoreNamedField(HValue* obj, | 6576 HStoreNamedField(HValue* obj, |
6613 HObjectAccess access, | 6577 HObjectAccess access, |
6614 HValue* val, | 6578 HValue* val, |
6615 StoreFieldOrKeyedMode store_mode = INITIALIZING_STORE) | 6579 StoreFieldOrKeyedMode store_mode = INITIALIZING_STORE) |
6616 : access_(access), | 6580 : access_(access), |
6617 new_space_dominator_(NULL), | 6581 new_space_dominator_(NULL), |
6618 write_barrier_mode_(UPDATE_WRITE_BARRIER), | 6582 write_barrier_mode_(UPDATE_WRITE_BARRIER), |
6619 has_transition_(false), | 6583 has_transition_(false), |
6620 is_stable_(false), | |
6621 store_mode_(store_mode) { | 6584 store_mode_(store_mode) { |
6622 // Stores to a non existing in-object property are allowed only to the | 6585 // Stores to a non existing in-object property are allowed only to the |
6623 // newly allocated objects (via HAllocate or HInnerAllocatedObject). | 6586 // newly allocated objects (via HAllocate or HInnerAllocatedObject). |
6624 ASSERT(!access.IsInobject() || access.existing_inobject_property() || | 6587 ASSERT(!access.IsInobject() || access.existing_inobject_property() || |
6625 obj->IsAllocate() || obj->IsInnerAllocatedObject()); | 6588 obj->IsAllocate() || obj->IsInnerAllocatedObject()); |
6626 SetOperandAt(0, obj); | 6589 SetOperandAt(0, obj); |
6627 SetOperandAt(1, val); | 6590 SetOperandAt(1, val); |
6628 SetOperandAt(2, obj); | 6591 SetOperandAt(2, obj); |
6629 access.SetGVNFlags(this, STORE); | 6592 access.SetGVNFlags(this, STORE); |
6630 } | 6593 } |
6631 | 6594 |
6632 HObjectAccess access_; | 6595 HObjectAccess access_; |
6633 HValue* new_space_dominator_; | 6596 HValue* new_space_dominator_; |
6634 WriteBarrierMode write_barrier_mode_ : 1; | 6597 WriteBarrierMode write_barrier_mode_ : 1; |
6635 bool has_transition_ : 1; | 6598 bool has_transition_ : 1; |
6636 bool is_stable_ : 1; | |
6637 StoreFieldOrKeyedMode store_mode_ : 1; | 6599 StoreFieldOrKeyedMode store_mode_ : 1; |
6638 }; | 6600 }; |
6639 | 6601 |
6640 | 6602 |
6641 class HStoreNamedGeneric V8_FINAL : public HTemplateInstruction<3> { | 6603 class HStoreNamedGeneric V8_FINAL : public HTemplateInstruction<3> { |
6642 public: | 6604 public: |
6643 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HStoreNamedGeneric, HValue*, | 6605 DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HStoreNamedGeneric, HValue*, |
6644 Handle<String>, HValue*, | 6606 Handle<String>, HValue*, |
6645 StrictModeFlag); | 6607 StrictModeFlag); |
6646 HValue* object() { return OperandAt(0); } | 6608 HValue* object() { return OperandAt(0); } |
(...skipping 873 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7520 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 7482 virtual bool IsDeletable() const V8_OVERRIDE { return true; } |
7521 }; | 7483 }; |
7522 | 7484 |
7523 | 7485 |
7524 #undef DECLARE_INSTRUCTION | 7486 #undef DECLARE_INSTRUCTION |
7525 #undef DECLARE_CONCRETE_INSTRUCTION | 7487 #undef DECLARE_CONCRETE_INSTRUCTION |
7526 | 7488 |
7527 } } // namespace v8::internal | 7489 } } // namespace v8::internal |
7528 | 7490 |
7529 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 7491 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
OLD | NEW |