blob: 387e9619f551ccaa8379aadf16e91e50d1caaf31 [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 }
Ben Murdochc5610432016-08-08 18:44:38 +010079 Node* RelocatableIntPtrConstant(intptr_t value, RelocInfo::Mode rmode);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000080 Node* Int32Constant(int32_t value) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000081 return AddNode(common()->Int32Constant(value));
Ben Murdochb8a8cc12014-11-26 15:28:44 +000082 }
Ben Murdoch097c5b22016-05-18 11:27:45 +010083 Node* StackSlot(MachineRepresentation rep) {
84 return AddNode(machine()->StackSlot(rep));
85 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000086 Node* Int64Constant(int64_t value) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000087 return AddNode(common()->Int64Constant(value));
Ben Murdochb8a8cc12014-11-26 15:28:44 +000088 }
89 Node* NumberConstant(double value) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000090 return AddNode(common()->NumberConstant(value));
Ben Murdochb8a8cc12014-11-26 15:28:44 +000091 }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040092 Node* Float32Constant(float value) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000093 return AddNode(common()->Float32Constant(value));
Emily Bernierd0a1eb72015-03-24 16:35:39 -040094 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000095 Node* Float64Constant(double value) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000096 return AddNode(common()->Float64Constant(value));
Ben Murdochb8a8cc12014-11-26 15:28:44 +000097 }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040098 Node* HeapConstant(Handle<HeapObject> object) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000099 return AddNode(common()->HeapConstant(object));
100 }
101 Node* BooleanConstant(bool value) {
102 Handle<Object> object = isolate()->factory()->ToBoolean(value);
103 return HeapConstant(Handle<HeapObject>::cast(object));
104 }
105 Node* ExternalConstant(ExternalReference address) {
106 return AddNode(common()->ExternalConstant(address));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000107 }
Ben Murdochc5610432016-08-08 18:44:38 +0100108 Node* RelocatableInt32Constant(int32_t value, RelocInfo::Mode rmode) {
109 return AddNode(common()->RelocatableInt32Constant(value, rmode));
110 }
111 Node* RelocatableInt64Constant(int64_t value, RelocInfo::Mode rmode) {
112 return AddNode(common()->RelocatableInt64Constant(value, rmode));
113 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000114
115 Node* Projection(int index, Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000116 return AddNode(common()->Projection(index), a);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000117 }
118
119 // Memory Operations.
120 Node* Load(MachineType rep, Node* base) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000121 return Load(rep, base, IntPtrConstant(0));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000122 }
123 Node* Load(MachineType rep, Node* base, Node* index) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000124 return AddNode(machine()->Load(rep), base, index);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000125 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000126 Node* Store(MachineRepresentation rep, Node* base, Node* value,
127 WriteBarrierKind write_barrier) {
128 return Store(rep, base, IntPtrConstant(0), value, write_barrier);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000129 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000130 Node* Store(MachineRepresentation rep, Node* base, Node* index, Node* value,
131 WriteBarrierKind write_barrier) {
132 return AddNode(machine()->Store(StoreRepresentation(rep, write_barrier)),
133 base, index, value);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000134 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000135
Ben Murdochc5610432016-08-08 18:44:38 +0100136 // Atomic memory operations.
137 Node* AtomicLoad(MachineType rep, Node* base, Node* index) {
138 return AddNode(machine()->AtomicLoad(rep), base, index);
139 }
140 Node* AtomicStore(MachineRepresentation rep, Node* base, Node* index,
141 Node* value) {
142 return AddNode(machine()->AtomicStore(rep), base, index, value);
143 }
144
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000145 // Arithmetic Operations.
146 Node* WordAnd(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000147 return AddNode(machine()->WordAnd(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000148 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000149 Node* WordOr(Node* a, Node* b) { return AddNode(machine()->WordOr(), a, b); }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000150 Node* WordXor(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000151 return AddNode(machine()->WordXor(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000152 }
153 Node* WordShl(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000154 return AddNode(machine()->WordShl(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000155 }
156 Node* WordShr(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000157 return AddNode(machine()->WordShr(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000158 }
159 Node* WordSar(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000160 return AddNode(machine()->WordSar(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000161 }
162 Node* WordRor(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000163 return AddNode(machine()->WordRor(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000164 }
165 Node* WordEqual(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000166 return AddNode(machine()->WordEqual(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000167 }
168 Node* WordNotEqual(Node* a, Node* b) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100169 return Word32BinaryNot(WordEqual(a, b));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000170 }
171 Node* WordNot(Node* a) {
172 if (machine()->Is32()) {
173 return Word32Not(a);
174 } else {
175 return Word64Not(a);
176 }
177 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000178
179 Node* Word32And(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000180 return AddNode(machine()->Word32And(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000181 }
182 Node* Word32Or(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000183 return AddNode(machine()->Word32Or(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000184 }
185 Node* Word32Xor(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000186 return AddNode(machine()->Word32Xor(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000187 }
188 Node* Word32Shl(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000189 return AddNode(machine()->Word32Shl(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000190 }
191 Node* Word32Shr(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000192 return AddNode(machine()->Word32Shr(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000193 }
194 Node* Word32Sar(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000195 return AddNode(machine()->Word32Sar(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000196 }
197 Node* Word32Ror(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000198 return AddNode(machine()->Word32Ror(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000199 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000200 Node* Word32Clz(Node* a) { return AddNode(machine()->Word32Clz(), a); }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000201 Node* Word32Equal(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000202 return AddNode(machine()->Word32Equal(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000203 }
204 Node* Word32NotEqual(Node* a, Node* b) {
205 return Word32BinaryNot(Word32Equal(a, b));
206 }
207 Node* Word32Not(Node* a) { return Word32Xor(a, Int32Constant(-1)); }
208 Node* Word32BinaryNot(Node* a) { return Word32Equal(a, Int32Constant(0)); }
209
210 Node* Word64And(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000211 return AddNode(machine()->Word64And(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000212 }
213 Node* Word64Or(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000214 return AddNode(machine()->Word64Or(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000215 }
216 Node* Word64Xor(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000217 return AddNode(machine()->Word64Xor(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000218 }
219 Node* Word64Shl(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000220 return AddNode(machine()->Word64Shl(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000221 }
222 Node* Word64Shr(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000223 return AddNode(machine()->Word64Shr(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000224 }
225 Node* Word64Sar(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000226 return AddNode(machine()->Word64Sar(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000227 }
228 Node* Word64Ror(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000229 return AddNode(machine()->Word64Ror(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000230 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000231 Node* Word64Clz(Node* a) { return AddNode(machine()->Word64Clz(), a); }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000232 Node* Word64Equal(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000233 return AddNode(machine()->Word64Equal(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000234 }
235 Node* Word64NotEqual(Node* a, Node* b) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100236 return Word32BinaryNot(Word64Equal(a, b));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000237 }
238 Node* Word64Not(Node* a) { return Word64Xor(a, Int64Constant(-1)); }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000239
240 Node* Int32Add(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000241 return AddNode(machine()->Int32Add(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000242 }
243 Node* Int32AddWithOverflow(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000244 return AddNode(machine()->Int32AddWithOverflow(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000245 }
246 Node* Int32Sub(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000247 return AddNode(machine()->Int32Sub(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000248 }
249 Node* Int32SubWithOverflow(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000250 return AddNode(machine()->Int32SubWithOverflow(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000251 }
252 Node* Int32Mul(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000253 return AddNode(machine()->Int32Mul(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000254 }
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400255 Node* Int32MulHigh(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000256 return AddNode(machine()->Int32MulHigh(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000257 }
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400258 Node* Int32Div(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000259 return AddNode(machine()->Int32Div(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000260 }
261 Node* Int32Mod(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000262 return AddNode(machine()->Int32Mod(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000263 }
264 Node* Int32LessThan(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000265 return AddNode(machine()->Int32LessThan(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000266 }
267 Node* Int32LessThanOrEqual(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000268 return AddNode(machine()->Int32LessThanOrEqual(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000269 }
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400270 Node* Uint32Div(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000271 return AddNode(machine()->Uint32Div(), a, b);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400272 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000273 Node* Uint32LessThan(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000274 return AddNode(machine()->Uint32LessThan(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000275 }
276 Node* Uint32LessThanOrEqual(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000277 return AddNode(machine()->Uint32LessThanOrEqual(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000278 }
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400279 Node* Uint32Mod(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000280 return AddNode(machine()->Uint32Mod(), a, b);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400281 }
282 Node* Uint32MulHigh(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000283 return AddNode(machine()->Uint32MulHigh(), a, b);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400284 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000285 Node* Int32GreaterThan(Node* a, Node* b) { return Int32LessThan(b, a); }
286 Node* Int32GreaterThanOrEqual(Node* a, Node* b) {
287 return Int32LessThanOrEqual(b, a);
288 }
Ben Murdoch097c5b22016-05-18 11:27:45 +0100289 Node* Uint32GreaterThan(Node* a, Node* b) { return Uint32LessThan(b, a); }
290 Node* Uint32GreaterThanOrEqual(Node* a, Node* b) {
291 return Uint32LessThanOrEqual(b, a);
292 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000293 Node* Int32Neg(Node* a) { return Int32Sub(Int32Constant(0), a); }
294
295 Node* Int64Add(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000296 return AddNode(machine()->Int64Add(), a, b);
297 }
298 Node* Int64AddWithOverflow(Node* a, Node* b) {
299 return AddNode(machine()->Int64AddWithOverflow(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000300 }
301 Node* Int64Sub(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000302 return AddNode(machine()->Int64Sub(), a, b);
303 }
304 Node* Int64SubWithOverflow(Node* a, Node* b) {
305 return AddNode(machine()->Int64SubWithOverflow(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000306 }
307 Node* Int64Mul(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000308 return AddNode(machine()->Int64Mul(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000309 }
310 Node* Int64Div(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000311 return AddNode(machine()->Int64Div(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000312 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000313 Node* Int64Mod(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000314 return AddNode(machine()->Int64Mod(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000315 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000316 Node* Int64Neg(Node* a) { return Int64Sub(Int64Constant(0), a); }
317 Node* Int64LessThan(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000318 return AddNode(machine()->Int64LessThan(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000319 }
320 Node* Int64LessThanOrEqual(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000321 return AddNode(machine()->Int64LessThanOrEqual(), a, b);
322 }
323 Node* Uint64LessThan(Node* a, Node* b) {
324 return AddNode(machine()->Uint64LessThan(), a, b);
325 }
326 Node* Uint64LessThanOrEqual(Node* a, Node* b) {
327 return AddNode(machine()->Uint64LessThanOrEqual(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000328 }
329 Node* Int64GreaterThan(Node* a, Node* b) { return Int64LessThan(b, a); }
330 Node* Int64GreaterThanOrEqual(Node* a, Node* b) {
331 return Int64LessThanOrEqual(b, a);
332 }
Ben Murdoch097c5b22016-05-18 11:27:45 +0100333 Node* Uint64GreaterThan(Node* a, Node* b) { return Uint64LessThan(b, a); }
334 Node* Uint64GreaterThanOrEqual(Node* a, Node* b) {
335 return Uint64LessThanOrEqual(b, a);
336 }
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400337 Node* Uint64Div(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000338 return AddNode(machine()->Uint64Div(), a, b);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400339 }
340 Node* Uint64Mod(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000341 return AddNode(machine()->Uint64Mod(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000342 }
Ben Murdochda12d292016-06-02 14:46:10 +0100343 Node* Int32PairAdd(Node* a_low, Node* a_high, Node* b_low, Node* b_high) {
344 return AddNode(machine()->Int32PairAdd(), a_low, a_high, b_low, b_high);
345 }
346 Node* Int32PairSub(Node* a_low, Node* a_high, Node* b_low, Node* b_high) {
347 return AddNode(machine()->Int32PairSub(), a_low, a_high, b_low, b_high);
348 }
349 Node* Int32PairMul(Node* a_low, Node* a_high, Node* b_low, Node* b_high) {
350 return AddNode(machine()->Int32PairMul(), a_low, a_high, b_low, b_high);
351 }
352 Node* Word32PairShl(Node* low_word, Node* high_word, Node* shift) {
353 return AddNode(machine()->Word32PairShl(), low_word, high_word, shift);
354 }
355 Node* Word32PairShr(Node* low_word, Node* high_word, Node* shift) {
356 return AddNode(machine()->Word32PairShr(), low_word, high_word, shift);
357 }
358 Node* Word32PairSar(Node* low_word, Node* high_word, Node* shift) {
359 return AddNode(machine()->Word32PairSar(), low_word, high_word, shift);
360 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000361
362#define INTPTR_BINOP(prefix, name) \
363 Node* IntPtr##name(Node* a, Node* b) { \
364 return kPointerSize == 8 ? prefix##64##name(a, b) \
365 : prefix##32##name(a, b); \
366 }
367
368 INTPTR_BINOP(Int, Add);
Ben Murdochda12d292016-06-02 14:46:10 +0100369 INTPTR_BINOP(Int, AddWithOverflow);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000370 INTPTR_BINOP(Int, Sub);
Ben Murdochda12d292016-06-02 14:46:10 +0100371 INTPTR_BINOP(Int, SubWithOverflow);
Ben Murdochc5610432016-08-08 18:44:38 +0100372 INTPTR_BINOP(Int, Mul);
373 INTPTR_BINOP(Int, Div);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000374 INTPTR_BINOP(Int, LessThan);
375 INTPTR_BINOP(Int, LessThanOrEqual);
376 INTPTR_BINOP(Word, Equal);
377 INTPTR_BINOP(Word, NotEqual);
378 INTPTR_BINOP(Int, GreaterThanOrEqual);
379 INTPTR_BINOP(Int, GreaterThan);
380
381#undef INTPTR_BINOP
382
Ben Murdoch097c5b22016-05-18 11:27:45 +0100383#define UINTPTR_BINOP(prefix, name) \
384 Node* UintPtr##name(Node* a, Node* b) { \
385 return kPointerSize == 8 ? prefix##64##name(a, b) \
386 : prefix##32##name(a, b); \
387 }
388
389 UINTPTR_BINOP(Uint, LessThan);
390 UINTPTR_BINOP(Uint, LessThanOrEqual);
391 UINTPTR_BINOP(Uint, GreaterThanOrEqual);
392 UINTPTR_BINOP(Uint, GreaterThan);
393
394#undef UINTPTR_BINOP
395
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000396 Node* Float32Add(Node* a, Node* b) {
397 return AddNode(machine()->Float32Add(), a, b);
398 }
399 Node* Float32Sub(Node* a, Node* b) {
400 return AddNode(machine()->Float32Sub(), a, b);
401 }
Ben Murdochc5610432016-08-08 18:44:38 +0100402 Node* Float32SubPreserveNan(Node* a, Node* b) {
403 return AddNode(machine()->Float32SubPreserveNan(), a, b);
404 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000405 Node* Float32Mul(Node* a, Node* b) {
406 return AddNode(machine()->Float32Mul(), a, b);
407 }
408 Node* Float32Div(Node* a, Node* b) {
409 return AddNode(machine()->Float32Div(), a, b);
410 }
411 Node* Float32Max(Node* a, Node* b) {
412 return AddNode(machine()->Float32Max().op(), a, b);
413 }
414 Node* Float32Min(Node* a, Node* b) {
415 return AddNode(machine()->Float32Min().op(), a, b);
416 }
417 Node* Float32Abs(Node* a) { return AddNode(machine()->Float32Abs(), a); }
Ben Murdochda12d292016-06-02 14:46:10 +0100418 Node* Float32Neg(Node* a) { return Float32Sub(Float32Constant(-0.0f), a); }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000419 Node* Float32Sqrt(Node* a) { return AddNode(machine()->Float32Sqrt(), a); }
420 Node* Float32Equal(Node* a, Node* b) {
421 return AddNode(machine()->Float32Equal(), a, b);
422 }
423 Node* Float32NotEqual(Node* a, Node* b) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100424 return Word32BinaryNot(Float32Equal(a, b));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000425 }
426 Node* Float32LessThan(Node* a, Node* b) {
427 return AddNode(machine()->Float32LessThan(), a, b);
428 }
429 Node* Float32LessThanOrEqual(Node* a, Node* b) {
430 return AddNode(machine()->Float32LessThanOrEqual(), a, b);
431 }
432 Node* Float32GreaterThan(Node* a, Node* b) { return Float32LessThan(b, a); }
433 Node* Float32GreaterThanOrEqual(Node* a, Node* b) {
434 return Float32LessThanOrEqual(b, a);
435 }
436
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000437 Node* Float64Add(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000438 return AddNode(machine()->Float64Add(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000439 }
440 Node* Float64Sub(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000441 return AddNode(machine()->Float64Sub(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000442 }
Ben Murdochc5610432016-08-08 18:44:38 +0100443 Node* Float64SubPreserveNan(Node* a, Node* b) {
444 return AddNode(machine()->Float64SubPreserveNan(), a, b);
445 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000446 Node* Float64Mul(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000447 return AddNode(machine()->Float64Mul(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000448 }
449 Node* Float64Div(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000450 return AddNode(machine()->Float64Div(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000451 }
452 Node* Float64Mod(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000453 return AddNode(machine()->Float64Mod(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000454 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000455 Node* Float64Max(Node* a, Node* b) {
456 return AddNode(machine()->Float64Max().op(), a, b);
457 }
458 Node* Float64Min(Node* a, Node* b) {
459 return AddNode(machine()->Float64Min().op(), a, b);
460 }
461 Node* Float64Abs(Node* a) { return AddNode(machine()->Float64Abs(), a); }
Ben Murdochda12d292016-06-02 14:46:10 +0100462 Node* Float64Neg(Node* a) { return Float64Sub(Float64Constant(-0.0), a); }
Ben Murdoch61f157c2016-09-16 13:49:30 +0100463 Node* Float64Atan(Node* a) { return AddNode(machine()->Float64Atan(), a); }
464 Node* Float64Atan2(Node* a, Node* b) {
465 return AddNode(machine()->Float64Atan2(), a, b);
466 }
467 Node* Float64Atanh(Node* a) { return AddNode(machine()->Float64Atanh(), a); }
468 Node* Float64Cbrt(Node* a) { return AddNode(machine()->Float64Cbrt(), a); }
469 Node* Float64Cos(Node* a) { return AddNode(machine()->Float64Cos(), a); }
470 Node* Float64Exp(Node* a) { return AddNode(machine()->Float64Exp(), a); }
471 Node* Float64Expm1(Node* a) { return AddNode(machine()->Float64Expm1(), a); }
472 Node* Float64Log(Node* a) { return AddNode(machine()->Float64Log(), a); }
473 Node* Float64Log1p(Node* a) { return AddNode(machine()->Float64Log1p(), a); }
474 Node* Float64Log10(Node* a) { return AddNode(machine()->Float64Log10(), a); }
475 Node* Float64Log2(Node* a) { return AddNode(machine()->Float64Log2(), a); }
476 Node* Float64Sin(Node* a) { return AddNode(machine()->Float64Sin(), a); }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000477 Node* Float64Sqrt(Node* a) { return AddNode(machine()->Float64Sqrt(), a); }
Ben Murdoch61f157c2016-09-16 13:49:30 +0100478 Node* Float64Tan(Node* a) { return AddNode(machine()->Float64Tan(), a); }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000479 Node* Float64Equal(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000480 return AddNode(machine()->Float64Equal(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000481 }
482 Node* Float64NotEqual(Node* a, Node* b) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100483 return Word32BinaryNot(Float64Equal(a, b));
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000484 }
485 Node* Float64LessThan(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000486 return AddNode(machine()->Float64LessThan(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000487 }
488 Node* Float64LessThanOrEqual(Node* a, Node* b) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000489 return AddNode(machine()->Float64LessThanOrEqual(), a, b);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000490 }
491 Node* Float64GreaterThan(Node* a, Node* b) { return Float64LessThan(b, a); }
492 Node* Float64GreaterThanOrEqual(Node* a, Node* b) {
493 return Float64LessThanOrEqual(b, a);
494 }
495
496 // Conversions.
Ben Murdochc5610432016-08-08 18:44:38 +0100497 Node* BitcastWordToTagged(Node* a) {
498 return AddNode(machine()->BitcastWordToTagged(), a);
499 }
500 Node* TruncateFloat64ToWord32(Node* a) {
501 return AddNode(machine()->TruncateFloat64ToWord32(), a);
502 }
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400503 Node* ChangeFloat32ToFloat64(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000504 return AddNode(machine()->ChangeFloat32ToFloat64(), a);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400505 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000506 Node* ChangeInt32ToFloat64(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000507 return AddNode(machine()->ChangeInt32ToFloat64(), a);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000508 }
509 Node* ChangeUint32ToFloat64(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000510 return AddNode(machine()->ChangeUint32ToFloat64(), a);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000511 }
512 Node* ChangeFloat64ToInt32(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000513 return AddNode(machine()->ChangeFloat64ToInt32(), a);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000514 }
515 Node* ChangeFloat64ToUint32(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000516 return AddNode(machine()->ChangeFloat64ToUint32(), a);
517 }
Ben Murdochda12d292016-06-02 14:46:10 +0100518 Node* TruncateFloat64ToUint32(Node* a) {
519 return AddNode(machine()->TruncateFloat64ToUint32(), a);
520 }
Ben Murdoch097c5b22016-05-18 11:27:45 +0100521 Node* TruncateFloat32ToInt32(Node* a) {
522 return AddNode(machine()->TruncateFloat32ToInt32(), a);
523 }
524 Node* TruncateFloat32ToUint32(Node* a) {
525 return AddNode(machine()->TruncateFloat32ToUint32(), a);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000526 }
527 Node* TryTruncateFloat32ToInt64(Node* a) {
528 return AddNode(machine()->TryTruncateFloat32ToInt64(), a);
529 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000530 Node* TryTruncateFloat64ToInt64(Node* a) {
531 return AddNode(machine()->TryTruncateFloat64ToInt64(), a);
532 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000533 Node* TryTruncateFloat32ToUint64(Node* a) {
534 return AddNode(machine()->TryTruncateFloat32ToUint64(), a);
535 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000536 Node* TryTruncateFloat64ToUint64(Node* a) {
537 return AddNode(machine()->TryTruncateFloat64ToUint64(), a);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000538 }
539 Node* ChangeInt32ToInt64(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000540 return AddNode(machine()->ChangeInt32ToInt64(), a);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000541 }
542 Node* ChangeUint32ToUint64(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000543 return AddNode(machine()->ChangeUint32ToUint64(), a);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000544 }
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400545 Node* TruncateFloat64ToFloat32(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000546 return AddNode(machine()->TruncateFloat64ToFloat32(), a);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400547 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000548 Node* TruncateInt64ToInt32(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000549 return AddNode(machine()->TruncateInt64ToInt32(), a);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000550 }
Ben Murdochc5610432016-08-08 18:44:38 +0100551 Node* RoundFloat64ToInt32(Node* a) {
552 return AddNode(machine()->RoundFloat64ToInt32(), a);
553 }
Ben Murdoch097c5b22016-05-18 11:27:45 +0100554 Node* RoundInt32ToFloat32(Node* a) {
555 return AddNode(machine()->RoundInt32ToFloat32(), a);
556 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000557 Node* RoundInt64ToFloat32(Node* a) {
558 return AddNode(machine()->RoundInt64ToFloat32(), a);
559 }
560 Node* RoundInt64ToFloat64(Node* a) {
561 return AddNode(machine()->RoundInt64ToFloat64(), a);
562 }
Ben Murdoch097c5b22016-05-18 11:27:45 +0100563 Node* RoundUint32ToFloat32(Node* a) {
564 return AddNode(machine()->RoundUint32ToFloat32(), a);
565 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000566 Node* RoundUint64ToFloat32(Node* a) {
567 return AddNode(machine()->RoundUint64ToFloat32(), a);
568 }
569 Node* RoundUint64ToFloat64(Node* a) {
570 return AddNode(machine()->RoundUint64ToFloat64(), a);
571 }
572 Node* BitcastFloat32ToInt32(Node* a) {
573 return AddNode(machine()->BitcastFloat32ToInt32(), a);
574 }
575 Node* BitcastFloat64ToInt64(Node* a) {
576 return AddNode(machine()->BitcastFloat64ToInt64(), a);
577 }
578 Node* BitcastInt32ToFloat32(Node* a) {
579 return AddNode(machine()->BitcastInt32ToFloat32(), a);
580 }
581 Node* BitcastInt64ToFloat64(Node* a) {
582 return AddNode(machine()->BitcastInt64ToFloat64(), a);
583 }
584 Node* Float32RoundDown(Node* a) {
585 return AddNode(machine()->Float32RoundDown().op(), a);
586 }
587 Node* Float64RoundDown(Node* a) {
588 return AddNode(machine()->Float64RoundDown().op(), a);
589 }
590 Node* Float32RoundUp(Node* a) {
591 return AddNode(machine()->Float32RoundUp().op(), a);
592 }
593 Node* Float64RoundUp(Node* a) {
594 return AddNode(machine()->Float64RoundUp().op(), a);
595 }
596 Node* Float32RoundTruncate(Node* a) {
597 return AddNode(machine()->Float32RoundTruncate().op(), a);
598 }
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400599 Node* Float64RoundTruncate(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000600 return AddNode(machine()->Float64RoundTruncate().op(), a);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400601 }
602 Node* Float64RoundTiesAway(Node* a) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000603 return AddNode(machine()->Float64RoundTiesAway().op(), a);
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400604 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000605 Node* Float32RoundTiesEven(Node* a) {
606 return AddNode(machine()->Float32RoundTiesEven().op(), a);
607 }
608 Node* Float64RoundTiesEven(Node* a) {
609 return AddNode(machine()->Float64RoundTiesEven().op(), a);
610 }
611
612 // Float64 bit operations.
613 Node* Float64ExtractLowWord32(Node* a) {
614 return AddNode(machine()->Float64ExtractLowWord32(), a);
615 }
616 Node* Float64ExtractHighWord32(Node* a) {
617 return AddNode(machine()->Float64ExtractHighWord32(), a);
618 }
619 Node* Float64InsertLowWord32(Node* a, Node* b) {
620 return AddNode(machine()->Float64InsertLowWord32(), a, b);
621 }
622 Node* Float64InsertHighWord32(Node* a, Node* b) {
623 return AddNode(machine()->Float64InsertHighWord32(), a, b);
624 }
625
626 // Stack operations.
627 Node* LoadStackPointer() { return AddNode(machine()->LoadStackPointer()); }
628 Node* LoadFramePointer() { return AddNode(machine()->LoadFramePointer()); }
Ben Murdoch097c5b22016-05-18 11:27:45 +0100629 Node* LoadParentFramePointer() {
630 return AddNode(machine()->LoadParentFramePointer());
631 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000632
633 // Parameters.
634 Node* Parameter(size_t index);
635
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000636 // Pointer utilities.
637 Node* LoadFromPointer(void* address, MachineType rep, int32_t offset = 0) {
638 return Load(rep, PointerConstant(address), Int32Constant(offset));
639 }
640 Node* StoreToPointer(void* address, MachineRepresentation rep, Node* node) {
641 return Store(rep, PointerConstant(address), node, kNoWriteBarrier);
642 }
643 Node* StringConstant(const char* string) {
644 return HeapConstant(isolate()->factory()->InternalizeUtf8String(string));
645 }
646
647 // Call a given call descriptor and the given arguments.
648 Node* CallN(CallDescriptor* desc, Node* function, Node** args);
649 // Call a given call descriptor and the given arguments and frame-state.
650 Node* CallNWithFrameState(CallDescriptor* desc, Node* function, Node** args,
651 Node* frame_state);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100652 // Call to a runtime function with zero arguments.
653 Node* CallRuntime0(Runtime::FunctionId function, Node* context);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000654 // Call to a runtime function with one arguments.
655 Node* CallRuntime1(Runtime::FunctionId function, Node* arg0, Node* context);
656 // Call to a runtime function with two arguments.
657 Node* CallRuntime2(Runtime::FunctionId function, Node* arg1, Node* arg2,
658 Node* context);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100659 // Call to a runtime function with three arguments.
660 Node* CallRuntime3(Runtime::FunctionId function, Node* arg1, Node* arg2,
661 Node* arg3, Node* context);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000662 // Call to a runtime function with four arguments.
663 Node* CallRuntime4(Runtime::FunctionId function, Node* arg1, Node* arg2,
664 Node* arg3, Node* arg4, Node* context);
665 // Call to a C function with zero arguments.
666 Node* CallCFunction0(MachineType return_type, Node* function);
667 // Call to a C function with one parameter.
668 Node* CallCFunction1(MachineType return_type, MachineType arg0_type,
669 Node* function, Node* arg0);
670 // Call to a C function with two arguments.
671 Node* CallCFunction2(MachineType return_type, MachineType arg0_type,
672 MachineType arg1_type, Node* function, Node* arg0,
673 Node* arg1);
674 // Call to a C function with eight arguments.
675 Node* CallCFunction8(MachineType return_type, MachineType arg0_type,
676 MachineType arg1_type, MachineType arg2_type,
677 MachineType arg3_type, MachineType arg4_type,
678 MachineType arg5_type, MachineType arg6_type,
679 MachineType arg7_type, Node* function, Node* arg0,
680 Node* arg1, Node* arg2, Node* arg3, Node* arg4,
681 Node* arg5, Node* arg6, Node* arg7);
682
683 // Tail call the given call descriptor and the given arguments.
684 Node* TailCallN(CallDescriptor* call_descriptor, Node* function, Node** args);
Ben Murdochda12d292016-06-02 14:46:10 +0100685 // Tail call to a runtime function with zero arguments.
686 Node* TailCallRuntime0(Runtime::FunctionId function, Node* context);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000687 // Tail call to a runtime function with one argument.
688 Node* TailCallRuntime1(Runtime::FunctionId function, Node* arg0,
689 Node* context);
690 // Tail call to a runtime function with two arguments.
691 Node* TailCallRuntime2(Runtime::FunctionId function, Node* arg1, Node* arg2,
692 Node* context);
Ben Murdoch097c5b22016-05-18 11:27:45 +0100693 // Tail call to a runtime function with three arguments.
694 Node* TailCallRuntime3(Runtime::FunctionId function, Node* arg1, Node* arg2,
695 Node* arg3, Node* context);
696 // Tail call to a runtime function with four arguments.
697 Node* TailCallRuntime4(Runtime::FunctionId function, Node* arg1, Node* arg2,
698 Node* arg3, Node* arg4, Node* context);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000699
700 // ===========================================================================
701 // The following utility methods deal with control flow, hence might switch
702 // the current basic block or create new basic blocks for labels.
703
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000704 // Control flow.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000705 void Goto(RawMachineLabel* label);
706 void Branch(Node* condition, RawMachineLabel* true_val,
707 RawMachineLabel* false_val);
708 void Switch(Node* index, RawMachineLabel* default_label, int32_t* case_values,
709 RawMachineLabel** case_labels, size_t case_count);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000710 void Return(Node* value);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000711 void Return(Node* v1, Node* v2);
712 void Return(Node* v1, Node* v2, Node* v3);
713 void Bind(RawMachineLabel* label);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000714 void Deoptimize(Node* state);
Ben Murdoch61f157c2016-09-16 13:49:30 +0100715 void DebugBreak();
716 void Comment(const char* msg);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000717
718 // Variables.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000719 Node* Phi(MachineRepresentation rep, Node* n1, Node* n2) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100720 return AddNode(common()->Phi(rep, 2), n1, n2, graph()->start());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000721 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000722 Node* Phi(MachineRepresentation rep, Node* n1, Node* n2, Node* n3) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100723 return AddNode(common()->Phi(rep, 3), n1, n2, n3, graph()->start());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000724 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000725 Node* Phi(MachineRepresentation rep, Node* n1, Node* n2, Node* n3, Node* n4) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100726 return AddNode(common()->Phi(rep, 4), n1, n2, n3, n4, graph()->start());
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000727 }
Ben Murdoch097c5b22016-05-18 11:27:45 +0100728 Node* Phi(MachineRepresentation rep, int input_count, Node* const* inputs);
729 void AppendPhiInput(Node* phi, Node* new_input);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000730
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000731 // ===========================================================================
732 // The following generic node creation methods can be used for operators that
733 // are not covered by the above utility methods. There should rarely be a need
734 // to do that outside of testing though.
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000735
Ben Murdoch097c5b22016-05-18 11:27:45 +0100736 Node* AddNode(const Operator* op, int input_count, Node* const* inputs);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000737
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000738 Node* AddNode(const Operator* op) {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100739 return AddNode(op, 0, static_cast<Node* const*>(nullptr));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000740 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000741
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000742 template <class... TArgs>
743 Node* AddNode(const Operator* op, Node* n1, TArgs... args) {
744 Node* buffer[] = {n1, args...};
745 return AddNode(op, sizeof...(args) + 1, buffer);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000746 }
747
748 private:
Ben Murdoch097c5b22016-05-18 11:27:45 +0100749 Node* MakeNode(const Operator* op, int input_count, Node* const* inputs);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000750 BasicBlock* Use(RawMachineLabel* label);
751 BasicBlock* EnsureBlock(RawMachineLabel* label);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000752 BasicBlock* CurrentBlock();
753
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000754 Schedule* schedule() { return schedule_; }
755 size_t parameter_count() const { return machine_sig()->parameter_count(); }
756 const MachineSignature* machine_sig() const {
757 return call_descriptor_->GetMachineSignature();
758 }
759
760 Isolate* isolate_;
761 Graph* graph_;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000762 Schedule* schedule_;
763 MachineOperatorBuilder machine_;
764 CommonOperatorBuilder common_;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000765 CallDescriptor* call_descriptor_;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000766 NodeVector parameters_;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000767 BasicBlock* current_block_;
768
769 DISALLOW_COPY_AND_ASSIGN(RawMachineAssembler);
770};
771
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000772
773class RawMachineLabel final {
774 public:
Ben Murdochda12d292016-06-02 14:46:10 +0100775 enum Type { kDeferred, kNonDeferred };
776
777 explicit RawMachineLabel(Type type = kNonDeferred)
778 : deferred_(type == kDeferred) {}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000779 ~RawMachineLabel();
780
781 private:
Ben Murdochda12d292016-06-02 14:46:10 +0100782 BasicBlock* block_ = nullptr;
783 bool used_ = false;
784 bool bound_ = false;
785 bool deferred_;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000786 friend class RawMachineAssembler;
787 DISALLOW_COPY_AND_ASSIGN(RawMachineLabel);
788};
789
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000790} // namespace compiler
791} // namespace internal
792} // namespace v8
793
794#endif // V8_COMPILER_RAW_MACHINE_ASSEMBLER_H_