OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |