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 <cstring> | 8 #include <cstring> |
9 #include <iosfwd> | 9 #include <iosfwd> |
10 | 10 |
(...skipping 4812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4823 SetFlag(kUseGVN); | 4823 SetFlag(kUseGVN); |
4824 SetChangesFlag(kNewSpacePromotion); | 4824 SetChangesFlag(kNewSpacePromotion); |
4825 } | 4825 } |
4826 | 4826 |
4827 bool IsDeletable() const override { | 4827 bool IsDeletable() const override { |
4828 return !right()->representation().IsTagged(); | 4828 return !right()->representation().IsTagged(); |
4829 } | 4829 } |
4830 }; | 4830 }; |
4831 | 4831 |
4832 | 4832 |
4833 enum ExternalAddType { | |
4834 AddOfExternalAndTagged, | |
4835 AddOfExternalAndInt32, | |
4836 NoExternalAdd | |
4837 }; | |
4838 | |
4839 | |
4833 class HAdd final : public HArithmeticBinaryOperation { | 4840 class HAdd final : public HArithmeticBinaryOperation { |
4834 public: | 4841 public: |
4835 static HInstruction* New(Isolate* isolate, Zone* zone, HValue* context, | 4842 static HInstruction* New(Isolate* isolate, Zone* zone, HValue* context, |
4836 HValue* left, HValue* right, | 4843 HValue* left, HValue* right, |
4837 Strength strength = Strength::WEAK); | 4844 Strength strength = Strength::WEAK); |
4845 static HInstruction* New(Isolate* isolate, Zone* zone, HValue* context, | |
4846 HValue* left, HValue* right, Strength strength, | |
4847 ExternalAddType external_add_type); | |
4838 | 4848 |
4839 // Add is only commutative if two integer values are added and not if two | 4849 // Add is only commutative if two integer values are added and not if two |
4840 // tagged values are added (because it might be a String concatenation). | 4850 // tagged values are added (because it might be a String concatenation). |
4841 // We also do not commute (pointer + offset). | 4851 // We also do not commute (pointer + offset). |
4842 bool IsCommutative() const override { | 4852 bool IsCommutative() const override { |
4843 return !representation().IsTagged() && !representation().IsExternal(); | 4853 return !representation().IsTagged() && !representation().IsExternal(); |
4844 } | 4854 } |
4845 | 4855 |
4846 HValue* Canonicalize() override; | 4856 HValue* Canonicalize() override; |
4847 | 4857 |
(...skipping 22 matching lines...) Expand all Loading... | |
4870 if (to.IsTagged()) { | 4880 if (to.IsTagged()) { |
4871 SetChangesFlag(kNewSpacePromotion); | 4881 SetChangesFlag(kNewSpacePromotion); |
4872 ClearFlag(kAllowUndefinedAsNaN); | 4882 ClearFlag(kAllowUndefinedAsNaN); |
4873 } | 4883 } |
4874 } | 4884 } |
4875 | 4885 |
4876 Representation RepresentationFromInputs() override; | 4886 Representation RepresentationFromInputs() override; |
4877 | 4887 |
4878 Representation RequiredInputRepresentation(int index) override; | 4888 Representation RequiredInputRepresentation(int index) override; |
4879 | 4889 |
4890 ExternalAddType external_add_type() const { return external_add_type_; } | |
4891 | |
4880 DECLARE_CONCRETE_INSTRUCTION(Add) | 4892 DECLARE_CONCRETE_INSTRUCTION(Add) |
4881 | 4893 |
4882 protected: | 4894 protected: |
4883 bool DataEquals(HValue* other) override { return true; } | 4895 bool DataEquals(HValue* other) override { return true; } |
4884 | 4896 |
4885 Range* InferRange(Zone* zone) override; | 4897 Range* InferRange(Zone* zone) override; |
4886 | 4898 |
4887 private: | 4899 private: |
4888 HAdd(HValue* context, HValue* left, HValue* right, Strength strength) | 4900 HAdd(HValue* context, HValue* left, HValue* right, Strength strength, |
4889 : HArithmeticBinaryOperation(context, left, right, strength) { | 4901 ExternalAddType external_add_type = NoExternalAdd) |
4902 : HArithmeticBinaryOperation(context, left, right, strength), | |
4903 external_add_type_(external_add_type) { | |
4890 SetFlag(kCanOverflow); | 4904 SetFlag(kCanOverflow); |
4905 if (left->representation().IsExternal()) { | |
4906 if (right->representation().IsTagged()) { | |
4907 DCHECK_EQ(external_add_type_, AddOfExternalAndTagged); | |
4908 SetDependsOnFlag(kNewSpacePromotion); | |
4909 } else { | |
4910 // This is a bit of a hack: The call to this constructor is generated | |
4911 // by a macro that also supports sub and mul, so it doesn't pass in | |
4912 // a value for external_add_type but uses the default. | |
4913 DCHECK_EQ(external_add_type_, NoExternalAdd); | |
4914 external_add_type_ = AddOfExternalAndInt32; | |
4915 } | |
4916 } else { | |
4917 DCHECK_EQ(external_add_type_, NoExternalAdd); | |
4918 } | |
Jarin
2015/07/20 14:17:56
Hmm, I was imagining you would drive it the other
| |
4891 } | 4919 } |
4920 | |
4921 ExternalAddType external_add_type_; | |
4892 }; | 4922 }; |
4893 | 4923 |
4894 | 4924 |
4895 class HSub final : public HArithmeticBinaryOperation { | 4925 class HSub final : public HArithmeticBinaryOperation { |
4896 public: | 4926 public: |
4897 static HInstruction* New(Isolate* isolate, Zone* zone, HValue* context, | 4927 static HInstruction* New(Isolate* isolate, Zone* zone, HValue* context, |
4898 HValue* left, HValue* right, | 4928 HValue* left, HValue* right, |
4899 Strength strength = Strength::WEAK); | 4929 Strength strength = Strength::WEAK); |
4900 | 4930 |
4901 HValue* Canonicalize() override; | 4931 HValue* Canonicalize() override; |
(...skipping 3140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
8042 }; | 8072 }; |
8043 | 8073 |
8044 | 8074 |
8045 | 8075 |
8046 #undef DECLARE_INSTRUCTION | 8076 #undef DECLARE_INSTRUCTION |
8047 #undef DECLARE_CONCRETE_INSTRUCTION | 8077 #undef DECLARE_CONCRETE_INSTRUCTION |
8048 | 8078 |
8049 } } // namespace v8::internal | 8079 } } // namespace v8::internal |
8050 | 8080 |
8051 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 8081 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
OLD | NEW |