Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/compiler/node-matchers.h

Issue 613643002: [turbofan] add new ia32 addressing modes (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 "src/compiler/node.h" 8 #include "src/compiler/node.h"
9 #include "src/compiler/operator.h" 9 #include "src/compiler/operator.h"
10 10
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 Left left_; 132 Left left_;
133 Right right_; 133 Right right_;
134 }; 134 };
135 135
136 typedef BinopMatcher<Int32Matcher, Int32Matcher> Int32BinopMatcher; 136 typedef BinopMatcher<Int32Matcher, Int32Matcher> Int32BinopMatcher;
137 typedef BinopMatcher<Uint32Matcher, Uint32Matcher> Uint32BinopMatcher; 137 typedef BinopMatcher<Uint32Matcher, Uint32Matcher> Uint32BinopMatcher;
138 typedef BinopMatcher<Int64Matcher, Int64Matcher> Int64BinopMatcher; 138 typedef BinopMatcher<Int64Matcher, Int64Matcher> Int64BinopMatcher;
139 typedef BinopMatcher<Uint64Matcher, Uint64Matcher> Uint64BinopMatcher; 139 typedef BinopMatcher<Uint64Matcher, Uint64Matcher> Uint64BinopMatcher;
140 typedef BinopMatcher<Float64Matcher, Float64Matcher> Float64BinopMatcher; 140 typedef BinopMatcher<Float64Matcher, Float64Matcher> Float64BinopMatcher;
141 141
142
143 // Fairly intel-specify node matcher used for matching scale factors in
144 // addressing modes.
145 // Matches nodes of form [x * N] for N in {1,2,4,8}
146 class ScaleFactorMatcher : public NodeMatcher {
147 public:
148 explicit ScaleFactorMatcher(Node* node)
149 : NodeMatcher(node), left_(NULL), power_(0) {
150 Match();
151 }
152
153 bool Matches() { return left_ != NULL; }
154 int Power() {
155 DCHECK(Matches());
156 return power_;
157 }
158 Node* Left() {
159 DCHECK(Matches());
160 return left_;
161 }
162
163 private:
164 void Match() {
165 if (opcode() != IrOpcode::kInt32Mul) return;
166 Int32BinopMatcher m(node());
167 if (!m.right().HasValue()) return;
168 int32_t value = m.right().Value();
169 switch (value) {
170 case 8:
171 power_++; // Fall through.
172 case 4:
173 power_++; // Fall through.
174 case 2:
175 power_++; // Fall through.
176 case 1:
177 break;
178 default:
179 return;
180 }
181 left_ = m.left().node();
182 }
183
184 Node* left_;
185 int power_;
186 };
187
188
189 // Fairly intel-specify node matcher used for matching index and displacement
190 // operands in addressing modes.
191 // Matches nodes of form:
192 // [x * N]
193 // [x * N + K]
194 // [x + K]
195 // [x] -- fallback case
196 // for N in {1,2,4,8} and K int32_t
197 class IndexAndDisplacementMatcher : public NodeMatcher {
198 public:
199 explicit IndexAndDisplacementMatcher(Node* node)
200 : NodeMatcher(node), index_node_(node), displacement_(0), power_(0) {
201 Match();
202 }
203
204 Node* index_node() { return index_node_; }
205 int displacement() { return displacement_; }
206 int power() { return power_; }
207
208 private:
209 void Match() {
210 if (opcode() == IrOpcode::kInt32Add) {
211 // Assume reduction has put constant on the right.
212 Int32BinopMatcher m(node());
213 if (m.right().HasValue()) {
214 displacement_ = m.right().Value();
215 index_node_ = m.left().node();
216 }
217 }
218 // Test scale factor.
219 ScaleFactorMatcher scale_matcher(index_node_);
220 if (scale_matcher.Matches()) {
221 index_node_ = scale_matcher.Left();
222 power_ = scale_matcher.Power();
223 }
224 }
225
226 Node* index_node_;
227 int displacement_;
228 int power_;
229 };
230
231
142 } // namespace compiler 232 } // namespace compiler
143 } // namespace internal 233 } // namespace internal
144 } // namespace v8 234 } // namespace v8
145 235
146 #endif // V8_COMPILER_NODE_MATCHERS_H_ 236 #endif // V8_COMPILER_NODE_MATCHERS_H_
OLDNEW
« no previous file with comments | « src/compiler/ia32/instruction-selector-ia32-unittest.cc ('k') | src/compiler/x64/instruction-selector-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698