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

Side by Side Diff: src/compiler/code-assembler.cc

Issue 2498073002: [refactoring] Split CodeAssemblerState out of CodeAssembler (Closed)
Patch Set: address comments Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/compiler/code-assembler.h ('k') | src/fast-accessor-assembler.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/compiler/code-assembler.h" 5 #include "src/compiler/code-assembler.h"
6 6
7 #include <ostream> 7 #include <ostream>
8 8
9 #include "src/code-factory.h" 9 #include "src/code-factory.h"
10 #include "src/compiler/graph.h" 10 #include "src/compiler/graph.h"
11 #include "src/compiler/instruction-selector.h" 11 #include "src/compiler/instruction-selector.h"
12 #include "src/compiler/linkage.h" 12 #include "src/compiler/linkage.h"
13 #include "src/compiler/node-matchers.h" 13 #include "src/compiler/node-matchers.h"
14 #include "src/compiler/pipeline.h" 14 #include "src/compiler/pipeline.h"
15 #include "src/compiler/raw-machine-assembler.h" 15 #include "src/compiler/raw-machine-assembler.h"
16 #include "src/compiler/schedule.h" 16 #include "src/compiler/schedule.h"
17 #include "src/frames.h" 17 #include "src/frames.h"
18 #include "src/interface-descriptors.h" 18 #include "src/interface-descriptors.h"
19 #include "src/interpreter/bytecodes.h" 19 #include "src/interpreter/bytecodes.h"
20 #include "src/machine-type.h" 20 #include "src/machine-type.h"
21 #include "src/macro-assembler.h" 21 #include "src/macro-assembler.h"
22 #include "src/utils.h" 22 #include "src/utils.h"
23 #include "src/zone/zone.h" 23 #include "src/zone/zone.h"
24 24
25 namespace v8 { 25 namespace v8 {
26 namespace internal { 26 namespace internal {
27 namespace compiler { 27 namespace compiler {
28 28
29 CodeAssembler::CodeAssembler(Isolate* isolate, Zone* zone, 29 CodeAssemblerState::CodeAssemblerState(
30 const CallInterfaceDescriptor& descriptor, 30 Isolate* isolate, Zone* zone, const CallInterfaceDescriptor& descriptor,
31 Code::Flags flags, const char* name, 31 Code::Flags flags, const char* name, size_t result_size)
32 size_t result_size) 32 : CodeAssemblerState(
33 : CodeAssembler(
34 isolate, zone, 33 isolate, zone,
35 Linkage::GetStubCallDescriptor( 34 Linkage::GetStubCallDescriptor(
36 isolate, zone, descriptor, descriptor.GetStackParameterCount(), 35 isolate, zone, descriptor, descriptor.GetStackParameterCount(),
37 CallDescriptor::kNoFlags, Operator::kNoProperties, 36 CallDescriptor::kNoFlags, Operator::kNoProperties,
38 MachineType::AnyTagged(), result_size), 37 MachineType::AnyTagged(), result_size),
39 flags, name) {} 38 flags, name) {}
40 39
41 CodeAssembler::CodeAssembler(Isolate* isolate, Zone* zone, int parameter_count, 40 CodeAssemblerState::CodeAssemblerState(Isolate* isolate, Zone* zone,
42 Code::Flags flags, const char* name) 41 int parameter_count, Code::Flags flags,
43 : CodeAssembler(isolate, zone, 42 const char* name)
44 Linkage::GetJSCallDescriptor( 43 : CodeAssemblerState(isolate, zone,
45 zone, false, parameter_count, 44 Linkage::GetJSCallDescriptor(
46 Code::ExtractKindFromFlags(flags) == Code::BUILTIN 45 zone, false, parameter_count,
47 ? CallDescriptor::kPushArgumentCount 46 Code::ExtractKindFromFlags(flags) == Code::BUILTIN
48 : CallDescriptor::kNoFlags), 47 ? CallDescriptor::kPushArgumentCount
49 flags, name) {} 48 : CallDescriptor::kNoFlags),
49 flags, name) {}
50 50
51 CodeAssembler::CodeAssembler(Isolate* isolate, Zone* zone, 51 CodeAssemblerState::CodeAssemblerState(Isolate* isolate, Zone* zone,
52 CallDescriptor* call_descriptor, Code::Flags flags, 52 CallDescriptor* call_descriptor,
53 const char* name) 53 Code::Flags flags, const char* name)
54 : raw_assembler_(new RawMachineAssembler( 54 : raw_assembler_(new RawMachineAssembler(
55 isolate, new (zone) Graph(zone), call_descriptor, 55 isolate, new (zone) Graph(zone), call_descriptor,
56 MachineType::PointerRepresentation(), 56 MachineType::PointerRepresentation(),
57 InstructionSelector::SupportedMachineOperatorFlags(), 57 InstructionSelector::SupportedMachineOperatorFlags(),
58 InstructionSelector::AlignmentRequirements())), 58 InstructionSelector::AlignmentRequirements())),
59 flags_(flags), 59 flags_(flags),
60 name_(name), 60 name_(name),
61 code_generated_(false), 61 code_generated_(false),
62 variables_(zone) {} 62 variables_(zone) {}
63 63
64 // static
65 Handle<Code> CodeAssembler::GenerateCode(CodeAssemblerState* state) {
Igor Sheludko 2016/11/15 14:02:53 This code could probably be moved down where it wa
Jakob Kummerow 2016/11/15 15:21:13 Done.
66 DCHECK(!state->code_generated_);
67
68 RawMachineAssembler* rasm = state->raw_assembler_.get();
69 Schedule* schedule = rasm->Export();
70 Handle<Code> code = Pipeline::GenerateCodeForCodeStub(
71 rasm->isolate(), rasm->call_descriptor(), rasm->graph(), schedule,
72 state->flags_, state->name_);
73
74 state->code_generated_ = true;
75 return code;
76 }
77
78 CodeAssemblerState::~CodeAssemblerState() {}
79
64 CodeAssembler::~CodeAssembler() {} 80 CodeAssembler::~CodeAssembler() {}
65 81
66 void CodeAssembler::CallPrologue() {} 82 void CodeAssembler::CallPrologue() {}
67 83
68 void CodeAssembler::CallEpilogue() {} 84 void CodeAssembler::CallEpilogue() {}
69 85
70 Handle<Code> CodeAssembler::GenerateCode() { 86 bool CodeAssembler::Is64() const { return raw_assembler()->machine()->Is64(); }
71 DCHECK(!code_generated_);
72
73 Schedule* schedule = raw_assembler_->Export();
74 Handle<Code> code = Pipeline::GenerateCodeForCodeStub(
75 isolate(), raw_assembler_->call_descriptor(), raw_assembler_->graph(),
76 schedule, flags_, name_);
77
78 code_generated_ = true;
79 return code;
80 }
81
82 bool CodeAssembler::Is64() const { return raw_assembler_->machine()->Is64(); }
83 87
84 bool CodeAssembler::IsFloat64RoundUpSupported() const { 88 bool CodeAssembler::IsFloat64RoundUpSupported() const {
85 return raw_assembler_->machine()->Float64RoundUp().IsSupported(); 89 return raw_assembler()->machine()->Float64RoundUp().IsSupported();
86 } 90 }
87 91
88 bool CodeAssembler::IsFloat64RoundDownSupported() const { 92 bool CodeAssembler::IsFloat64RoundDownSupported() const {
89 return raw_assembler_->machine()->Float64RoundDown().IsSupported(); 93 return raw_assembler()->machine()->Float64RoundDown().IsSupported();
90 } 94 }
91 95
92 bool CodeAssembler::IsFloat64RoundTruncateSupported() const { 96 bool CodeAssembler::IsFloat64RoundTruncateSupported() const {
93 return raw_assembler_->machine()->Float64RoundTruncate().IsSupported(); 97 return raw_assembler()->machine()->Float64RoundTruncate().IsSupported();
94 } 98 }
95 99
96 Node* CodeAssembler::Int32Constant(int32_t value) { 100 Node* CodeAssembler::Int32Constant(int32_t value) {
97 return raw_assembler_->Int32Constant(value); 101 return raw_assembler()->Int32Constant(value);
98 } 102 }
99 103
100 Node* CodeAssembler::Int64Constant(int64_t value) { 104 Node* CodeAssembler::Int64Constant(int64_t value) {
101 return raw_assembler_->Int64Constant(value); 105 return raw_assembler()->Int64Constant(value);
102 } 106 }
103 107
104 Node* CodeAssembler::IntPtrConstant(intptr_t value) { 108 Node* CodeAssembler::IntPtrConstant(intptr_t value) {
105 return raw_assembler_->IntPtrConstant(value); 109 return raw_assembler()->IntPtrConstant(value);
106 } 110 }
107 111
108 Node* CodeAssembler::NumberConstant(double value) { 112 Node* CodeAssembler::NumberConstant(double value) {
109 return raw_assembler_->NumberConstant(value); 113 return raw_assembler()->NumberConstant(value);
110 } 114 }
111 115
112 Node* CodeAssembler::SmiConstant(Smi* value) { 116 Node* CodeAssembler::SmiConstant(Smi* value) {
113 return BitcastWordToTaggedSigned(IntPtrConstant(bit_cast<intptr_t>(value))); 117 return BitcastWordToTaggedSigned(IntPtrConstant(bit_cast<intptr_t>(value)));
114 } 118 }
115 119
116 Node* CodeAssembler::SmiConstant(int value) { 120 Node* CodeAssembler::SmiConstant(int value) {
117 return SmiConstant(Smi::FromInt(value)); 121 return SmiConstant(Smi::FromInt(value));
118 } 122 }
119 123
120 Node* CodeAssembler::HeapConstant(Handle<HeapObject> object) { 124 Node* CodeAssembler::HeapConstant(Handle<HeapObject> object) {
121 return raw_assembler_->HeapConstant(object); 125 return raw_assembler()->HeapConstant(object);
122 } 126 }
123 127
124 Node* CodeAssembler::BooleanConstant(bool value) { 128 Node* CodeAssembler::BooleanConstant(bool value) {
125 return raw_assembler_->BooleanConstant(value); 129 return raw_assembler()->BooleanConstant(value);
126 } 130 }
127 131
128 Node* CodeAssembler::ExternalConstant(ExternalReference address) { 132 Node* CodeAssembler::ExternalConstant(ExternalReference address) {
129 return raw_assembler_->ExternalConstant(address); 133 return raw_assembler()->ExternalConstant(address);
130 } 134 }
131 135
132 Node* CodeAssembler::Float64Constant(double value) { 136 Node* CodeAssembler::Float64Constant(double value) {
133 return raw_assembler_->Float64Constant(value); 137 return raw_assembler()->Float64Constant(value);
134 } 138 }
135 139
136 Node* CodeAssembler::NaNConstant() { 140 Node* CodeAssembler::NaNConstant() {
137 return LoadRoot(Heap::kNanValueRootIndex); 141 return LoadRoot(Heap::kNanValueRootIndex);
138 } 142 }
139 143
140 bool CodeAssembler::ToInt32Constant(Node* node, int32_t& out_value) { 144 bool CodeAssembler::ToInt32Constant(Node* node, int32_t& out_value) {
141 Int64Matcher m(node); 145 Int64Matcher m(node);
142 if (m.HasValue() && 146 if (m.HasValue() &&
143 m.IsInRange(std::numeric_limits<int32_t>::min(), 147 m.IsInRange(std::numeric_limits<int32_t>::min(),
(...skipping 25 matching lines...) Expand all
169 return false; 173 return false;
170 } 174 }
171 175
172 bool CodeAssembler::ToIntPtrConstant(Node* node, intptr_t& out_value) { 176 bool CodeAssembler::ToIntPtrConstant(Node* node, intptr_t& out_value) {
173 IntPtrMatcher m(node); 177 IntPtrMatcher m(node);
174 if (m.HasValue()) out_value = m.Value(); 178 if (m.HasValue()) out_value = m.Value();
175 return m.HasValue(); 179 return m.HasValue();
176 } 180 }
177 181
178 Node* CodeAssembler::Parameter(int value) { 182 Node* CodeAssembler::Parameter(int value) {
179 return raw_assembler_->Parameter(value); 183 return raw_assembler()->Parameter(value);
180 } 184 }
181 185
182 void CodeAssembler::Return(Node* value) { 186 void CodeAssembler::Return(Node* value) {
183 return raw_assembler_->Return(value); 187 return raw_assembler()->Return(value);
184 } 188 }
185 189
186 void CodeAssembler::PopAndReturn(Node* pop, Node* value) { 190 void CodeAssembler::PopAndReturn(Node* pop, Node* value) {
187 return raw_assembler_->PopAndReturn(pop, value); 191 return raw_assembler()->PopAndReturn(pop, value);
188 } 192 }
189 193
190 void CodeAssembler::DebugBreak() { raw_assembler_->DebugBreak(); } 194 void CodeAssembler::DebugBreak() { raw_assembler()->DebugBreak(); }
191 195
192 void CodeAssembler::Comment(const char* format, ...) { 196 void CodeAssembler::Comment(const char* format, ...) {
193 if (!FLAG_code_comments) return; 197 if (!FLAG_code_comments) return;
194 char buffer[4 * KB]; 198 char buffer[4 * KB];
195 StringBuilder builder(buffer, arraysize(buffer)); 199 StringBuilder builder(buffer, arraysize(buffer));
196 va_list arguments; 200 va_list arguments;
197 va_start(arguments, format); 201 va_start(arguments, format);
198 builder.AddFormattedList(format, arguments); 202 builder.AddFormattedList(format, arguments);
199 va_end(arguments); 203 va_end(arguments);
200 204
201 // Copy the string before recording it in the assembler to avoid 205 // Copy the string before recording it in the assembler to avoid
202 // issues when the stack allocated buffer goes out of scope. 206 // issues when the stack allocated buffer goes out of scope.
203 const int prefix_len = 2; 207 const int prefix_len = 2;
204 int length = builder.position() + 1; 208 int length = builder.position() + 1;
205 char* copy = reinterpret_cast<char*>(malloc(length + prefix_len)); 209 char* copy = reinterpret_cast<char*>(malloc(length + prefix_len));
206 MemCopy(copy + prefix_len, builder.Finalize(), length); 210 MemCopy(copy + prefix_len, builder.Finalize(), length);
207 copy[0] = ';'; 211 copy[0] = ';';
208 copy[1] = ' '; 212 copy[1] = ' ';
209 raw_assembler_->Comment(copy); 213 raw_assembler()->Comment(copy);
210 } 214 }
211 215
212 void CodeAssembler::Bind(CodeAssembler::Label* label) { return label->Bind(); } 216 void CodeAssembler::Bind(CodeAssembler::Label* label) { return label->Bind(); }
213 217
214 Node* CodeAssembler::LoadFramePointer() { 218 Node* CodeAssembler::LoadFramePointer() {
215 return raw_assembler_->LoadFramePointer(); 219 return raw_assembler()->LoadFramePointer();
216 } 220 }
217 221
218 Node* CodeAssembler::LoadParentFramePointer() { 222 Node* CodeAssembler::LoadParentFramePointer() {
219 return raw_assembler_->LoadParentFramePointer(); 223 return raw_assembler()->LoadParentFramePointer();
220 } 224 }
221 225
222 Node* CodeAssembler::LoadStackPointer() { 226 Node* CodeAssembler::LoadStackPointer() {
223 return raw_assembler_->LoadStackPointer(); 227 return raw_assembler()->LoadStackPointer();
224 } 228 }
225 229
226 #define DEFINE_CODE_ASSEMBLER_BINARY_OP(name) \ 230 #define DEFINE_CODE_ASSEMBLER_BINARY_OP(name) \
227 Node* CodeAssembler::name(Node* a, Node* b) { \ 231 Node* CodeAssembler::name(Node* a, Node* b) { \
228 return raw_assembler_->name(a, b); \ 232 return raw_assembler()->name(a, b); \
229 } 233 }
230 CODE_ASSEMBLER_BINARY_OP_LIST(DEFINE_CODE_ASSEMBLER_BINARY_OP) 234 CODE_ASSEMBLER_BINARY_OP_LIST(DEFINE_CODE_ASSEMBLER_BINARY_OP)
231 #undef DEFINE_CODE_ASSEMBLER_BINARY_OP 235 #undef DEFINE_CODE_ASSEMBLER_BINARY_OP
232 236
233 Node* CodeAssembler::WordShl(Node* value, int shift) { 237 Node* CodeAssembler::WordShl(Node* value, int shift) {
234 return (shift != 0) ? raw_assembler_->WordShl(value, IntPtrConstant(shift)) 238 return (shift != 0) ? raw_assembler()->WordShl(value, IntPtrConstant(shift))
235 : value; 239 : value;
236 } 240 }
237 241
238 Node* CodeAssembler::WordShr(Node* value, int shift) { 242 Node* CodeAssembler::WordShr(Node* value, int shift) {
239 return (shift != 0) ? raw_assembler_->WordShr(value, IntPtrConstant(shift)) 243 return (shift != 0) ? raw_assembler()->WordShr(value, IntPtrConstant(shift))
240 : value; 244 : value;
241 } 245 }
242 246
243 Node* CodeAssembler::Word32Shr(Node* value, int shift) { 247 Node* CodeAssembler::Word32Shr(Node* value, int shift) {
244 return (shift != 0) ? raw_assembler_->Word32Shr(value, Int32Constant(shift)) 248 return (shift != 0) ? raw_assembler()->Word32Shr(value, Int32Constant(shift))
245 : value; 249 : value;
246 } 250 }
247 251
248 Node* CodeAssembler::ChangeUint32ToWord(Node* value) { 252 Node* CodeAssembler::ChangeUint32ToWord(Node* value) {
249 if (raw_assembler_->machine()->Is64()) { 253 if (raw_assembler()->machine()->Is64()) {
250 value = raw_assembler_->ChangeUint32ToUint64(value); 254 value = raw_assembler()->ChangeUint32ToUint64(value);
251 } 255 }
252 return value; 256 return value;
253 } 257 }
254 258
255 Node* CodeAssembler::ChangeInt32ToIntPtr(Node* value) { 259 Node* CodeAssembler::ChangeInt32ToIntPtr(Node* value) {
256 if (raw_assembler_->machine()->Is64()) { 260 if (raw_assembler()->machine()->Is64()) {
257 value = raw_assembler_->ChangeInt32ToInt64(value); 261 value = raw_assembler()->ChangeInt32ToInt64(value);
258 } 262 }
259 return value; 263 return value;
260 } 264 }
261 265
262 Node* CodeAssembler::RoundIntPtrToFloat64(Node* value) { 266 Node* CodeAssembler::RoundIntPtrToFloat64(Node* value) {
263 if (raw_assembler_->machine()->Is64()) { 267 if (raw_assembler()->machine()->Is64()) {
264 return raw_assembler_->RoundInt64ToFloat64(value); 268 return raw_assembler()->RoundInt64ToFloat64(value);
265 } 269 }
266 return raw_assembler_->ChangeInt32ToFloat64(value); 270 return raw_assembler()->ChangeInt32ToFloat64(value);
267 } 271 }
268 272
269 #define DEFINE_CODE_ASSEMBLER_UNARY_OP(name) \ 273 #define DEFINE_CODE_ASSEMBLER_UNARY_OP(name) \
270 Node* CodeAssembler::name(Node* a) { return raw_assembler_->name(a); } 274 Node* CodeAssembler::name(Node* a) { return raw_assembler()->name(a); }
271 CODE_ASSEMBLER_UNARY_OP_LIST(DEFINE_CODE_ASSEMBLER_UNARY_OP) 275 CODE_ASSEMBLER_UNARY_OP_LIST(DEFINE_CODE_ASSEMBLER_UNARY_OP)
272 #undef DEFINE_CODE_ASSEMBLER_UNARY_OP 276 #undef DEFINE_CODE_ASSEMBLER_UNARY_OP
273 277
274 Node* CodeAssembler::Load(MachineType rep, Node* base) { 278 Node* CodeAssembler::Load(MachineType rep, Node* base) {
275 return raw_assembler_->Load(rep, base); 279 return raw_assembler()->Load(rep, base);
276 } 280 }
277 281
278 Node* CodeAssembler::Load(MachineType rep, Node* base, Node* index) { 282 Node* CodeAssembler::Load(MachineType rep, Node* base, Node* index) {
279 return raw_assembler_->Load(rep, base, index); 283 return raw_assembler()->Load(rep, base, index);
280 } 284 }
281 285
282 Node* CodeAssembler::AtomicLoad(MachineType rep, Node* base, Node* index) { 286 Node* CodeAssembler::AtomicLoad(MachineType rep, Node* base, Node* index) {
283 return raw_assembler_->AtomicLoad(rep, base, index); 287 return raw_assembler()->AtomicLoad(rep, base, index);
284 } 288 }
285 289
286 Node* CodeAssembler::LoadRoot(Heap::RootListIndex root_index) { 290 Node* CodeAssembler::LoadRoot(Heap::RootListIndex root_index) {
287 if (isolate()->heap()->RootCanBeTreatedAsConstant(root_index)) { 291 if (isolate()->heap()->RootCanBeTreatedAsConstant(root_index)) {
288 Handle<Object> root = isolate()->heap()->root_handle(root_index); 292 Handle<Object> root = isolate()->heap()->root_handle(root_index);
289 if (root->IsSmi()) { 293 if (root->IsSmi()) {
290 return SmiConstant(Smi::cast(*root)); 294 return SmiConstant(Smi::cast(*root));
291 } else { 295 } else {
292 return HeapConstant(Handle<HeapObject>::cast(root)); 296 return HeapConstant(Handle<HeapObject>::cast(root));
293 } 297 }
294 } 298 }
295 299
296 Node* roots_array_start = 300 Node* roots_array_start =
297 ExternalConstant(ExternalReference::roots_array_start(isolate())); 301 ExternalConstant(ExternalReference::roots_array_start(isolate()));
298 return Load(MachineType::AnyTagged(), roots_array_start, 302 return Load(MachineType::AnyTagged(), roots_array_start,
299 IntPtrConstant(root_index * kPointerSize)); 303 IntPtrConstant(root_index * kPointerSize));
300 } 304 }
301 305
302 Node* CodeAssembler::Store(MachineRepresentation rep, Node* base, Node* value) { 306 Node* CodeAssembler::Store(MachineRepresentation rep, Node* base, Node* value) {
303 return raw_assembler_->Store(rep, base, value, kFullWriteBarrier); 307 return raw_assembler()->Store(rep, base, value, kFullWriteBarrier);
304 } 308 }
305 309
306 Node* CodeAssembler::Store(MachineRepresentation rep, Node* base, Node* index, 310 Node* CodeAssembler::Store(MachineRepresentation rep, Node* base, Node* index,
307 Node* value) { 311 Node* value) {
308 return raw_assembler_->Store(rep, base, index, value, kFullWriteBarrier); 312 return raw_assembler()->Store(rep, base, index, value, kFullWriteBarrier);
309 } 313 }
310 314
311 Node* CodeAssembler::StoreNoWriteBarrier(MachineRepresentation rep, Node* base, 315 Node* CodeAssembler::StoreNoWriteBarrier(MachineRepresentation rep, Node* base,
312 Node* value) { 316 Node* value) {
313 return raw_assembler_->Store(rep, base, value, kNoWriteBarrier); 317 return raw_assembler()->Store(rep, base, value, kNoWriteBarrier);
314 } 318 }
315 319
316 Node* CodeAssembler::StoreNoWriteBarrier(MachineRepresentation rep, Node* base, 320 Node* CodeAssembler::StoreNoWriteBarrier(MachineRepresentation rep, Node* base,
317 Node* index, Node* value) { 321 Node* index, Node* value) {
318 return raw_assembler_->Store(rep, base, index, value, kNoWriteBarrier); 322 return raw_assembler()->Store(rep, base, index, value, kNoWriteBarrier);
319 } 323 }
320 324
321 Node* CodeAssembler::AtomicStore(MachineRepresentation rep, Node* base, 325 Node* CodeAssembler::AtomicStore(MachineRepresentation rep, Node* base,
322 Node* index, Node* value) { 326 Node* index, Node* value) {
323 return raw_assembler_->AtomicStore(rep, base, index, value); 327 return raw_assembler()->AtomicStore(rep, base, index, value);
324 } 328 }
325 329
326 Node* CodeAssembler::StoreRoot(Heap::RootListIndex root_index, Node* value) { 330 Node* CodeAssembler::StoreRoot(Heap::RootListIndex root_index, Node* value) {
327 DCHECK(Heap::RootCanBeWrittenAfterInitialization(root_index)); 331 DCHECK(Heap::RootCanBeWrittenAfterInitialization(root_index));
328 Node* roots_array_start = 332 Node* roots_array_start =
329 ExternalConstant(ExternalReference::roots_array_start(isolate())); 333 ExternalConstant(ExternalReference::roots_array_start(isolate()));
330 return StoreNoWriteBarrier(MachineRepresentation::kTagged, roots_array_start, 334 return StoreNoWriteBarrier(MachineRepresentation::kTagged, roots_array_start,
331 IntPtrConstant(root_index * kPointerSize), value); 335 IntPtrConstant(root_index * kPointerSize), value);
332 } 336 }
333 337
334 Node* CodeAssembler::Retain(Node* value) { 338 Node* CodeAssembler::Retain(Node* value) {
335 return raw_assembler_->Retain(value); 339 return raw_assembler()->Retain(value);
336 } 340 }
337 341
338 Node* CodeAssembler::Projection(int index, Node* value) { 342 Node* CodeAssembler::Projection(int index, Node* value) {
339 return raw_assembler_->Projection(index, value); 343 return raw_assembler()->Projection(index, value);
340 } 344 }
341 345
342 void CodeAssembler::GotoIfException(Node* node, Label* if_exception, 346 void CodeAssembler::GotoIfException(Node* node, Label* if_exception,
343 Variable* exception_var) { 347 Variable* exception_var) {
344 Label success(this), exception(this, Label::kDeferred); 348 Label success(this), exception(this, Label::kDeferred);
345 success.MergeVariables(); 349 success.MergeVariables();
346 exception.MergeVariables(); 350 exception.MergeVariables();
347 DCHECK(!node->op()->HasProperty(Operator::kNoThrow)); 351 DCHECK(!node->op()->HasProperty(Operator::kNoThrow));
348 352
349 raw_assembler_->Continuations(node, success.label_, exception.label_); 353 raw_assembler()->Continuations(node, success.label_, exception.label_);
350 354
351 Bind(&exception); 355 Bind(&exception);
352 const Operator* op = raw_assembler_->common()->IfException(); 356 const Operator* op = raw_assembler()->common()->IfException();
353 Node* exception_value = raw_assembler_->AddNode(op, node, node); 357 Node* exception_value = raw_assembler()->AddNode(op, node, node);
354 if (exception_var != nullptr) { 358 if (exception_var != nullptr) {
355 exception_var->Bind(exception_value); 359 exception_var->Bind(exception_value);
356 } 360 }
357 Goto(if_exception); 361 Goto(if_exception);
358 362
359 Bind(&success); 363 Bind(&success);
360 } 364 }
361 365
362 Node* CodeAssembler::CallN(CallDescriptor* descriptor, Node* code_target, 366 Node* CodeAssembler::CallN(CallDescriptor* descriptor, Node* code_target,
363 Node** args) { 367 Node** args) {
364 CallPrologue(); 368 CallPrologue();
365 Node* return_value = raw_assembler_->CallN(descriptor, code_target, args); 369 Node* return_value = raw_assembler()->CallN(descriptor, code_target, args);
366 CallEpilogue(); 370 CallEpilogue();
367 return return_value; 371 return return_value;
368 } 372 }
369 373
370 Node* CodeAssembler::TailCallN(CallDescriptor* descriptor, Node* code_target, 374 Node* CodeAssembler::TailCallN(CallDescriptor* descriptor, Node* code_target,
371 Node** args) { 375 Node** args) {
372 return raw_assembler_->TailCallN(descriptor, code_target, args); 376 return raw_assembler()->TailCallN(descriptor, code_target, args);
373 } 377 }
374 378
375 Node* CodeAssembler::CallRuntime(Runtime::FunctionId function_id, 379 Node* CodeAssembler::CallRuntime(Runtime::FunctionId function_id,
376 Node* context) { 380 Node* context) {
377 CallPrologue(); 381 CallPrologue();
378 Node* return_value = raw_assembler_->CallRuntime0(function_id, context); 382 Node* return_value = raw_assembler()->CallRuntime0(function_id, context);
379 CallEpilogue(); 383 CallEpilogue();
380 return return_value; 384 return return_value;
381 } 385 }
382 386
383 Node* CodeAssembler::CallRuntime(Runtime::FunctionId function_id, Node* context, 387 Node* CodeAssembler::CallRuntime(Runtime::FunctionId function_id, Node* context,
384 Node* arg1) { 388 Node* arg1) {
385 CallPrologue(); 389 CallPrologue();
386 Node* return_value = raw_assembler_->CallRuntime1(function_id, arg1, context); 390 Node* return_value =
391 raw_assembler()->CallRuntime1(function_id, arg1, context);
387 CallEpilogue(); 392 CallEpilogue();
388 return return_value; 393 return return_value;
389 } 394 }
390 395
391 Node* CodeAssembler::CallRuntime(Runtime::FunctionId function_id, Node* context, 396 Node* CodeAssembler::CallRuntime(Runtime::FunctionId function_id, Node* context,
392 Node* arg1, Node* arg2) { 397 Node* arg1, Node* arg2) {
393 CallPrologue(); 398 CallPrologue();
394 Node* return_value = 399 Node* return_value =
395 raw_assembler_->CallRuntime2(function_id, arg1, arg2, context); 400 raw_assembler()->CallRuntime2(function_id, arg1, arg2, context);
396 CallEpilogue(); 401 CallEpilogue();
397 return return_value; 402 return return_value;
398 } 403 }
399 404
400 Node* CodeAssembler::CallRuntime(Runtime::FunctionId function_id, Node* context, 405 Node* CodeAssembler::CallRuntime(Runtime::FunctionId function_id, Node* context,
401 Node* arg1, Node* arg2, Node* arg3) { 406 Node* arg1, Node* arg2, Node* arg3) {
402 CallPrologue(); 407 CallPrologue();
403 Node* return_value = 408 Node* return_value =
404 raw_assembler_->CallRuntime3(function_id, arg1, arg2, arg3, context); 409 raw_assembler()->CallRuntime3(function_id, arg1, arg2, arg3, context);
405 CallEpilogue(); 410 CallEpilogue();
406 return return_value; 411 return return_value;
407 } 412 }
408 413
409 Node* CodeAssembler::CallRuntime(Runtime::FunctionId function_id, Node* context, 414 Node* CodeAssembler::CallRuntime(Runtime::FunctionId function_id, Node* context,
410 Node* arg1, Node* arg2, Node* arg3, 415 Node* arg1, Node* arg2, Node* arg3,
411 Node* arg4) { 416 Node* arg4) {
412 CallPrologue(); 417 CallPrologue();
413 Node* return_value = raw_assembler_->CallRuntime4(function_id, arg1, arg2, 418 Node* return_value = raw_assembler()->CallRuntime4(function_id, arg1, arg2,
414 arg3, arg4, context); 419 arg3, arg4, context);
415 CallEpilogue(); 420 CallEpilogue();
416 return return_value; 421 return return_value;
417 } 422 }
418 423
419 Node* CodeAssembler::TailCallRuntime(Runtime::FunctionId function_id, 424 Node* CodeAssembler::TailCallRuntime(Runtime::FunctionId function_id,
420 Node* context) { 425 Node* context) {
421 return raw_assembler_->TailCallRuntime0(function_id, context); 426 return raw_assembler()->TailCallRuntime0(function_id, context);
422 } 427 }
423 428
424 Node* CodeAssembler::TailCallRuntime(Runtime::FunctionId function_id, 429 Node* CodeAssembler::TailCallRuntime(Runtime::FunctionId function_id,
425 Node* context, Node* arg1) { 430 Node* context, Node* arg1) {
426 return raw_assembler_->TailCallRuntime1(function_id, arg1, context); 431 return raw_assembler()->TailCallRuntime1(function_id, arg1, context);
427 } 432 }
428 433
429 Node* CodeAssembler::TailCallRuntime(Runtime::FunctionId function_id, 434 Node* CodeAssembler::TailCallRuntime(Runtime::FunctionId function_id,
430 Node* context, Node* arg1, Node* arg2) { 435 Node* context, Node* arg1, Node* arg2) {
431 return raw_assembler_->TailCallRuntime2(function_id, arg1, arg2, context); 436 return raw_assembler()->TailCallRuntime2(function_id, arg1, arg2, context);
432 } 437 }
433 438
434 Node* CodeAssembler::TailCallRuntime(Runtime::FunctionId function_id, 439 Node* CodeAssembler::TailCallRuntime(Runtime::FunctionId function_id,
435 Node* context, Node* arg1, Node* arg2, 440 Node* context, Node* arg1, Node* arg2,
436 Node* arg3) { 441 Node* arg3) {
437 return raw_assembler_->TailCallRuntime3(function_id, arg1, arg2, arg3, 442 return raw_assembler()->TailCallRuntime3(function_id, arg1, arg2, arg3,
438 context); 443 context);
439 } 444 }
440 445
441 Node* CodeAssembler::TailCallRuntime(Runtime::FunctionId function_id, 446 Node* CodeAssembler::TailCallRuntime(Runtime::FunctionId function_id,
442 Node* context, Node* arg1, Node* arg2, 447 Node* context, Node* arg1, Node* arg2,
443 Node* arg3, Node* arg4) { 448 Node* arg3, Node* arg4) {
444 return raw_assembler_->TailCallRuntime4(function_id, arg1, arg2, arg3, arg4, 449 return raw_assembler()->TailCallRuntime4(function_id, arg1, arg2, arg3, arg4,
445 context); 450 context);
446 } 451 }
447 452
448 Node* CodeAssembler::TailCallRuntime(Runtime::FunctionId function_id, 453 Node* CodeAssembler::TailCallRuntime(Runtime::FunctionId function_id,
449 Node* context, Node* arg1, Node* arg2, 454 Node* context, Node* arg1, Node* arg2,
450 Node* arg3, Node* arg4, Node* arg5) { 455 Node* arg3, Node* arg4, Node* arg5) {
451 return raw_assembler_->TailCallRuntime5(function_id, arg1, arg2, arg3, arg4, 456 return raw_assembler()->TailCallRuntime5(function_id, arg1, arg2, arg3, arg4,
452 arg5, context); 457 arg5, context);
453 } 458 }
454 459
455 Node* CodeAssembler::TailCallRuntime(Runtime::FunctionId function_id, 460 Node* CodeAssembler::TailCallRuntime(Runtime::FunctionId function_id,
456 Node* context, Node* arg1, Node* arg2, 461 Node* context, Node* arg1, Node* arg2,
457 Node* arg3, Node* arg4, Node* arg5, 462 Node* arg3, Node* arg4, Node* arg5,
458 Node* arg6) { 463 Node* arg6) {
459 return raw_assembler_->TailCallRuntime6(function_id, arg1, arg2, arg3, arg4, 464 return raw_assembler()->TailCallRuntime6(function_id, arg1, arg2, arg3, arg4,
460 arg5, arg6, context); 465 arg5, arg6, context);
461 } 466 }
462 467
463 Node* CodeAssembler::CallStub(Callable const& callable, Node* context, 468 Node* CodeAssembler::CallStub(Callable const& callable, Node* context,
464 Node* arg1, size_t result_size) { 469 Node* arg1, size_t result_size) {
465 Node* target = HeapConstant(callable.code()); 470 Node* target = HeapConstant(callable.code());
466 return CallStub(callable.descriptor(), target, context, arg1, result_size); 471 return CallStub(callable.descriptor(), target, context, arg1, result_size);
467 } 472 }
468 473
469 Node* CodeAssembler::CallStub(Callable const& callable, Node* context, 474 Node* CodeAssembler::CallStub(Callable const& callable, Node* context,
470 Node* arg1, Node* arg2, size_t result_size) { 475 Node* arg1, Node* arg2, size_t result_size) {
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
735 size_t result_size) { 740 size_t result_size) {
736 CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor( 741 CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor(
737 isolate(), zone(), descriptor, descriptor.GetStackParameterCount(), 742 isolate(), zone(), descriptor, descriptor.GetStackParameterCount(),
738 CallDescriptor::kSupportsTailCalls, Operator::kNoProperties, 743 CallDescriptor::kSupportsTailCalls, Operator::kNoProperties,
739 MachineType::AnyTagged(), result_size); 744 MachineType::AnyTagged(), result_size);
740 745
741 Node** args = zone()->NewArray<Node*>(2); 746 Node** args = zone()->NewArray<Node*>(2);
742 args[0] = arg1; 747 args[0] = arg1;
743 args[1] = context; 748 args[1] = context;
744 749
745 return raw_assembler_->TailCallN(call_descriptor, target, args); 750 return raw_assembler()->TailCallN(call_descriptor, target, args);
746 } 751 }
747 752
748 Node* CodeAssembler::TailCallStub(const CallInterfaceDescriptor& descriptor, 753 Node* CodeAssembler::TailCallStub(const CallInterfaceDescriptor& descriptor,
749 Node* target, Node* context, Node* arg1, 754 Node* target, Node* context, Node* arg1,
750 Node* arg2, size_t result_size) { 755 Node* arg2, size_t result_size) {
751 CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor( 756 CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor(
752 isolate(), zone(), descriptor, descriptor.GetStackParameterCount(), 757 isolate(), zone(), descriptor, descriptor.GetStackParameterCount(),
753 CallDescriptor::kSupportsTailCalls, Operator::kNoProperties, 758 CallDescriptor::kSupportsTailCalls, Operator::kNoProperties,
754 MachineType::AnyTagged(), result_size); 759 MachineType::AnyTagged(), result_size);
755 760
756 Node** args = zone()->NewArray<Node*>(3); 761 Node** args = zone()->NewArray<Node*>(3);
757 args[0] = arg1; 762 args[0] = arg1;
758 args[1] = arg2; 763 args[1] = arg2;
759 args[2] = context; 764 args[2] = context;
760 765
761 return raw_assembler_->TailCallN(call_descriptor, target, args); 766 return raw_assembler()->TailCallN(call_descriptor, target, args);
762 } 767 }
763 768
764 Node* CodeAssembler::TailCallStub(const CallInterfaceDescriptor& descriptor, 769 Node* CodeAssembler::TailCallStub(const CallInterfaceDescriptor& descriptor,
765 Node* target, Node* context, Node* arg1, 770 Node* target, Node* context, Node* arg1,
766 Node* arg2, Node* arg3, size_t result_size) { 771 Node* arg2, Node* arg3, size_t result_size) {
767 CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor( 772 CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor(
768 isolate(), zone(), descriptor, descriptor.GetStackParameterCount(), 773 isolate(), zone(), descriptor, descriptor.GetStackParameterCount(),
769 CallDescriptor::kSupportsTailCalls, Operator::kNoProperties, 774 CallDescriptor::kSupportsTailCalls, Operator::kNoProperties,
770 MachineType::AnyTagged(), result_size); 775 MachineType::AnyTagged(), result_size);
771 776
772 Node** args = zone()->NewArray<Node*>(4); 777 Node** args = zone()->NewArray<Node*>(4);
773 args[0] = arg1; 778 args[0] = arg1;
774 args[1] = arg2; 779 args[1] = arg2;
775 args[2] = arg3; 780 args[2] = arg3;
776 args[3] = context; 781 args[3] = context;
777 782
778 return raw_assembler_->TailCallN(call_descriptor, target, args); 783 return raw_assembler()->TailCallN(call_descriptor, target, args);
779 } 784 }
780 785
781 Node* CodeAssembler::TailCallStub(const CallInterfaceDescriptor& descriptor, 786 Node* CodeAssembler::TailCallStub(const CallInterfaceDescriptor& descriptor,
782 Node* target, Node* context, Node* arg1, 787 Node* target, Node* context, Node* arg1,
783 Node* arg2, Node* arg3, Node* arg4, 788 Node* arg2, Node* arg3, Node* arg4,
784 size_t result_size) { 789 size_t result_size) {
785 CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor( 790 CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor(
786 isolate(), zone(), descriptor, descriptor.GetStackParameterCount(), 791 isolate(), zone(), descriptor, descriptor.GetStackParameterCount(),
787 CallDescriptor::kSupportsTailCalls, Operator::kNoProperties, 792 CallDescriptor::kSupportsTailCalls, Operator::kNoProperties,
788 MachineType::AnyTagged(), result_size); 793 MachineType::AnyTagged(), result_size);
789 794
790 Node** args = zone()->NewArray<Node*>(5); 795 Node** args = zone()->NewArray<Node*>(5);
791 args[0] = arg1; 796 args[0] = arg1;
792 args[1] = arg2; 797 args[1] = arg2;
793 args[2] = arg3; 798 args[2] = arg3;
794 args[3] = arg4; 799 args[3] = arg4;
795 args[4] = context; 800 args[4] = context;
796 801
797 return raw_assembler_->TailCallN(call_descriptor, target, args); 802 return raw_assembler()->TailCallN(call_descriptor, target, args);
798 } 803 }
799 804
800 Node* CodeAssembler::TailCallStub(const CallInterfaceDescriptor& descriptor, 805 Node* CodeAssembler::TailCallStub(const CallInterfaceDescriptor& descriptor,
801 Node* target, Node* context, Node* arg1, 806 Node* target, Node* context, Node* arg1,
802 Node* arg2, Node* arg3, Node* arg4, 807 Node* arg2, Node* arg3, Node* arg4,
803 Node* arg5, size_t result_size) { 808 Node* arg5, size_t result_size) {
804 CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor( 809 CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor(
805 isolate(), zone(), descriptor, descriptor.GetStackParameterCount(), 810 isolate(), zone(), descriptor, descriptor.GetStackParameterCount(),
806 CallDescriptor::kSupportsTailCalls, Operator::kNoProperties, 811 CallDescriptor::kSupportsTailCalls, Operator::kNoProperties,
807 MachineType::AnyTagged(), result_size); 812 MachineType::AnyTagged(), result_size);
808 813
809 Node** args = zone()->NewArray<Node*>(6); 814 Node** args = zone()->NewArray<Node*>(6);
810 args[0] = arg1; 815 args[0] = arg1;
811 args[1] = arg2; 816 args[1] = arg2;
812 args[2] = arg3; 817 args[2] = arg3;
813 args[3] = arg4; 818 args[3] = arg4;
814 args[4] = arg5; 819 args[4] = arg5;
815 args[5] = context; 820 args[5] = context;
816 821
817 return raw_assembler_->TailCallN(call_descriptor, target, args); 822 return raw_assembler()->TailCallN(call_descriptor, target, args);
818 } 823 }
819 824
820 Node* CodeAssembler::TailCallStub(const CallInterfaceDescriptor& descriptor, 825 Node* CodeAssembler::TailCallStub(const CallInterfaceDescriptor& descriptor,
821 Node* target, Node* context, Node* arg1, 826 Node* target, Node* context, Node* arg1,
822 Node* arg2, Node* arg3, Node* arg4, 827 Node* arg2, Node* arg3, Node* arg4,
823 Node* arg5, Node* arg6, size_t result_size) { 828 Node* arg5, Node* arg6, size_t result_size) {
824 CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor( 829 CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor(
825 isolate(), zone(), descriptor, descriptor.GetStackParameterCount(), 830 isolate(), zone(), descriptor, descriptor.GetStackParameterCount(),
826 CallDescriptor::kSupportsTailCalls, Operator::kNoProperties, 831 CallDescriptor::kSupportsTailCalls, Operator::kNoProperties,
827 MachineType::AnyTagged(), result_size); 832 MachineType::AnyTagged(), result_size);
828 833
829 Node** args = zone()->NewArray<Node*>(7); 834 Node** args = zone()->NewArray<Node*>(7);
830 args[0] = arg1; 835 args[0] = arg1;
831 args[1] = arg2; 836 args[1] = arg2;
832 args[2] = arg3; 837 args[2] = arg3;
833 args[3] = arg4; 838 args[3] = arg4;
834 args[4] = arg5; 839 args[4] = arg5;
835 args[5] = arg6; 840 args[5] = arg6;
836 args[6] = context; 841 args[6] = context;
837 842
838 return raw_assembler_->TailCallN(call_descriptor, target, args); 843 return raw_assembler()->TailCallN(call_descriptor, target, args);
839 } 844 }
840 845
841 Node* CodeAssembler::TailCallStub(const CallInterfaceDescriptor& descriptor, 846 Node* CodeAssembler::TailCallStub(const CallInterfaceDescriptor& descriptor,
842 Node* target, Node* context, const Arg& arg1, 847 Node* target, Node* context, const Arg& arg1,
843 const Arg& arg2, const Arg& arg3, 848 const Arg& arg2, const Arg& arg3,
844 const Arg& arg4, size_t result_size) { 849 const Arg& arg4, size_t result_size) {
845 CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor( 850 CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor(
846 isolate(), zone(), descriptor, descriptor.GetStackParameterCount(), 851 isolate(), zone(), descriptor, descriptor.GetStackParameterCount(),
847 CallDescriptor::kSupportsTailCalls, Operator::kNoProperties, 852 CallDescriptor::kSupportsTailCalls, Operator::kNoProperties,
848 MachineType::AnyTagged(), result_size); 853 MachineType::AnyTagged(), result_size);
849 854
850 const int kArgsCount = 5; 855 const int kArgsCount = 5;
851 Node** args = zone()->NewArray<Node*>(kArgsCount); 856 Node** args = zone()->NewArray<Node*>(kArgsCount);
852 DCHECK((std::fill(&args[0], &args[kArgsCount], nullptr), true)); 857 DCHECK((std::fill(&args[0], &args[kArgsCount], nullptr), true));
853 args[arg1.index] = arg1.value; 858 args[arg1.index] = arg1.value;
854 args[arg2.index] = arg2.value; 859 args[arg2.index] = arg2.value;
855 args[arg3.index] = arg3.value; 860 args[arg3.index] = arg3.value;
856 args[arg4.index] = arg4.value; 861 args[arg4.index] = arg4.value;
857 args[kArgsCount - 1] = context; 862 args[kArgsCount - 1] = context;
858 DCHECK_EQ(0, std::count(&args[0], &args[kArgsCount], nullptr)); 863 DCHECK_EQ(0, std::count(&args[0], &args[kArgsCount], nullptr));
859 864
860 return raw_assembler_->TailCallN(call_descriptor, target, args); 865 return raw_assembler()->TailCallN(call_descriptor, target, args);
861 } 866 }
862 867
863 Node* CodeAssembler::TailCallStub(const CallInterfaceDescriptor& descriptor, 868 Node* CodeAssembler::TailCallStub(const CallInterfaceDescriptor& descriptor,
864 Node* target, Node* context, const Arg& arg1, 869 Node* target, Node* context, const Arg& arg1,
865 const Arg& arg2, const Arg& arg3, 870 const Arg& arg2, const Arg& arg3,
866 const Arg& arg4, const Arg& arg5, 871 const Arg& arg4, const Arg& arg5,
867 size_t result_size) { 872 size_t result_size) {
868 CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor( 873 CallDescriptor* call_descriptor = Linkage::GetStubCallDescriptor(
869 isolate(), zone(), descriptor, descriptor.GetStackParameterCount(), 874 isolate(), zone(), descriptor, descriptor.GetStackParameterCount(),
870 CallDescriptor::kSupportsTailCalls, Operator::kNoProperties, 875 CallDescriptor::kSupportsTailCalls, Operator::kNoProperties,
871 MachineType::AnyTagged(), result_size); 876 MachineType::AnyTagged(), result_size);
872 877
873 const int kArgsCount = 6; 878 const int kArgsCount = 6;
874 Node** args = zone()->NewArray<Node*>(kArgsCount); 879 Node** args = zone()->NewArray<Node*>(kArgsCount);
875 DCHECK((std::fill(&args[0], &args[kArgsCount], nullptr), true)); 880 DCHECK((std::fill(&args[0], &args[kArgsCount], nullptr), true));
876 args[arg1.index] = arg1.value; 881 args[arg1.index] = arg1.value;
877 args[arg2.index] = arg2.value; 882 args[arg2.index] = arg2.value;
878 args[arg3.index] = arg3.value; 883 args[arg3.index] = arg3.value;
879 args[arg4.index] = arg4.value; 884 args[arg4.index] = arg4.value;
880 args[arg5.index] = arg5.value; 885 args[arg5.index] = arg5.value;
881 args[kArgsCount - 1] = context; 886 args[kArgsCount - 1] = context;
882 DCHECK_EQ(0, std::count(&args[0], &args[kArgsCount], nullptr)); 887 DCHECK_EQ(0, std::count(&args[0], &args[kArgsCount], nullptr));
883 888
884 return raw_assembler_->TailCallN(call_descriptor, target, args); 889 return raw_assembler()->TailCallN(call_descriptor, target, args);
885 } 890 }
886 891
887 Node* CodeAssembler::TailCallBytecodeDispatch( 892 Node* CodeAssembler::TailCallBytecodeDispatch(
888 const CallInterfaceDescriptor& interface_descriptor, 893 const CallInterfaceDescriptor& interface_descriptor,
889 Node* code_target_address, Node** args) { 894 Node* code_target_address, Node** args) {
890 CallDescriptor* descriptor = Linkage::GetBytecodeDispatchCallDescriptor( 895 CallDescriptor* descriptor = Linkage::GetBytecodeDispatchCallDescriptor(
891 isolate(), zone(), interface_descriptor, 896 isolate(), zone(), interface_descriptor,
892 interface_descriptor.GetStackParameterCount()); 897 interface_descriptor.GetStackParameterCount());
893 return raw_assembler_->TailCallN(descriptor, code_target_address, args); 898 return raw_assembler()->TailCallN(descriptor, code_target_address, args);
894 } 899 }
895 900
896 Node* CodeAssembler::CallJS(Callable const& callable, Node* context, 901 Node* CodeAssembler::CallJS(Callable const& callable, Node* context,
897 Node* function, Node* receiver, 902 Node* function, Node* receiver,
898 size_t result_size) { 903 size_t result_size) {
899 const int argc = 0; 904 const int argc = 0;
900 Node* target = HeapConstant(callable.code()); 905 Node* target = HeapConstant(callable.code());
901 906
902 Node** args = zone()->NewArray<Node*>(argc + 4); 907 Node** args = zone()->NewArray<Node*>(argc + 4);
903 args[0] = function; 908 args[0] = function;
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
956 args[5] = arg3; 961 args[5] = arg3;
957 args[6] = context; 962 args[6] = context;
958 963
959 return CallStubN(callable.descriptor(), argc + 1, target, args, result_size); 964 return CallStubN(callable.descriptor(), argc + 1, target, args, result_size);
960 } 965 }
961 966
962 Node* CodeAssembler::CallCFunction2(MachineType return_type, 967 Node* CodeAssembler::CallCFunction2(MachineType return_type,
963 MachineType arg0_type, 968 MachineType arg0_type,
964 MachineType arg1_type, Node* function, 969 MachineType arg1_type, Node* function,
965 Node* arg0, Node* arg1) { 970 Node* arg0, Node* arg1) {
966 return raw_assembler_->CallCFunction2(return_type, arg0_type, arg1_type, 971 return raw_assembler()->CallCFunction2(return_type, arg0_type, arg1_type,
967 function, arg0, arg1); 972 function, arg0, arg1);
968 } 973 }
969 974
970 void CodeAssembler::Goto(CodeAssembler::Label* label) { 975 void CodeAssembler::Goto(CodeAssembler::Label* label) {
971 label->MergeVariables(); 976 label->MergeVariables();
972 raw_assembler_->Goto(label->label_); 977 raw_assembler()->Goto(label->label_);
973 } 978 }
974 979
975 void CodeAssembler::GotoIf(Node* condition, Label* true_label) { 980 void CodeAssembler::GotoIf(Node* condition, Label* true_label) {
976 Label false_label(this); 981 Label false_label(this);
977 Branch(condition, true_label, &false_label); 982 Branch(condition, true_label, &false_label);
978 Bind(&false_label); 983 Bind(&false_label);
979 } 984 }
980 985
981 void CodeAssembler::GotoUnless(Node* condition, Label* false_label) { 986 void CodeAssembler::GotoUnless(Node* condition, Label* false_label) {
982 Label true_label(this); 987 Label true_label(this);
983 Branch(condition, &true_label, false_label); 988 Branch(condition, &true_label, false_label);
984 Bind(&true_label); 989 Bind(&true_label);
985 } 990 }
986 991
987 void CodeAssembler::Branch(Node* condition, CodeAssembler::Label* true_label, 992 void CodeAssembler::Branch(Node* condition, CodeAssembler::Label* true_label,
988 CodeAssembler::Label* false_label) { 993 CodeAssembler::Label* false_label) {
989 true_label->MergeVariables(); 994 true_label->MergeVariables();
990 false_label->MergeVariables(); 995 false_label->MergeVariables();
991 return raw_assembler_->Branch(condition, true_label->label_, 996 return raw_assembler()->Branch(condition, true_label->label_,
992 false_label->label_); 997 false_label->label_);
993 } 998 }
994 999
995 void CodeAssembler::Switch(Node* index, Label* default_label, 1000 void CodeAssembler::Switch(Node* index, Label* default_label,
996 const int32_t* case_values, Label** case_labels, 1001 const int32_t* case_values, Label** case_labels,
997 size_t case_count) { 1002 size_t case_count) {
998 RawMachineLabel** labels = 1003 RawMachineLabel** labels =
999 new (zone()->New(sizeof(RawMachineLabel*) * case_count)) 1004 new (zone()->New(sizeof(RawMachineLabel*) * case_count))
1000 RawMachineLabel*[case_count]; 1005 RawMachineLabel*[case_count];
1001 for (size_t i = 0; i < case_count; ++i) { 1006 for (size_t i = 0; i < case_count; ++i) {
1002 labels[i] = case_labels[i]->label_; 1007 labels[i] = case_labels[i]->label_;
1003 case_labels[i]->MergeVariables(); 1008 case_labels[i]->MergeVariables();
1004 default_label->MergeVariables(); 1009 default_label->MergeVariables();
1005 } 1010 }
1006 return raw_assembler_->Switch(index, default_label->label_, case_values, 1011 return raw_assembler()->Switch(index, default_label->label_, case_values,
1007 labels, case_count); 1012 labels, case_count);
1008 } 1013 }
1009 1014
1010 Node* CodeAssembler::Select(Node* condition, Node* true_value, 1015 Node* CodeAssembler::Select(Node* condition, Node* true_value,
1011 Node* false_value, MachineRepresentation rep) { 1016 Node* false_value, MachineRepresentation rep) {
1012 Variable value(this, rep); 1017 Variable value(this, rep);
1013 Label vtrue(this), vfalse(this), end(this); 1018 Label vtrue(this), vfalse(this), end(this);
1014 Branch(condition, &vtrue, &vfalse); 1019 Branch(condition, &vtrue, &vfalse);
1015 1020
1016 Bind(&vtrue); 1021 Bind(&vtrue);
1017 { 1022 {
1018 value.Bind(true_value); 1023 value.Bind(true_value);
1019 Goto(&end); 1024 Goto(&end);
1020 } 1025 }
1021 Bind(&vfalse); 1026 Bind(&vfalse);
1022 { 1027 {
1023 value.Bind(false_value); 1028 value.Bind(false_value);
1024 Goto(&end); 1029 Goto(&end);
1025 } 1030 }
1026 1031
1027 Bind(&end); 1032 Bind(&end);
1028 return value.value(); 1033 return value.value();
1029 } 1034 }
1030 1035
1031 // RawMachineAssembler delegate helpers: 1036 // RawMachineAssembler delegate helpers:
1032 Isolate* CodeAssembler::isolate() const { return raw_assembler_->isolate(); } 1037 Isolate* CodeAssembler::isolate() const { return raw_assembler()->isolate(); }
1033 1038
1034 Factory* CodeAssembler::factory() const { return isolate()->factory(); } 1039 Factory* CodeAssembler::factory() const { return isolate()->factory(); }
1035 1040
1036 Zone* CodeAssembler::zone() const { return raw_assembler_->zone(); } 1041 Zone* CodeAssembler::zone() const { return raw_assembler()->zone(); }
1042
1043 RawMachineAssembler* CodeAssembler::raw_assembler() const {
1044 return state_->raw_assembler_.get();
1045 }
1037 1046
1038 // The core implementation of Variable is stored through an indirection so 1047 // The core implementation of Variable is stored through an indirection so
1039 // that it can outlive the often block-scoped Variable declarations. This is 1048 // that it can outlive the often block-scoped Variable declarations. This is
1040 // needed to ensure that variable binding and merging through phis can 1049 // needed to ensure that variable binding and merging through phis can
1041 // properly be verified. 1050 // properly be verified.
1042 class CodeAssembler::Variable::Impl : public ZoneObject { 1051 class CodeAssembler::Variable::Impl : public ZoneObject {
1043 public: 1052 public:
1044 explicit Impl(MachineRepresentation rep) : value_(nullptr), rep_(rep) {} 1053 explicit Impl(MachineRepresentation rep) : value_(nullptr), rep_(rep) {}
1045 Node* value_; 1054 Node* value_;
1046 MachineRepresentation rep_; 1055 MachineRepresentation rep_;
1047 }; 1056 };
1048 1057
1049 CodeAssembler::Variable::Variable(CodeAssembler* assembler, 1058 CodeAssembler::Variable::Variable(CodeAssembler* assembler,
1050 MachineRepresentation rep) 1059 MachineRepresentation rep)
1051 : impl_(new (assembler->zone()) Impl(rep)), assembler_(assembler) { 1060 : impl_(new (assembler->zone()) Impl(rep)), state_(assembler->state_) {
1052 assembler->variables_.insert(impl_); 1061 state_->variables_.insert(impl_);
1053 } 1062 }
1054 1063
1055 CodeAssembler::Variable::~Variable() { assembler_->variables_.erase(impl_); } 1064 CodeAssembler::Variable::~Variable() { state_->variables_.erase(impl_); }
1056 1065
1057 void CodeAssembler::Variable::Bind(Node* value) { impl_->value_ = value; } 1066 void CodeAssembler::Variable::Bind(Node* value) { impl_->value_ = value; }
1058 1067
1059 Node* CodeAssembler::Variable::value() const { 1068 Node* CodeAssembler::Variable::value() const {
1060 DCHECK_NOT_NULL(impl_->value_); 1069 DCHECK_NOT_NULL(impl_->value_);
1061 return impl_->value_; 1070 return impl_->value_;
1062 } 1071 }
1063 1072
1064 MachineRepresentation CodeAssembler::Variable::rep() const { 1073 MachineRepresentation CodeAssembler::Variable::rep() const {
1065 return impl_->rep_; 1074 return impl_->rep_;
1066 } 1075 }
1067 1076
1068 bool CodeAssembler::Variable::IsBound() const { 1077 bool CodeAssembler::Variable::IsBound() const {
1069 return impl_->value_ != nullptr; 1078 return impl_->value_ != nullptr;
1070 } 1079 }
1071 1080
1072 CodeAssembler::Label::Label(CodeAssembler* assembler, size_t vars_count, 1081 CodeAssembler::Label::Label(CodeAssembler* assembler, size_t vars_count,
1073 Variable** vars, CodeAssembler::Label::Type type) 1082 Variable** vars, CodeAssembler::Label::Type type)
1074 : bound_(false), merge_count_(0), assembler_(assembler), label_(nullptr) { 1083 : bound_(false),
1084 merge_count_(0),
1085 state_(assembler->state_),
1086 label_(nullptr) {
1075 void* buffer = assembler->zone()->New(sizeof(RawMachineLabel)); 1087 void* buffer = assembler->zone()->New(sizeof(RawMachineLabel));
1076 label_ = new (buffer) 1088 label_ = new (buffer)
1077 RawMachineLabel(type == kDeferred ? RawMachineLabel::kDeferred 1089 RawMachineLabel(type == kDeferred ? RawMachineLabel::kDeferred
1078 : RawMachineLabel::kNonDeferred); 1090 : RawMachineLabel::kNonDeferred);
1079 for (size_t i = 0; i < vars_count; ++i) { 1091 for (size_t i = 0; i < vars_count; ++i) {
1080 variable_phis_[vars[i]->impl_] = nullptr; 1092 variable_phis_[vars[i]->impl_] = nullptr;
1081 } 1093 }
1082 } 1094 }
1083 1095
1084 void CodeAssembler::Label::MergeVariables() { 1096 void CodeAssembler::Label::MergeVariables() {
1085 ++merge_count_; 1097 ++merge_count_;
1086 for (auto var : assembler_->variables_) { 1098 for (auto var : state_->variables_) {
1087 size_t count = 0; 1099 size_t count = 0;
1088 Node* node = var->value_; 1100 Node* node = var->value_;
1089 if (node != nullptr) { 1101 if (node != nullptr) {
1090 auto i = variable_merges_.find(var); 1102 auto i = variable_merges_.find(var);
1091 if (i != variable_merges_.end()) { 1103 if (i != variable_merges_.end()) {
1092 i->second.push_back(node); 1104 i->second.push_back(node);
1093 count = i->second.size(); 1105 count = i->second.size();
1094 } else { 1106 } else {
1095 count = 1; 1107 count = 1;
1096 variable_merges_[var] = std::vector<Node*>(1, node); 1108 variable_merges_[var] = std::vector<Node*>(1, node);
1097 } 1109 }
1098 } 1110 }
1099 // If the following asserts, then you've jumped to a label without a bound 1111 // If the following asserts, then you've jumped to a label without a bound
1100 // variable along that path that expects to merge its value into a phi. 1112 // variable along that path that expects to merge its value into a phi.
1101 DCHECK(variable_phis_.find(var) == variable_phis_.end() || 1113 DCHECK(variable_phis_.find(var) == variable_phis_.end() ||
1102 count == merge_count_); 1114 count == merge_count_);
1103 USE(count); 1115 USE(count);
1104 1116
1105 // If the label is already bound, we already know the set of variables to 1117 // If the label is already bound, we already know the set of variables to
1106 // merge and phi nodes have already been created. 1118 // merge and phi nodes have already been created.
1107 if (bound_) { 1119 if (bound_) {
1108 auto phi = variable_phis_.find(var); 1120 auto phi = variable_phis_.find(var);
1109 if (phi != variable_phis_.end()) { 1121 if (phi != variable_phis_.end()) {
1110 DCHECK_NOT_NULL(phi->second); 1122 DCHECK_NOT_NULL(phi->second);
1111 assembler_->raw_assembler_->AppendPhiInput(phi->second, node); 1123 state_->raw_assembler_->AppendPhiInput(phi->second, node);
1112 } else { 1124 } else {
1113 auto i = variable_merges_.find(var); 1125 auto i = variable_merges_.find(var);
1114 if (i != variable_merges_.end()) { 1126 if (i != variable_merges_.end()) {
1115 // If the following assert fires, then you've declared a variable that 1127 // If the following assert fires, then you've declared a variable that
1116 // has the same bound value along all paths up until the point you 1128 // has the same bound value along all paths up until the point you
1117 // bound this label, but then later merged a path with a new value for 1129 // bound this label, but then later merged a path with a new value for
1118 // the variable after the label bind (it's not possible to add phis to 1130 // the variable after the label bind (it's not possible to add phis to
1119 // the bound label after the fact, just make sure to list the variable 1131 // the bound label after the fact, just make sure to list the variable
1120 // in the label's constructor's list of merged variables). 1132 // in the label's constructor's list of merged variables).
1121 DCHECK(find_if(i->second.begin(), i->second.end(), 1133 DCHECK(find_if(i->second.begin(), i->second.end(),
1122 [node](Node* e) -> bool { return node != e; }) == 1134 [node](Node* e) -> bool { return node != e; }) ==
1123 i->second.end()); 1135 i->second.end());
1124 } 1136 }
1125 } 1137 }
1126 } 1138 }
1127 } 1139 }
1128 } 1140 }
1129 1141
1130 void CodeAssembler::Label::Bind() { 1142 void CodeAssembler::Label::Bind() {
1131 DCHECK(!bound_); 1143 DCHECK(!bound_);
1132 assembler_->raw_assembler_->Bind(label_); 1144 state_->raw_assembler_->Bind(label_);
1133 1145
1134 // Make sure that all variables that have changed along any path up to this 1146 // Make sure that all variables that have changed along any path up to this
1135 // point are marked as merge variables. 1147 // point are marked as merge variables.
1136 for (auto var : assembler_->variables_) { 1148 for (auto var : state_->variables_) {
1137 Node* shared_value = nullptr; 1149 Node* shared_value = nullptr;
1138 auto i = variable_merges_.find(var); 1150 auto i = variable_merges_.find(var);
1139 if (i != variable_merges_.end()) { 1151 if (i != variable_merges_.end()) {
1140 for (auto value : i->second) { 1152 for (auto value : i->second) {
1141 DCHECK(value != nullptr); 1153 DCHECK(value != nullptr);
1142 if (value != shared_value) { 1154 if (value != shared_value) {
1143 if (shared_value == nullptr) { 1155 if (shared_value == nullptr) {
1144 shared_value = value; 1156 shared_value = value;
1145 } else { 1157 } else {
1146 variable_phis_[var] = nullptr; 1158 variable_phis_[var] = nullptr;
1147 } 1159 }
1148 } 1160 }
1149 } 1161 }
1150 } 1162 }
1151 } 1163 }
1152 1164
1153 for (auto var : variable_phis_) { 1165 for (auto var : variable_phis_) {
1154 CodeAssembler::Variable::Impl* var_impl = var.first; 1166 CodeAssembler::Variable::Impl* var_impl = var.first;
1155 auto i = variable_merges_.find(var_impl); 1167 auto i = variable_merges_.find(var_impl);
1156 // If the following assert fires, then a variable that has been marked as 1168 // If the following assert fires, then a variable that has been marked as
1157 // being merged at the label--either by explicitly marking it so in the 1169 // being merged at the label--either by explicitly marking it so in the
1158 // label constructor or by having seen different bound values at branches 1170 // label constructor or by having seen different bound values at branches
1159 // into the label--doesn't have a bound value along all of the paths that 1171 // into the label--doesn't have a bound value along all of the paths that
1160 // have been merged into the label up to this point. 1172 // have been merged into the label up to this point.
1161 DCHECK(i != variable_merges_.end() && i->second.size() == merge_count_); 1173 DCHECK(i != variable_merges_.end() && i->second.size() == merge_count_);
1162 Node* phi = assembler_->raw_assembler_->Phi( 1174 Node* phi = state_->raw_assembler_->Phi(
1163 var.first->rep_, static_cast<int>(merge_count_), &(i->second[0])); 1175 var.first->rep_, static_cast<int>(merge_count_), &(i->second[0]));
1164 variable_phis_[var_impl] = phi; 1176 variable_phis_[var_impl] = phi;
1165 } 1177 }
1166 1178
1167 // Bind all variables to a merge phi, the common value along all paths or 1179 // Bind all variables to a merge phi, the common value along all paths or
1168 // null. 1180 // null.
1169 for (auto var : assembler_->variables_) { 1181 for (auto var : state_->variables_) {
1170 auto i = variable_phis_.find(var); 1182 auto i = variable_phis_.find(var);
1171 if (i != variable_phis_.end()) { 1183 if (i != variable_phis_.end()) {
1172 var->value_ = i->second; 1184 var->value_ = i->second;
1173 } else { 1185 } else {
1174 auto j = variable_merges_.find(var); 1186 auto j = variable_merges_.find(var);
1175 if (j != variable_merges_.end() && j->second.size() == merge_count_) { 1187 if (j != variable_merges_.end() && j->second.size() == merge_count_) {
1176 var->value_ = j->second.back(); 1188 var->value_ = j->second.back();
1177 } else { 1189 } else {
1178 var->value_ = nullptr; 1190 var->value_ = nullptr;
1179 } 1191 }
1180 } 1192 }
1181 } 1193 }
1182 1194
1183 bound_ = true; 1195 bound_ = true;
1184 } 1196 }
1185 1197
1186 } // namespace compiler 1198 } // namespace compiler
1187 } // namespace internal 1199 } // namespace internal
1188 } // namespace v8 1200 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/code-assembler.h ('k') | src/fast-accessor-assembler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698