blob: a0cb7a0bfbc3a753d215e47d384100dc231027a7 [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 }
327
328#define INTPTR_BINOP(prefix, name) \
329 Node* IntPtr##name(Node* a, Node* b) { \
330 return kPointerSize == 8 ? prefix##64##name(a, b) \
331 : prefix##32##name(a, b); \
332 }
333
334 INTPTR_BINOP(Int, Add);
335 INTPTR_BINOP(Int, Sub);
336 INTPTR_BINOP(Int, LessThan);
337 INTPTR_BINOP(Int, LessThanOrEqual);
338 INTPTR_BINOP(Word, Equal);
339 INTPTR_BINOP(Word, NotEqual);
340 INTPTR_BINOP(Int, GreaterThanOrEqual);
341 INTPTR_BINOP(Int, GreaterThan);
342
343#undef INTPTR_BINOP
344
Ben Murdoch097c5b22016-05-18 11:27:45 +0100345#define UINTPTR_BINOP(prefix, name) \
346 Node* UintPtr##name(Node* a, Node* b) { \
347 return kPointerSize == 8 ? prefix##64##name(a, b) \
348 : prefix##32##name(a, b); \
349 }
350
351 UINTPTR_BINOP(Uint, LessThan);
352 UINTPTR_BINOP(Uint, LessThanOrEqual);
353 UINTPTR_BINOP(Uint, GreaterThanOrEqual);
354 UINTPTR_BINOP(Uint, GreaterThan);
355
356#undef UINTPTR_BINOP
357
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000358 Node* Float32Add(Node* a, Node* b) {
359 return AddNode(machine()->Float32Add(), a, b);
360 }
361 Node* Float32Sub(Node* a, Node* b) {
362 return AddNode(machine()->Float32Sub(), a, b);
363 }
364 Node* Float32Mul(Node* a, Node* b) {
365 return AddNode(machine()->Float32Mul(), a, b);
366 }
367 Node* Float32Div(Node* a, Node* b) {
368 return AddNode(machine()->Float32Div(), a, b);
369 }
370 Node* Float32Max(Node* a, Node* b) {
371 return AddNode(machine()->Float32Max().op(), a, b);
372 }
373 Node* Float32Min(Node* a, Node* b) {
374 return AddNode(machine()->Float32Min().op(), a, b);
375 }
376 Node* Float32Abs(Node* a) { return AddNode(machine()->Float32Abs(), a); }
377 Node* Float32Sqrt(Node* a) { return AddNode(machine()->Float32Sqrt(), a); }
378 Node* Float32Equal(Node* a, Node* b) {
379 return AddNode(machine()->Float32Equal(), a, b);
380 }
381 Node* Float32NotEqual(Node* a, Node* b) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100382 return Word32BinaryNot(Float32Equal(a, b));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000383 }
384 Node* Float32LessThan(Node* a, Node* b) {
385 return AddNode(machine()->Float32LessThan(), a, b);
386 }
387 Node* Float32LessThanOrEqual(Node* a, Node* b) {
388 return AddNode(machine()->Float32LessThanOrEqual(), a, b);
389 }
390 Node* Float32GreaterThan(Node* a, Node* b) { return Float32LessThan(b, a); }
391 Node* Float32GreaterThanOrEqual(Node* a, Node* b) {
392 return Float32LessThanOrEqual(b, a);
393 }
394
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000395 Node* Float64Add(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000396 return AddNode(machine()->Float64Add(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000397 }
398 Node* Float64Sub(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000399 return AddNode(machine()->Float64Sub(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000400 }
401 Node* Float64Mul(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000402 return AddNode(machine()->Float64Mul(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000403 }
404 Node* Float64Div(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000405 return AddNode(machine()->Float64Div(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000406 }
407 Node* Float64Mod(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000408 return AddNode(machine()->Float64Mod(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000409 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000410 Node* Float64Max(Node* a, Node* b) {
411 return AddNode(machine()->Float64Max().op(), a, b);
412 }
413 Node* Float64Min(Node* a, Node* b) {
414 return AddNode(machine()->Float64Min().op(), a, b);
415 }
416 Node* Float64Abs(Node* a) { return AddNode(machine()->Float64Abs(), a); }
417 Node* Float64Sqrt(Node* a) { return AddNode(machine()->Float64Sqrt(), a); }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000418 Node* Float64Equal(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000419 return AddNode(machine()->Float64Equal(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000420 }
421 Node* Float64NotEqual(Node* a, Node* b) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100422 return Word32BinaryNot(Float64Equal(a, b));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000423 }
424 Node* Float64LessThan(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000425 return AddNode(machine()->Float64LessThan(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000426 }
427 Node* Float64LessThanOrEqual(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000428 return AddNode(machine()->Float64LessThanOrEqual(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000429 }
430 Node* Float64GreaterThan(Node* a, Node* b) { return Float64LessThan(b, a); }
431 Node* Float64GreaterThanOrEqual(Node* a, Node* b) {
432 return Float64LessThanOrEqual(b, a);
433 }
434
435 // Conversions.
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400436 Node* ChangeFloat32ToFloat64(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000437 return AddNode(machine()->ChangeFloat32ToFloat64(), a);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400438 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000439 Node* ChangeInt32ToFloat64(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000440 return AddNode(machine()->ChangeInt32ToFloat64(), a);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000441 }
442 Node* ChangeUint32ToFloat64(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000443 return AddNode(machine()->ChangeUint32ToFloat64(), a);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000444 }
445 Node* ChangeFloat64ToInt32(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000446 return AddNode(machine()->ChangeFloat64ToInt32(), a);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000447 }
448 Node* ChangeFloat64ToUint32(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000449 return AddNode(machine()->ChangeFloat64ToUint32(), a);
450 }
Ben Murdoch097c5b22016-05-18 11:27:45 +0100451 Node* TruncateFloat32ToInt32(Node* a) {
452 return AddNode(machine()->TruncateFloat32ToInt32(), a);
453 }
454 Node* TruncateFloat32ToUint32(Node* a) {
455 return AddNode(machine()->TruncateFloat32ToUint32(), a);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000456 }
457 Node* TryTruncateFloat32ToInt64(Node* a) {
458 return AddNode(machine()->TryTruncateFloat32ToInt64(), a);
459 }
460 Node* TruncateFloat64ToInt64(Node* a) {
461 // TODO(ahaas): Remove this function as soon as it is not used anymore in
462 // WebAssembly.
463 return AddNode(machine()->TryTruncateFloat64ToInt64(), a);
464 }
465 Node* TryTruncateFloat64ToInt64(Node* a) {
466 return AddNode(machine()->TryTruncateFloat64ToInt64(), a);
467 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000468 Node* TryTruncateFloat32ToUint64(Node* a) {
469 return AddNode(machine()->TryTruncateFloat32ToUint64(), a);
470 }
471 Node* TruncateFloat64ToUint64(Node* a) {
472 // TODO(ahaas): Remove this function as soon as it is not used anymore in
473 // WebAssembly.
474 return AddNode(machine()->TryTruncateFloat64ToUint64(), a);
475 }
476 Node* TryTruncateFloat64ToUint64(Node* a) {
477 return AddNode(machine()->TryTruncateFloat64ToUint64(), a);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000478 }
479 Node* ChangeInt32ToInt64(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000480 return AddNode(machine()->ChangeInt32ToInt64(), a);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000481 }
482 Node* ChangeUint32ToUint64(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000483 return AddNode(machine()->ChangeUint32ToUint64(), a);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000484 }
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400485 Node* TruncateFloat64ToFloat32(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000486 return AddNode(machine()->TruncateFloat64ToFloat32(), a);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400487 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000488 Node* TruncateFloat64ToInt32(TruncationMode mode, Node* a) {
489 return AddNode(machine()->TruncateFloat64ToInt32(mode), a);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000490 }
491 Node* TruncateInt64ToInt32(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000492 return AddNode(machine()->TruncateInt64ToInt32(), a);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000493 }
Ben Murdoch097c5b22016-05-18 11:27:45 +0100494 Node* RoundInt32ToFloat32(Node* a) {
495 return AddNode(machine()->RoundInt32ToFloat32(), a);
496 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000497 Node* RoundInt64ToFloat32(Node* a) {
498 return AddNode(machine()->RoundInt64ToFloat32(), a);
499 }
500 Node* RoundInt64ToFloat64(Node* a) {
501 return AddNode(machine()->RoundInt64ToFloat64(), a);
502 }
Ben Murdoch097c5b22016-05-18 11:27:45 +0100503 Node* RoundUint32ToFloat32(Node* a) {
504 return AddNode(machine()->RoundUint32ToFloat32(), a);
505 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000506 Node* RoundUint64ToFloat32(Node* a) {
507 return AddNode(machine()->RoundUint64ToFloat32(), a);
508 }
509 Node* RoundUint64ToFloat64(Node* a) {
510 return AddNode(machine()->RoundUint64ToFloat64(), a);
511 }
512 Node* BitcastFloat32ToInt32(Node* a) {
513 return AddNode(machine()->BitcastFloat32ToInt32(), a);
514 }
515 Node* BitcastFloat64ToInt64(Node* a) {
516 return AddNode(machine()->BitcastFloat64ToInt64(), a);
517 }
518 Node* BitcastInt32ToFloat32(Node* a) {
519 return AddNode(machine()->BitcastInt32ToFloat32(), a);
520 }
521 Node* BitcastInt64ToFloat64(Node* a) {
522 return AddNode(machine()->BitcastInt64ToFloat64(), a);
523 }
524 Node* Float32RoundDown(Node* a) {
525 return AddNode(machine()->Float32RoundDown().op(), a);
526 }
527 Node* Float64RoundDown(Node* a) {
528 return AddNode(machine()->Float64RoundDown().op(), a);
529 }
530 Node* Float32RoundUp(Node* a) {
531 return AddNode(machine()->Float32RoundUp().op(), a);
532 }
533 Node* Float64RoundUp(Node* a) {
534 return AddNode(machine()->Float64RoundUp().op(), a);
535 }
536 Node* Float32RoundTruncate(Node* a) {
537 return AddNode(machine()->Float32RoundTruncate().op(), a);
538 }
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400539 Node* Float64RoundTruncate(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000540 return AddNode(machine()->Float64RoundTruncate().op(), a);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400541 }
542 Node* Float64RoundTiesAway(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000543 return AddNode(machine()->Float64RoundTiesAway().op(), a);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400544 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000545 Node* Float32RoundTiesEven(Node* a) {
546 return AddNode(machine()->Float32RoundTiesEven().op(), a);
547 }
548 Node* Float64RoundTiesEven(Node* a) {
549 return AddNode(machine()->Float64RoundTiesEven().op(), a);
550 }
551
552 // Float64 bit operations.
553 Node* Float64ExtractLowWord32(Node* a) {
554 return AddNode(machine()->Float64ExtractLowWord32(), a);
555 }
556 Node* Float64ExtractHighWord32(Node* a) {
557 return AddNode(machine()->Float64ExtractHighWord32(), a);
558 }
559 Node* Float64InsertLowWord32(Node* a, Node* b) {
560 return AddNode(machine()->Float64InsertLowWord32(), a, b);
561 }
562 Node* Float64InsertHighWord32(Node* a, Node* b) {
563 return AddNode(machine()->Float64InsertHighWord32(), a, b);
564 }
565
566 // Stack operations.
567 Node* LoadStackPointer() { return AddNode(machine()->LoadStackPointer()); }
568 Node* LoadFramePointer() { return AddNode(machine()->LoadFramePointer()); }
Ben Murdoch097c5b22016-05-18 11:27:45 +0100569 Node* LoadParentFramePointer() {
570 return AddNode(machine()->LoadParentFramePointer());
571 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000572
573 // Parameters.
574 Node* Parameter(size_t index);
575
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000576 // Pointer utilities.
577 Node* LoadFromPointer(void* address, MachineType rep, int32_t offset = 0) {
578 return Load(rep, PointerConstant(address), Int32Constant(offset));
579 }
580 Node* StoreToPointer(void* address, MachineRepresentation rep, Node* node) {
581 return Store(rep, PointerConstant(address), node, kNoWriteBarrier);
582 }
583 Node* StringConstant(const char* string) {
584 return HeapConstant(isolate()->factory()->InternalizeUtf8String(string));
585 }
586
587 // Call a given call descriptor and the given arguments.
588 Node* CallN(CallDescriptor* desc, Node* function, Node** args);
589 // Call a given call descriptor and the given arguments and frame-state.
590 Node* CallNWithFrameState(CallDescriptor* desc, Node* function, Node** args,
591 Node* frame_state);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100592 // Call to a runtime function with zero arguments.
593 Node* CallRuntime0(Runtime::FunctionId function, Node* context);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000594 // Call to a runtime function with one arguments.
595 Node* CallRuntime1(Runtime::FunctionId function, Node* arg0, Node* context);
596 // Call to a runtime function with two arguments.
597 Node* CallRuntime2(Runtime::FunctionId function, Node* arg1, Node* arg2,
598 Node* context);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100599 // Call to a runtime function with three arguments.
600 Node* CallRuntime3(Runtime::FunctionId function, Node* arg1, Node* arg2,
601 Node* arg3, Node* context);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000602 // Call to a runtime function with four arguments.
603 Node* CallRuntime4(Runtime::FunctionId function, Node* arg1, Node* arg2,
604 Node* arg3, Node* arg4, Node* context);
605 // Call to a C function with zero arguments.
606 Node* CallCFunction0(MachineType return_type, Node* function);
607 // Call to a C function with one parameter.
608 Node* CallCFunction1(MachineType return_type, MachineType arg0_type,
609 Node* function, Node* arg0);
610 // Call to a C function with two arguments.
611 Node* CallCFunction2(MachineType return_type, MachineType arg0_type,
612 MachineType arg1_type, Node* function, Node* arg0,
613 Node* arg1);
614 // Call to a C function with eight arguments.
615 Node* CallCFunction8(MachineType return_type, MachineType arg0_type,
616 MachineType arg1_type, MachineType arg2_type,
617 MachineType arg3_type, MachineType arg4_type,
618 MachineType arg5_type, MachineType arg6_type,
619 MachineType arg7_type, Node* function, Node* arg0,
620 Node* arg1, Node* arg2, Node* arg3, Node* arg4,
621 Node* arg5, Node* arg6, Node* arg7);
622
623 // Tail call the given call descriptor and the given arguments.
624 Node* TailCallN(CallDescriptor* call_descriptor, Node* function, Node** args);
625 // Tail call to a runtime function with one argument.
626 Node* TailCallRuntime1(Runtime::FunctionId function, Node* arg0,
627 Node* context);
628 // Tail call to a runtime function with two arguments.
629 Node* TailCallRuntime2(Runtime::FunctionId function, Node* arg1, Node* arg2,
630 Node* context);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100631 // Tail call to a runtime function with three arguments.
632 Node* TailCallRuntime3(Runtime::FunctionId function, Node* arg1, Node* arg2,
633 Node* arg3, Node* context);
634 // Tail call to a runtime function with four arguments.
635 Node* TailCallRuntime4(Runtime::FunctionId function, Node* arg1, Node* arg2,
636 Node* arg3, Node* arg4, Node* context);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000637
638 // ===========================================================================
639 // The following utility methods deal with control flow, hence might switch
640 // the current basic block or create new basic blocks for labels.
641
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000642 // Control flow.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000643 void Goto(RawMachineLabel* label);
644 void Branch(Node* condition, RawMachineLabel* true_val,
645 RawMachineLabel* false_val);
646 void Switch(Node* index, RawMachineLabel* default_label, int32_t* case_values,
647 RawMachineLabel** case_labels, size_t case_count);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000648 void Return(Node* value);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000649 void Return(Node* v1, Node* v2);
650 void Return(Node* v1, Node* v2, Node* v3);
651 void Bind(RawMachineLabel* label);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000652 void Deoptimize(Node* state);
653
654 // Variables.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000655 Node* Phi(MachineRepresentation rep, Node* n1, Node* n2) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100656 return AddNode(common()->Phi(rep, 2), n1, n2, graph()->start());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000657 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000658 Node* Phi(MachineRepresentation rep, Node* n1, Node* n2, Node* n3) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100659 return AddNode(common()->Phi(rep, 3), n1, n2, n3, graph()->start());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000660 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000661 Node* Phi(MachineRepresentation rep, Node* n1, Node* n2, Node* n3, Node* n4) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100662 return AddNode(common()->Phi(rep, 4), n1, n2, n3, n4, graph()->start());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000663 }
Ben Murdoch097c5b22016-05-18 11:27:45 +0100664 Node* Phi(MachineRepresentation rep, int input_count, Node* const* inputs);
665 void AppendPhiInput(Node* phi, Node* new_input);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000666
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000667 // ===========================================================================
668 // The following generic node creation methods can be used for operators that
669 // are not covered by the above utility methods. There should rarely be a need
670 // to do that outside of testing though.
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000671
Ben Murdoch097c5b22016-05-18 11:27:45 +0100672 Node* AddNode(const Operator* op, int input_count, Node* const* inputs);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000673
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000674 Node* AddNode(const Operator* op) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100675 return AddNode(op, 0, static_cast<Node* const*>(nullptr));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000676 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000677
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000678 template <class... TArgs>
679 Node* AddNode(const Operator* op, Node* n1, TArgs... args) {
680 Node* buffer[] = {n1, args...};
681 return AddNode(op, sizeof...(args) + 1, buffer);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000682 }
683
684 private:
Ben Murdoch097c5b22016-05-18 11:27:45 +0100685 Node* MakeNode(const Operator* op, int input_count, Node* const* inputs);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000686 BasicBlock* Use(RawMachineLabel* label);
687 BasicBlock* EnsureBlock(RawMachineLabel* label);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000688 BasicBlock* CurrentBlock();
689
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000690 Schedule* schedule() { return schedule_; }
691 size_t parameter_count() const { return machine_sig()->parameter_count(); }
692 const MachineSignature* machine_sig() const {
693 return call_descriptor_->GetMachineSignature();
694 }
695
696 Isolate* isolate_;
697 Graph* graph_;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000698 Schedule* schedule_;
699 MachineOperatorBuilder machine_;
700 CommonOperatorBuilder common_;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000701 CallDescriptor* call_descriptor_;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000702 NodeVector parameters_;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000703 BasicBlock* current_block_;
704
705 DISALLOW_COPY_AND_ASSIGN(RawMachineAssembler);
706};
707
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000708
709class RawMachineLabel final {
710 public:
711 RawMachineLabel();
712 ~RawMachineLabel();
713
714 private:
715 BasicBlock* block_;
716 bool used_;
717 bool bound_;
718 friend class RawMachineAssembler;
719 DISALLOW_COPY_AND_ASSIGN(RawMachineLabel);
720};
721
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000722} // namespace compiler
723} // namespace internal
724} // namespace v8
725
726#endif // V8_COMPILER_RAW_MACHINE_ASSEMBLER_H_