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

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

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

Powered by Google App Engine
This is Rietveld 408576698