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_RAW_MACHINE_ASSEMBLER_H_ | 5 #ifndef V8_COMPILER_RAW_MACHINE_ASSEMBLER_H_ |
6 #define V8_COMPILER_RAW_MACHINE_ASSEMBLER_H_ | 6 #define V8_COMPILER_RAW_MACHINE_ASSEMBLER_H_ |
7 | 7 |
8 #include "src/assembler.h" | 8 #include "src/assembler.h" |
9 #include "src/compiler/common-operator.h" | 9 #include "src/compiler/common-operator.h" |
10 #include "src/compiler/graph.h" | 10 #include "src/compiler/graph.h" |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 // that this RawMachineAssembler becomes invalid after export. | 67 // that this RawMachineAssembler becomes invalid after export. |
68 Schedule* Export(); | 68 Schedule* Export(); |
69 | 69 |
70 // =========================================================================== | 70 // =========================================================================== |
71 // The following utility methods create new nodes with specific operators and | 71 // The following utility methods create new nodes with specific operators and |
72 // place them into the current basic block. They don't perform control flow, | 72 // place them into the current basic block. They don't perform control flow, |
73 // hence will not switch the current basic block. | 73 // hence will not switch the current basic block. |
74 | 74 |
75 Node* UndefinedConstant() { | 75 Node* UndefinedConstant() { |
76 Handle<HeapObject> undefined = isolate()->factory()->undefined_value(); | 76 Handle<HeapObject> undefined = isolate()->factory()->undefined_value(); |
77 return AddNode(common()->HeapConstant(undefined)); | 77 return NewNode(common()->HeapConstant(undefined)); |
78 } | 78 } |
79 | 79 |
80 // Constants. | 80 // Constants. |
81 Node* PointerConstant(void* value) { | 81 Node* PointerConstant(void* value) { |
82 return IntPtrConstant(reinterpret_cast<intptr_t>(value)); | 82 return IntPtrConstant(reinterpret_cast<intptr_t>(value)); |
83 } | 83 } |
84 Node* IntPtrConstant(intptr_t value) { | 84 Node* IntPtrConstant(intptr_t value) { |
85 // TODO(dcarney): mark generated code as unserializable if value != 0. | 85 // TODO(dcarney): mark generated code as unserializable if value != 0. |
86 return kPointerSize == 8 ? Int64Constant(value) | 86 return kPointerSize == 8 ? Int64Constant(value) |
87 : Int32Constant(static_cast<int>(value)); | 87 : Int32Constant(static_cast<int>(value)); |
88 } | 88 } |
89 Node* Int32Constant(int32_t value) { | 89 Node* Int32Constant(int32_t value) { |
90 return AddNode(common()->Int32Constant(value)); | 90 return NewNode(common()->Int32Constant(value)); |
91 } | 91 } |
92 Node* Int64Constant(int64_t value) { | 92 Node* Int64Constant(int64_t value) { |
93 return AddNode(common()->Int64Constant(value)); | 93 return NewNode(common()->Int64Constant(value)); |
94 } | 94 } |
95 Node* NumberConstant(double value) { | 95 Node* NumberConstant(double value) { |
96 return AddNode(common()->NumberConstant(value)); | 96 return NewNode(common()->NumberConstant(value)); |
97 } | 97 } |
98 Node* Float32Constant(float value) { | 98 Node* Float32Constant(float value) { |
99 return AddNode(common()->Float32Constant(value)); | 99 return NewNode(common()->Float32Constant(value)); |
100 } | 100 } |
101 Node* Float64Constant(double value) { | 101 Node* Float64Constant(double value) { |
102 return AddNode(common()->Float64Constant(value)); | 102 return NewNode(common()->Float64Constant(value)); |
103 } | 103 } |
104 Node* HeapConstant(Handle<HeapObject> object) { | 104 Node* HeapConstant(Handle<HeapObject> object) { |
105 return AddNode(common()->HeapConstant(object)); | 105 return NewNode(common()->HeapConstant(object)); |
106 } | 106 } |
107 Node* ExternalConstant(ExternalReference address) { | 107 Node* ExternalConstant(ExternalReference address) { |
108 return AddNode(common()->ExternalConstant(address)); | 108 return NewNode(common()->ExternalConstant(address)); |
109 } | 109 } |
110 | 110 |
111 Node* Projection(int index, Node* a) { | 111 Node* Projection(int index, Node* a) { |
112 return AddNode(common()->Projection(index), a); | 112 return NewNode(common()->Projection(index), a); |
113 } | 113 } |
114 | 114 |
115 // Memory Operations. | 115 // Memory Operations. |
116 Node* Load(MachineType rep, Node* base) { | 116 Node* Load(MachineType rep, Node* base) { |
117 return Load(rep, base, IntPtrConstant(0)); | 117 return Load(rep, base, IntPtrConstant(0)); |
118 } | 118 } |
119 Node* Load(MachineType rep, Node* base, Node* index) { | 119 Node* Load(MachineType rep, Node* base, Node* index) { |
120 return AddNode(machine()->Load(rep), base, index, graph()->start(), | 120 return NewNode(machine()->Load(rep), base, index, graph()->start(), |
121 graph()->start()); | 121 graph()->start()); |
122 } | 122 } |
123 Node* Store(MachineType rep, Node* base, Node* value) { | 123 Node* Store(MachineType rep, Node* base, Node* value) { |
124 return Store(rep, base, IntPtrConstant(0), value); | 124 return Store(rep, base, IntPtrConstant(0), value); |
125 } | 125 } |
126 Node* Store(MachineType rep, Node* base, Node* index, Node* value) { | 126 Node* Store(MachineType rep, Node* base, Node* index, Node* value) { |
127 return AddNode(machine()->Store(StoreRepresentation(rep, kNoWriteBarrier)), | 127 return NewNode(machine()->Store(StoreRepresentation(rep, kNoWriteBarrier)), |
128 base, index, value, graph()->start(), graph()->start()); | 128 base, index, value, graph()->start(), graph()->start()); |
129 } | 129 } |
130 | 130 |
131 // Arithmetic Operations. | 131 // Arithmetic Operations. |
132 Node* WordAnd(Node* a, Node* b) { | 132 Node* WordAnd(Node* a, Node* b) { |
133 return AddNode(machine()->WordAnd(), a, b); | 133 return NewNode(machine()->WordAnd(), a, b); |
134 } | 134 } |
135 Node* WordOr(Node* a, Node* b) { return AddNode(machine()->WordOr(), a, b); } | 135 Node* WordOr(Node* a, Node* b) { return NewNode(machine()->WordOr(), a, b); } |
136 Node* WordXor(Node* a, Node* b) { | 136 Node* WordXor(Node* a, Node* b) { |
137 return AddNode(machine()->WordXor(), a, b); | 137 return NewNode(machine()->WordXor(), a, b); |
138 } | 138 } |
139 Node* WordShl(Node* a, Node* b) { | 139 Node* WordShl(Node* a, Node* b) { |
140 return AddNode(machine()->WordShl(), a, b); | 140 return NewNode(machine()->WordShl(), a, b); |
141 } | 141 } |
142 Node* WordShr(Node* a, Node* b) { | 142 Node* WordShr(Node* a, Node* b) { |
143 return AddNode(machine()->WordShr(), a, b); | 143 return NewNode(machine()->WordShr(), a, b); |
144 } | 144 } |
145 Node* WordSar(Node* a, Node* b) { | 145 Node* WordSar(Node* a, Node* b) { |
146 return AddNode(machine()->WordSar(), a, b); | 146 return NewNode(machine()->WordSar(), a, b); |
147 } | 147 } |
148 Node* WordRor(Node* a, Node* b) { | 148 Node* WordRor(Node* a, Node* b) { |
149 return AddNode(machine()->WordRor(), a, b); | 149 return NewNode(machine()->WordRor(), a, b); |
150 } | 150 } |
151 Node* WordEqual(Node* a, Node* b) { | 151 Node* WordEqual(Node* a, Node* b) { |
152 return AddNode(machine()->WordEqual(), a, b); | 152 return NewNode(machine()->WordEqual(), a, b); |
153 } | 153 } |
154 Node* WordNotEqual(Node* a, Node* b) { | 154 Node* WordNotEqual(Node* a, Node* b) { |
155 return WordBinaryNot(WordEqual(a, b)); | 155 return WordBinaryNot(WordEqual(a, b)); |
156 } | 156 } |
157 Node* WordNot(Node* a) { | 157 Node* WordNot(Node* a) { |
158 if (machine()->Is32()) { | 158 if (machine()->Is32()) { |
159 return Word32Not(a); | 159 return Word32Not(a); |
160 } else { | 160 } else { |
161 return Word64Not(a); | 161 return Word64Not(a); |
162 } | 162 } |
163 } | 163 } |
164 Node* WordBinaryNot(Node* a) { | 164 Node* WordBinaryNot(Node* a) { |
165 if (machine()->Is32()) { | 165 if (machine()->Is32()) { |
166 return Word32BinaryNot(a); | 166 return Word32BinaryNot(a); |
167 } else { | 167 } else { |
168 return Word64BinaryNot(a); | 168 return Word64BinaryNot(a); |
169 } | 169 } |
170 } | 170 } |
171 | 171 |
172 Node* Word32And(Node* a, Node* b) { | 172 Node* Word32And(Node* a, Node* b) { |
173 return AddNode(machine()->Word32And(), a, b); | 173 return NewNode(machine()->Word32And(), a, b); |
174 } | 174 } |
175 Node* Word32Or(Node* a, Node* b) { | 175 Node* Word32Or(Node* a, Node* b) { |
176 return AddNode(machine()->Word32Or(), a, b); | 176 return NewNode(machine()->Word32Or(), a, b); |
177 } | 177 } |
178 Node* Word32Xor(Node* a, Node* b) { | 178 Node* Word32Xor(Node* a, Node* b) { |
179 return AddNode(machine()->Word32Xor(), a, b); | 179 return NewNode(machine()->Word32Xor(), a, b); |
180 } | 180 } |
181 Node* Word32Shl(Node* a, Node* b) { | 181 Node* Word32Shl(Node* a, Node* b) { |
182 return AddNode(machine()->Word32Shl(), a, b); | 182 return NewNode(machine()->Word32Shl(), a, b); |
183 } | 183 } |
184 Node* Word32Shr(Node* a, Node* b) { | 184 Node* Word32Shr(Node* a, Node* b) { |
185 return AddNode(machine()->Word32Shr(), a, b); | 185 return NewNode(machine()->Word32Shr(), a, b); |
186 } | 186 } |
187 Node* Word32Sar(Node* a, Node* b) { | 187 Node* Word32Sar(Node* a, Node* b) { |
188 return AddNode(machine()->Word32Sar(), a, b); | 188 return NewNode(machine()->Word32Sar(), a, b); |
189 } | 189 } |
190 Node* Word32Ror(Node* a, Node* b) { | 190 Node* Word32Ror(Node* a, Node* b) { |
191 return AddNode(machine()->Word32Ror(), a, b); | 191 return NewNode(machine()->Word32Ror(), a, b); |
192 } | 192 } |
193 Node* Word32Clz(Node* a) { return AddNode(machine()->Word32Clz(), a); } | 193 Node* Word32Clz(Node* a) { return NewNode(machine()->Word32Clz(), a); } |
194 Node* Word32Equal(Node* a, Node* b) { | 194 Node* Word32Equal(Node* a, Node* b) { |
195 return AddNode(machine()->Word32Equal(), a, b); | 195 return NewNode(machine()->Word32Equal(), a, b); |
196 } | 196 } |
197 Node* Word32NotEqual(Node* a, Node* b) { | 197 Node* Word32NotEqual(Node* a, Node* b) { |
198 return Word32BinaryNot(Word32Equal(a, b)); | 198 return Word32BinaryNot(Word32Equal(a, b)); |
199 } | 199 } |
200 Node* Word32Not(Node* a) { return Word32Xor(a, Int32Constant(-1)); } | 200 Node* Word32Not(Node* a) { return Word32Xor(a, Int32Constant(-1)); } |
201 Node* Word32BinaryNot(Node* a) { return Word32Equal(a, Int32Constant(0)); } | 201 Node* Word32BinaryNot(Node* a) { return Word32Equal(a, Int32Constant(0)); } |
202 | 202 |
203 Node* Word64And(Node* a, Node* b) { | 203 Node* Word64And(Node* a, Node* b) { |
204 return AddNode(machine()->Word64And(), a, b); | 204 return NewNode(machine()->Word64And(), a, b); |
205 } | 205 } |
206 Node* Word64Or(Node* a, Node* b) { | 206 Node* Word64Or(Node* a, Node* b) { |
207 return AddNode(machine()->Word64Or(), a, b); | 207 return NewNode(machine()->Word64Or(), a, b); |
208 } | 208 } |
209 Node* Word64Xor(Node* a, Node* b) { | 209 Node* Word64Xor(Node* a, Node* b) { |
210 return AddNode(machine()->Word64Xor(), a, b); | 210 return NewNode(machine()->Word64Xor(), a, b); |
211 } | 211 } |
212 Node* Word64Shl(Node* a, Node* b) { | 212 Node* Word64Shl(Node* a, Node* b) { |
213 return AddNode(machine()->Word64Shl(), a, b); | 213 return NewNode(machine()->Word64Shl(), a, b); |
214 } | 214 } |
215 Node* Word64Shr(Node* a, Node* b) { | 215 Node* Word64Shr(Node* a, Node* b) { |
216 return AddNode(machine()->Word64Shr(), a, b); | 216 return NewNode(machine()->Word64Shr(), a, b); |
217 } | 217 } |
218 Node* Word64Sar(Node* a, Node* b) { | 218 Node* Word64Sar(Node* a, Node* b) { |
219 return AddNode(machine()->Word64Sar(), a, b); | 219 return NewNode(machine()->Word64Sar(), a, b); |
220 } | 220 } |
221 Node* Word64Ror(Node* a, Node* b) { | 221 Node* Word64Ror(Node* a, Node* b) { |
222 return AddNode(machine()->Word64Ror(), a, b); | 222 return NewNode(machine()->Word64Ror(), a, b); |
223 } | 223 } |
224 Node* Word64Equal(Node* a, Node* b) { | 224 Node* Word64Equal(Node* a, Node* b) { |
225 return AddNode(machine()->Word64Equal(), a, b); | 225 return NewNode(machine()->Word64Equal(), a, b); |
226 } | 226 } |
227 Node* Word64NotEqual(Node* a, Node* b) { | 227 Node* Word64NotEqual(Node* a, Node* b) { |
228 return Word64BinaryNot(Word64Equal(a, b)); | 228 return Word64BinaryNot(Word64Equal(a, b)); |
229 } | 229 } |
230 Node* Word64Not(Node* a) { return Word64Xor(a, Int64Constant(-1)); } | 230 Node* Word64Not(Node* a) { return Word64Xor(a, Int64Constant(-1)); } |
231 Node* Word64BinaryNot(Node* a) { return Word64Equal(a, Int64Constant(0)); } | 231 Node* Word64BinaryNot(Node* a) { return Word64Equal(a, Int64Constant(0)); } |
232 | 232 |
233 Node* Int32Add(Node* a, Node* b) { | 233 Node* Int32Add(Node* a, Node* b) { |
234 return AddNode(machine()->Int32Add(), a, b); | 234 return NewNode(machine()->Int32Add(), a, b); |
235 } | 235 } |
236 Node* Int32AddWithOverflow(Node* a, Node* b) { | 236 Node* Int32AddWithOverflow(Node* a, Node* b) { |
237 return AddNode(machine()->Int32AddWithOverflow(), a, b); | 237 return NewNode(machine()->Int32AddWithOverflow(), a, b); |
238 } | 238 } |
239 Node* Int32Sub(Node* a, Node* b) { | 239 Node* Int32Sub(Node* a, Node* b) { |
240 return AddNode(machine()->Int32Sub(), a, b); | 240 return NewNode(machine()->Int32Sub(), a, b); |
241 } | 241 } |
242 Node* Int32SubWithOverflow(Node* a, Node* b) { | 242 Node* Int32SubWithOverflow(Node* a, Node* b) { |
243 return AddNode(machine()->Int32SubWithOverflow(), a, b); | 243 return NewNode(machine()->Int32SubWithOverflow(), a, b); |
244 } | 244 } |
245 Node* Int32Mul(Node* a, Node* b) { | 245 Node* Int32Mul(Node* a, Node* b) { |
246 return AddNode(machine()->Int32Mul(), a, b); | 246 return NewNode(machine()->Int32Mul(), a, b); |
247 } | 247 } |
248 Node* Int32MulHigh(Node* a, Node* b) { | 248 Node* Int32MulHigh(Node* a, Node* b) { |
249 return AddNode(machine()->Int32MulHigh(), a, b); | 249 return NewNode(machine()->Int32MulHigh(), a, b); |
250 } | 250 } |
251 Node* Int32Div(Node* a, Node* b) { | 251 Node* Int32Div(Node* a, Node* b) { |
252 return AddNode(machine()->Int32Div(), a, b, graph()->start()); | 252 return NewNode(machine()->Int32Div(), a, b, graph()->start()); |
253 } | 253 } |
254 Node* Int32Mod(Node* a, Node* b) { | 254 Node* Int32Mod(Node* a, Node* b) { |
255 return AddNode(machine()->Int32Mod(), a, b, graph()->start()); | 255 return NewNode(machine()->Int32Mod(), a, b, graph()->start()); |
256 } | 256 } |
257 Node* Int32LessThan(Node* a, Node* b) { | 257 Node* Int32LessThan(Node* a, Node* b) { |
258 return AddNode(machine()->Int32LessThan(), a, b); | 258 return NewNode(machine()->Int32LessThan(), a, b); |
259 } | 259 } |
260 Node* Int32LessThanOrEqual(Node* a, Node* b) { | 260 Node* Int32LessThanOrEqual(Node* a, Node* b) { |
261 return AddNode(machine()->Int32LessThanOrEqual(), a, b); | 261 return NewNode(machine()->Int32LessThanOrEqual(), a, b); |
262 } | 262 } |
263 Node* Uint32Div(Node* a, Node* b) { | 263 Node* Uint32Div(Node* a, Node* b) { |
264 return AddNode(machine()->Uint32Div(), a, b, graph()->start()); | 264 return NewNode(machine()->Uint32Div(), a, b, graph()->start()); |
265 } | 265 } |
266 Node* Uint32LessThan(Node* a, Node* b) { | 266 Node* Uint32LessThan(Node* a, Node* b) { |
267 return AddNode(machine()->Uint32LessThan(), a, b); | 267 return NewNode(machine()->Uint32LessThan(), a, b); |
268 } | 268 } |
269 Node* Uint32LessThanOrEqual(Node* a, Node* b) { | 269 Node* Uint32LessThanOrEqual(Node* a, Node* b) { |
270 return AddNode(machine()->Uint32LessThanOrEqual(), a, b); | 270 return NewNode(machine()->Uint32LessThanOrEqual(), a, b); |
271 } | 271 } |
272 Node* Uint32Mod(Node* a, Node* b) { | 272 Node* Uint32Mod(Node* a, Node* b) { |
273 return AddNode(machine()->Uint32Mod(), a, b, graph()->start()); | 273 return NewNode(machine()->Uint32Mod(), a, b, graph()->start()); |
274 } | 274 } |
275 Node* Uint32MulHigh(Node* a, Node* b) { | 275 Node* Uint32MulHigh(Node* a, Node* b) { |
276 return AddNode(machine()->Uint32MulHigh(), a, b); | 276 return NewNode(machine()->Uint32MulHigh(), a, b); |
277 } | 277 } |
278 Node* Int32GreaterThan(Node* a, Node* b) { return Int32LessThan(b, a); } | 278 Node* Int32GreaterThan(Node* a, Node* b) { return Int32LessThan(b, a); } |
279 Node* Int32GreaterThanOrEqual(Node* a, Node* b) { | 279 Node* Int32GreaterThanOrEqual(Node* a, Node* b) { |
280 return Int32LessThanOrEqual(b, a); | 280 return Int32LessThanOrEqual(b, a); |
281 } | 281 } |
282 Node* Int32Neg(Node* a) { return Int32Sub(Int32Constant(0), a); } | 282 Node* Int32Neg(Node* a) { return Int32Sub(Int32Constant(0), a); } |
283 | 283 |
284 Node* Int64Add(Node* a, Node* b) { | 284 Node* Int64Add(Node* a, Node* b) { |
285 return AddNode(machine()->Int64Add(), a, b); | 285 return NewNode(machine()->Int64Add(), a, b); |
286 } | 286 } |
287 Node* Int64Sub(Node* a, Node* b) { | 287 Node* Int64Sub(Node* a, Node* b) { |
288 return AddNode(machine()->Int64Sub(), a, b); | 288 return NewNode(machine()->Int64Sub(), a, b); |
289 } | 289 } |
290 Node* Int64Mul(Node* a, Node* b) { | 290 Node* Int64Mul(Node* a, Node* b) { |
291 return AddNode(machine()->Int64Mul(), a, b); | 291 return NewNode(machine()->Int64Mul(), a, b); |
292 } | 292 } |
293 Node* Int64Div(Node* a, Node* b) { | 293 Node* Int64Div(Node* a, Node* b) { |
294 return AddNode(machine()->Int64Div(), a, b); | 294 return NewNode(machine()->Int64Div(), a, b); |
295 } | 295 } |
296 Node* Int64Mod(Node* a, Node* b) { | 296 Node* Int64Mod(Node* a, Node* b) { |
297 return AddNode(machine()->Int64Mod(), a, b); | 297 return NewNode(machine()->Int64Mod(), a, b); |
298 } | 298 } |
299 Node* Int64Neg(Node* a) { return Int64Sub(Int64Constant(0), a); } | 299 Node* Int64Neg(Node* a) { return Int64Sub(Int64Constant(0), a); } |
300 Node* Int64LessThan(Node* a, Node* b) { | 300 Node* Int64LessThan(Node* a, Node* b) { |
301 return AddNode(machine()->Int64LessThan(), a, b); | 301 return NewNode(machine()->Int64LessThan(), a, b); |
302 } | 302 } |
303 Node* Int64LessThanOrEqual(Node* a, Node* b) { | 303 Node* Int64LessThanOrEqual(Node* a, Node* b) { |
304 return AddNode(machine()->Int64LessThanOrEqual(), a, b); | 304 return NewNode(machine()->Int64LessThanOrEqual(), a, b); |
305 } | 305 } |
306 Node* Uint64LessThan(Node* a, Node* b) { | 306 Node* Uint64LessThan(Node* a, Node* b) { |
307 return AddNode(machine()->Uint64LessThan(), a, b); | 307 return NewNode(machine()->Uint64LessThan(), a, b); |
308 } | 308 } |
309 Node* Uint64LessThanOrEqual(Node* a, Node* b) { | 309 Node* Uint64LessThanOrEqual(Node* a, Node* b) { |
310 return AddNode(machine()->Uint64LessThanOrEqual(), a, b); | 310 return NewNode(machine()->Uint64LessThanOrEqual(), a, b); |
311 } | 311 } |
312 Node* Int64GreaterThan(Node* a, Node* b) { return Int64LessThan(b, a); } | 312 Node* Int64GreaterThan(Node* a, Node* b) { return Int64LessThan(b, a); } |
313 Node* Int64GreaterThanOrEqual(Node* a, Node* b) { | 313 Node* Int64GreaterThanOrEqual(Node* a, Node* b) { |
314 return Int64LessThanOrEqual(b, a); | 314 return Int64LessThanOrEqual(b, a); |
315 } | 315 } |
316 Node* Uint64Div(Node* a, Node* b) { | 316 Node* Uint64Div(Node* a, Node* b) { |
317 return AddNode(machine()->Uint64Div(), a, b); | 317 return NewNode(machine()->Uint64Div(), a, b); |
318 } | 318 } |
319 Node* Uint64Mod(Node* a, Node* b) { | 319 Node* Uint64Mod(Node* a, Node* b) { |
320 return AddNode(machine()->Uint64Mod(), a, b); | 320 return NewNode(machine()->Uint64Mod(), a, b); |
321 } | 321 } |
322 | 322 |
323 #define INTPTR_BINOP(prefix, name) \ | 323 #define INTPTR_BINOP(prefix, name) \ |
324 Node* IntPtr##name(Node* a, Node* b) { \ | 324 Node* IntPtr##name(Node* a, Node* b) { \ |
325 return kPointerSize == 8 ? prefix##64##name(a, b) \ | 325 return kPointerSize == 8 ? prefix##64##name(a, b) \ |
326 : prefix##32##name(a, b); \ | 326 : prefix##32##name(a, b); \ |
327 } | 327 } |
328 | 328 |
329 INTPTR_BINOP(Int, Add); | 329 INTPTR_BINOP(Int, Add); |
330 INTPTR_BINOP(Int, Sub); | 330 INTPTR_BINOP(Int, Sub); |
331 INTPTR_BINOP(Int, LessThan); | 331 INTPTR_BINOP(Int, LessThan); |
332 INTPTR_BINOP(Int, LessThanOrEqual); | 332 INTPTR_BINOP(Int, LessThanOrEqual); |
333 INTPTR_BINOP(Word, Equal); | 333 INTPTR_BINOP(Word, Equal); |
334 INTPTR_BINOP(Word, NotEqual); | 334 INTPTR_BINOP(Word, NotEqual); |
335 INTPTR_BINOP(Int, GreaterThanOrEqual); | 335 INTPTR_BINOP(Int, GreaterThanOrEqual); |
336 INTPTR_BINOP(Int, GreaterThan); | 336 INTPTR_BINOP(Int, GreaterThan); |
337 | 337 |
338 #undef INTPTR_BINOP | 338 #undef INTPTR_BINOP |
339 | 339 |
340 Node* Float32Add(Node* a, Node* b) { | 340 Node* Float32Add(Node* a, Node* b) { |
341 return AddNode(machine()->Float32Add(), a, b); | 341 return NewNode(machine()->Float32Add(), a, b); |
342 } | 342 } |
343 Node* Float32Sub(Node* a, Node* b) { | 343 Node* Float32Sub(Node* a, Node* b) { |
344 return AddNode(machine()->Float32Sub(), a, b); | 344 return NewNode(machine()->Float32Sub(), a, b); |
345 } | 345 } |
346 Node* Float32Mul(Node* a, Node* b) { | 346 Node* Float32Mul(Node* a, Node* b) { |
347 return AddNode(machine()->Float32Mul(), a, b); | 347 return NewNode(machine()->Float32Mul(), a, b); |
348 } | 348 } |
349 Node* Float32Div(Node* a, Node* b) { | 349 Node* Float32Div(Node* a, Node* b) { |
350 return AddNode(machine()->Float32Div(), a, b); | 350 return NewNode(machine()->Float32Div(), a, b); |
351 } | 351 } |
352 Node* Float32Abs(Node* a) { return AddNode(machine()->Float32Abs(), a); } | 352 Node* Float32Abs(Node* a) { return NewNode(machine()->Float32Abs(), a); } |
353 Node* Float32Sqrt(Node* a) { return AddNode(machine()->Float32Sqrt(), a); } | 353 Node* Float32Sqrt(Node* a) { return NewNode(machine()->Float32Sqrt(), a); } |
354 Node* Float32Equal(Node* a, Node* b) { | 354 Node* Float32Equal(Node* a, Node* b) { |
355 return AddNode(machine()->Float32Equal(), a, b); | 355 return NewNode(machine()->Float32Equal(), a, b); |
356 } | 356 } |
357 Node* Float32NotEqual(Node* a, Node* b) { | 357 Node* Float32NotEqual(Node* a, Node* b) { |
358 return WordBinaryNot(Float32Equal(a, b)); | 358 return WordBinaryNot(Float32Equal(a, b)); |
359 } | 359 } |
360 Node* Float32LessThan(Node* a, Node* b) { | 360 Node* Float32LessThan(Node* a, Node* b) { |
361 return AddNode(machine()->Float32LessThan(), a, b); | 361 return NewNode(machine()->Float32LessThan(), a, b); |
362 } | 362 } |
363 Node* Float32LessThanOrEqual(Node* a, Node* b) { | 363 Node* Float32LessThanOrEqual(Node* a, Node* b) { |
364 return AddNode(machine()->Float32LessThanOrEqual(), a, b); | 364 return NewNode(machine()->Float32LessThanOrEqual(), a, b); |
365 } | 365 } |
366 Node* Float32GreaterThan(Node* a, Node* b) { return Float32LessThan(b, a); } | 366 Node* Float32GreaterThan(Node* a, Node* b) { return Float32LessThan(b, a); } |
367 Node* Float32GreaterThanOrEqual(Node* a, Node* b) { | 367 Node* Float32GreaterThanOrEqual(Node* a, Node* b) { |
368 return Float32LessThanOrEqual(b, a); | 368 return Float32LessThanOrEqual(b, a); |
369 } | 369 } |
370 | 370 |
371 Node* Float64Add(Node* a, Node* b) { | 371 Node* Float64Add(Node* a, Node* b) { |
372 return AddNode(machine()->Float64Add(), a, b); | 372 return NewNode(machine()->Float64Add(), a, b); |
373 } | 373 } |
374 Node* Float64Sub(Node* a, Node* b) { | 374 Node* Float64Sub(Node* a, Node* b) { |
375 return AddNode(machine()->Float64Sub(), a, b); | 375 return NewNode(machine()->Float64Sub(), a, b); |
376 } | 376 } |
377 Node* Float64Mul(Node* a, Node* b) { | 377 Node* Float64Mul(Node* a, Node* b) { |
378 return AddNode(machine()->Float64Mul(), a, b); | 378 return NewNode(machine()->Float64Mul(), a, b); |
379 } | 379 } |
380 Node* Float64Div(Node* a, Node* b) { | 380 Node* Float64Div(Node* a, Node* b) { |
381 return AddNode(machine()->Float64Div(), a, b); | 381 return NewNode(machine()->Float64Div(), a, b); |
382 } | 382 } |
383 Node* Float64Mod(Node* a, Node* b) { | 383 Node* Float64Mod(Node* a, Node* b) { |
384 return AddNode(machine()->Float64Mod(), a, b); | 384 return NewNode(machine()->Float64Mod(), a, b); |
385 } | 385 } |
386 Node* Float64Abs(Node* a) { return AddNode(machine()->Float64Abs(), a); } | 386 Node* Float64Abs(Node* a) { return NewNode(machine()->Float64Abs(), a); } |
387 Node* Float64Sqrt(Node* a) { return AddNode(machine()->Float64Sqrt(), a); } | 387 Node* Float64Sqrt(Node* a) { return NewNode(machine()->Float64Sqrt(), a); } |
388 Node* Float64Equal(Node* a, Node* b) { | 388 Node* Float64Equal(Node* a, Node* b) { |
389 return AddNode(machine()->Float64Equal(), a, b); | 389 return NewNode(machine()->Float64Equal(), a, b); |
390 } | 390 } |
391 Node* Float64NotEqual(Node* a, Node* b) { | 391 Node* Float64NotEqual(Node* a, Node* b) { |
392 return WordBinaryNot(Float64Equal(a, b)); | 392 return WordBinaryNot(Float64Equal(a, b)); |
393 } | 393 } |
394 Node* Float64LessThan(Node* a, Node* b) { | 394 Node* Float64LessThan(Node* a, Node* b) { |
395 return AddNode(machine()->Float64LessThan(), a, b); | 395 return NewNode(machine()->Float64LessThan(), a, b); |
396 } | 396 } |
397 Node* Float64LessThanOrEqual(Node* a, Node* b) { | 397 Node* Float64LessThanOrEqual(Node* a, Node* b) { |
398 return AddNode(machine()->Float64LessThanOrEqual(), a, b); | 398 return NewNode(machine()->Float64LessThanOrEqual(), a, b); |
399 } | 399 } |
400 Node* Float64GreaterThan(Node* a, Node* b) { return Float64LessThan(b, a); } | 400 Node* Float64GreaterThan(Node* a, Node* b) { return Float64LessThan(b, a); } |
401 Node* Float64GreaterThanOrEqual(Node* a, Node* b) { | 401 Node* Float64GreaterThanOrEqual(Node* a, Node* b) { |
402 return Float64LessThanOrEqual(b, a); | 402 return Float64LessThanOrEqual(b, a); |
403 } | 403 } |
404 | 404 |
405 // Conversions. | 405 // Conversions. |
406 Node* ChangeFloat32ToFloat64(Node* a) { | 406 Node* ChangeFloat32ToFloat64(Node* a) { |
407 return AddNode(machine()->ChangeFloat32ToFloat64(), a); | 407 return NewNode(machine()->ChangeFloat32ToFloat64(), a); |
408 } | 408 } |
409 Node* ChangeInt32ToFloat64(Node* a) { | 409 Node* ChangeInt32ToFloat64(Node* a) { |
410 return AddNode(machine()->ChangeInt32ToFloat64(), a); | 410 return NewNode(machine()->ChangeInt32ToFloat64(), a); |
411 } | 411 } |
412 Node* ChangeUint32ToFloat64(Node* a) { | 412 Node* ChangeUint32ToFloat64(Node* a) { |
413 return AddNode(machine()->ChangeUint32ToFloat64(), a); | 413 return NewNode(machine()->ChangeUint32ToFloat64(), a); |
414 } | 414 } |
415 Node* ChangeFloat64ToInt32(Node* a) { | 415 Node* ChangeFloat64ToInt32(Node* a) { |
416 return AddNode(machine()->ChangeFloat64ToInt32(), a); | 416 return NewNode(machine()->ChangeFloat64ToInt32(), a); |
417 } | 417 } |
418 Node* ChangeFloat64ToUint32(Node* a) { | 418 Node* ChangeFloat64ToUint32(Node* a) { |
419 return AddNode(machine()->ChangeFloat64ToUint32(), a); | 419 return NewNode(machine()->ChangeFloat64ToUint32(), a); |
420 } | 420 } |
421 Node* ChangeInt32ToInt64(Node* a) { | 421 Node* ChangeInt32ToInt64(Node* a) { |
422 return AddNode(machine()->ChangeInt32ToInt64(), a); | 422 return NewNode(machine()->ChangeInt32ToInt64(), a); |
423 } | 423 } |
424 Node* ChangeUint32ToUint64(Node* a) { | 424 Node* ChangeUint32ToUint64(Node* a) { |
425 return AddNode(machine()->ChangeUint32ToUint64(), a); | 425 return NewNode(machine()->ChangeUint32ToUint64(), a); |
426 } | 426 } |
427 Node* TruncateFloat64ToFloat32(Node* a) { | 427 Node* TruncateFloat64ToFloat32(Node* a) { |
428 return AddNode(machine()->TruncateFloat64ToFloat32(), a); | 428 return NewNode(machine()->TruncateFloat64ToFloat32(), a); |
429 } | 429 } |
430 Node* TruncateFloat64ToInt32(TruncationMode mode, Node* a) { | 430 Node* TruncateFloat64ToInt32(TruncationMode mode, Node* a) { |
431 return AddNode(machine()->TruncateFloat64ToInt32(mode), a); | 431 return NewNode(machine()->TruncateFloat64ToInt32(mode), a); |
432 } | 432 } |
433 Node* TruncateInt64ToInt32(Node* a) { | 433 Node* TruncateInt64ToInt32(Node* a) { |
434 return AddNode(machine()->TruncateInt64ToInt32(), a); | 434 return NewNode(machine()->TruncateInt64ToInt32(), a); |
435 } | 435 } |
436 Node* BitcastFloat32ToInt32(Node* a) { | 436 Node* BitcastFloat32ToInt32(Node* a) { |
437 return AddNode(machine()->BitcastFloat32ToInt32(), a); | 437 return NewNode(machine()->BitcastFloat32ToInt32(), a); |
438 } | 438 } |
439 Node* BitcastFloat64ToInt64(Node* a) { | 439 Node* BitcastFloat64ToInt64(Node* a) { |
440 return AddNode(machine()->BitcastFloat64ToInt64(), a); | 440 return NewNode(machine()->BitcastFloat64ToInt64(), a); |
441 } | 441 } |
442 Node* BitcastInt32ToFloat32(Node* a) { | 442 Node* BitcastInt32ToFloat32(Node* a) { |
443 return AddNode(machine()->BitcastInt32ToFloat32(), a); | 443 return NewNode(machine()->BitcastInt32ToFloat32(), a); |
444 } | 444 } |
445 Node* BitcastInt64ToFloat64(Node* a) { | 445 Node* BitcastInt64ToFloat64(Node* a) { |
446 return AddNode(machine()->BitcastInt64ToFloat64(), a); | 446 return NewNode(machine()->BitcastInt64ToFloat64(), a); |
447 } | 447 } |
448 Node* Float64RoundDown(Node* a) { | 448 Node* Float64RoundDown(Node* a) { |
449 return AddNode(machine()->Float64RoundDown().op(), a); | 449 return NewNode(machine()->Float64RoundDown().op(), a); |
450 } | 450 } |
451 Node* Float64RoundTruncate(Node* a) { | 451 Node* Float64RoundTruncate(Node* a) { |
452 return AddNode(machine()->Float64RoundTruncate().op(), a); | 452 return NewNode(machine()->Float64RoundTruncate().op(), a); |
453 } | 453 } |
454 Node* Float64RoundTiesAway(Node* a) { | 454 Node* Float64RoundTiesAway(Node* a) { |
455 return AddNode(machine()->Float64RoundTiesAway().op(), a); | 455 return NewNode(machine()->Float64RoundTiesAway().op(), a); |
456 } | 456 } |
457 | 457 |
458 // Float64 bit operations. | 458 // Float64 bit operations. |
459 Node* Float64ExtractLowWord32(Node* a) { | 459 Node* Float64ExtractLowWord32(Node* a) { |
460 return AddNode(machine()->Float64ExtractLowWord32(), a); | 460 return NewNode(machine()->Float64ExtractLowWord32(), a); |
461 } | 461 } |
462 Node* Float64ExtractHighWord32(Node* a) { | 462 Node* Float64ExtractHighWord32(Node* a) { |
463 return AddNode(machine()->Float64ExtractHighWord32(), a); | 463 return NewNode(machine()->Float64ExtractHighWord32(), a); |
464 } | 464 } |
465 Node* Float64InsertLowWord32(Node* a, Node* b) { | 465 Node* Float64InsertLowWord32(Node* a, Node* b) { |
466 return AddNode(machine()->Float64InsertLowWord32(), a, b); | 466 return NewNode(machine()->Float64InsertLowWord32(), a, b); |
467 } | 467 } |
468 Node* Float64InsertHighWord32(Node* a, Node* b) { | 468 Node* Float64InsertHighWord32(Node* a, Node* b) { |
469 return AddNode(machine()->Float64InsertHighWord32(), a, b); | 469 return NewNode(machine()->Float64InsertHighWord32(), a, b); |
470 } | 470 } |
471 | 471 |
472 // Stack operations. | 472 // Stack operations. |
473 Node* LoadStackPointer() { return AddNode(machine()->LoadStackPointer()); } | 473 Node* LoadStackPointer() { return NewNode(machine()->LoadStackPointer()); } |
474 Node* LoadFramePointer() { return AddNode(machine()->LoadFramePointer()); } | 474 Node* LoadFramePointer() { return NewNode(machine()->LoadFramePointer()); } |
475 | 475 |
476 // Parameters. | 476 // Parameters. |
477 Node* Parameter(size_t index); | 477 Node* Parameter(size_t index); |
478 | 478 |
479 // Pointer utilities. | 479 // Pointer utilities. |
480 Node* LoadFromPointer(void* address, MachineType rep, int32_t offset = 0) { | 480 Node* LoadFromPointer(void* address, MachineType rep, int32_t offset = 0) { |
481 return Load(rep, PointerConstant(address), Int32Constant(offset)); | 481 return Load(rep, PointerConstant(address), Int32Constant(offset)); |
482 } | 482 } |
483 Node* StoreToPointer(void* address, MachineType rep, Node* node) { | 483 Node* StoreToPointer(void* address, MachineType rep, Node* node) { |
484 return Store(rep, PointerConstant(address), node); | 484 return Store(rep, PointerConstant(address), node); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
528 void Goto(Label* label); | 528 void Goto(Label* label); |
529 void Branch(Node* condition, Label* true_val, Label* false_val); | 529 void Branch(Node* condition, Label* true_val, Label* false_val); |
530 void Switch(Node* index, Label* default_label, int32_t* case_values, | 530 void Switch(Node* index, Label* default_label, int32_t* case_values, |
531 Label** case_labels, size_t case_count); | 531 Label** case_labels, size_t case_count); |
532 void Return(Node* value); | 532 void Return(Node* value); |
533 void Bind(Label* label); | 533 void Bind(Label* label); |
534 void Deoptimize(Node* state); | 534 void Deoptimize(Node* state); |
535 | 535 |
536 // Variables. | 536 // Variables. |
537 Node* Phi(MachineType type, Node* n1, Node* n2) { | 537 Node* Phi(MachineType type, Node* n1, Node* n2) { |
538 return AddNode(common()->Phi(type, 2), n1, n2); | 538 return NewNode(common()->Phi(type, 2), n1, n2); |
539 } | 539 } |
540 Node* Phi(MachineType type, Node* n1, Node* n2, Node* n3) { | 540 Node* Phi(MachineType type, Node* n1, Node* n2, Node* n3) { |
541 return AddNode(common()->Phi(type, 3), n1, n2, n3); | 541 return NewNode(common()->Phi(type, 3), n1, n2, n3); |
542 } | 542 } |
543 Node* Phi(MachineType type, Node* n1, Node* n2, Node* n3, Node* n4) { | 543 Node* Phi(MachineType type, Node* n1, Node* n2, Node* n3, Node* n4) { |
544 return AddNode(common()->Phi(type, 4), n1, n2, n3, n4); | 544 return NewNode(common()->Phi(type, 4), n1, n2, n3, n4); |
545 } | 545 } |
546 | 546 |
547 // =========================================================================== | 547 // =========================================================================== |
548 // The following generic node creation methods can be used for operators that | 548 // The following generic node creation methods can be used for operators that |
549 // are not covered by the above utility methods. There should rarely be a need | 549 // are not covered by the above utility methods. There should rarely be a need |
550 // to do that outside of testing though. | 550 // to do that outside of testing though. |
551 | 551 |
552 Node* AddNode(const Operator* op, int input_count, Node** inputs); | 552 Node* NewNode(const Operator* op) { |
553 | 553 return MakeNode(op, 0, static_cast<Node**>(NULL)); |
554 Node* AddNode(const Operator* op) { | |
555 return AddNode(op, 0, static_cast<Node**>(nullptr)); | |
556 } | 554 } |
557 | 555 |
558 Node* AddNode(const Operator* op, Node* n1) { return AddNode(op, 1, &n1); } | 556 Node* NewNode(const Operator* op, Node* n1) { return MakeNode(op, 1, &n1); } |
559 | 557 |
560 template <class... TArgs> | 558 Node* NewNode(const Operator* op, Node* n1, Node* n2) { |
561 Node* AddNode(const Operator* op, Node* n1, Node* n2, TArgs... args) { | 559 Node* buffer[] = {n1, n2}; |
562 Node* buffer[] = {n1, n2, args...}; | 560 return MakeNode(op, arraysize(buffer), buffer); |
563 return AddNode(op, arraysize(buffer), buffer); | 561 } |
| 562 |
| 563 Node* NewNode(const Operator* op, Node* n1, Node* n2, Node* n3) { |
| 564 Node* buffer[] = {n1, n2, n3}; |
| 565 return MakeNode(op, arraysize(buffer), buffer); |
| 566 } |
| 567 |
| 568 Node* NewNode(const Operator* op, Node* n1, Node* n2, Node* n3, Node* n4) { |
| 569 Node* buffer[] = {n1, n2, n3, n4}; |
| 570 return MakeNode(op, arraysize(buffer), buffer); |
| 571 } |
| 572 |
| 573 Node* NewNode(const Operator* op, Node* n1, Node* n2, Node* n3, Node* n4, |
| 574 Node* n5) { |
| 575 Node* buffer[] = {n1, n2, n3, n4, n5}; |
| 576 return MakeNode(op, arraysize(buffer), buffer); |
| 577 } |
| 578 |
| 579 Node* NewNode(const Operator* op, Node* n1, Node* n2, Node* n3, Node* n4, |
| 580 Node* n5, Node* n6) { |
| 581 Node* nodes[] = {n1, n2, n3, n4, n5, n6}; |
| 582 return MakeNode(op, arraysize(nodes), nodes); |
| 583 } |
| 584 |
| 585 Node* NewNode(const Operator* op, int value_input_count, |
| 586 Node** value_inputs) { |
| 587 return MakeNode(op, value_input_count, value_inputs); |
564 } | 588 } |
565 | 589 |
566 private: | 590 private: |
567 Node* MakeNode(const Operator* op, int input_count, Node** inputs); | 591 Node* MakeNode(const Operator* op, int input_count, Node** inputs); |
568 BasicBlock* Use(Label* label); | 592 BasicBlock* Use(Label* label); |
569 BasicBlock* EnsureBlock(Label* label); | 593 BasicBlock* EnsureBlock(Label* label); |
570 | 594 |
571 Isolate* isolate_; | 595 Isolate* isolate_; |
572 Graph* graph_; | 596 Graph* graph_; |
573 Schedule* schedule_; | 597 Schedule* schedule_; |
574 MachineOperatorBuilder machine_; | 598 MachineOperatorBuilder machine_; |
575 CommonOperatorBuilder common_; | 599 CommonOperatorBuilder common_; |
576 CallDescriptor* call_descriptor_; | 600 CallDescriptor* call_descriptor_; |
577 Node** parameters_; | 601 Node** parameters_; |
578 BasicBlock* current_block_; | 602 BasicBlock* current_block_; |
579 | 603 |
580 DISALLOW_COPY_AND_ASSIGN(RawMachineAssembler); | 604 DISALLOW_COPY_AND_ASSIGN(RawMachineAssembler); |
581 }; | 605 }; |
582 | 606 |
583 } // namespace compiler | 607 } // namespace compiler |
584 } // namespace internal | 608 } // namespace internal |
585 } // namespace v8 | 609 } // namespace v8 |
586 | 610 |
587 #endif // V8_COMPILER_RAW_MACHINE_ASSEMBLER_H_ | 611 #endif // V8_COMPILER_RAW_MACHINE_ASSEMBLER_H_ |
OLD | NEW |