| 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 5684 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5695 } | 5695 } |
| 5696 if (value->IsAllocate() && | 5696 if (value->IsAllocate() && |
| 5697 !HAllocate::cast(value)->IsNewSpaceAllocation()) { | 5697 !HAllocate::cast(value)->IsNewSpaceAllocation()) { |
| 5698 return false; | 5698 return false; |
| 5699 } | 5699 } |
| 5700 } | 5700 } |
| 5701 return true; | 5701 return true; |
| 5702 } | 5702 } |
| 5703 | 5703 |
| 5704 | 5704 |
| 5705 inline bool ObjectIsInNewSpace(HValue* object, |
| 5706 HValue* dominator) { |
| 5707 while (object->IsInnerAllocatedObject()) { |
| 5708 object = HInnerAllocatedObject::cast(object)->base_object(); |
| 5709 } |
| 5710 if (object != dominator) return false; |
| 5711 return (object->IsAllocate() && |
| 5712 HAllocate::cast(object)->IsNewSpaceAllocation()); |
| 5713 } |
| 5714 |
| 5715 |
| 5705 class HStoreGlobalCell V8_FINAL : public HUnaryOperation { | 5716 class HStoreGlobalCell V8_FINAL : public HUnaryOperation { |
| 5706 public: | 5717 public: |
| 5707 DECLARE_INSTRUCTION_FACTORY_P3(HStoreGlobalCell, HValue*, | 5718 DECLARE_INSTRUCTION_FACTORY_P3(HStoreGlobalCell, HValue*, |
| 5708 Handle<PropertyCell>, PropertyDetails); | 5719 Handle<PropertyCell>, PropertyDetails); |
| 5709 | 5720 |
| 5710 Unique<PropertyCell> cell() const { return cell_; } | 5721 Unique<PropertyCell> cell() const { return cell_; } |
| 5711 bool RequiresHoleCheck() { | 5722 bool RequiresHoleCheck() { |
| 5712 return !details_.IsDontDelete() || details_.IsReadOnly(); | 5723 return !details_.IsDontDelete() || details_.IsReadOnly(); |
| 5713 } | 5724 } |
| 5714 bool NeedsWriteBarrier() { | 5725 bool NeedsWriteBarrier() { |
| (...skipping 998 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6713 return ReceiverObjectNeedsWriteBarrier(object(), transition(), | 6724 return ReceiverObjectNeedsWriteBarrier(object(), transition(), |
| 6714 new_space_dominator()); | 6725 new_space_dominator()); |
| 6715 } | 6726 } |
| 6716 | 6727 |
| 6717 SmiCheck SmiCheckForWriteBarrier() const { | 6728 SmiCheck SmiCheckForWriteBarrier() const { |
| 6718 if (field_representation().IsHeapObject()) return OMIT_SMI_CHECK; | 6729 if (field_representation().IsHeapObject()) return OMIT_SMI_CHECK; |
| 6719 if (value()->type().IsHeapObject()) return OMIT_SMI_CHECK; | 6730 if (value()->type().IsHeapObject()) return OMIT_SMI_CHECK; |
| 6720 return INLINE_SMI_CHECK; | 6731 return INLINE_SMI_CHECK; |
| 6721 } | 6732 } |
| 6722 | 6733 |
| 6734 bool ValueIsInNewSpace() const { |
| 6735 return ObjectIsInNewSpace(value(), new_space_dominator()); |
| 6736 } |
| 6737 |
| 6723 Representation field_representation() const { | 6738 Representation field_representation() const { |
| 6724 return access_.representation(); | 6739 return access_.representation(); |
| 6725 } | 6740 } |
| 6726 | 6741 |
| 6727 void UpdateValue(HValue* value) { | 6742 void UpdateValue(HValue* value) { |
| 6728 SetOperandAt(1, value); | 6743 SetOperandAt(1, value); |
| 6729 } | 6744 } |
| 6730 | 6745 |
| 6731 bool CanBeReplacedWith(HStoreNamedField* that) const { | 6746 bool CanBeReplacedWith(HStoreNamedField* that) const { |
| 6732 if (!this->access().Equals(that->access())) return false; | 6747 if (!this->access().Equals(that->access())) return false; |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6871 if (IsFastSmiElementsKind(elements_kind())) { | 6886 if (IsFastSmiElementsKind(elements_kind())) { |
| 6872 return Representation::Smi(); | 6887 return Representation::Smi(); |
| 6873 } | 6888 } |
| 6874 if (is_typed_elements()) { | 6889 if (is_typed_elements()) { |
| 6875 return Representation::Integer32(); | 6890 return Representation::Integer32(); |
| 6876 } | 6891 } |
| 6877 // For fast object elements kinds, don't assume anything. | 6892 // For fast object elements kinds, don't assume anything. |
| 6878 return Representation::None(); | 6893 return Representation::None(); |
| 6879 } | 6894 } |
| 6880 | 6895 |
| 6881 HValue* elements() { return OperandAt(0); } | 6896 HValue* elements() const { return OperandAt(0); } |
| 6882 HValue* key() { return OperandAt(1); } | 6897 HValue* key() const { return OperandAt(1); } |
| 6883 HValue* value() { return OperandAt(2); } | 6898 HValue* value() const { return OperandAt(2); } |
| 6884 bool value_is_smi() const { | 6899 bool value_is_smi() const { |
| 6885 return IsFastSmiElementsKind(elements_kind_); | 6900 return IsFastSmiElementsKind(elements_kind_); |
| 6886 } | 6901 } |
| 6887 StoreFieldOrKeyedMode store_mode() const { return store_mode_; } | 6902 StoreFieldOrKeyedMode store_mode() const { return store_mode_; } |
| 6888 ElementsKind elements_kind() const { return elements_kind_; } | 6903 ElementsKind elements_kind() const { return elements_kind_; } |
| 6889 uint32_t base_offset() { return base_offset_; } | 6904 uint32_t base_offset() { return base_offset_; } |
| 6890 void IncreaseBaseOffset(uint32_t base_offset) { | 6905 void IncreaseBaseOffset(uint32_t base_offset) { |
| 6891 base_offset_ += base_offset; | 6906 base_offset_ += base_offset; |
| 6892 } | 6907 } |
| 6893 virtual int MaxBaseOffsetBits() { | 6908 virtual int MaxBaseOffsetBits() { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 6918 bool NeedsWriteBarrier() { | 6933 bool NeedsWriteBarrier() { |
| 6919 if (value_is_smi()) { | 6934 if (value_is_smi()) { |
| 6920 return false; | 6935 return false; |
| 6921 } else { | 6936 } else { |
| 6922 return StoringValueNeedsWriteBarrier(value()) && | 6937 return StoringValueNeedsWriteBarrier(value()) && |
| 6923 ReceiverObjectNeedsWriteBarrier(elements(), value(), | 6938 ReceiverObjectNeedsWriteBarrier(elements(), value(), |
| 6924 new_space_dominator()); | 6939 new_space_dominator()); |
| 6925 } | 6940 } |
| 6926 } | 6941 } |
| 6927 | 6942 |
| 6943 bool ValueIsInNewSpace() const { |
| 6944 return ObjectIsInNewSpace(value(), new_space_dominator()); |
| 6945 } |
| 6946 |
| 6928 bool NeedsCanonicalization(); | 6947 bool NeedsCanonicalization(); |
| 6929 | 6948 |
| 6930 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; | 6949 virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; |
| 6931 | 6950 |
| 6932 DECLARE_CONCRETE_INSTRUCTION(StoreKeyed) | 6951 DECLARE_CONCRETE_INSTRUCTION(StoreKeyed) |
| 6933 | 6952 |
| 6934 private: | 6953 private: |
| 6935 HStoreKeyed(HValue* obj, HValue* key, HValue* val, | 6954 HStoreKeyed(HValue* obj, HValue* key, HValue* val, |
| 6936 ElementsKind elements_kind, | 6955 ElementsKind elements_kind, |
| 6937 StoreFieldOrKeyedMode store_mode = INITIALIZING_STORE, | 6956 StoreFieldOrKeyedMode store_mode = INITIALIZING_STORE, |
| (...skipping 776 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7714 virtual bool IsDeletable() const V8_OVERRIDE { return true; } | 7733 virtual bool IsDeletable() const V8_OVERRIDE { return true; } |
| 7715 }; | 7734 }; |
| 7716 | 7735 |
| 7717 | 7736 |
| 7718 #undef DECLARE_INSTRUCTION | 7737 #undef DECLARE_INSTRUCTION |
| 7719 #undef DECLARE_CONCRETE_INSTRUCTION | 7738 #undef DECLARE_CONCRETE_INSTRUCTION |
| 7720 | 7739 |
| 7721 } } // namespace v8::internal | 7740 } } // namespace v8::internal |
| 7722 | 7741 |
| 7723 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 7742 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
| OLD | NEW |