OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 1751 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1762 DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject, "arguments-object") | 1762 DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject, "arguments-object") |
1763 }; | 1763 }; |
1764 | 1764 |
1765 | 1765 |
1766 class HConstant: public HInstruction { | 1766 class HConstant: public HInstruction { |
1767 public: | 1767 public: |
1768 HConstant(Handle<Object> handle, Representation r); | 1768 HConstant(Handle<Object> handle, Representation r); |
1769 | 1769 |
1770 Handle<Object> handle() const { return handle_; } | 1770 Handle<Object> handle() const { return handle_; } |
1771 | 1771 |
| 1772 bool InOldSpace() const { return !Heap::InNewSpace(*handle_); } |
| 1773 |
1772 virtual bool EmitAtUses() const { return !representation().IsDouble(); } | 1774 virtual bool EmitAtUses() const { return !representation().IsDouble(); } |
1773 virtual void PrintDataTo(StringStream* stream) const; | 1775 virtual void PrintDataTo(StringStream* stream) const; |
1774 virtual HType CalculateInferredType() const; | 1776 virtual HType CalculateInferredType() const; |
1775 bool IsInteger() const { return handle_->IsSmi(); } | 1777 bool IsInteger() const { return handle_->IsSmi(); } |
1776 HConstant* CopyToRepresentation(Representation r) const; | 1778 HConstant* CopyToRepresentation(Representation r) const; |
1777 HConstant* CopyToTruncatedInt32() const; | 1779 HConstant* CopyToTruncatedInt32() const; |
1778 bool HasInteger32Value() const { return has_int32_value_; } | 1780 bool HasInteger32Value() const { return has_int32_value_; } |
1779 int32_t Integer32Value() const { | 1781 int32_t Integer32Value() const { |
1780 ASSERT(HasInteger32Value()); | 1782 ASSERT(HasInteger32Value()); |
1781 return int32_value_; | 1783 return int32_value_; |
(...skipping 898 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2680 class HLoadKeyedGeneric: public HLoadKeyed { | 2682 class HLoadKeyedGeneric: public HLoadKeyed { |
2681 public: | 2683 public: |
2682 HLoadKeyedGeneric(HValue* obj, HValue* key) : HLoadKeyed(obj, key) { | 2684 HLoadKeyedGeneric(HValue* obj, HValue* key) : HLoadKeyed(obj, key) { |
2683 SetFlagMask(AllSideEffects()); | 2685 SetFlagMask(AllSideEffects()); |
2684 } | 2686 } |
2685 | 2687 |
2686 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric, "load_keyed_generic") | 2688 DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric, "load_keyed_generic") |
2687 }; | 2689 }; |
2688 | 2690 |
2689 | 2691 |
| 2692 static inline bool StoringValueNeedsWriteBarrier(HValue* value) { |
| 2693 return !value->type().IsSmi() && |
| 2694 !(value->IsConstant() && HConstant::cast(value)->InOldSpace()); |
| 2695 } |
| 2696 |
| 2697 |
2690 class HStoreNamed: public HBinaryOperation { | 2698 class HStoreNamed: public HBinaryOperation { |
2691 public: | 2699 public: |
2692 HStoreNamed(HValue* obj, Handle<Object> name, HValue* val) | 2700 HStoreNamed(HValue* obj, Handle<Object> name, HValue* val) |
2693 : HBinaryOperation(obj, val), name_(name) { | 2701 : HBinaryOperation(obj, val), name_(name) { |
2694 } | 2702 } |
2695 | 2703 |
2696 virtual Representation RequiredInputRepresentation(int index) const { | 2704 virtual Representation RequiredInputRepresentation(int index) const { |
2697 return Representation::Tagged(); | 2705 return Representation::Tagged(); |
2698 } | 2706 } |
2699 | 2707 |
2700 virtual void PrintDataTo(StringStream* stream) const; | 2708 virtual void PrintDataTo(StringStream* stream) const; |
2701 | 2709 |
2702 HValue* object() const { return OperandAt(0); } | 2710 HValue* object() const { return OperandAt(0); } |
2703 Handle<Object> name() const { return name_; } | 2711 Handle<Object> name() const { return name_; } |
2704 HValue* value() const { return OperandAt(1); } | 2712 HValue* value() const { return OperandAt(1); } |
2705 void set_value(HValue* value) { SetOperandAt(1, value); } | 2713 void set_value(HValue* value) { SetOperandAt(1, value); } |
2706 | 2714 |
| 2715 bool NeedsWriteBarrier() const { |
| 2716 return StoringValueNeedsWriteBarrier(value()); |
| 2717 } |
| 2718 |
2707 DECLARE_INSTRUCTION(StoreNamed) | 2719 DECLARE_INSTRUCTION(StoreNamed) |
2708 | 2720 |
2709 protected: | 2721 protected: |
2710 virtual bool DataEquals(HValue* other) const { | 2722 virtual bool DataEquals(HValue* other) const { |
2711 HStoreNamed* b = HStoreNamed::cast(other); | 2723 HStoreNamed* b = HStoreNamed::cast(other); |
2712 return name_.is_identical_to(b->name_); | 2724 return name_.is_identical_to(b->name_); |
2713 } | 2725 } |
2714 | 2726 |
2715 private: | 2727 private: |
2716 Handle<Object> name_; | 2728 Handle<Object> name_; |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2777 virtual HValue* OperandAt(int index) const { return operands_[index]; } | 2789 virtual HValue* OperandAt(int index) const { return operands_[index]; } |
2778 | 2790 |
2779 virtual Representation RequiredInputRepresentation(int index) const { | 2791 virtual Representation RequiredInputRepresentation(int index) const { |
2780 return Representation::Tagged(); | 2792 return Representation::Tagged(); |
2781 } | 2793 } |
2782 | 2794 |
2783 HValue* object() const { return OperandAt(0); } | 2795 HValue* object() const { return OperandAt(0); } |
2784 HValue* key() const { return OperandAt(1); } | 2796 HValue* key() const { return OperandAt(1); } |
2785 HValue* value() const { return OperandAt(2); } | 2797 HValue* value() const { return OperandAt(2); } |
2786 | 2798 |
| 2799 bool NeedsWriteBarrier() const { |
| 2800 return StoringValueNeedsWriteBarrier(value()); |
| 2801 } |
| 2802 |
2787 DECLARE_INSTRUCTION(StoreKeyed) | 2803 DECLARE_INSTRUCTION(StoreKeyed) |
2788 | 2804 |
2789 protected: | 2805 protected: |
2790 virtual void InternalSetOperandAt(int index, HValue* value) { | 2806 virtual void InternalSetOperandAt(int index, HValue* value) { |
2791 operands_[index] = value; | 2807 operands_[index] = value; |
2792 } | 2808 } |
2793 | 2809 |
2794 private: | 2810 private: |
2795 HOperandVector<3> operands_; | 2811 HOperandVector<3> operands_; |
2796 }; | 2812 }; |
2797 | 2813 |
2798 | 2814 |
2799 class HStoreKeyedFastElement: public HStoreKeyed { | 2815 class HStoreKeyedFastElement: public HStoreKeyed { |
2800 public: | 2816 public: |
2801 HStoreKeyedFastElement(HValue* obj, HValue* key, HValue* val) | 2817 HStoreKeyedFastElement(HValue* obj, HValue* key, HValue* val) |
2802 : HStoreKeyed(obj, key, val) { | 2818 : HStoreKeyed(obj, key, val) { |
2803 SetFlag(kChangesArrayElements); | 2819 SetFlag(kChangesArrayElements); |
2804 } | 2820 } |
2805 | 2821 |
2806 bool NeedsWriteBarrier() const { | |
2807 return !value()->type().IsSmi(); | |
2808 } | |
2809 | |
2810 virtual Representation RequiredInputRepresentation(int index) const { | 2822 virtual Representation RequiredInputRepresentation(int index) const { |
2811 // The key is supposed to be Integer32. | 2823 // The key is supposed to be Integer32. |
2812 return (index == 1) ? Representation::Integer32() | 2824 return (index == 1) ? Representation::Integer32() |
2813 : Representation::Tagged(); | 2825 : Representation::Tagged(); |
2814 } | 2826 } |
2815 | 2827 |
2816 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastElement, | 2828 DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastElement, |
2817 "store_keyed_fast_element") | 2829 "store_keyed_fast_element") |
2818 }; | 2830 }; |
2819 | 2831 |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2968 HValue* object() const { return left(); } | 2980 HValue* object() const { return left(); } |
2969 HValue* key() const { return right(); } | 2981 HValue* key() const { return right(); } |
2970 }; | 2982 }; |
2971 | 2983 |
2972 #undef DECLARE_INSTRUCTION | 2984 #undef DECLARE_INSTRUCTION |
2973 #undef DECLARE_CONCRETE_INSTRUCTION | 2985 #undef DECLARE_CONCRETE_INSTRUCTION |
2974 | 2986 |
2975 } } // namespace v8::internal | 2987 } } // namespace v8::internal |
2976 | 2988 |
2977 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 2989 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
OLD | NEW |