blob: f3445aceeabe3dc34b6574131e9033bb61051365 [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// 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_RAW_MACHINE_ASSEMBLER_H_
6#define V8_COMPILER_RAW_MACHINE_ASSEMBLER_H_
7
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00008#include "src/assembler.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +00009#include "src/compiler/common-operator.h"
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000010#include "src/compiler/graph.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +000011#include "src/compiler/linkage.h"
12#include "src/compiler/machine-operator.h"
13#include "src/compiler/node.h"
14#include "src/compiler/operator.h"
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000015#include "src/factory.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +000016
17namespace v8 {
18namespace internal {
19namespace compiler {
20
21class BasicBlock;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000022class RawMachineLabel;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000023class Schedule;
24
25
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000026// The RawMachineAssembler produces a low-level IR graph. All nodes are wired
27// into a graph and also placed into a schedule immediately, hence subsequent
28// code generation can happen without the need for scheduling.
29//
30// In order to create a schedule on-the-fly, the assembler keeps track of basic
31// blocks by having one current basic block being populated and by referencing
32// other basic blocks through the use of labels.
33//
34// Also note that the generated graph is only valid together with the generated
35// schedule, using one without the other is invalid as the graph is inherently
36// non-schedulable due to missing control and effect dependencies.
37class RawMachineAssembler {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000038 public:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000039 RawMachineAssembler(
40 Isolate* isolate, Graph* graph, CallDescriptor* call_descriptor,
41 MachineRepresentation word = MachineType::PointerRepresentation(),
42 MachineOperatorBuilder::Flags flags =
43 MachineOperatorBuilder::Flag::kNoFlags);
44 ~RawMachineAssembler() {}
Ben Murdochb8a8cc12014-11-26 15:28:44 +000045
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000046 Isolate* isolate() const { return isolate_; }
47 Graph* graph() const { return graph_; }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000048 Zone* zone() const { return graph()->zone(); }
49 MachineOperatorBuilder* machine() { return &machine_; }
50 CommonOperatorBuilder* common() { return &common_; }
51 CallDescriptor* call_descriptor() const { return call_descriptor_; }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000052
53 // Finalizes the schedule and exports it to be used for code generation. Note
54 // that this RawMachineAssembler becomes invalid after export.
55 Schedule* Export();
56
57 // ===========================================================================
58 // The following utility methods create new nodes with specific operators and
59 // place them into the current basic block. They don't perform control flow,
60 // hence will not switch the current basic block.
61
62 Node* NullConstant() {
63 return HeapConstant(isolate()->factory()->null_value());
64 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000065
66 Node* UndefinedConstant() {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000067 return HeapConstant(isolate()->factory()->undefined_value());
Ben Murdochb8a8cc12014-11-26 15:28:44 +000068 }
69
70 // Constants.
71 Node* PointerConstant(void* value) {
72 return IntPtrConstant(reinterpret_cast<intptr_t>(value));
73 }
74 Node* IntPtrConstant(intptr_t value) {
75 // TODO(dcarney): mark generated code as unserializable if value != 0.
76 return kPointerSize == 8 ? Int64Constant(value)
77 : Int32Constant(static_cast<int>(value));
78 }
79 Node* Int32Constant(int32_t value) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000080 return AddNode(common()->Int32Constant(value));
Ben Murdochb8a8cc12014-11-26 15:28:44 +000081 }
Ben Murdoch097c5b22016-05-18 11:27:45 +010082 Node* StackSlot(MachineRepresentation rep) {
83 return AddNode(machine()->StackSlot(rep));
84 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000085 Node* Int64Constant(int64_t value) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000086 return AddNode(common()->Int64Constant(value));
Ben Murdochb8a8cc12014-11-26 15:28:44 +000087 }
88 Node* NumberConstant(double value) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000089 return AddNode(common()->NumberConstant(value));
Ben Murdochb8a8cc12014-11-26 15:28:44 +000090 }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040091 Node* Float32Constant(float value) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000092 return AddNode(common()->Float32Constant(value));
Emily Bernierd0a1eb72015-03-24 16:35:39 -040093 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000094 Node* Float64Constant(double value) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000095 return AddNode(common()->Float64Constant(value));
Ben Murdochb8a8cc12014-11-26 15:28:44 +000096 }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040097 Node* HeapConstant(Handle<HeapObject> object) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000098 return AddNode(common()->HeapConstant(object));
99 }
100 Node* BooleanConstant(bool value) {
101 Handle<Object> object = isolate()->factory()->ToBoolean(value);
102 return HeapConstant(Handle<HeapObject>::cast(object));
103 }
104 Node* ExternalConstant(ExternalReference address) {
105 return AddNode(common()->ExternalConstant(address));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000106 }
107
108 Node* Projection(int index, Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000109 return AddNode(common()->Projection(index), a);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000110 }
111
112 // Memory Operations.
113 Node* Load(MachineType rep, Node* base) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000114 return Load(rep, base, IntPtrConstant(0));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000115 }
116 Node* Load(MachineType rep, Node* base, Node* index) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000117 return AddNode(machine()->Load(rep), base, index);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000118 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000119 Node* Store(MachineRepresentation rep, Node* base, Node* value,
120 WriteBarrierKind write_barrier) {
121 return Store(rep, base, IntPtrConstant(0), value, write_barrier);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000122 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000123 Node* Store(MachineRepresentation rep, Node* base, Node* index, Node* value,
124 WriteBarrierKind write_barrier) {
125 return AddNode(machine()->Store(StoreRepresentation(rep, write_barrier)),
126 base, index, value);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000127 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000128
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000129 // Arithmetic Operations.
130 Node* WordAnd(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000131 return AddNode(machine()->WordAnd(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000132 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000133 Node* WordOr(Node* a, Node* b) { return AddNode(machine()->WordOr(), a, b); }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000134 Node* WordXor(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000135 return AddNode(machine()->WordXor(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000136 }
137 Node* WordShl(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000138 return AddNode(machine()->WordShl(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000139 }
140 Node* WordShr(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000141 return AddNode(machine()->WordShr(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000142 }
143 Node* WordSar(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000144 return AddNode(machine()->WordSar(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000145 }
146 Node* WordRor(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000147 return AddNode(machine()->WordRor(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000148 }
149 Node* WordEqual(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000150 return AddNode(machine()->WordEqual(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000151 }
152 Node* WordNotEqual(Node* a, Node* b) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100153 return Word32BinaryNot(WordEqual(a, b));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000154 }
155 Node* WordNot(Node* a) {
156 if (machine()->Is32()) {
157 return Word32Not(a);
158 } else {
159 return Word64Not(a);
160 }
161 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000162
163 Node* Word32And(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000164 return AddNode(machine()->Word32And(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000165 }
166 Node* Word32Or(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000167 return AddNode(machine()->Word32Or(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000168 }
169 Node* Word32Xor(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000170 return AddNode(machine()->Word32Xor(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000171 }
172 Node* Word32Shl(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000173 return AddNode(machine()->Word32Shl(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000174 }
175 Node* Word32Shr(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000176 return AddNode(machine()->Word32Shr(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000177 }
178 Node* Word32Sar(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000179 return AddNode(machine()->Word32Sar(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000180 }
181 Node* Word32Ror(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000182 return AddNode(machine()->Word32Ror(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000183 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000184 Node* Word32Clz(Node* a) { return AddNode(machine()->Word32Clz(), a); }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000185 Node* Word32Equal(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000186 return AddNode(machine()->Word32Equal(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000187 }
188 Node* Word32NotEqual(Node* a, Node* b) {
189 return Word32BinaryNot(Word32Equal(a, b));
190 }
191 Node* Word32Not(Node* a) { return Word32Xor(a, Int32Constant(-1)); }
192 Node* Word32BinaryNot(Node* a) { return Word32Equal(a, Int32Constant(0)); }
193
194 Node* Word64And(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000195 return AddNode(machine()->Word64And(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000196 }
197 Node* Word64Or(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000198 return AddNode(machine()->Word64Or(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000199 }
200 Node* Word64Xor(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000201 return AddNode(machine()->Word64Xor(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000202 }
203 Node* Word64Shl(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000204 return AddNode(machine()->Word64Shl(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000205 }
206 Node* Word64Shr(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000207 return AddNode(machine()->Word64Shr(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000208 }
209 Node* Word64Sar(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000210 return AddNode(machine()->Word64Sar(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000211 }
212 Node* Word64Ror(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000213 return AddNode(machine()->Word64Ror(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000214 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000215 Node* Word64Clz(Node* a) { return AddNode(machine()->Word64Clz(), a); }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000216 Node* Word64Equal(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000217 return AddNode(machine()->Word64Equal(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000218 }
219 Node* Word64NotEqual(Node* a, Node* b) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100220 return Word32BinaryNot(Word64Equal(a, b));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000221 }
222 Node* Word64Not(Node* a) { return Word64Xor(a, Int64Constant(-1)); }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000223
224 Node* Int32Add(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000225 return AddNode(machine()->Int32Add(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000226 }
227 Node* Int32AddWithOverflow(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000228 return AddNode(machine()->Int32AddWithOverflow(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000229 }
230 Node* Int32Sub(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000231 return AddNode(machine()->Int32Sub(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000232 }
233 Node* Int32SubWithOverflow(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000234 return AddNode(machine()->Int32SubWithOverflow(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000235 }
236 Node* Int32Mul(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000237 return AddNode(machine()->Int32Mul(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000238 }
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400239 Node* Int32MulHigh(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000240 return AddNode(machine()->Int32MulHigh(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000241 }
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400242 Node* Int32Div(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000243 return AddNode(machine()->Int32Div(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000244 }
245 Node* Int32Mod(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000246 return AddNode(machine()->Int32Mod(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000247 }
248 Node* Int32LessThan(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000249 return AddNode(machine()->Int32LessThan(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000250 }
251 Node* Int32LessThanOrEqual(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000252 return AddNode(machine()->Int32LessThanOrEqual(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000253 }
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400254 Node* Uint32Div(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000255 return AddNode(machine()->Uint32Div(), a, b);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400256 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000257 Node* Uint32LessThan(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000258 return AddNode(machine()->Uint32LessThan(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000259 }
260 Node* Uint32LessThanOrEqual(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000261 return AddNode(machine()->Uint32LessThanOrEqual(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000262 }
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400263 Node* Uint32Mod(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000264 return AddNode(machine()->Uint32Mod(), a, b);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400265 }
266 Node* Uint32MulHigh(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000267 return AddNode(machine()->Uint32MulHigh(), a, b);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400268 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000269 Node* Int32GreaterThan(Node* a, Node* b) { return Int32LessThan(b, a); }
270 Node* Int32GreaterThanOrEqual(Node* a, Node* b) {
271 return Int32LessThanOrEqual(b, a);
272 }
Ben Murdoch097c5b22016-05-18 11:27:45 +0100273 Node* Uint32GreaterThan(Node* a, Node* b) { return Uint32LessThan(b, a); }
274 Node* Uint32GreaterThanOrEqual(Node* a, Node* b) {
275 return Uint32LessThanOrEqual(b, a);
276 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000277 Node* Int32Neg(Node* a) { return Int32Sub(Int32Constant(0), a); }
278
279 Node* Int64Add(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000280 return AddNode(machine()->Int64Add(), a, b);
281 }
282 Node* Int64AddWithOverflow(Node* a, Node* b) {
283 return AddNode(machine()->Int64AddWithOverflow(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000284 }
285 Node* Int64Sub(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000286 return AddNode(machine()->Int64Sub(), a, b);
287 }
288 Node* Int64SubWithOverflow(Node* a, Node* b) {
289 return AddNode(machine()->Int64SubWithOverflow(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000290 }
291 Node* Int64Mul(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000292 return AddNode(machine()->Int64Mul(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000293 }
294 Node* Int64Div(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000295 return AddNode(machine()->Int64Div(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000296 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000297 Node* Int64Mod(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000298 return AddNode(machine()->Int64Mod(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000299 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000300 Node* Int64Neg(Node* a) { return Int64Sub(Int64Constant(0), a); }
301 Node* Int64LessThan(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000302 return AddNode(machine()->Int64LessThan(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000303 }
304 Node* Int64LessThanOrEqual(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000305 return AddNode(machine()->Int64LessThanOrEqual(), a, b);
306 }
307 Node* Uint64LessThan(Node* a, Node* b) {
308 return AddNode(machine()->Uint64LessThan(), a, b);
309 }
310 Node* Uint64LessThanOrEqual(Node* a, Node* b) {
311 return AddNode(machine()->Uint64LessThanOrEqual(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000312 }
313 Node* Int64GreaterThan(Node* a, Node* b) { return Int64LessThan(b, a); }
314 Node* Int64GreaterThanOrEqual(Node* a, Node* b) {
315 return Int64LessThanOrEqual(b, a);
316 }
Ben Murdoch097c5b22016-05-18 11:27:45 +0100317 Node* Uint64GreaterThan(Node* a, Node* b) { return Uint64LessThan(b, a); }
318 Node* Uint64GreaterThanOrEqual(Node* a, Node* b) {
319 return Uint64LessThanOrEqual(b, a);
320 }
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400321 Node* Uint64Div(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000322 return AddNode(machine()->Uint64Div(), a, b);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400323 }
324 Node* Uint64Mod(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000325 return AddNode(machine()->Uint64Mod(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000326 }
Ben Murdochda12d292016-06-02 14:46:10 +0100327 Node* Int32PairAdd(Node* a_low, Node* a_high, Node* b_low, Node* b_high) {
328 return AddNode(machine()->Int32PairAdd(), a_low, a_high, b_low, b_high);
329 }
330 Node* Int32PairSub(Node* a_low, Node* a_high, Node* b_low, Node* b_high) {
331 return AddNode(machine()->Int32PairSub(), a_low, a_high, b_low, b_high);
332 }
333 Node* Int32PairMul(Node* a_low, Node* a_high, Node* b_low, Node* b_high) {
334 return AddNode(machine()->Int32PairMul(), a_low, a_high, b_low, b_high);
335 }
336 Node* Word32PairShl(Node* low_word, Node* high_word, Node* shift) {
337 return AddNode(machine()->Word32PairShl(), low_word, high_word, shift);
338 }
339 Node* Word32PairShr(Node* low_word, Node* high_word, Node* shift) {
340 return AddNode(machine()->Word32PairShr(), low_word, high_word, shift);
341 }
342 Node* Word32PairSar(Node* low_word, Node* high_word, Node* shift) {
343 return AddNode(machine()->Word32PairSar(), low_word, high_word, shift);
344 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000345
346#define INTPTR_BINOP(prefix, name) \
347 Node* IntPtr##name(Node* a, Node* b) { \
348 return kPointerSize == 8 ? prefix##64##name(a, b) \
349 : prefix##32##name(a, b); \
350 }
351
352 INTPTR_BINOP(Int, Add);
Ben Murdochda12d292016-06-02 14:46:10 +0100353 INTPTR_BINOP(Int, AddWithOverflow);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000354 INTPTR_BINOP(Int, Sub);
Ben Murdochda12d292016-06-02 14:46:10 +0100355 INTPTR_BINOP(Int, SubWithOverflow);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000356 INTPTR_BINOP(Int, LessThan);
357 INTPTR_BINOP(Int, LessThanOrEqual);
358 INTPTR_BINOP(Word, Equal);
359 INTPTR_BINOP(Word, NotEqual);
360 INTPTR_BINOP(Int, GreaterThanOrEqual);
361 INTPTR_BINOP(Int, GreaterThan);
362
363#undef INTPTR_BINOP
364
Ben Murdoch097c5b22016-05-18 11:27:45 +0100365#define UINTPTR_BINOP(prefix, name) \
366 Node* UintPtr##name(Node* a, Node* b) { \
367 return kPointerSize == 8 ? prefix##64##name(a, b) \
368 : prefix##32##name(a, b); \
369 }
370
371 UINTPTR_BINOP(Uint, LessThan);
372 UINTPTR_BINOP(Uint, LessThanOrEqual);
373 UINTPTR_BINOP(Uint, GreaterThanOrEqual);
374 UINTPTR_BINOP(Uint, GreaterThan);
375
376#undef UINTPTR_BINOP
377
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000378 Node* Float32Add(Node* a, Node* b) {
379 return AddNode(machine()->Float32Add(), a, b);
380 }
381 Node* Float32Sub(Node* a, Node* b) {
382 return AddNode(machine()->Float32Sub(), a, b);
383 }
384 Node* Float32Mul(Node* a, Node* b) {
385 return AddNode(machine()->Float32Mul(), a, b);
386 }
387 Node* Float32Div(Node* a, Node* b) {
388 return AddNode(machine()->Float32Div(), a, b);
389 }
390 Node* Float32Max(Node* a, Node* b) {
391 return AddNode(machine()->Float32Max().op(), a, b);
392 }
393 Node* Float32Min(Node* a, Node* b) {
394 return AddNode(machine()->Float32Min().op(), a, b);
395 }
396 Node* Float32Abs(Node* a) { return AddNode(machine()->Float32Abs(), a); }
Ben Murdochda12d292016-06-02 14:46:10 +0100397 Node* Float32Neg(Node* a) { return Float32Sub(Float32Constant(-0.0f), a); }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000398 Node* Float32Sqrt(Node* a) { return AddNode(machine()->Float32Sqrt(), a); }
399 Node* Float32Equal(Node* a, Node* b) {
400 return AddNode(machine()->Float32Equal(), a, b);
401 }
402 Node* Float32NotEqual(Node* a, Node* b) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100403 return Word32BinaryNot(Float32Equal(a, b));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000404 }
405 Node* Float32LessThan(Node* a, Node* b) {
406 return AddNode(machine()->Float32LessThan(), a, b);
407 }
408 Node* Float32LessThanOrEqual(Node* a, Node* b) {
409 return AddNode(machine()->Float32LessThanOrEqual(), a, b);
410 }
411 Node* Float32GreaterThan(Node* a, Node* b) { return Float32LessThan(b, a); }
412 Node* Float32GreaterThanOrEqual(Node* a, Node* b) {
413 return Float32LessThanOrEqual(b, a);
414 }
415
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000416 Node* Float64Add(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000417 return AddNode(machine()->Float64Add(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000418 }
419 Node* Float64Sub(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000420 return AddNode(machine()->Float64Sub(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000421 }
422 Node* Float64Mul(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000423 return AddNode(machine()->Float64Mul(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000424 }
425 Node* Float64Div(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000426 return AddNode(machine()->Float64Div(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000427 }
428 Node* Float64Mod(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000429 return AddNode(machine()->Float64Mod(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000430 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000431 Node* Float64Max(Node* a, Node* b) {
432 return AddNode(machine()->Float64Max().op(), a, b);
433 }
434 Node* Float64Min(Node* a, Node* b) {
435 return AddNode(machine()->Float64Min().op(), a, b);
436 }
437 Node* Float64Abs(Node* a) { return AddNode(machine()->Float64Abs(), a); }
Ben Murdochda12d292016-06-02 14:46:10 +0100438 Node* Float64Neg(Node* a) { return Float64Sub(Float64Constant(-0.0), a); }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000439 Node* Float64Sqrt(Node* a) { return AddNode(machine()->Float64Sqrt(), a); }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000440 Node* Float64Equal(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000441 return AddNode(machine()->Float64Equal(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000442 }
443 Node* Float64NotEqual(Node* a, Node* b) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100444 return Word32BinaryNot(Float64Equal(a, b));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000445 }
446 Node* Float64LessThan(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000447 return AddNode(machine()->Float64LessThan(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000448 }
449 Node* Float64LessThanOrEqual(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000450 return AddNode(machine()->Float64LessThanOrEqual(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000451 }
452 Node* Float64GreaterThan(Node* a, Node* b) { return Float64LessThan(b, a); }
453 Node* Float64GreaterThanOrEqual(Node* a, Node* b) {
454 return Float64LessThanOrEqual(b, a);
455 }
456
457 // Conversions.
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400458 Node* ChangeFloat32ToFloat64(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000459 return AddNode(machine()->ChangeFloat32ToFloat64(), a);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400460 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000461 Node* ChangeInt32ToFloat64(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000462 return AddNode(machine()->ChangeInt32ToFloat64(), a);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000463 }
464 Node* ChangeUint32ToFloat64(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000465 return AddNode(machine()->ChangeUint32ToFloat64(), a);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000466 }
467 Node* ChangeFloat64ToInt32(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000468 return AddNode(machine()->ChangeFloat64ToInt32(), a);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000469 }
470 Node* ChangeFloat64ToUint32(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000471 return AddNode(machine()->ChangeFloat64ToUint32(), a);
472 }
Ben Murdochda12d292016-06-02 14:46:10 +0100473 Node* TruncateFloat64ToUint32(Node* a) {
474 return AddNode(machine()->TruncateFloat64ToUint32(), a);
475 }
Ben Murdoch097c5b22016-05-18 11:27:45 +0100476 Node* TruncateFloat32ToInt32(Node* a) {
477 return AddNode(machine()->TruncateFloat32ToInt32(), a);
478 }
479 Node* TruncateFloat32ToUint32(Node* a) {
480 return AddNode(machine()->TruncateFloat32ToUint32(), a);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000481 }
482 Node* TryTruncateFloat32ToInt64(Node* a) {
483 return AddNode(machine()->TryTruncateFloat32ToInt64(), a);
484 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000485 Node* TryTruncateFloat64ToInt64(Node* a) {
486 return AddNode(machine()->TryTruncateFloat64ToInt64(), a);
487 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000488 Node* TryTruncateFloat32ToUint64(Node* a) {
489 return AddNode(machine()->TryTruncateFloat32ToUint64(), a);
490 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000491 Node* TryTruncateFloat64ToUint64(Node* a) {
492 return AddNode(machine()->TryTruncateFloat64ToUint64(), a);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000493 }
494 Node* ChangeInt32ToInt64(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000495 return AddNode(machine()->ChangeInt32ToInt64(), a);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000496 }
497 Node* ChangeUint32ToUint64(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000498 return AddNode(machine()->ChangeUint32ToUint64(), a);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000499 }
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400500 Node* TruncateFloat64ToFloat32(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000501 return AddNode(machine()->TruncateFloat64ToFloat32(), a);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400502 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000503 Node* TruncateFloat64ToInt32(TruncationMode mode, Node* a) {
504 return AddNode(machine()->TruncateFloat64ToInt32(mode), a);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000505 }
506 Node* TruncateInt64ToInt32(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000507 return AddNode(machine()->TruncateInt64ToInt32(), a);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000508 }
Ben Murdoch097c5b22016-05-18 11:27:45 +0100509 Node* RoundInt32ToFloat32(Node* a) {
510 return AddNode(machine()->RoundInt32ToFloat32(), a);
511 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000512 Node* RoundInt64ToFloat32(Node* a) {
513 return AddNode(machine()->RoundInt64ToFloat32(), a);
514 }
515 Node* RoundInt64ToFloat64(Node* a) {
516 return AddNode(machine()->RoundInt64ToFloat64(), a);
517 }
Ben Murdoch097c5b22016-05-18 11:27:45 +0100518 Node* RoundUint32ToFloat32(Node* a) {
519 return AddNode(machine()->RoundUint32ToFloat32(), a);
520 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000521 Node* RoundUint64ToFloat32(Node* a) {
522 return AddNode(machine()->RoundUint64ToFloat32(), a);
523 }
524 Node* RoundUint64ToFloat64(Node* a) {
525 return AddNode(machine()->RoundUint64ToFloat64(), a);
526 }
527 Node* BitcastFloat32ToInt32(Node* a) {
528 return AddNode(machine()->BitcastFloat32ToInt32(), a);
529 }
530 Node* BitcastFloat64ToInt64(Node* a) {
531 return AddNode(machine()->BitcastFloat64ToInt64(), a);
532 }
533 Node* BitcastInt32ToFloat32(Node* a) {
534 return AddNode(machine()->BitcastInt32ToFloat32(), a);
535 }
536 Node* BitcastInt64ToFloat64(Node* a) {
537 return AddNode(machine()->BitcastInt64ToFloat64(), a);
538 }
539 Node* Float32RoundDown(Node* a) {
540 return AddNode(machine()->Float32RoundDown().op(), a);
541 }
542 Node* Float64RoundDown(Node* a) {
543 return AddNode(machine()->Float64RoundDown().op(), a);
544 }
545 Node* Float32RoundUp(Node* a) {
546 return AddNode(machine()->Float32RoundUp().op(), a);
547 }
548 Node* Float64RoundUp(Node* a) {
549 return AddNode(machine()->Float64RoundUp().op(), a);
550 }
551 Node* Float32RoundTruncate(Node* a) {
552 return AddNode(machine()->Float32RoundTruncate().op(), a);
553 }
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400554 Node* Float64RoundTruncate(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000555 return AddNode(machine()->Float64RoundTruncate().op(), a);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400556 }
557 Node* Float64RoundTiesAway(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000558 return AddNode(machine()->Float64RoundTiesAway().op(), a);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400559 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000560 Node* Float32RoundTiesEven(Node* a) {
561 return AddNode(machine()->Float32RoundTiesEven().op(), a);
562 }
563 Node* Float64RoundTiesEven(Node* a) {
564 return AddNode(machine()->Float64RoundTiesEven().op(), a);
565 }
566
567 // Float64 bit operations.
568 Node* Float64ExtractLowWord32(Node* a) {
569 return AddNode(machine()->Float64ExtractLowWord32(), a);
570 }
571 Node* Float64ExtractHighWord32(Node* a) {
572 return AddNode(machine()->Float64ExtractHighWord32(), a);
573 }
574 Node* Float64InsertLowWord32(Node* a, Node* b) {
575 return AddNode(machine()->Float64InsertLowWord32(), a, b);
576 }
577 Node* Float64InsertHighWord32(Node* a, Node* b) {
578 return AddNode(machine()->Float64InsertHighWord32(), a, b);
579 }
580
581 // Stack operations.
582 Node* LoadStackPointer() { return AddNode(machine()->LoadStackPointer()); }
583 Node* LoadFramePointer() { return AddNode(machine()->LoadFramePointer()); }
Ben Murdoch097c5b22016-05-18 11:27:45 +0100584 Node* LoadParentFramePointer() {
585 return AddNode(machine()->LoadParentFramePointer());
586 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000587
588 // Parameters.
589 Node* Parameter(size_t index);
590
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000591 // Pointer utilities.
592 Node* LoadFromPointer(void* address, MachineType rep, int32_t offset = 0) {
593 return Load(rep, PointerConstant(address), Int32Constant(offset));
594 }
595 Node* StoreToPointer(void* address, MachineRepresentation rep, Node* node) {
596 return Store(rep, PointerConstant(address), node, kNoWriteBarrier);
597 }
598 Node* StringConstant(const char* string) {
599 return HeapConstant(isolate()->factory()->InternalizeUtf8String(string));
600 }
601
602 // Call a given call descriptor and the given arguments.
603 Node* CallN(CallDescriptor* desc, Node* function, Node** args);
604 // Call a given call descriptor and the given arguments and frame-state.
605 Node* CallNWithFrameState(CallDescriptor* desc, Node* function, Node** args,
606 Node* frame_state);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100607 // Call to a runtime function with zero arguments.
608 Node* CallRuntime0(Runtime::FunctionId function, Node* context);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000609 // Call to a runtime function with one arguments.
610 Node* CallRuntime1(Runtime::FunctionId function, Node* arg0, Node* context);
611 // Call to a runtime function with two arguments.
612 Node* CallRuntime2(Runtime::FunctionId function, Node* arg1, Node* arg2,
613 Node* context);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100614 // Call to a runtime function with three arguments.
615 Node* CallRuntime3(Runtime::FunctionId function, Node* arg1, Node* arg2,
616 Node* arg3, Node* context);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000617 // Call to a runtime function with four arguments.
618 Node* CallRuntime4(Runtime::FunctionId function, Node* arg1, Node* arg2,
619 Node* arg3, Node* arg4, Node* context);
620 // Call to a C function with zero arguments.
621 Node* CallCFunction0(MachineType return_type, Node* function);
622 // Call to a C function with one parameter.
623 Node* CallCFunction1(MachineType return_type, MachineType arg0_type,
624 Node* function, Node* arg0);
625 // Call to a C function with two arguments.
626 Node* CallCFunction2(MachineType return_type, MachineType arg0_type,
627 MachineType arg1_type, Node* function, Node* arg0,
628 Node* arg1);
629 // Call to a C function with eight arguments.
630 Node* CallCFunction8(MachineType return_type, MachineType arg0_type,
631 MachineType arg1_type, MachineType arg2_type,
632 MachineType arg3_type, MachineType arg4_type,
633 MachineType arg5_type, MachineType arg6_type,
634 MachineType arg7_type, Node* function, Node* arg0,
635 Node* arg1, Node* arg2, Node* arg3, Node* arg4,
636 Node* arg5, Node* arg6, Node* arg7);
637
638 // Tail call the given call descriptor and the given arguments.
639 Node* TailCallN(CallDescriptor* call_descriptor, Node* function, Node** args);
Ben Murdochda12d292016-06-02 14:46:10 +0100640 // Tail call to a runtime function with zero arguments.
641 Node* TailCallRuntime0(Runtime::FunctionId function, Node* context);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000642 // Tail call to a runtime function with one argument.
643 Node* TailCallRuntime1(Runtime::FunctionId function, Node* arg0,
644 Node* context);
645 // Tail call to a runtime function with two arguments.
646 Node* TailCallRuntime2(Runtime::FunctionId function, Node* arg1, Node* arg2,
647 Node* context);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100648 // Tail call to a runtime function with three arguments.
649 Node* TailCallRuntime3(Runtime::FunctionId function, Node* arg1, Node* arg2,
650 Node* arg3, Node* context);
651 // Tail call to a runtime function with four arguments.
652 Node* TailCallRuntime4(Runtime::FunctionId function, Node* arg1, Node* arg2,
653 Node* arg3, Node* arg4, Node* context);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000654
655 // ===========================================================================
656 // The following utility methods deal with control flow, hence might switch
657 // the current basic block or create new basic blocks for labels.
658
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000659 // Control flow.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000660 void Goto(RawMachineLabel* label);
661 void Branch(Node* condition, RawMachineLabel* true_val,
662 RawMachineLabel* false_val);
663 void Switch(Node* index, RawMachineLabel* default_label, int32_t* case_values,
664 RawMachineLabel** case_labels, size_t case_count);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000665 void Return(Node* value);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000666 void Return(Node* v1, Node* v2);
667 void Return(Node* v1, Node* v2, Node* v3);
668 void Bind(RawMachineLabel* label);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000669 void Deoptimize(Node* state);
670
671 // Variables.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000672 Node* Phi(MachineRepresentation rep, Node* n1, Node* n2) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100673 return AddNode(common()->Phi(rep, 2), n1, n2, graph()->start());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000674 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000675 Node* Phi(MachineRepresentation rep, Node* n1, Node* n2, Node* n3) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100676 return AddNode(common()->Phi(rep, 3), n1, n2, n3, graph()->start());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000677 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000678 Node* Phi(MachineRepresentation rep, Node* n1, Node* n2, Node* n3, Node* n4) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100679 return AddNode(common()->Phi(rep, 4), n1, n2, n3, n4, graph()->start());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000680 }
Ben Murdoch097c5b22016-05-18 11:27:45 +0100681 Node* Phi(MachineRepresentation rep, int input_count, Node* const* inputs);
682 void AppendPhiInput(Node* phi, Node* new_input);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000683
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000684 // ===========================================================================
685 // The following generic node creation methods can be used for operators that
686 // are not covered by the above utility methods. There should rarely be a need
687 // to do that outside of testing though.
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000688
Ben Murdoch097c5b22016-05-18 11:27:45 +0100689 Node* AddNode(const Operator* op, int input_count, Node* const* inputs);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000690
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000691 Node* AddNode(const Operator* op) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100692 return AddNode(op, 0, static_cast<Node* const*>(nullptr));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000693 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000694
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000695 template <class... TArgs>
696 Node* AddNode(const Operator* op, Node* n1, TArgs... args) {
697 Node* buffer[] = {n1, args...};
698 return AddNode(op, sizeof...(args) + 1, buffer);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000699 }
700
701 private:
Ben Murdoch097c5b22016-05-18 11:27:45 +0100702 Node* MakeNode(const Operator* op, int input_count, Node* const* inputs);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000703 BasicBlock* Use(RawMachineLabel* label);
704 BasicBlock* EnsureBlock(RawMachineLabel* label);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000705 BasicBlock* CurrentBlock();
706
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000707 Schedule* schedule() { return schedule_; }
708 size_t parameter_count() const { return machine_sig()->parameter_count(); }
709 const MachineSignature* machine_sig() const {
710 return call_descriptor_->GetMachineSignature();
711 }
712
713 Isolate* isolate_;
714 Graph* graph_;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000715 Schedule* schedule_;
716 MachineOperatorBuilder machine_;
717 CommonOperatorBuilder common_;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000718 CallDescriptor* call_descriptor_;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000719 NodeVector parameters_;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000720 BasicBlock* current_block_;
721
722 DISALLOW_COPY_AND_ASSIGN(RawMachineAssembler);
723};
724
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000725
726class RawMachineLabel final {
727 public:
Ben Murdochda12d292016-06-02 14:46:10 +0100728 enum Type { kDeferred, kNonDeferred };
729
730 explicit RawMachineLabel(Type type = kNonDeferred)
731 : deferred_(type == kDeferred) {}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000732 ~RawMachineLabel();
733
734 private:
Ben Murdochda12d292016-06-02 14:46:10 +0100735 BasicBlock* block_ = nullptr;
736 bool used_ = false;
737 bool bound_ = false;
738 bool deferred_;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000739 friend class RawMachineAssembler;
740 DISALLOW_COPY_AND_ASSIGN(RawMachineLabel);
741};
742
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000743} // namespace compiler
744} // namespace internal
745} // namespace v8
746
747#endif // V8_COMPILER_RAW_MACHINE_ASSEMBLER_H_