| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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_COMPILER_NODE_MATCHERS_H_ | 5 #ifndef V8_COMPILER_NODE_MATCHERS_H_ |
| 6 #define V8_COMPILER_NODE_MATCHERS_H_ | 6 #define V8_COMPILER_NODE_MATCHERS_H_ |
| 7 | 7 |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 | 9 |
| 10 // TODO(turbofan): Move ExternalReference out of assembler.h | 10 // TODO(turbofan): Move ExternalReference out of assembler.h |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 98 : NodeMatcher(node), value_(), has_value_(false) { | 98 : NodeMatcher(node), value_(), has_value_(false) { |
| 99 if (opcode() == IrOpcode::kInt32Constant) { | 99 if (opcode() == IrOpcode::kInt32Constant) { |
| 100 value_ = static_cast<uint32_t>(OpParameter<int32_t>(node)); | 100 value_ = static_cast<uint32_t>(OpParameter<int32_t>(node)); |
| 101 has_value_ = true; | 101 has_value_ = true; |
| 102 } else if (opcode() == IrOpcode::kInt64Constant) { | 102 } else if (opcode() == IrOpcode::kInt64Constant) { |
| 103 value_ = static_cast<uint64_t>(OpParameter<int64_t>(node)); | 103 value_ = static_cast<uint64_t>(OpParameter<int64_t>(node)); |
| 104 has_value_ = true; | 104 has_value_ = true; |
| 105 } | 105 } |
| 106 } | 106 } |
| 107 | 107 |
| 108 template <> |
| 109 inline ValueMatcher< |
| 110 uint32_t, IrOpcode::kRelocatableInt32Constant>::ValueMatcher(Node* node) |
| 111 : NodeMatcher(node), |
| 112 value_(), |
| 113 has_value_(opcode() == IrOpcode::kInt32Constant || |
| 114 opcode() == IrOpcode::kRelocatableInt32Constant) { |
| 115 if (has_value_) { |
| 116 value_ = static_cast<uint32_t>(OpParameter<int32_t>(node)); |
| 117 } |
| 118 } |
| 119 |
| 120 template <> |
| 121 inline ValueMatcher< |
| 122 uint64_t, IrOpcode::kRelocatableInt64Constant>::ValueMatcher(Node* node) |
| 123 : NodeMatcher(node), value_(), has_value_(false) { |
| 124 if (opcode() == IrOpcode::kInt32Constant || |
| 125 opcode() == IrOpcode::kRelocatableInt32Constant) { |
| 126 value_ = static_cast<uint32_t>(OpParameter<int32_t>(node)); |
| 127 has_value_ = true; |
| 128 } else if (opcode() == IrOpcode::kInt64Constant || |
| 129 opcode() == IrOpcode::kRelocatableInt64Constant) { |
| 130 value_ = static_cast<uint64_t>(OpParameter<int64_t>(node)); |
| 131 has_value_ = true; |
| 132 } |
| 133 } |
| 108 | 134 |
| 109 // A pattern matcher for integer constants. | 135 // A pattern matcher for integer constants. |
| 110 template <typename T, IrOpcode::Value kOpcode> | 136 template <typename T, IrOpcode::Value kOpcode> |
| 111 struct IntMatcher final : public ValueMatcher<T, kOpcode> { | 137 struct IntMatcher final : public ValueMatcher<T, kOpcode> { |
| 112 explicit IntMatcher(Node* node) : ValueMatcher<T, kOpcode>(node) {} | 138 explicit IntMatcher(Node* node) : ValueMatcher<T, kOpcode>(node) {} |
| 113 | 139 |
| 114 bool Is(const T& value) const { | 140 bool Is(const T& value) const { |
| 115 return this->HasValue() && this->Value() == value; | 141 return this->HasValue() && this->Value() == value; |
| 116 } | 142 } |
| 117 bool IsInRange(const T& low, const T& high) const { | 143 bool IsInRange(const T& low, const T& high) const { |
| 118 return this->HasValue() && low <= this->Value() && this->Value() <= high; | 144 return this->HasValue() && low <= this->Value() && this->Value() <= high; |
| 119 } | 145 } |
| 120 bool IsMultipleOf(T n) const { | 146 bool IsMultipleOf(T n) const { |
| 121 return this->HasValue() && (this->Value() % n) == 0; | 147 return this->HasValue() && (this->Value() % n) == 0; |
| 122 } | 148 } |
| 123 bool IsPowerOf2() const { | 149 bool IsPowerOf2() const { |
| 124 return this->HasValue() && this->Value() > 0 && | 150 return this->HasValue() && this->Value() > 0 && |
| 125 (this->Value() & (this->Value() - 1)) == 0; | 151 (this->Value() & (this->Value() - 1)) == 0; |
| 126 } | 152 } |
| 127 bool IsNegativePowerOf2() const { | 153 bool IsNegativePowerOf2() const { |
| 128 return this->HasValue() && this->Value() < 0 && | 154 return this->HasValue() && this->Value() < 0 && |
| 129 (-this->Value() & (-this->Value() - 1)) == 0; | 155 (-this->Value() & (-this->Value() - 1)) == 0; |
| 130 } | 156 } |
| 131 }; | 157 }; |
| 132 | 158 |
| 133 typedef IntMatcher<int32_t, IrOpcode::kInt32Constant> Int32Matcher; | 159 typedef IntMatcher<int32_t, IrOpcode::kInt32Constant> Int32Matcher; |
| 134 typedef IntMatcher<uint32_t, IrOpcode::kInt32Constant> Uint32Matcher; | 160 typedef IntMatcher<uint32_t, IrOpcode::kInt32Constant> Uint32Matcher; |
| 161 typedef IntMatcher<uint32_t, IrOpcode::kRelocatableInt32Constant> |
| 162 RelocatableInt32Matcher; |
| 135 typedef IntMatcher<int64_t, IrOpcode::kInt64Constant> Int64Matcher; | 163 typedef IntMatcher<int64_t, IrOpcode::kInt64Constant> Int64Matcher; |
| 136 typedef IntMatcher<uint64_t, IrOpcode::kInt64Constant> Uint64Matcher; | 164 typedef IntMatcher<uint64_t, IrOpcode::kInt64Constant> Uint64Matcher; |
| 165 typedef IntMatcher<uint64_t, IrOpcode::kRelocatableInt64Constant> |
| 166 RelocatableInt64Matcher; |
| 137 #if V8_HOST_ARCH_32_BIT | 167 #if V8_HOST_ARCH_32_BIT |
| 138 typedef Int32Matcher IntPtrMatcher; | 168 typedef Int32Matcher IntPtrMatcher; |
| 139 typedef Uint32Matcher UintPtrMatcher; | 169 typedef Uint32Matcher UintPtrMatcher; |
| 170 typedef RelocatableInt32Matcher PtrMatcher; |
| 140 #else | 171 #else |
| 141 typedef Int64Matcher IntPtrMatcher; | 172 typedef Int64Matcher IntPtrMatcher; |
| 142 typedef Uint64Matcher UintPtrMatcher; | 173 typedef Uint64Matcher UintPtrMatcher; |
| 174 typedef RelocatableInt64Matcher PtrMatcher; |
| 143 #endif | 175 #endif |
| 144 | 176 |
| 145 | 177 |
| 146 // A pattern matcher for floating point constants. | 178 // A pattern matcher for floating point constants. |
| 147 template <typename T, IrOpcode::Value kOpcode> | 179 template <typename T, IrOpcode::Value kOpcode> |
| 148 struct FloatMatcher final : public ValueMatcher<T, kOpcode> { | 180 struct FloatMatcher final : public ValueMatcher<T, kOpcode> { |
| 149 explicit FloatMatcher(Node* node) : ValueMatcher<T, kOpcode>(node) {} | 181 explicit FloatMatcher(Node* node) : ValueMatcher<T, kOpcode>(node) {} |
| 150 | 182 |
| 151 bool Is(const T& value) const { | 183 bool Is(const T& value) const { |
| 152 return this->HasValue() && this->Value() == value; | 184 return this->HasValue() && this->Value() == value; |
| (...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 608 Node* branch_; | 640 Node* branch_; |
| 609 Node* if_true_; | 641 Node* if_true_; |
| 610 Node* if_false_; | 642 Node* if_false_; |
| 611 }; | 643 }; |
| 612 | 644 |
| 613 } // namespace compiler | 645 } // namespace compiler |
| 614 } // namespace internal | 646 } // namespace internal |
| 615 } // namespace v8 | 647 } // namespace v8 |
| 616 | 648 |
| 617 #endif // V8_COMPILER_NODE_MATCHERS_H_ | 649 #endif // V8_COMPILER_NODE_MATCHERS_H_ |
| OLD | NEW |