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

Side by Side Diff: src/compiler/machine-node-factory.h

Issue 543763002: Remove overly complex MachineNodeFactory. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 3 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
« no previous file with comments | « BUILD.gn ('k') | src/compiler/raw-machine-assembler.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #ifndef V8_COMPILER_MACHINE_NODE_FACTORY_H_
6 #define V8_COMPILER_MACHINE_NODE_FACTORY_H_
7
8 #ifdef USE_SIMULATOR
9 #define MACHINE_ASSEMBLER_SUPPORTS_CALL_C 0
10 #else
11 #define MACHINE_ASSEMBLER_SUPPORTS_CALL_C 1
12 #endif
13
14 #include "src/v8.h"
15
16 #include "src/compiler/machine-operator.h"
17 #include "src/compiler/node.h"
18
19 namespace v8 {
20 namespace internal {
21 namespace compiler {
22
23 #define ZONE() static_cast<NodeFactory*>(this)->zone()
24 #define COMMON() static_cast<NodeFactory*>(this)->common()
25 #define MACHINE() static_cast<NodeFactory*>(this)->machine()
26 #define MACHINE_SIG() static_cast<NodeFactory*>(this)->machine_sig()
27 #define NEW_NODE_0(op) static_cast<NodeFactory*>(this)->NewNode(op)
28 #define NEW_NODE_1(op, a) static_cast<NodeFactory*>(this)->NewNode(op, a)
29 #define NEW_NODE_2(op, a, b) static_cast<NodeFactory*>(this)->NewNode(op, a, b)
30 #define NEW_NODE_3(op, a, b, c) \
31 static_cast<NodeFactory*>(this)->NewNode(op, a, b, c)
32
33 template <typename NodeFactory>
34 class MachineNodeFactory {
35 public:
36 // Constants.
37 Node* PointerConstant(void* value) {
38 return IntPtrConstant(reinterpret_cast<intptr_t>(value));
39 }
40 Node* IntPtrConstant(intptr_t value) {
41 // TODO(dcarney): mark generated code as unserializable if value != 0.
42 return kPointerSize == 8 ? Int64Constant(value)
43 : Int32Constant(static_cast<int>(value));
44 }
45 Node* Int32Constant(int32_t value) {
46 return NEW_NODE_0(COMMON()->Int32Constant(value));
47 }
48 Node* Int64Constant(int64_t value) {
49 return NEW_NODE_0(COMMON()->Int64Constant(value));
50 }
51 Node* NumberConstant(double value) {
52 return NEW_NODE_0(COMMON()->NumberConstant(value));
53 }
54 Node* Float64Constant(double value) {
55 return NEW_NODE_0(COMMON()->Float64Constant(value));
56 }
57 Node* HeapConstant(Handle<Object> object) {
58 Unique<Object> val = Unique<Object>::CreateUninitialized(object);
59 return NEW_NODE_0(COMMON()->HeapConstant(val));
60 }
61
62 Node* Projection(int index, Node* a) {
63 return NEW_NODE_1(COMMON()->Projection(index), a);
64 }
65
66 // Memory Operations.
67 Node* Load(MachineType rep, Node* base) {
68 return Load(rep, base, Int32Constant(0));
69 }
70 Node* Load(MachineType rep, Node* base, Node* index) {
71 return NEW_NODE_2(MACHINE()->Load(rep), base, index);
72 }
73 void Store(MachineType rep, Node* base, Node* value) {
74 Store(rep, base, Int32Constant(0), value);
75 }
76 void Store(MachineType rep, Node* base, Node* index, Node* value) {
77 NEW_NODE_3(MACHINE()->Store(rep, kNoWriteBarrier), base, index, value);
78 }
79 // Arithmetic Operations.
80 Node* WordAnd(Node* a, Node* b) {
81 return NEW_NODE_2(MACHINE()->WordAnd(), a, b);
82 }
83 Node* WordOr(Node* a, Node* b) {
84 return NEW_NODE_2(MACHINE()->WordOr(), a, b);
85 }
86 Node* WordXor(Node* a, Node* b) {
87 return NEW_NODE_2(MACHINE()->WordXor(), a, b);
88 }
89 Node* WordShl(Node* a, Node* b) {
90 return NEW_NODE_2(MACHINE()->WordShl(), a, b);
91 }
92 Node* WordShr(Node* a, Node* b) {
93 return NEW_NODE_2(MACHINE()->WordShr(), a, b);
94 }
95 Node* WordSar(Node* a, Node* b) {
96 return NEW_NODE_2(MACHINE()->WordSar(), a, b);
97 }
98 Node* WordRor(Node* a, Node* b) {
99 return NEW_NODE_2(MACHINE()->WordRor(), a, b);
100 }
101 Node* WordEqual(Node* a, Node* b) {
102 return NEW_NODE_2(MACHINE()->WordEqual(), a, b);
103 }
104 Node* WordNotEqual(Node* a, Node* b) {
105 return WordBinaryNot(WordEqual(a, b));
106 }
107 Node* WordNot(Node* a) {
108 if (MACHINE()->is32()) {
109 return Word32Not(a);
110 } else {
111 return Word64Not(a);
112 }
113 }
114 Node* WordBinaryNot(Node* a) {
115 if (MACHINE()->is32()) {
116 return Word32BinaryNot(a);
117 } else {
118 return Word64BinaryNot(a);
119 }
120 }
121
122 Node* Word32And(Node* a, Node* b) {
123 return NEW_NODE_2(MACHINE()->Word32And(), a, b);
124 }
125 Node* Word32Or(Node* a, Node* b) {
126 return NEW_NODE_2(MACHINE()->Word32Or(), a, b);
127 }
128 Node* Word32Xor(Node* a, Node* b) {
129 return NEW_NODE_2(MACHINE()->Word32Xor(), a, b);
130 }
131 Node* Word32Shl(Node* a, Node* b) {
132 return NEW_NODE_2(MACHINE()->Word32Shl(), a, b);
133 }
134 Node* Word32Shr(Node* a, Node* b) {
135 return NEW_NODE_2(MACHINE()->Word32Shr(), a, b);
136 }
137 Node* Word32Sar(Node* a, Node* b) {
138 return NEW_NODE_2(MACHINE()->Word32Sar(), a, b);
139 }
140 Node* Word32Ror(Node* a, Node* b) {
141 return NEW_NODE_2(MACHINE()->Word32Ror(), a, b);
142 }
143 Node* Word32Equal(Node* a, Node* b) {
144 return NEW_NODE_2(MACHINE()->Word32Equal(), a, b);
145 }
146 Node* Word32NotEqual(Node* a, Node* b) {
147 return Word32BinaryNot(Word32Equal(a, b));
148 }
149 Node* Word32Not(Node* a) { return Word32Xor(a, Int32Constant(-1)); }
150 Node* Word32BinaryNot(Node* a) { return Word32Equal(a, Int32Constant(0)); }
151
152 Node* Word64And(Node* a, Node* b) {
153 return NEW_NODE_2(MACHINE()->Word64And(), a, b);
154 }
155 Node* Word64Or(Node* a, Node* b) {
156 return NEW_NODE_2(MACHINE()->Word64Or(), a, b);
157 }
158 Node* Word64Xor(Node* a, Node* b) {
159 return NEW_NODE_2(MACHINE()->Word64Xor(), a, b);
160 }
161 Node* Word64Shl(Node* a, Node* b) {
162 return NEW_NODE_2(MACHINE()->Word64Shl(), a, b);
163 }
164 Node* Word64Shr(Node* a, Node* b) {
165 return NEW_NODE_2(MACHINE()->Word64Shr(), a, b);
166 }
167 Node* Word64Sar(Node* a, Node* b) {
168 return NEW_NODE_2(MACHINE()->Word64Sar(), a, b);
169 }
170 Node* Word64Ror(Node* a, Node* b) {
171 return NEW_NODE_2(MACHINE()->Word64Ror(), a, b);
172 }
173 Node* Word64Equal(Node* a, Node* b) {
174 return NEW_NODE_2(MACHINE()->Word64Equal(), a, b);
175 }
176 Node* Word64NotEqual(Node* a, Node* b) {
177 return Word64BinaryNot(Word64Equal(a, b));
178 }
179 Node* Word64Not(Node* a) { return Word64Xor(a, Int64Constant(-1)); }
180 Node* Word64BinaryNot(Node* a) { return Word64Equal(a, Int64Constant(0)); }
181
182 Node* Int32Add(Node* a, Node* b) {
183 return NEW_NODE_2(MACHINE()->Int32Add(), a, b);
184 }
185 Node* Int32AddWithOverflow(Node* a, Node* b) {
186 return NEW_NODE_2(MACHINE()->Int32AddWithOverflow(), a, b);
187 }
188 Node* Int32Sub(Node* a, Node* b) {
189 return NEW_NODE_2(MACHINE()->Int32Sub(), a, b);
190 }
191 Node* Int32SubWithOverflow(Node* a, Node* b) {
192 return NEW_NODE_2(MACHINE()->Int32SubWithOverflow(), a, b);
193 }
194 Node* Int32Mul(Node* a, Node* b) {
195 return NEW_NODE_2(MACHINE()->Int32Mul(), a, b);
196 }
197 Node* Int32Div(Node* a, Node* b) {
198 return NEW_NODE_2(MACHINE()->Int32Div(), a, b);
199 }
200 Node* Int32UDiv(Node* a, Node* b) {
201 return NEW_NODE_2(MACHINE()->Int32UDiv(), a, b);
202 }
203 Node* Int32Mod(Node* a, Node* b) {
204 return NEW_NODE_2(MACHINE()->Int32Mod(), a, b);
205 }
206 Node* Int32UMod(Node* a, Node* b) {
207 return NEW_NODE_2(MACHINE()->Int32UMod(), a, b);
208 }
209 Node* Int32LessThan(Node* a, Node* b) {
210 return NEW_NODE_2(MACHINE()->Int32LessThan(), a, b);
211 }
212 Node* Int32LessThanOrEqual(Node* a, Node* b) {
213 return NEW_NODE_2(MACHINE()->Int32LessThanOrEqual(), a, b);
214 }
215 Node* Uint32LessThan(Node* a, Node* b) {
216 return NEW_NODE_2(MACHINE()->Uint32LessThan(), a, b);
217 }
218 Node* Uint32LessThanOrEqual(Node* a, Node* b) {
219 return NEW_NODE_2(MACHINE()->Uint32LessThanOrEqual(), a, b);
220 }
221 Node* Int32GreaterThan(Node* a, Node* b) { return Int32LessThan(b, a); }
222 Node* Int32GreaterThanOrEqual(Node* a, Node* b) {
223 return Int32LessThanOrEqual(b, a);
224 }
225 Node* Int32Neg(Node* a) { return Int32Sub(Int32Constant(0), a); }
226
227 Node* Int64Add(Node* a, Node* b) {
228 return NEW_NODE_2(MACHINE()->Int64Add(), a, b);
229 }
230 Node* Int64Sub(Node* a, Node* b) {
231 return NEW_NODE_2(MACHINE()->Int64Sub(), a, b);
232 }
233 Node* Int64Mul(Node* a, Node* b) {
234 return NEW_NODE_2(MACHINE()->Int64Mul(), a, b);
235 }
236 Node* Int64Div(Node* a, Node* b) {
237 return NEW_NODE_2(MACHINE()->Int64Div(), a, b);
238 }
239 Node* Int64UDiv(Node* a, Node* b) {
240 return NEW_NODE_2(MACHINE()->Int64UDiv(), a, b);
241 }
242 Node* Int64Mod(Node* a, Node* b) {
243 return NEW_NODE_2(MACHINE()->Int64Mod(), a, b);
244 }
245 Node* Int64UMod(Node* a, Node* b) {
246 return NEW_NODE_2(MACHINE()->Int64UMod(), a, b);
247 }
248 Node* Int64Neg(Node* a) { return Int64Sub(Int64Constant(0), a); }
249 Node* Int64LessThan(Node* a, Node* b) {
250 return NEW_NODE_2(MACHINE()->Int64LessThan(), a, b);
251 }
252 Node* Int64LessThanOrEqual(Node* a, Node* b) {
253 return NEW_NODE_2(MACHINE()->Int64LessThanOrEqual(), a, b);
254 }
255 Node* Int64GreaterThan(Node* a, Node* b) { return Int64LessThan(b, a); }
256 Node* Int64GreaterThanOrEqual(Node* a, Node* b) {
257 return Int64LessThanOrEqual(b, a);
258 }
259
260 // TODO(turbofan): What is this used for?
261 Node* ConvertIntPtrToInt32(Node* a) {
262 return kPointerSize == 8 ? NEW_NODE_1(MACHINE()->TruncateInt64ToInt32(), a)
263 : a;
264 }
265 Node* ConvertInt32ToIntPtr(Node* a) {
266 return kPointerSize == 8 ? NEW_NODE_1(MACHINE()->ChangeInt32ToInt64(), a)
267 : a;
268 }
269
270 #define INTPTR_BINOP(prefix, name) \
271 Node* IntPtr##name(Node* a, Node* b) { \
272 return kPointerSize == 8 ? prefix##64##name(a, b) \
273 : prefix##32##name(a, b); \
274 }
275
276 INTPTR_BINOP(Int, Add);
277 INTPTR_BINOP(Int, Sub);
278 INTPTR_BINOP(Int, LessThan);
279 INTPTR_BINOP(Int, LessThanOrEqual);
280 INTPTR_BINOP(Word, Equal);
281 INTPTR_BINOP(Word, NotEqual);
282 INTPTR_BINOP(Int, GreaterThanOrEqual);
283 INTPTR_BINOP(Int, GreaterThan);
284
285 #undef INTPTR_BINOP
286
287 Node* Float64Add(Node* a, Node* b) {
288 return NEW_NODE_2(MACHINE()->Float64Add(), a, b);
289 }
290 Node* Float64Sub(Node* a, Node* b) {
291 return NEW_NODE_2(MACHINE()->Float64Sub(), a, b);
292 }
293 Node* Float64Mul(Node* a, Node* b) {
294 return NEW_NODE_2(MACHINE()->Float64Mul(), a, b);
295 }
296 Node* Float64Div(Node* a, Node* b) {
297 return NEW_NODE_2(MACHINE()->Float64Div(), a, b);
298 }
299 Node* Float64Mod(Node* a, Node* b) {
300 return NEW_NODE_2(MACHINE()->Float64Mod(), a, b);
301 }
302 Node* Float64Equal(Node* a, Node* b) {
303 return NEW_NODE_2(MACHINE()->Float64Equal(), a, b);
304 }
305 Node* Float64NotEqual(Node* a, Node* b) {
306 return WordBinaryNot(Float64Equal(a, b));
307 }
308 Node* Float64LessThan(Node* a, Node* b) {
309 return NEW_NODE_2(MACHINE()->Float64LessThan(), a, b);
310 }
311 Node* Float64LessThanOrEqual(Node* a, Node* b) {
312 return NEW_NODE_2(MACHINE()->Float64LessThanOrEqual(), a, b);
313 }
314 Node* Float64GreaterThan(Node* a, Node* b) { return Float64LessThan(b, a); }
315 Node* Float64GreaterThanOrEqual(Node* a, Node* b) {
316 return Float64LessThanOrEqual(b, a);
317 }
318
319 // Conversions.
320 Node* ChangeInt32ToFloat64(Node* a) {
321 return NEW_NODE_1(MACHINE()->ChangeInt32ToFloat64(), a);
322 }
323 Node* ChangeUint32ToFloat64(Node* a) {
324 return NEW_NODE_1(MACHINE()->ChangeUint32ToFloat64(), a);
325 }
326 Node* ChangeFloat64ToInt32(Node* a) {
327 return NEW_NODE_1(MACHINE()->ChangeFloat64ToInt32(), a);
328 }
329 Node* ChangeFloat64ToUint32(Node* a) {
330 return NEW_NODE_1(MACHINE()->ChangeFloat64ToUint32(), a);
331 }
332 Node* ChangeInt32ToInt64(Node* a) {
333 return NEW_NODE_1(MACHINE()->ChangeInt32ToInt64(), a);
334 }
335 Node* ChangeUint32ToUint64(Node* a) {
336 return NEW_NODE_1(MACHINE()->ChangeUint32ToUint64(), a);
337 }
338 Node* TruncateFloat64ToInt32(Node* a) {
339 return NEW_NODE_1(MACHINE()->TruncateFloat64ToInt32(), a);
340 }
341 Node* TruncateInt64ToInt32(Node* a) {
342 return NEW_NODE_1(MACHINE()->TruncateInt64ToInt32(), a);
343 }
344
345 #ifdef MACHINE_ASSEMBLER_SUPPORTS_CALL_C
346 // Call to C.
347 Node* CallC(Node* function_address, MachineType return_type,
348 MachineType* arg_types, Node** args, int n_args) {
349 Zone* zone = ZONE();
350 CallDescriptor* descriptor =
351 Linkage::GetSimplifiedCDescriptor(ZONE(), MACHINE_SIG());
352 Node** passed_args = zone->NewArray<Node*>(n_args + 1);
353 passed_args[0] = function_address;
354 for (int i = 0; i < n_args; ++i) {
355 passed_args[i + 1] = args[i];
356 }
357 return NEW_NODE_2(COMMON()->Call(descriptor), n_args + 1, passed_args);
358 }
359 #endif
360 };
361
362 #undef NEW_NODE_0
363 #undef NEW_NODE_1
364 #undef NEW_NODE_2
365 #undef NEW_NODE_3
366 #undef MACHINE
367 #undef COMMON
368 #undef ZONE
369
370 } // namespace compiler
371 } // namespace internal
372 } // namespace v8
373
374 #endif // V8_COMPILER_MACHINE_NODE_FACTORY_H_
OLDNEW
« no previous file with comments | « BUILD.gn ('k') | src/compiler/raw-machine-assembler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698