OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_ARM64. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_ARM64. |
6 #if defined(TARGET_ARCH_ARM64) | 6 #if defined(TARGET_ARCH_ARM64) |
7 | 7 |
8 #include "vm/intermediate_language.h" | 8 #include "vm/intermediate_language.h" |
9 | 9 |
10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" |
11 #include "vm/flow_graph_compiler.h" | 11 #include "vm/flow_graph_compiler.h" |
12 #include "vm/locations.h" | 12 #include "vm/locations.h" |
13 #include "vm/object_store.h" | 13 #include "vm/object_store.h" |
14 #include "vm/parser.h" | 14 #include "vm/parser.h" |
15 #include "vm/simulator.h" | 15 #include "vm/simulator.h" |
16 #include "vm/stack_frame.h" | 16 #include "vm/stack_frame.h" |
17 #include "vm/stub_code.h" | 17 #include "vm/stub_code.h" |
18 #include "vm/symbols.h" | 18 #include "vm/symbols.h" |
19 | 19 |
20 #define __ compiler->assembler()-> | 20 #define __ compiler->assembler()-> |
21 | 21 |
22 namespace dart { | 22 namespace dart { |
23 | 23 |
24 DECLARE_FLAG(int, optimization_counter_threshold); | 24 DECLARE_FLAG(int, optimization_counter_threshold); |
25 DECLARE_FLAG(bool, use_osr); | 25 DECLARE_FLAG(bool, use_osr); |
26 | 26 |
27 // Generic summary for call instructions that have all arguments pushed | 27 // Generic summary for call instructions that have all arguments pushed |
28 // on the stack and return the result in a fixed register R0. | 28 // on the stack and return the result in a fixed register R0. |
29 LocationSummary* Instruction::MakeCallSummary() { | 29 LocationSummary* Instruction::MakeCallSummary() { |
30 LocationSummary* result = new LocationSummary(0, 0, LocationSummary::kCall); | 30 Isolate* isolate = Isolate::Current(); |
| 31 LocationSummary* result = new(isolate) LocationSummary( |
| 32 isolate, 0, 0, LocationSummary::kCall); |
31 result->set_out(0, Location::RegisterLocation(R0)); | 33 result->set_out(0, Location::RegisterLocation(R0)); |
32 return result; | 34 return result; |
33 } | 35 } |
34 | 36 |
35 | 37 |
36 LocationSummary* PushArgumentInstr::MakeLocationSummary(bool opt) const { | 38 LocationSummary* PushArgumentInstr::MakeLocationSummary(Isolate* isolate, |
| 39 bool opt) const { |
37 const intptr_t kNumInputs = 1; | 40 const intptr_t kNumInputs = 1; |
38 const intptr_t kNumTemps= 0; | 41 const intptr_t kNumTemps= 0; |
39 LocationSummary* locs = | 42 LocationSummary* locs = new(isolate) LocationSummary( |
40 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 43 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
41 locs->set_in(0, Location::AnyOrConstant(value())); | 44 locs->set_in(0, Location::AnyOrConstant(value())); |
42 return locs; | 45 return locs; |
43 } | 46 } |
44 | 47 |
45 | 48 |
46 void PushArgumentInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 49 void PushArgumentInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
47 // In SSA mode, we need an explicit push. Nothing to do in non-SSA mode | 50 // In SSA mode, we need an explicit push. Nothing to do in non-SSA mode |
48 // where PushArgument is handled by BindInstr::EmitNativeCode. | 51 // where PushArgument is handled by BindInstr::EmitNativeCode. |
49 if (compiler->is_optimizing()) { | 52 if (compiler->is_optimizing()) { |
50 Location value = locs()->in(0); | 53 Location value = locs()->in(0); |
51 if (value.IsRegister()) { | 54 if (value.IsRegister()) { |
52 __ Push(value.reg()); | 55 __ Push(value.reg()); |
53 } else if (value.IsConstant()) { | 56 } else if (value.IsConstant()) { |
54 __ PushObject(value.constant(), PP); | 57 __ PushObject(value.constant(), PP); |
55 } else { | 58 } else { |
56 ASSERT(value.IsStackSlot()); | 59 ASSERT(value.IsStackSlot()); |
57 const intptr_t value_offset = value.ToStackSlotOffset(); | 60 const intptr_t value_offset = value.ToStackSlotOffset(); |
58 __ LoadFromOffset(TMP, FP, value_offset, PP); | 61 __ LoadFromOffset(TMP, FP, value_offset, PP); |
59 __ Push(TMP); | 62 __ Push(TMP); |
60 } | 63 } |
61 } | 64 } |
62 } | 65 } |
63 | 66 |
64 | 67 |
65 LocationSummary* ReturnInstr::MakeLocationSummary(bool opt) const { | 68 LocationSummary* ReturnInstr::MakeLocationSummary(Isolate* isolate, |
| 69 bool opt) const { |
66 const intptr_t kNumInputs = 1; | 70 const intptr_t kNumInputs = 1; |
67 const intptr_t kNumTemps = 0; | 71 const intptr_t kNumTemps = 0; |
68 LocationSummary* locs = | 72 LocationSummary* locs = new(isolate) LocationSummary( |
69 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 73 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
70 locs->set_in(0, Location::RegisterLocation(R0)); | 74 locs->set_in(0, Location::RegisterLocation(R0)); |
71 return locs; | 75 return locs; |
72 } | 76 } |
73 | 77 |
74 | 78 |
75 // Attempt optimized compilation at return instruction instead of at the entry. | 79 // Attempt optimized compilation at return instruction instead of at the entry. |
76 // The entry needs to be patchable, no inlined objects are allowed in the area | 80 // The entry needs to be patchable, no inlined objects are allowed in the area |
77 // that will be overwritten by the patch instructions: a branch macro sequence. | 81 // that will be overwritten by the patch instructions: a branch macro sequence. |
78 void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 82 void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
79 const Register result = locs()->in(0).reg(); | 83 const Register result = locs()->in(0).reg(); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 } | 120 } |
117 | 121 |
118 | 122 |
119 // Detect pattern when one value is zero and another is a power of 2. | 123 // Detect pattern when one value is zero and another is a power of 2. |
120 static bool IsPowerOfTwoKind(intptr_t v1, intptr_t v2) { | 124 static bool IsPowerOfTwoKind(intptr_t v1, intptr_t v2) { |
121 return (Utils::IsPowerOfTwo(v1) && (v2 == 0)) || | 125 return (Utils::IsPowerOfTwo(v1) && (v2 == 0)) || |
122 (Utils::IsPowerOfTwo(v2) && (v1 == 0)); | 126 (Utils::IsPowerOfTwo(v2) && (v1 == 0)); |
123 } | 127 } |
124 | 128 |
125 | 129 |
126 LocationSummary* IfThenElseInstr::MakeLocationSummary(bool opt) const { | 130 LocationSummary* IfThenElseInstr::MakeLocationSummary(Isolate* isolate, |
127 comparison()->InitializeLocationSummary(opt); | 131 bool opt) const { |
| 132 comparison()->InitializeLocationSummary(isolate, opt); |
128 return comparison()->locs(); | 133 return comparison()->locs(); |
129 } | 134 } |
130 | 135 |
131 | 136 |
132 void IfThenElseInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 137 void IfThenElseInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
133 const Register result = locs()->out(0).reg(); | 138 const Register result = locs()->out(0).reg(); |
134 | 139 |
135 Location left = locs()->in(0); | 140 Location left = locs()->in(0); |
136 Location right = locs()->in(1); | 141 Location right = locs()->in(1); |
137 ASSERT(!left.IsConstant() || !right.IsConstant()); | 142 ASSERT(!left.IsConstant() || !right.IsConstant()); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 const int64_t val = | 177 const int64_t val = |
173 Smi::RawValue(true_value) - Smi::RawValue(false_value); | 178 Smi::RawValue(true_value) - Smi::RawValue(false_value); |
174 __ AndImmediate(result, result, val, PP); | 179 __ AndImmediate(result, result, val, PP); |
175 if (false_value != 0) { | 180 if (false_value != 0) { |
176 __ AddImmediate(result, result, Smi::RawValue(false_value), PP); | 181 __ AddImmediate(result, result, Smi::RawValue(false_value), PP); |
177 } | 182 } |
178 } | 183 } |
179 } | 184 } |
180 | 185 |
181 | 186 |
182 LocationSummary* ClosureCallInstr::MakeLocationSummary(bool opt) const { | 187 LocationSummary* ClosureCallInstr::MakeLocationSummary(Isolate* isolate, |
| 188 bool opt) const { |
183 const intptr_t kNumInputs = 1; | 189 const intptr_t kNumInputs = 1; |
184 const intptr_t kNumTemps = 0; | 190 const intptr_t kNumTemps = 0; |
185 LocationSummary* summary = | 191 LocationSummary* summary = new(isolate) LocationSummary( |
186 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 192 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
187 summary->set_in(0, Location::RegisterLocation(R0)); // Function. | 193 summary->set_in(0, Location::RegisterLocation(R0)); // Function. |
188 summary->set_out(0, Location::RegisterLocation(R0)); | 194 summary->set_out(0, Location::RegisterLocation(R0)); |
189 return summary; | 195 return summary; |
190 } | 196 } |
191 | 197 |
192 | 198 |
193 void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 199 void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
194 // Load arguments descriptor in R4. | 200 // Load arguments descriptor in R4. |
195 int argument_count = ArgumentCount(); | 201 int argument_count = ArgumentCount(); |
196 const Array& arguments_descriptor = | 202 const Array& arguments_descriptor = |
(...skipping 25 matching lines...) Expand all Loading... |
222 // Add deoptimization continuation point after the call and before the | 228 // Add deoptimization continuation point after the call and before the |
223 // arguments are removed. | 229 // arguments are removed. |
224 compiler->AddCurrentDescriptor(PcDescriptors::kDeopt, | 230 compiler->AddCurrentDescriptor(PcDescriptors::kDeopt, |
225 deopt_id_after, | 231 deopt_id_after, |
226 token_pos()); | 232 token_pos()); |
227 } | 233 } |
228 __ Drop(argument_count); | 234 __ Drop(argument_count); |
229 } | 235 } |
230 | 236 |
231 | 237 |
232 LocationSummary* LoadLocalInstr::MakeLocationSummary(bool opt) const { | 238 LocationSummary* LoadLocalInstr::MakeLocationSummary(Isolate* isolate, |
| 239 bool opt) const { |
233 return LocationSummary::Make(0, | 240 return LocationSummary::Make(0, |
234 Location::RequiresRegister(), | 241 Location::RequiresRegister(), |
235 LocationSummary::kNoCall); | 242 LocationSummary::kNoCall); |
236 } | 243 } |
237 | 244 |
238 | 245 |
239 void LoadLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 246 void LoadLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
240 const Register result = locs()->out(0).reg(); | 247 const Register result = locs()->out(0).reg(); |
241 __ LoadFromOffset(result, FP, local().index() * kWordSize, PP); | 248 __ LoadFromOffset(result, FP, local().index() * kWordSize, PP); |
242 } | 249 } |
243 | 250 |
244 | 251 |
245 LocationSummary* StoreLocalInstr::MakeLocationSummary(bool opt) const { | 252 LocationSummary* StoreLocalInstr::MakeLocationSummary(Isolate* isolate, |
| 253 bool opt) const { |
246 return LocationSummary::Make(1, | 254 return LocationSummary::Make(1, |
247 Location::SameAsFirstInput(), | 255 Location::SameAsFirstInput(), |
248 LocationSummary::kNoCall); | 256 LocationSummary::kNoCall); |
249 } | 257 } |
250 | 258 |
251 | 259 |
252 void StoreLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 260 void StoreLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
253 const Register value = locs()->in(0).reg(); | 261 const Register value = locs()->in(0).reg(); |
254 const Register result = locs()->out(0).reg(); | 262 const Register result = locs()->out(0).reg(); |
255 ASSERT(result == value); // Assert that register assignment is correct. | 263 ASSERT(result == value); // Assert that register assignment is correct. |
256 __ StoreToOffset(value, FP, local().index() * kWordSize, PP); | 264 __ StoreToOffset(value, FP, local().index() * kWordSize, PP); |
257 } | 265 } |
258 | 266 |
259 | 267 |
260 LocationSummary* ConstantInstr::MakeLocationSummary(bool opt) const { | 268 LocationSummary* ConstantInstr::MakeLocationSummary(Isolate* isolate, |
| 269 bool opt) const { |
261 return LocationSummary::Make(0, | 270 return LocationSummary::Make(0, |
262 Location::RequiresRegister(), | 271 Location::RequiresRegister(), |
263 LocationSummary::kNoCall); | 272 LocationSummary::kNoCall); |
264 } | 273 } |
265 | 274 |
266 | 275 |
267 void ConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 276 void ConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
268 // The register allocator drops constant definitions that have no uses. | 277 // The register allocator drops constant definitions that have no uses. |
269 if (!locs()->out(0).IsInvalid()) { | 278 if (!locs()->out(0).IsInvalid()) { |
270 const Register result = locs()->out(0).reg(); | 279 const Register result = locs()->out(0).reg(); |
271 __ LoadObject(result, value(), PP); | 280 __ LoadObject(result, value(), PP); |
272 } | 281 } |
273 } | 282 } |
274 | 283 |
275 | 284 |
276 LocationSummary* UnboxedConstantInstr::MakeLocationSummary(bool opt) const { | 285 LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Isolate* isolate, |
| 286 bool opt) const { |
277 const intptr_t kNumInputs = 0; | 287 const intptr_t kNumInputs = 0; |
278 return LocationSummary::Make(kNumInputs, | 288 return LocationSummary::Make(kNumInputs, |
279 Location::RequiresFpuRegister(), | 289 Location::RequiresFpuRegister(), |
280 LocationSummary::kNoCall); | 290 LocationSummary::kNoCall); |
281 } | 291 } |
282 | 292 |
283 | 293 |
284 void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 294 void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
285 if (!locs()->out(0).IsInvalid()) { | 295 if (!locs()->out(0).IsInvalid()) { |
286 const VRegister dst = locs()->out(0).fpu_reg(); | 296 const VRegister dst = locs()->out(0).fpu_reg(); |
287 __ LoadDImmediate(dst, Double::Cast(value()).value(), PP); | 297 __ LoadDImmediate(dst, Double::Cast(value()).value(), PP); |
288 } | 298 } |
289 } | 299 } |
290 | 300 |
291 | 301 |
292 LocationSummary* AssertAssignableInstr::MakeLocationSummary(bool opt) const { | 302 LocationSummary* AssertAssignableInstr::MakeLocationSummary(Isolate* isolate, |
| 303 bool opt) const { |
293 const intptr_t kNumInputs = 3; | 304 const intptr_t kNumInputs = 3; |
294 const intptr_t kNumTemps = 0; | 305 const intptr_t kNumTemps = 0; |
295 LocationSummary* summary = | 306 LocationSummary* summary = new(isolate) LocationSummary( |
296 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 307 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
297 summary->set_in(0, Location::RegisterLocation(R0)); // Value. | 308 summary->set_in(0, Location::RegisterLocation(R0)); // Value. |
298 summary->set_in(1, Location::RegisterLocation(R2)); // Instantiator. | 309 summary->set_in(1, Location::RegisterLocation(R2)); // Instantiator. |
299 summary->set_in(2, Location::RegisterLocation(R1)); // Type arguments. | 310 summary->set_in(2, Location::RegisterLocation(R1)); // Type arguments. |
300 summary->set_out(0, Location::RegisterLocation(R0)); | 311 summary->set_out(0, Location::RegisterLocation(R0)); |
301 return summary; | 312 return summary; |
302 } | 313 } |
303 | 314 |
304 | 315 |
305 LocationSummary* AssertBooleanInstr::MakeLocationSummary(bool opt) const { | 316 LocationSummary* AssertBooleanInstr::MakeLocationSummary(Isolate* isolate, |
| 317 bool opt) const { |
306 const intptr_t kNumInputs = 1; | 318 const intptr_t kNumInputs = 1; |
307 const intptr_t kNumTemps = 0; | 319 const intptr_t kNumTemps = 0; |
308 LocationSummary* locs = | 320 LocationSummary* locs = new(isolate) LocationSummary( |
309 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 321 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
310 locs->set_in(0, Location::RegisterLocation(R0)); | 322 locs->set_in(0, Location::RegisterLocation(R0)); |
311 locs->set_out(0, Location::RegisterLocation(R0)); | 323 locs->set_out(0, Location::RegisterLocation(R0)); |
312 return locs; | 324 return locs; |
313 } | 325 } |
314 | 326 |
315 | 327 |
316 static void EmitAssertBoolean(Register reg, | 328 static void EmitAssertBoolean(Register reg, |
317 intptr_t token_pos, | 329 intptr_t token_pos, |
318 intptr_t deopt_id, | 330 intptr_t deopt_id, |
319 LocationSummary* locs, | 331 LocationSummary* locs, |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
415 true_condition = FlipCondition(true_condition); | 427 true_condition = FlipCondition(true_condition); |
416 } else if (right.IsConstant()) { | 428 } else if (right.IsConstant()) { |
417 __ CompareObject(left.reg(), right.constant(), PP); | 429 __ CompareObject(left.reg(), right.constant(), PP); |
418 } else { | 430 } else { |
419 __ CompareRegisters(left.reg(), right.reg()); | 431 __ CompareRegisters(left.reg(), right.reg()); |
420 } | 432 } |
421 return true_condition; | 433 return true_condition; |
422 } | 434 } |
423 | 435 |
424 | 436 |
425 LocationSummary* EqualityCompareInstr::MakeLocationSummary(bool opt) const { | 437 LocationSummary* EqualityCompareInstr::MakeLocationSummary(Isolate* isolate, |
| 438 bool opt) const { |
426 const intptr_t kNumInputs = 2; | 439 const intptr_t kNumInputs = 2; |
427 if (operation_cid() == kDoubleCid) { | 440 if (operation_cid() == kDoubleCid) { |
428 const intptr_t kNumTemps = 0; | 441 const intptr_t kNumTemps = 0; |
429 LocationSummary* locs = | 442 LocationSummary* locs = new(isolate) LocationSummary( |
430 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 443 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
431 locs->set_in(0, Location::RequiresFpuRegister()); | 444 locs->set_in(0, Location::RequiresFpuRegister()); |
432 locs->set_in(1, Location::RequiresFpuRegister()); | 445 locs->set_in(1, Location::RequiresFpuRegister()); |
433 locs->set_out(0, Location::RequiresRegister()); | 446 locs->set_out(0, Location::RequiresRegister()); |
434 return locs; | 447 return locs; |
435 } | 448 } |
436 if (operation_cid() == kSmiCid) { | 449 if (operation_cid() == kSmiCid) { |
437 const intptr_t kNumTemps = 0; | 450 const intptr_t kNumTemps = 0; |
438 LocationSummary* locs = | 451 LocationSummary* locs = new(isolate) LocationSummary( |
439 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 452 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
440 locs->set_in(0, Location::RegisterOrConstant(left())); | 453 locs->set_in(0, Location::RegisterOrConstant(left())); |
441 // Only one input can be a constant operand. The case of two constant | 454 // Only one input can be a constant operand. The case of two constant |
442 // operands should be handled by constant propagation. | 455 // operands should be handled by constant propagation. |
443 // Only right can be a stack slot. | 456 // Only right can be a stack slot. |
444 locs->set_in(1, locs->in(0).IsConstant() | 457 locs->set_in(1, locs->in(0).IsConstant() |
445 ? Location::RequiresRegister() | 458 ? Location::RequiresRegister() |
446 : Location::RegisterOrConstant(right())); | 459 : Location::RegisterOrConstant(right())); |
447 locs->set_out(0, Location::RequiresRegister()); | 460 locs->set_out(0, Location::RequiresRegister()); |
448 return locs; | 461 return locs; |
449 } | 462 } |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
521 Condition true_condition = EmitComparisonCode(compiler, labels); | 534 Condition true_condition = EmitComparisonCode(compiler, labels); |
522 if ((operation_cid() == kDoubleCid) && (true_condition != NE)) { | 535 if ((operation_cid() == kDoubleCid) && (true_condition != NE)) { |
523 // Special case for NaN comparison. Result is always false unless | 536 // Special case for NaN comparison. Result is always false unless |
524 // relational operator is !=. | 537 // relational operator is !=. |
525 __ b(labels.false_label, VS); | 538 __ b(labels.false_label, VS); |
526 } | 539 } |
527 EmitBranchOnCondition(compiler, true_condition, labels); | 540 EmitBranchOnCondition(compiler, true_condition, labels); |
528 } | 541 } |
529 | 542 |
530 | 543 |
531 LocationSummary* TestSmiInstr::MakeLocationSummary(bool opt) const { | 544 LocationSummary* TestSmiInstr::MakeLocationSummary(Isolate* isolate, |
| 545 bool opt) const { |
532 const intptr_t kNumInputs = 2; | 546 const intptr_t kNumInputs = 2; |
533 const intptr_t kNumTemps = 0; | 547 const intptr_t kNumTemps = 0; |
534 LocationSummary* locs = | 548 LocationSummary* locs = new(isolate) LocationSummary( |
535 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 549 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
536 locs->set_in(0, Location::RequiresRegister()); | 550 locs->set_in(0, Location::RequiresRegister()); |
537 // Only one input can be a constant operand. The case of two constant | 551 // Only one input can be a constant operand. The case of two constant |
538 // operands should be handled by constant propagation. | 552 // operands should be handled by constant propagation. |
539 locs->set_in(1, Location::RegisterOrConstant(right())); | 553 locs->set_in(1, Location::RegisterOrConstant(right())); |
540 return locs; | 554 return locs; |
541 } | 555 } |
542 | 556 |
543 | 557 |
544 Condition TestSmiInstr::EmitComparisonCode(FlowGraphCompiler* compiler, | 558 Condition TestSmiInstr::EmitComparisonCode(FlowGraphCompiler* compiler, |
545 BranchLabels labels) { | 559 BranchLabels labels) { |
(...skipping 19 matching lines...) Expand all Loading... |
565 | 579 |
566 | 580 |
567 void TestSmiInstr::EmitBranchCode(FlowGraphCompiler* compiler, | 581 void TestSmiInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
568 BranchInstr* branch) { | 582 BranchInstr* branch) { |
569 BranchLabels labels = compiler->CreateBranchLabels(branch); | 583 BranchLabels labels = compiler->CreateBranchLabels(branch); |
570 Condition true_condition = EmitComparisonCode(compiler, labels); | 584 Condition true_condition = EmitComparisonCode(compiler, labels); |
571 EmitBranchOnCondition(compiler, true_condition, labels); | 585 EmitBranchOnCondition(compiler, true_condition, labels); |
572 } | 586 } |
573 | 587 |
574 | 588 |
575 LocationSummary* TestCidsInstr::MakeLocationSummary(bool opt) const { | 589 LocationSummary* TestCidsInstr::MakeLocationSummary(Isolate* isolate, |
| 590 bool opt) const { |
576 const intptr_t kNumInputs = 1; | 591 const intptr_t kNumInputs = 1; |
577 const intptr_t kNumTemps = 1; | 592 const intptr_t kNumTemps = 1; |
578 LocationSummary* locs = | 593 LocationSummary* locs = new(isolate) LocationSummary( |
579 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 594 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
580 locs->set_in(0, Location::RequiresRegister()); | 595 locs->set_in(0, Location::RequiresRegister()); |
581 locs->set_temp(0, Location::RequiresRegister()); | 596 locs->set_temp(0, Location::RequiresRegister()); |
582 locs->set_out(0, Location::RequiresRegister()); | 597 locs->set_out(0, Location::RequiresRegister()); |
583 return locs; | 598 return locs; |
584 } | 599 } |
585 | 600 |
586 | 601 |
587 Condition TestCidsInstr::EmitComparisonCode(FlowGraphCompiler* compiler, | 602 Condition TestCidsInstr::EmitComparisonCode(FlowGraphCompiler* compiler, |
588 BranchLabels labels) { | 603 BranchLabels labels) { |
589 ASSERT((kind() == Token::kIS) || (kind() == Token::kISNOT)); | 604 ASSERT((kind() == Token::kIS) || (kind() == Token::kISNOT)); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
639 // True or False into result. | 654 // True or False into result. |
640 __ Bind(&is_false); | 655 __ Bind(&is_false); |
641 __ LoadObject(result_reg, Bool::False(), PP); | 656 __ LoadObject(result_reg, Bool::False(), PP); |
642 __ b(&done); | 657 __ b(&done); |
643 __ Bind(&is_true); | 658 __ Bind(&is_true); |
644 __ LoadObject(result_reg, Bool::True(), PP); | 659 __ LoadObject(result_reg, Bool::True(), PP); |
645 __ Bind(&done); | 660 __ Bind(&done); |
646 } | 661 } |
647 | 662 |
648 | 663 |
649 LocationSummary* RelationalOpInstr::MakeLocationSummary(bool opt) const { | 664 LocationSummary* RelationalOpInstr::MakeLocationSummary(Isolate* isolate, |
| 665 bool opt) const { |
650 const intptr_t kNumInputs = 2; | 666 const intptr_t kNumInputs = 2; |
651 const intptr_t kNumTemps = 0; | 667 const intptr_t kNumTemps = 0; |
652 if (operation_cid() == kDoubleCid) { | 668 if (operation_cid() == kDoubleCid) { |
653 LocationSummary* summary = | 669 LocationSummary* summary = new(isolate) LocationSummary( |
654 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 670 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
655 summary->set_in(0, Location::RequiresFpuRegister()); | 671 summary->set_in(0, Location::RequiresFpuRegister()); |
656 summary->set_in(1, Location::RequiresFpuRegister()); | 672 summary->set_in(1, Location::RequiresFpuRegister()); |
657 summary->set_out(0, Location::RequiresRegister()); | 673 summary->set_out(0, Location::RequiresRegister()); |
658 return summary; | 674 return summary; |
659 } | 675 } |
660 ASSERT(operation_cid() == kSmiCid); | 676 ASSERT(operation_cid() == kSmiCid); |
661 LocationSummary* summary = | 677 LocationSummary* summary = new(isolate) LocationSummary( |
662 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 678 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
663 summary->set_in(0, Location::RegisterOrConstant(left())); | 679 summary->set_in(0, Location::RegisterOrConstant(left())); |
664 // Only one input can be a constant operand. The case of two constant | 680 // Only one input can be a constant operand. The case of two constant |
665 // operands should be handled by constant propagation. | 681 // operands should be handled by constant propagation. |
666 summary->set_in(1, summary->in(0).IsConstant() | 682 summary->set_in(1, summary->in(0).IsConstant() |
667 ? Location::RequiresRegister() | 683 ? Location::RequiresRegister() |
668 : Location::RegisterOrConstant(right())); | 684 : Location::RegisterOrConstant(right())); |
669 summary->set_out(0, Location::RequiresRegister()); | 685 summary->set_out(0, Location::RequiresRegister()); |
670 return summary; | 686 return summary; |
671 } | 687 } |
672 | 688 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
711 Condition true_condition = EmitComparisonCode(compiler, labels); | 727 Condition true_condition = EmitComparisonCode(compiler, labels); |
712 if ((operation_cid() == kDoubleCid) && (true_condition != NE)) { | 728 if ((operation_cid() == kDoubleCid) && (true_condition != NE)) { |
713 // Special case for NaN comparison. Result is always false unless | 729 // Special case for NaN comparison. Result is always false unless |
714 // relational operator is !=. | 730 // relational operator is !=. |
715 __ b(labels.false_label, VS); | 731 __ b(labels.false_label, VS); |
716 } | 732 } |
717 EmitBranchOnCondition(compiler, true_condition, labels); | 733 EmitBranchOnCondition(compiler, true_condition, labels); |
718 } | 734 } |
719 | 735 |
720 | 736 |
721 LocationSummary* NativeCallInstr::MakeLocationSummary(bool opt) const { | 737 LocationSummary* NativeCallInstr::MakeLocationSummary(Isolate* isolate, |
| 738 bool opt) const { |
722 const intptr_t kNumInputs = 0; | 739 const intptr_t kNumInputs = 0; |
723 const intptr_t kNumTemps = 3; | 740 const intptr_t kNumTemps = 3; |
724 LocationSummary* locs = | 741 LocationSummary* locs = new(isolate) LocationSummary( |
725 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 742 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
726 locs->set_temp(0, Location::RegisterLocation(R1)); | 743 locs->set_temp(0, Location::RegisterLocation(R1)); |
727 locs->set_temp(1, Location::RegisterLocation(R2)); | 744 locs->set_temp(1, Location::RegisterLocation(R2)); |
728 locs->set_temp(2, Location::RegisterLocation(R5)); | 745 locs->set_temp(2, Location::RegisterLocation(R5)); |
729 locs->set_out(0, Location::RegisterLocation(R0)); | 746 locs->set_out(0, Location::RegisterLocation(R0)); |
730 return locs; | 747 return locs; |
731 } | 748 } |
732 | 749 |
733 | 750 |
734 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 751 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
735 ASSERT(locs()->temp(0).reg() == R1); | 752 ASSERT(locs()->temp(0).reg() == R1); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
772 __ LoadImmediate(R5, entry, PP); | 789 __ LoadImmediate(R5, entry, PP); |
773 __ LoadImmediate(R1, NativeArguments::ComputeArgcTag(function()), PP); | 790 __ LoadImmediate(R1, NativeArguments::ComputeArgcTag(function()), PP); |
774 compiler->GenerateCall(token_pos(), | 791 compiler->GenerateCall(token_pos(), |
775 stub_entry, | 792 stub_entry, |
776 PcDescriptors::kOther, | 793 PcDescriptors::kOther, |
777 locs()); | 794 locs()); |
778 __ Pop(result); | 795 __ Pop(result); |
779 } | 796 } |
780 | 797 |
781 | 798 |
782 LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(bool opt) const { | 799 LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(Isolate* isolate, |
| 800 bool opt) const { |
783 const intptr_t kNumInputs = 1; | 801 const intptr_t kNumInputs = 1; |
784 // TODO(fschneider): Allow immediate operands for the char code. | 802 // TODO(fschneider): Allow immediate operands for the char code. |
785 return LocationSummary::Make(kNumInputs, | 803 return LocationSummary::Make(kNumInputs, |
786 Location::RequiresRegister(), | 804 Location::RequiresRegister(), |
787 LocationSummary::kNoCall); | 805 LocationSummary::kNoCall); |
788 } | 806 } |
789 | 807 |
790 | 808 |
791 void StringFromCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 809 void StringFromCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
792 const Register char_code = locs()->in(0).reg(); | 810 const Register char_code = locs()->in(0).reg(); |
793 const Register result = locs()->out(0).reg(); | 811 const Register result = locs()->out(0).reg(); |
794 __ LoadImmediate( | 812 __ LoadImmediate( |
795 result, reinterpret_cast<uword>(Symbols::PredefinedAddress()), PP); | 813 result, reinterpret_cast<uword>(Symbols::PredefinedAddress()), PP); |
796 __ AddImmediate( | 814 __ AddImmediate( |
797 result, result, Symbols::kNullCharCodeSymbolOffset * kWordSize, PP); | 815 result, result, Symbols::kNullCharCodeSymbolOffset * kWordSize, PP); |
798 __ Asr(TMP, char_code, kSmiTagShift); // Untag to use scaled adress mode. | 816 __ Asr(TMP, char_code, kSmiTagShift); // Untag to use scaled adress mode. |
799 __ ldr(result, Address(result, TMP, UXTX, Address::Scaled)); | 817 __ ldr(result, Address(result, TMP, UXTX, Address::Scaled)); |
800 } | 818 } |
801 | 819 |
802 | 820 |
803 LocationSummary* StringToCharCodeInstr::MakeLocationSummary(bool opt) const { | 821 LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Isolate* isolate, |
| 822 bool opt) const { |
804 const intptr_t kNumInputs = 1; | 823 const intptr_t kNumInputs = 1; |
805 return LocationSummary::Make(kNumInputs, | 824 return LocationSummary::Make(kNumInputs, |
806 Location::RequiresRegister(), | 825 Location::RequiresRegister(), |
807 LocationSummary::kNoCall); | 826 LocationSummary::kNoCall); |
808 } | 827 } |
809 | 828 |
810 | 829 |
811 void StringToCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 830 void StringToCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
812 ASSERT(cid_ == kOneByteStringCid); | 831 ASSERT(cid_ == kOneByteStringCid); |
813 const Register str = locs()->in(0).reg(); | 832 const Register str = locs()->in(0).reg(); |
814 const Register result = locs()->out(0).reg(); | 833 const Register result = locs()->out(0).reg(); |
815 __ LoadFieldFromOffset(result, str, String::length_offset(), PP); | 834 __ LoadFieldFromOffset(result, str, String::length_offset(), PP); |
816 __ ldr(TMP, FieldAddress(str, OneByteString::data_offset()), kUnsignedByte); | 835 __ ldr(TMP, FieldAddress(str, OneByteString::data_offset()), kUnsignedByte); |
817 __ CompareImmediate(result, Smi::RawValue(1), PP); | 836 __ CompareImmediate(result, Smi::RawValue(1), PP); |
818 __ LoadImmediate(result, -1, PP); | 837 __ LoadImmediate(result, -1, PP); |
819 __ csel(result, TMP, result, EQ); | 838 __ csel(result, TMP, result, EQ); |
820 __ SmiTag(result); | 839 __ SmiTag(result); |
821 } | 840 } |
822 | 841 |
823 | 842 |
824 LocationSummary* StringInterpolateInstr::MakeLocationSummary(bool opt) const { | 843 LocationSummary* StringInterpolateInstr::MakeLocationSummary(Isolate* isolate, |
| 844 bool opt) const { |
825 const intptr_t kNumInputs = 1; | 845 const intptr_t kNumInputs = 1; |
826 const intptr_t kNumTemps = 0; | 846 const intptr_t kNumTemps = 0; |
827 LocationSummary* summary = | 847 LocationSummary* summary = new(isolate) LocationSummary( |
828 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 848 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
829 summary->set_in(0, Location::RegisterLocation(R0)); | 849 summary->set_in(0, Location::RegisterLocation(R0)); |
830 summary->set_out(0, Location::RegisterLocation(R0)); | 850 summary->set_out(0, Location::RegisterLocation(R0)); |
831 return summary; | 851 return summary; |
832 } | 852 } |
833 | 853 |
834 | 854 |
835 void StringInterpolateInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 855 void StringInterpolateInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
836 const Register array = locs()->in(0).reg(); | 856 const Register array = locs()->in(0).reg(); |
837 __ Push(array); | 857 __ Push(array); |
838 const int kNumberOfArguments = 1; | 858 const int kNumberOfArguments = 1; |
839 const Array& kNoArgumentNames = Object::null_array(); | 859 const Array& kNoArgumentNames = Object::null_array(); |
840 compiler->GenerateStaticCall(deopt_id(), | 860 compiler->GenerateStaticCall(deopt_id(), |
841 token_pos(), | 861 token_pos(), |
842 CallFunction(), | 862 CallFunction(), |
843 kNumberOfArguments, | 863 kNumberOfArguments, |
844 kNoArgumentNames, | 864 kNoArgumentNames, |
845 locs()); | 865 locs()); |
846 ASSERT(locs()->out(0).reg() == R0); | 866 ASSERT(locs()->out(0).reg() == R0); |
847 } | 867 } |
848 | 868 |
849 | 869 |
850 LocationSummary* LoadUntaggedInstr::MakeLocationSummary(bool opt) const { | 870 LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Isolate* isolate, |
| 871 bool opt) const { |
851 const intptr_t kNumInputs = 1; | 872 const intptr_t kNumInputs = 1; |
852 return LocationSummary::Make(kNumInputs, | 873 return LocationSummary::Make(kNumInputs, |
853 Location::RequiresRegister(), | 874 Location::RequiresRegister(), |
854 LocationSummary::kNoCall); | 875 LocationSummary::kNoCall); |
855 } | 876 } |
856 | 877 |
857 | 878 |
858 void LoadUntaggedInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 879 void LoadUntaggedInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
859 const Register object = locs()->in(0).reg(); | 880 const Register object = locs()->in(0).reg(); |
860 const Register result = locs()->out(0).reg(); | 881 const Register result = locs()->out(0).reg(); |
861 __ LoadFieldFromOffset(result, object, offset(), PP); | 882 __ LoadFieldFromOffset(result, object, offset(), PP); |
862 } | 883 } |
863 | 884 |
864 | 885 |
865 LocationSummary* LoadClassIdInstr::MakeLocationSummary(bool opt) const { | 886 LocationSummary* LoadClassIdInstr::MakeLocationSummary(Isolate* isolate, |
| 887 bool opt) const { |
866 const intptr_t kNumInputs = 1; | 888 const intptr_t kNumInputs = 1; |
867 return LocationSummary::Make(kNumInputs, | 889 return LocationSummary::Make(kNumInputs, |
868 Location::RequiresRegister(), | 890 Location::RequiresRegister(), |
869 LocationSummary::kNoCall); | 891 LocationSummary::kNoCall); |
870 } | 892 } |
871 | 893 |
872 | 894 |
873 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 895 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
874 const Register object = locs()->in(0).reg(); | 896 const Register object = locs()->in(0).reg(); |
875 const Register result = locs()->out(0).reg(); | 897 const Register result = locs()->out(0).reg(); |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
946 return kUnboxedFloat32x4; | 968 return kUnboxedFloat32x4; |
947 case kTypedDataFloat64x2ArrayCid: | 969 case kTypedDataFloat64x2ArrayCid: |
948 return kUnboxedFloat64x2; | 970 return kUnboxedFloat64x2; |
949 default: | 971 default: |
950 UNIMPLEMENTED(); | 972 UNIMPLEMENTED(); |
951 return kTagged; | 973 return kTagged; |
952 } | 974 } |
953 } | 975 } |
954 | 976 |
955 | 977 |
956 LocationSummary* LoadIndexedInstr::MakeLocationSummary(bool opt) const { | 978 LocationSummary* LoadIndexedInstr::MakeLocationSummary(Isolate* isolate, |
| 979 bool opt) const { |
957 const intptr_t kNumInputs = 2; | 980 const intptr_t kNumInputs = 2; |
958 const intptr_t kNumTemps = 0; | 981 const intptr_t kNumTemps = 0; |
959 LocationSummary* locs = | 982 LocationSummary* locs = new(isolate) LocationSummary( |
960 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 983 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
961 locs->set_in(0, Location::RequiresRegister()); | 984 locs->set_in(0, Location::RequiresRegister()); |
962 // The smi index is either untagged (element size == 1), or it is left smi | 985 // The smi index is either untagged (element size == 1), or it is left smi |
963 // tagged (for all element sizes > 1). | 986 // tagged (for all element sizes > 1). |
964 // TODO(regis): Revisit and see if the index can be immediate. | 987 // TODO(regis): Revisit and see if the index can be immediate. |
965 locs->set_in(1, Location::WritableRegister()); | 988 locs->set_in(1, Location::WritableRegister()); |
966 if ((representation() == kUnboxedDouble) || | 989 if ((representation() == kUnboxedDouble) || |
967 (representation() == kUnboxedFloat32x4) || | 990 (representation() == kUnboxedFloat32x4) || |
968 (representation() == kUnboxedInt32x4) || | 991 (representation() == kUnboxedInt32x4) || |
969 (representation() == kUnboxedFloat64x2)) { | 992 (representation() == kUnboxedFloat64x2)) { |
970 locs->set_out(0, Location::RequiresFpuRegister()); | 993 locs->set_out(0, Location::RequiresFpuRegister()); |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1114 return kUnboxedInt32x4; | 1137 return kUnboxedInt32x4; |
1115 case kTypedDataFloat64x2ArrayCid: | 1138 case kTypedDataFloat64x2ArrayCid: |
1116 return kUnboxedFloat64x2; | 1139 return kUnboxedFloat64x2; |
1117 default: | 1140 default: |
1118 UNREACHABLE(); | 1141 UNREACHABLE(); |
1119 return kTagged; | 1142 return kTagged; |
1120 } | 1143 } |
1121 } | 1144 } |
1122 | 1145 |
1123 | 1146 |
1124 LocationSummary* StoreIndexedInstr::MakeLocationSummary(bool opt) const { | 1147 LocationSummary* StoreIndexedInstr::MakeLocationSummary(Isolate* isolate, |
| 1148 bool opt) const { |
1125 const intptr_t kNumInputs = 3; | 1149 const intptr_t kNumInputs = 3; |
1126 const intptr_t kNumTemps = 0; | 1150 const intptr_t kNumTemps = 0; |
1127 LocationSummary* locs = | 1151 LocationSummary* locs = new(isolate) LocationSummary( |
1128 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 1152 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
1129 locs->set_in(0, Location::RequiresRegister()); | 1153 locs->set_in(0, Location::RequiresRegister()); |
1130 // The smi index is either untagged (element size == 1), or it is left smi | 1154 // The smi index is either untagged (element size == 1), or it is left smi |
1131 // tagged (for all element sizes > 1). | 1155 // tagged (for all element sizes > 1). |
1132 // TODO(regis): Revisit and see if the index can be immediate. | 1156 // TODO(regis): Revisit and see if the index can be immediate. |
1133 locs->set_in(1, Location::WritableRegister()); | 1157 locs->set_in(1, Location::WritableRegister()); |
1134 switch (class_id()) { | 1158 switch (class_id()) { |
1135 case kArrayCid: | 1159 case kArrayCid: |
1136 locs->set_in(2, ShouldEmitStoreBarrier() | 1160 locs->set_in(2, ShouldEmitStoreBarrier() |
1137 ? Location::WritableRegister() | 1161 ? Location::WritableRegister() |
1138 : Location::RegisterOrConstant(value())); | 1162 : Location::RegisterOrConstant(value())); |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1326 if (value_is_smi == NULL) { | 1350 if (value_is_smi == NULL) { |
1327 __ b(&done, EQ); | 1351 __ b(&done, EQ); |
1328 } else { | 1352 } else { |
1329 __ b(value_is_smi, EQ); | 1353 __ b(value_is_smi, EQ); |
1330 } | 1354 } |
1331 __ LoadClassId(value_cid_reg, value_reg, PP); | 1355 __ LoadClassId(value_cid_reg, value_reg, PP); |
1332 __ Bind(&done); | 1356 __ Bind(&done); |
1333 } | 1357 } |
1334 | 1358 |
1335 | 1359 |
1336 LocationSummary* GuardFieldInstr::MakeLocationSummary(bool opt) const { | 1360 LocationSummary* GuardFieldInstr::MakeLocationSummary(Isolate* isolate, |
| 1361 bool opt) const { |
1337 const intptr_t kNumInputs = 1; | 1362 const intptr_t kNumInputs = 1; |
1338 LocationSummary* summary = | 1363 LocationSummary* summary = new(isolate) LocationSummary( |
1339 new LocationSummary(kNumInputs, 0, LocationSummary::kNoCall); | 1364 isolate, kNumInputs, 0, LocationSummary::kNoCall); |
1340 summary->set_in(0, Location::RequiresRegister()); | 1365 summary->set_in(0, Location::RequiresRegister()); |
1341 const bool field_has_length = field().needs_length_check(); | 1366 const bool field_has_length = field().needs_length_check(); |
1342 summary->AddTemp(Location::RequiresRegister()); | 1367 summary->AddTemp(Location::RequiresRegister()); |
1343 summary->AddTemp(Location::RequiresRegister()); | 1368 summary->AddTemp(Location::RequiresRegister()); |
1344 const bool need_field_temp_reg = | 1369 const bool need_field_temp_reg = |
1345 field_has_length || (field().guarded_cid() == kIllegalCid); | 1370 field_has_length || (field().guarded_cid() == kIllegalCid); |
1346 if (need_field_temp_reg) { | 1371 if (need_field_temp_reg) { |
1347 summary->AddTemp(Location::RequiresRegister()); | 1372 summary->AddTemp(Location::RequiresRegister()); |
1348 } | 1373 } |
1349 return summary; | 1374 return summary; |
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1679 | 1704 |
1680 __ b(exit_label()); | 1705 __ b(exit_label()); |
1681 } | 1706 } |
1682 | 1707 |
1683 private: | 1708 private: |
1684 StoreInstanceFieldInstr* instruction_; | 1709 StoreInstanceFieldInstr* instruction_; |
1685 const Class& cls_; | 1710 const Class& cls_; |
1686 }; | 1711 }; |
1687 | 1712 |
1688 | 1713 |
1689 LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(bool opt) const { | 1714 LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(Isolate* isolate, |
| 1715 bool opt) const { |
1690 const intptr_t kNumInputs = 2; | 1716 const intptr_t kNumInputs = 2; |
1691 const intptr_t kNumTemps = 0; | 1717 const intptr_t kNumTemps = 0; |
1692 LocationSummary* summary = | 1718 LocationSummary* summary = new(isolate) LocationSummary( |
1693 new LocationSummary(kNumInputs, kNumTemps, | 1719 isolate, kNumInputs, kNumTemps, |
1694 !field().IsNull() && | 1720 !field().IsNull() && |
1695 ((field().guarded_cid() == kIllegalCid) || is_initialization_) | 1721 ((field().guarded_cid() == kIllegalCid) || is_initialization_) |
1696 ? LocationSummary::kCallOnSlowPath | 1722 ? LocationSummary::kCallOnSlowPath |
1697 : LocationSummary::kNoCall); | 1723 : LocationSummary::kNoCall); |
1698 | 1724 |
1699 summary->set_in(0, Location::RequiresRegister()); | 1725 summary->set_in(0, Location::RequiresRegister()); |
1700 if (IsUnboxedStore() && opt) { | 1726 if (IsUnboxedStore() && opt) { |
1701 summary->set_in(1, Location::RequiresFpuRegister()); | 1727 summary->set_in(1, Location::RequiresFpuRegister()); |
1702 summary->AddTemp(Location::RequiresRegister()); | 1728 summary->AddTemp(Location::RequiresRegister()); |
1703 summary->AddTemp(Location::RequiresRegister()); | 1729 summary->AddTemp(Location::RequiresRegister()); |
1704 } else if (IsPotentialUnboxedStore()) { | 1730 } else if (IsPotentialUnboxedStore()) { |
1705 summary->set_in(1, ShouldEmitStoreBarrier() | 1731 summary->set_in(1, ShouldEmitStoreBarrier() |
1706 ? Location::WritableRegister() | 1732 ? Location::WritableRegister() |
1707 : Location::RequiresRegister()); | 1733 : Location::RequiresRegister()); |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1911 instance_reg, | 1937 instance_reg, |
1912 offset_in_bytes_, | 1938 offset_in_bytes_, |
1913 value_reg, | 1939 value_reg, |
1914 PP); | 1940 PP); |
1915 } | 1941 } |
1916 } | 1942 } |
1917 __ Bind(&skip_store); | 1943 __ Bind(&skip_store); |
1918 } | 1944 } |
1919 | 1945 |
1920 | 1946 |
1921 LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(bool opt) const { | 1947 LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(Isolate* isolate, |
| 1948 bool opt) const { |
1922 const intptr_t kNumInputs = 1; | 1949 const intptr_t kNumInputs = 1; |
1923 const intptr_t kNumTemps = 0; | 1950 const intptr_t kNumTemps = 0; |
1924 LocationSummary* summary = | 1951 LocationSummary* summary = new(isolate) LocationSummary( |
1925 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 1952 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
1926 summary->set_in(0, Location::RequiresRegister()); | 1953 summary->set_in(0, Location::RequiresRegister()); |
1927 summary->set_out(0, Location::RequiresRegister()); | 1954 summary->set_out(0, Location::RequiresRegister()); |
1928 return summary; | 1955 return summary; |
1929 } | 1956 } |
1930 | 1957 |
1931 | 1958 |
1932 // When the parser is building an implicit static getter for optimization, | 1959 // When the parser is building an implicit static getter for optimization, |
1933 // it can generate a function body where deoptimization ids do not line up | 1960 // it can generate a function body where deoptimization ids do not line up |
1934 // with the unoptimized code. | 1961 // with the unoptimized code. |
1935 // | 1962 // |
1936 // This is safe only so long as LoadStaticFieldInstr cannot deoptimize. | 1963 // This is safe only so long as LoadStaticFieldInstr cannot deoptimize. |
1937 void LoadStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 1964 void LoadStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
1938 const Register field = locs()->in(0).reg(); | 1965 const Register field = locs()->in(0).reg(); |
1939 const Register result = locs()->out(0).reg(); | 1966 const Register result = locs()->out(0).reg(); |
1940 __ LoadFieldFromOffset(result, field, Field::value_offset(), PP); | 1967 __ LoadFieldFromOffset(result, field, Field::value_offset(), PP); |
1941 } | 1968 } |
1942 | 1969 |
1943 | 1970 |
1944 LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(bool opt) const { | 1971 LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Isolate* isolate, |
1945 LocationSummary* locs = new LocationSummary(1, 1, LocationSummary::kNoCall); | 1972 bool opt) const { |
| 1973 LocationSummary* locs = new(isolate) LocationSummary( |
| 1974 isolate, 1, 1, LocationSummary::kNoCall); |
1946 locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister() | 1975 locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister() |
1947 : Location::RequiresRegister()); | 1976 : Location::RequiresRegister()); |
1948 locs->set_temp(0, Location::RequiresRegister()); | 1977 locs->set_temp(0, Location::RequiresRegister()); |
1949 return locs; | 1978 return locs; |
1950 } | 1979 } |
1951 | 1980 |
1952 | 1981 |
1953 void StoreStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 1982 void StoreStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
1954 const Register value = locs()->in(0).reg(); | 1983 const Register value = locs()->in(0).reg(); |
1955 const Register temp = locs()->temp(0).reg(); | 1984 const Register temp = locs()->temp(0).reg(); |
1956 | 1985 |
1957 __ LoadObject(temp, field(), PP); | 1986 __ LoadObject(temp, field(), PP); |
1958 if (this->value()->NeedsStoreBuffer()) { | 1987 if (this->value()->NeedsStoreBuffer()) { |
1959 __ StoreIntoObjectOffset( | 1988 __ StoreIntoObjectOffset( |
1960 temp, Field::value_offset(), value, PP, CanValueBeSmi()); | 1989 temp, Field::value_offset(), value, PP, CanValueBeSmi()); |
1961 } else { | 1990 } else { |
1962 __ StoreIntoObjectOffsetNoBarrier(temp, Field::value_offset(), value, PP); | 1991 __ StoreIntoObjectOffsetNoBarrier(temp, Field::value_offset(), value, PP); |
1963 } | 1992 } |
1964 } | 1993 } |
1965 | 1994 |
1966 | 1995 |
1967 LocationSummary* InstanceOfInstr::MakeLocationSummary(bool opt) const { | 1996 LocationSummary* InstanceOfInstr::MakeLocationSummary(Isolate* isolate, |
| 1997 bool opt) const { |
1968 const intptr_t kNumInputs = 3; | 1998 const intptr_t kNumInputs = 3; |
1969 const intptr_t kNumTemps = 0; | 1999 const intptr_t kNumTemps = 0; |
1970 LocationSummary* summary = | 2000 LocationSummary* summary = new(isolate) LocationSummary( |
1971 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 2001 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
1972 summary->set_in(0, Location::RegisterLocation(R0)); | 2002 summary->set_in(0, Location::RegisterLocation(R0)); |
1973 summary->set_in(1, Location::RegisterLocation(R2)); | 2003 summary->set_in(1, Location::RegisterLocation(R2)); |
1974 summary->set_in(2, Location::RegisterLocation(R1)); | 2004 summary->set_in(2, Location::RegisterLocation(R1)); |
1975 summary->set_out(0, Location::RegisterLocation(R0)); | 2005 summary->set_out(0, Location::RegisterLocation(R0)); |
1976 return summary; | 2006 return summary; |
1977 } | 2007 } |
1978 | 2008 |
1979 | 2009 |
1980 void InstanceOfInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2010 void InstanceOfInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
1981 ASSERT(locs()->in(0).reg() == R0); // Value. | 2011 ASSERT(locs()->in(0).reg() == R0); // Value. |
1982 ASSERT(locs()->in(1).reg() == R2); // Instantiator. | 2012 ASSERT(locs()->in(1).reg() == R2); // Instantiator. |
1983 ASSERT(locs()->in(2).reg() == R1); // Instantiator type arguments. | 2013 ASSERT(locs()->in(2).reg() == R1); // Instantiator type arguments. |
1984 | 2014 |
1985 compiler->GenerateInstanceOf(token_pos(), | 2015 compiler->GenerateInstanceOf(token_pos(), |
1986 deopt_id(), | 2016 deopt_id(), |
1987 type(), | 2017 type(), |
1988 negate_result(), | 2018 negate_result(), |
1989 locs()); | 2019 locs()); |
1990 ASSERT(locs()->out(0).reg() == R0); | 2020 ASSERT(locs()->out(0).reg() == R0); |
1991 } | 2021 } |
1992 | 2022 |
1993 | 2023 |
1994 LocationSummary* CreateArrayInstr::MakeLocationSummary(bool opt) const { | 2024 LocationSummary* CreateArrayInstr::MakeLocationSummary(Isolate* isolate, |
| 2025 bool opt) const { |
1995 const intptr_t kNumInputs = 2; | 2026 const intptr_t kNumInputs = 2; |
1996 const intptr_t kNumTemps = 0; | 2027 const intptr_t kNumTemps = 0; |
1997 LocationSummary* locs = | 2028 LocationSummary* locs = new(isolate) LocationSummary( |
1998 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 2029 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
1999 locs->set_in(kElementTypePos, Location::RegisterLocation(R1)); | 2030 locs->set_in(kElementTypePos, Location::RegisterLocation(R1)); |
2000 locs->set_in(kLengthPos, Location::RegisterLocation(R2)); | 2031 locs->set_in(kLengthPos, Location::RegisterLocation(R2)); |
2001 locs->set_out(0, Location::RegisterLocation(R0)); | 2032 locs->set_out(0, Location::RegisterLocation(R0)); |
2002 return locs; | 2033 return locs; |
2003 } | 2034 } |
2004 | 2035 |
2005 | 2036 |
2006 void CreateArrayInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2037 void CreateArrayInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2007 // Allocate the array. R2 = length, R1 = element type. | 2038 // Allocate the array. R2 = length, R1 = element type. |
2008 ASSERT(locs()->in(kElementTypePos).reg() == R1); | 2039 ASSERT(locs()->in(kElementTypePos).reg() == R1); |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2104 compiler->RestoreLiveRegisters(locs); | 2135 compiler->RestoreLiveRegisters(locs); |
2105 | 2136 |
2106 __ b(exit_label()); | 2137 __ b(exit_label()); |
2107 } | 2138 } |
2108 | 2139 |
2109 private: | 2140 private: |
2110 Instruction* instruction_; | 2141 Instruction* instruction_; |
2111 }; | 2142 }; |
2112 | 2143 |
2113 | 2144 |
2114 LocationSummary* LoadFieldInstr::MakeLocationSummary(bool opt) const { | 2145 LocationSummary* LoadFieldInstr::MakeLocationSummary(Isolate* isolate, |
| 2146 bool opt) const { |
2115 const intptr_t kNumInputs = 1; | 2147 const intptr_t kNumInputs = 1; |
2116 const intptr_t kNumTemps = 0; | 2148 const intptr_t kNumTemps = 0; |
2117 LocationSummary* locs = | 2149 LocationSummary* locs = new(isolate) LocationSummary( |
2118 new LocationSummary( | 2150 isolate, kNumInputs, kNumTemps, |
2119 kNumInputs, kNumTemps, | 2151 (opt && !IsPotentialUnboxedLoad()) |
2120 (opt && !IsPotentialUnboxedLoad()) | |
2121 ? LocationSummary::kNoCall | 2152 ? LocationSummary::kNoCall |
2122 : LocationSummary::kCallOnSlowPath); | 2153 : LocationSummary::kCallOnSlowPath); |
2123 | 2154 |
2124 locs->set_in(0, Location::RequiresRegister()); | 2155 locs->set_in(0, Location::RequiresRegister()); |
2125 | 2156 |
2126 if (IsUnboxedLoad() && opt) { | 2157 if (IsUnboxedLoad() && opt) { |
2127 locs->AddTemp(Location::RequiresRegister()); | 2158 locs->AddTemp(Location::RequiresRegister()); |
2128 } else if (IsPotentialUnboxedLoad()) { | 2159 } else if (IsPotentialUnboxedLoad()) { |
2129 locs->AddTemp(Location::RequiresRegister()); | 2160 locs->AddTemp(Location::RequiresRegister()); |
2130 } | 2161 } |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2244 __ b(&done); | 2275 __ b(&done); |
2245 } | 2276 } |
2246 | 2277 |
2247 __ Bind(&load_pointer); | 2278 __ Bind(&load_pointer); |
2248 } | 2279 } |
2249 __ LoadFieldFromOffset(result_reg, instance_reg, offset_in_bytes(), PP); | 2280 __ LoadFieldFromOffset(result_reg, instance_reg, offset_in_bytes(), PP); |
2250 __ Bind(&done); | 2281 __ Bind(&done); |
2251 } | 2282 } |
2252 | 2283 |
2253 | 2284 |
2254 LocationSummary* InstantiateTypeInstr::MakeLocationSummary(bool opt) const { | 2285 LocationSummary* InstantiateTypeInstr::MakeLocationSummary(Isolate* isolate, |
| 2286 bool opt) const { |
2255 const intptr_t kNumInputs = 1; | 2287 const intptr_t kNumInputs = 1; |
2256 const intptr_t kNumTemps = 0; | 2288 const intptr_t kNumTemps = 0; |
2257 LocationSummary* locs = | 2289 LocationSummary* locs = new(isolate) LocationSummary( |
2258 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 2290 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
2259 locs->set_in(0, Location::RegisterLocation(R0)); | 2291 locs->set_in(0, Location::RegisterLocation(R0)); |
2260 locs->set_out(0, Location::RegisterLocation(R0)); | 2292 locs->set_out(0, Location::RegisterLocation(R0)); |
2261 return locs; | 2293 return locs; |
2262 } | 2294 } |
2263 | 2295 |
2264 | 2296 |
2265 void InstantiateTypeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2297 void InstantiateTypeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2266 const Register instantiator_reg = locs()->in(0).reg(); | 2298 const Register instantiator_reg = locs()->in(0).reg(); |
2267 const Register result_reg = locs()->out(0).reg(); | 2299 const Register result_reg = locs()->out(0).reg(); |
2268 | 2300 |
2269 // 'instantiator_reg' is the instantiator TypeArguments object (or null). | 2301 // 'instantiator_reg' is the instantiator TypeArguments object (or null). |
2270 // A runtime call to instantiate the type is required. | 2302 // A runtime call to instantiate the type is required. |
2271 __ PushObject(Object::ZoneHandle(), PP); // Make room for the result. | 2303 __ PushObject(Object::ZoneHandle(), PP); // Make room for the result. |
2272 __ PushObject(type(), PP); | 2304 __ PushObject(type(), PP); |
2273 __ Push(instantiator_reg); // Push instantiator type arguments. | 2305 __ Push(instantiator_reg); // Push instantiator type arguments. |
2274 compiler->GenerateRuntimeCall(token_pos(), | 2306 compiler->GenerateRuntimeCall(token_pos(), |
2275 deopt_id(), | 2307 deopt_id(), |
2276 kInstantiateTypeRuntimeEntry, | 2308 kInstantiateTypeRuntimeEntry, |
2277 2, | 2309 2, |
2278 locs()); | 2310 locs()); |
2279 __ Drop(2); // Drop instantiator and uninstantiated type. | 2311 __ Drop(2); // Drop instantiator and uninstantiated type. |
2280 __ Pop(result_reg); // Pop instantiated type. | 2312 __ Pop(result_reg); // Pop instantiated type. |
2281 ASSERT(instantiator_reg == result_reg); | 2313 ASSERT(instantiator_reg == result_reg); |
2282 } | 2314 } |
2283 | 2315 |
2284 | 2316 |
2285 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary( | 2317 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary( |
2286 bool opt) const { | 2318 Isolate* isolate, bool opt) const { |
2287 const intptr_t kNumInputs = 1; | 2319 const intptr_t kNumInputs = 1; |
2288 const intptr_t kNumTemps = 0; | 2320 const intptr_t kNumTemps = 0; |
2289 LocationSummary* locs = | 2321 LocationSummary* locs = new(isolate) LocationSummary( |
2290 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 2322 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
2291 locs->set_in(0, Location::RegisterLocation(R0)); | 2323 locs->set_in(0, Location::RegisterLocation(R0)); |
2292 locs->set_out(0, Location::RegisterLocation(R0)); | 2324 locs->set_out(0, Location::RegisterLocation(R0)); |
2293 return locs; | 2325 return locs; |
2294 } | 2326 } |
2295 | 2327 |
2296 | 2328 |
2297 void InstantiateTypeArgumentsInstr::EmitNativeCode( | 2329 void InstantiateTypeArgumentsInstr::EmitNativeCode( |
2298 FlowGraphCompiler* compiler) { | 2330 FlowGraphCompiler* compiler) { |
2299 const Register instantiator_reg = locs()->in(0).reg(); | 2331 const Register instantiator_reg = locs()->in(0).reg(); |
2300 const Register result_reg = locs()->out(0).reg(); | 2332 const Register result_reg = locs()->out(0).reg(); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2343 deopt_id(), | 2375 deopt_id(), |
2344 kInstantiateTypeArgumentsRuntimeEntry, | 2376 kInstantiateTypeArgumentsRuntimeEntry, |
2345 2, | 2377 2, |
2346 locs()); | 2378 locs()); |
2347 __ Drop(2); // Drop instantiator and uninstantiated type arguments. | 2379 __ Drop(2); // Drop instantiator and uninstantiated type arguments. |
2348 __ Pop(result_reg); // Pop instantiated type arguments. | 2380 __ Pop(result_reg); // Pop instantiated type arguments. |
2349 __ Bind(&type_arguments_instantiated); | 2381 __ Bind(&type_arguments_instantiated); |
2350 } | 2382 } |
2351 | 2383 |
2352 | 2384 |
2353 LocationSummary* AllocateContextInstr::MakeLocationSummary(bool opt) const { | 2385 LocationSummary* AllocateContextInstr::MakeLocationSummary(Isolate* isolate, |
| 2386 bool opt) const { |
2354 const intptr_t kNumInputs = 0; | 2387 const intptr_t kNumInputs = 0; |
2355 const intptr_t kNumTemps = 1; | 2388 const intptr_t kNumTemps = 1; |
2356 LocationSummary* locs = | 2389 LocationSummary* locs = new(isolate) LocationSummary( |
2357 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 2390 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
2358 locs->set_temp(0, Location::RegisterLocation(R1)); | 2391 locs->set_temp(0, Location::RegisterLocation(R1)); |
2359 locs->set_out(0, Location::RegisterLocation(R0)); | 2392 locs->set_out(0, Location::RegisterLocation(R0)); |
2360 return locs; | 2393 return locs; |
2361 } | 2394 } |
2362 | 2395 |
2363 | 2396 |
2364 void AllocateContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2397 void AllocateContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2365 ASSERT(locs()->temp(0).reg() == R1); | 2398 ASSERT(locs()->temp(0).reg() == R1); |
2366 ASSERT(locs()->out(0).reg() == R0); | 2399 ASSERT(locs()->out(0).reg() == R0); |
2367 | 2400 |
2368 __ LoadImmediate(R1, num_context_variables(), PP); | 2401 __ LoadImmediate(R1, num_context_variables(), PP); |
2369 const ExternalLabel label("alloc_context", | 2402 const ExternalLabel label("alloc_context", |
2370 StubCode::AllocateContextEntryPoint()); | 2403 StubCode::AllocateContextEntryPoint()); |
2371 compiler->GenerateCall(token_pos(), | 2404 compiler->GenerateCall(token_pos(), |
2372 &label, | 2405 &label, |
2373 PcDescriptors::kOther, | 2406 PcDescriptors::kOther, |
2374 locs()); | 2407 locs()); |
2375 } | 2408 } |
2376 | 2409 |
2377 | 2410 |
2378 LocationSummary* CloneContextInstr::MakeLocationSummary(bool opt) const { | 2411 LocationSummary* CloneContextInstr::MakeLocationSummary(Isolate* isolate, |
| 2412 bool opt) const { |
2379 const intptr_t kNumInputs = 1; | 2413 const intptr_t kNumInputs = 1; |
2380 const intptr_t kNumTemps = 0; | 2414 const intptr_t kNumTemps = 0; |
2381 LocationSummary* locs = | 2415 LocationSummary* locs = new(isolate) LocationSummary( |
2382 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 2416 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
2383 locs->set_in(0, Location::RegisterLocation(R0)); | 2417 locs->set_in(0, Location::RegisterLocation(R0)); |
2384 locs->set_out(0, Location::RegisterLocation(R0)); | 2418 locs->set_out(0, Location::RegisterLocation(R0)); |
2385 return locs; | 2419 return locs; |
2386 } | 2420 } |
2387 | 2421 |
2388 | 2422 |
2389 void CloneContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2423 void CloneContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2390 const Register context_value = locs()->in(0).reg(); | 2424 const Register context_value = locs()->in(0).reg(); |
2391 const Register result = locs()->out(0).reg(); | 2425 const Register result = locs()->out(0).reg(); |
2392 | 2426 |
2393 __ PushObject(Object::ZoneHandle(), PP); // Make room for the result. | 2427 __ PushObject(Object::ZoneHandle(), PP); // Make room for the result. |
2394 __ Push(context_value); | 2428 __ Push(context_value); |
2395 compiler->GenerateRuntimeCall(token_pos(), | 2429 compiler->GenerateRuntimeCall(token_pos(), |
2396 deopt_id(), | 2430 deopt_id(), |
2397 kCloneContextRuntimeEntry, | 2431 kCloneContextRuntimeEntry, |
2398 1, | 2432 1, |
2399 locs()); | 2433 locs()); |
2400 __ Drop(1); // Remove argument. | 2434 __ Drop(1); // Remove argument. |
2401 __ Pop(result); // Get result (cloned context). | 2435 __ Pop(result); // Get result (cloned context). |
2402 } | 2436 } |
2403 | 2437 |
2404 | 2438 |
2405 LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(bool opt) const { | 2439 LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(Isolate* isolate, |
| 2440 bool opt) const { |
2406 UNREACHABLE(); | 2441 UNREACHABLE(); |
2407 return NULL; | 2442 return NULL; |
2408 } | 2443 } |
2409 | 2444 |
2410 | 2445 |
2411 void CatchBlockEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2446 void CatchBlockEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2412 __ Bind(compiler->GetJumpLabel(this)); | 2447 __ Bind(compiler->GetJumpLabel(this)); |
2413 compiler->AddExceptionHandler(catch_try_index(), | 2448 compiler->AddExceptionHandler(catch_try_index(), |
2414 try_index(), | 2449 try_index(), |
2415 compiler->assembler()->CodeSize(), | 2450 compiler->assembler()->CodeSize(), |
(...skipping 16 matching lines...) Expand all Loading... |
2432 | 2467 |
2433 // Restore stack and initialize the two exception variables: | 2468 // Restore stack and initialize the two exception variables: |
2434 // exception and stack trace variables. | 2469 // exception and stack trace variables. |
2435 __ StoreToOffset(kExceptionObjectReg, | 2470 __ StoreToOffset(kExceptionObjectReg, |
2436 FP, exception_var().index() * kWordSize, PP); | 2471 FP, exception_var().index() * kWordSize, PP); |
2437 __ StoreToOffset(kStackTraceObjectReg, | 2472 __ StoreToOffset(kStackTraceObjectReg, |
2438 FP, stacktrace_var().index() * kWordSize, PP); | 2473 FP, stacktrace_var().index() * kWordSize, PP); |
2439 } | 2474 } |
2440 | 2475 |
2441 | 2476 |
2442 LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(bool opt) const { | 2477 LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(Isolate* isolate, |
| 2478 bool opt) const { |
2443 const intptr_t kNumInputs = 0; | 2479 const intptr_t kNumInputs = 0; |
2444 const intptr_t kNumTemps = 1; | 2480 const intptr_t kNumTemps = 1; |
2445 LocationSummary* summary = | 2481 LocationSummary* summary = new(isolate) LocationSummary( |
2446 new LocationSummary(kNumInputs, | 2482 isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath); |
2447 kNumTemps, | |
2448 LocationSummary::kCallOnSlowPath); | |
2449 summary->set_temp(0, Location::RequiresRegister()); | 2483 summary->set_temp(0, Location::RequiresRegister()); |
2450 return summary; | 2484 return summary; |
2451 } | 2485 } |
2452 | 2486 |
2453 | 2487 |
2454 class CheckStackOverflowSlowPath : public SlowPathCode { | 2488 class CheckStackOverflowSlowPath : public SlowPathCode { |
2455 public: | 2489 public: |
2456 explicit CheckStackOverflowSlowPath(CheckStackOverflowInstr* instruction) | 2490 explicit CheckStackOverflowSlowPath(CheckStackOverflowInstr* instruction) |
2457 : instruction_(instruction) { } | 2491 : instruction_(instruction) { } |
2458 | 2492 |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2659 __ b(deopt, NE); // Overflow. | 2693 __ b(deopt, NE); // Overflow. |
2660 // Shift for result now we know there is no overflow. | 2694 // Shift for result now we know there is no overflow. |
2661 __ lslv(result, left, TMP); | 2695 __ lslv(result, left, TMP); |
2662 } | 2696 } |
2663 if (FLAG_throw_on_javascript_int_overflow) { | 2697 if (FLAG_throw_on_javascript_int_overflow) { |
2664 EmitJavascriptOverflowCheck(compiler, shift_left->range(), deopt, result); | 2698 EmitJavascriptOverflowCheck(compiler, shift_left->range(), deopt, result); |
2665 } | 2699 } |
2666 } | 2700 } |
2667 | 2701 |
2668 | 2702 |
2669 LocationSummary* BinarySmiOpInstr::MakeLocationSummary(bool opt) const { | 2703 LocationSummary* BinarySmiOpInstr::MakeLocationSummary(Isolate* isolate, |
| 2704 bool opt) const { |
2670 const intptr_t kNumInputs = 2; | 2705 const intptr_t kNumInputs = 2; |
2671 const intptr_t kNumTemps = 0; | 2706 const intptr_t kNumTemps = 0; |
2672 LocationSummary* summary = | 2707 LocationSummary* summary = new(isolate) LocationSummary( |
2673 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 2708 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
2674 if (op_kind() == Token::kTRUNCDIV) { | 2709 if (op_kind() == Token::kTRUNCDIV) { |
2675 summary->set_in(0, Location::RequiresRegister()); | 2710 summary->set_in(0, Location::RequiresRegister()); |
2676 if (RightIsPowerOfTwoConstant()) { | 2711 if (RightIsPowerOfTwoConstant()) { |
2677 ConstantInstr* right_constant = right()->definition()->AsConstant(); | 2712 ConstantInstr* right_constant = right()->definition()->AsConstant(); |
2678 summary->set_in(1, Location::Constant(right_constant->value())); | 2713 summary->set_in(1, Location::Constant(right_constant->value())); |
2679 } else { | 2714 } else { |
2680 summary->set_in(1, Location::RequiresRegister()); | 2715 summary->set_in(1, Location::RequiresRegister()); |
2681 } | 2716 } |
2682 summary->set_out(0, Location::RequiresRegister()); | 2717 summary->set_out(0, Location::RequiresRegister()); |
2683 return summary; | 2718 return summary; |
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2981 default: | 3016 default: |
2982 UNREACHABLE(); | 3017 UNREACHABLE(); |
2983 break; | 3018 break; |
2984 } | 3019 } |
2985 if (FLAG_throw_on_javascript_int_overflow) { | 3020 if (FLAG_throw_on_javascript_int_overflow) { |
2986 EmitJavascriptOverflowCheck(compiler, range(), deopt, result); | 3021 EmitJavascriptOverflowCheck(compiler, range(), deopt, result); |
2987 } | 3022 } |
2988 } | 3023 } |
2989 | 3024 |
2990 | 3025 |
2991 LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(bool opt) const { | 3026 LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(Isolate* isolate, |
| 3027 bool opt) const { |
2992 intptr_t left_cid = left()->Type()->ToCid(); | 3028 intptr_t left_cid = left()->Type()->ToCid(); |
2993 intptr_t right_cid = right()->Type()->ToCid(); | 3029 intptr_t right_cid = right()->Type()->ToCid(); |
2994 ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid)); | 3030 ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid)); |
2995 const intptr_t kNumInputs = 2; | 3031 const intptr_t kNumInputs = 2; |
2996 const intptr_t kNumTemps = 0; | 3032 const intptr_t kNumTemps = 0; |
2997 LocationSummary* summary = | 3033 LocationSummary* summary = new(isolate) LocationSummary( |
2998 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3034 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
2999 summary->set_in(0, Location::RequiresRegister()); | 3035 summary->set_in(0, Location::RequiresRegister()); |
3000 summary->set_in(1, Location::RequiresRegister()); | 3036 summary->set_in(1, Location::RequiresRegister()); |
3001 return summary; | 3037 return summary; |
3002 } | 3038 } |
3003 | 3039 |
3004 | 3040 |
3005 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3041 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3006 Label* deopt = compiler->AddDeoptStub(deopt_id(), | 3042 Label* deopt = compiler->AddDeoptStub(deopt_id(), |
3007 ICData::kDeoptBinaryDoubleOp); | 3043 ICData::kDeoptBinaryDoubleOp); |
3008 intptr_t left_cid = left()->Type()->ToCid(); | 3044 intptr_t left_cid = left()->Type()->ToCid(); |
3009 intptr_t right_cid = right()->Type()->ToCid(); | 3045 intptr_t right_cid = right()->Type()->ToCid(); |
3010 const Register left = locs()->in(0).reg(); | 3046 const Register left = locs()->in(0).reg(); |
3011 const Register right = locs()->in(1).reg(); | 3047 const Register right = locs()->in(1).reg(); |
3012 if (left_cid == kSmiCid) { | 3048 if (left_cid == kSmiCid) { |
3013 __ tsti(right, kSmiTagMask); | 3049 __ tsti(right, kSmiTagMask); |
3014 } else if (right_cid == kSmiCid) { | 3050 } else if (right_cid == kSmiCid) { |
3015 __ tsti(left, kSmiTagMask); | 3051 __ tsti(left, kSmiTagMask); |
3016 } else { | 3052 } else { |
3017 __ orr(TMP, left, Operand(right)); | 3053 __ orr(TMP, left, Operand(right)); |
3018 __ tsti(TMP, kSmiTagMask); | 3054 __ tsti(TMP, kSmiTagMask); |
3019 } | 3055 } |
3020 __ b(deopt, EQ); | 3056 __ b(deopt, EQ); |
3021 } | 3057 } |
3022 | 3058 |
3023 | 3059 |
3024 LocationSummary* BoxDoubleInstr::MakeLocationSummary(bool opt) const { | 3060 LocationSummary* BoxDoubleInstr::MakeLocationSummary(Isolate* isolate, |
| 3061 bool opt) const { |
3025 const intptr_t kNumInputs = 1; | 3062 const intptr_t kNumInputs = 1; |
3026 const intptr_t kNumTemps = 0; | 3063 const intptr_t kNumTemps = 0; |
3027 LocationSummary* summary = | 3064 LocationSummary* summary = new(isolate) LocationSummary( |
3028 new LocationSummary(kNumInputs, | 3065 isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath); |
3029 kNumTemps, | |
3030 LocationSummary::kCallOnSlowPath); | |
3031 summary->set_in(0, Location::RequiresFpuRegister()); | 3066 summary->set_in(0, Location::RequiresFpuRegister()); |
3032 summary->set_out(0, Location::RequiresRegister()); | 3067 summary->set_out(0, Location::RequiresRegister()); |
3033 return summary; | 3068 return summary; |
3034 } | 3069 } |
3035 | 3070 |
3036 | 3071 |
3037 void BoxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3072 void BoxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3038 BoxDoubleSlowPath* slow_path = new BoxDoubleSlowPath(this); | 3073 BoxDoubleSlowPath* slow_path = new BoxDoubleSlowPath(this); |
3039 compiler->AddSlowPathCode(slow_path); | 3074 compiler->AddSlowPathCode(slow_path); |
3040 | 3075 |
3041 const Register out_reg = locs()->out(0).reg(); | 3076 const Register out_reg = locs()->out(0).reg(); |
3042 const VRegister value = locs()->in(0).fpu_reg(); | 3077 const VRegister value = locs()->in(0).fpu_reg(); |
3043 | 3078 |
3044 __ TryAllocate(compiler->double_class(), | 3079 __ TryAllocate(compiler->double_class(), |
3045 slow_path->entry_label(), | 3080 slow_path->entry_label(), |
3046 out_reg, | 3081 out_reg, |
3047 PP); | 3082 PP); |
3048 __ Bind(slow_path->exit_label()); | 3083 __ Bind(slow_path->exit_label()); |
3049 __ StoreDFieldToOffset(value, out_reg, Double::value_offset(), PP); | 3084 __ StoreDFieldToOffset(value, out_reg, Double::value_offset(), PP); |
3050 } | 3085 } |
3051 | 3086 |
3052 | 3087 |
3053 LocationSummary* UnboxDoubleInstr::MakeLocationSummary(bool opt) const { | 3088 LocationSummary* UnboxDoubleInstr::MakeLocationSummary(Isolate* isolate, |
| 3089 bool opt) const { |
3054 const intptr_t kNumInputs = 1; | 3090 const intptr_t kNumInputs = 1; |
3055 const intptr_t kNumTemps = 0; | 3091 const intptr_t kNumTemps = 0; |
3056 LocationSummary* summary = | 3092 LocationSummary* summary = new(isolate) LocationSummary( |
3057 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3093 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3058 summary->set_in(0, Location::RequiresRegister()); | 3094 summary->set_in(0, Location::RequiresRegister()); |
3059 summary->set_out(0, Location::RequiresFpuRegister()); | 3095 summary->set_out(0, Location::RequiresFpuRegister()); |
3060 return summary; | 3096 return summary; |
3061 } | 3097 } |
3062 | 3098 |
3063 | 3099 |
3064 void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3100 void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3065 CompileType* value_type = value()->Type(); | 3101 CompileType* value_type = value()->Type(); |
3066 const intptr_t value_cid = value_type->ToCid(); | 3102 const intptr_t value_cid = value_type->ToCid(); |
3067 const Register value = locs()->in(0).reg(); | 3103 const Register value = locs()->in(0).reg(); |
(...skipping 23 matching lines...) Expand all Loading... |
3091 __ b(&done); | 3127 __ b(&done); |
3092 __ Bind(&is_smi); | 3128 __ Bind(&is_smi); |
3093 __ Asr(TMP, value, kSmiTagSize); // Copy and untag. | 3129 __ Asr(TMP, value, kSmiTagSize); // Copy and untag. |
3094 __ scvtfd(result, TMP); | 3130 __ scvtfd(result, TMP); |
3095 __ Bind(&done); | 3131 __ Bind(&done); |
3096 } | 3132 } |
3097 } | 3133 } |
3098 } | 3134 } |
3099 | 3135 |
3100 | 3136 |
3101 LocationSummary* BoxFloat32x4Instr::MakeLocationSummary(bool opt) const { | 3137 LocationSummary* BoxFloat32x4Instr::MakeLocationSummary(Isolate* isolate, |
| 3138 bool opt) const { |
3102 const intptr_t kNumInputs = 1; | 3139 const intptr_t kNumInputs = 1; |
3103 const intptr_t kNumTemps = 0; | 3140 const intptr_t kNumTemps = 0; |
3104 LocationSummary* summary = | 3141 LocationSummary* summary = new(isolate) LocationSummary( |
3105 new LocationSummary(kNumInputs, | 3142 isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath); |
3106 kNumTemps, | |
3107 LocationSummary::kCallOnSlowPath); | |
3108 summary->set_in(0, Location::RequiresFpuRegister()); | 3143 summary->set_in(0, Location::RequiresFpuRegister()); |
3109 summary->set_out(0, Location::RequiresRegister()); | 3144 summary->set_out(0, Location::RequiresRegister()); |
3110 return summary; | 3145 return summary; |
3111 } | 3146 } |
3112 | 3147 |
3113 | 3148 |
3114 void BoxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3149 void BoxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3115 BoxFloat32x4SlowPath* slow_path = new BoxFloat32x4SlowPath(this); | 3150 BoxFloat32x4SlowPath* slow_path = new BoxFloat32x4SlowPath(this); |
3116 compiler->AddSlowPathCode(slow_path); | 3151 compiler->AddSlowPathCode(slow_path); |
3117 | 3152 |
3118 const Register out_reg = locs()->out(0).reg(); | 3153 const Register out_reg = locs()->out(0).reg(); |
3119 const VRegister value = locs()->in(0).fpu_reg(); | 3154 const VRegister value = locs()->in(0).fpu_reg(); |
3120 | 3155 |
3121 __ TryAllocate(compiler->float32x4_class(), | 3156 __ TryAllocate(compiler->float32x4_class(), |
3122 slow_path->entry_label(), | 3157 slow_path->entry_label(), |
3123 out_reg, | 3158 out_reg, |
3124 PP); | 3159 PP); |
3125 __ Bind(slow_path->exit_label()); | 3160 __ Bind(slow_path->exit_label()); |
3126 | 3161 |
3127 __ StoreQFieldToOffset(value, out_reg, Float32x4::value_offset(), PP); | 3162 __ StoreQFieldToOffset(value, out_reg, Float32x4::value_offset(), PP); |
3128 } | 3163 } |
3129 | 3164 |
3130 | 3165 |
3131 LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary(bool opt) const { | 3166 LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary(Isolate* isolate, |
| 3167 bool opt) const { |
3132 const intptr_t kNumInputs = 1; | 3168 const intptr_t kNumInputs = 1; |
3133 const intptr_t kNumTemps = 0; | 3169 const intptr_t kNumTemps = 0; |
3134 LocationSummary* summary = | 3170 LocationSummary* summary = new(isolate) LocationSummary( |
3135 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3171 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3136 summary->set_in(0, Location::RequiresRegister()); | 3172 summary->set_in(0, Location::RequiresRegister()); |
3137 summary->set_out(0, Location::RequiresFpuRegister()); | 3173 summary->set_out(0, Location::RequiresFpuRegister()); |
3138 return summary; | 3174 return summary; |
3139 } | 3175 } |
3140 | 3176 |
3141 | 3177 |
3142 void UnboxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3178 void UnboxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3143 const intptr_t value_cid = value()->Type()->ToCid(); | 3179 const intptr_t value_cid = value()->Type()->ToCid(); |
3144 const Register value = locs()->in(0).reg(); | 3180 const Register value = locs()->in(0).reg(); |
3145 const VRegister result = locs()->out(0).fpu_reg(); | 3181 const VRegister result = locs()->out(0).fpu_reg(); |
3146 | 3182 |
3147 if (value_cid != kFloat32x4Cid) { | 3183 if (value_cid != kFloat32x4Cid) { |
3148 Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass); | 3184 Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass); |
3149 __ tsti(value, kSmiTagMask); | 3185 __ tsti(value, kSmiTagMask); |
3150 __ b(deopt, EQ); | 3186 __ b(deopt, EQ); |
3151 __ CompareClassId(value, kFloat32x4Cid, PP); | 3187 __ CompareClassId(value, kFloat32x4Cid, PP); |
3152 __ b(deopt, NE); | 3188 __ b(deopt, NE); |
3153 } | 3189 } |
3154 | 3190 |
3155 __ LoadQFieldFromOffset(result, value, Float32x4::value_offset(), PP); | 3191 __ LoadQFieldFromOffset(result, value, Float32x4::value_offset(), PP); |
3156 } | 3192 } |
3157 | 3193 |
3158 | 3194 |
3159 LocationSummary* BoxFloat64x2Instr::MakeLocationSummary(bool opt) const { | 3195 LocationSummary* BoxFloat64x2Instr::MakeLocationSummary(Isolate* isolate, |
| 3196 bool opt) const { |
3160 const intptr_t kNumInputs = 1; | 3197 const intptr_t kNumInputs = 1; |
3161 const intptr_t kNumTemps = 0; | 3198 const intptr_t kNumTemps = 0; |
3162 LocationSummary* summary = | 3199 LocationSummary* summary = new(isolate) LocationSummary( |
3163 new LocationSummary(kNumInputs, | 3200 isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath); |
3164 kNumTemps, | |
3165 LocationSummary::kCallOnSlowPath); | |
3166 summary->set_in(0, Location::RequiresFpuRegister()); | 3201 summary->set_in(0, Location::RequiresFpuRegister()); |
3167 summary->set_out(0, Location::RequiresRegister()); | 3202 summary->set_out(0, Location::RequiresRegister()); |
3168 return summary; | 3203 return summary; |
3169 } | 3204 } |
3170 | 3205 |
3171 | 3206 |
3172 void BoxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3207 void BoxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3173 BoxFloat64x2SlowPath* slow_path = new BoxFloat64x2SlowPath(this); | 3208 BoxFloat64x2SlowPath* slow_path = new BoxFloat64x2SlowPath(this); |
3174 compiler->AddSlowPathCode(slow_path); | 3209 compiler->AddSlowPathCode(slow_path); |
3175 | 3210 |
3176 const Register out_reg = locs()->out(0).reg(); | 3211 const Register out_reg = locs()->out(0).reg(); |
3177 const VRegister value = locs()->in(0).fpu_reg(); | 3212 const VRegister value = locs()->in(0).fpu_reg(); |
3178 | 3213 |
3179 __ TryAllocate(compiler->float64x2_class(), | 3214 __ TryAllocate(compiler->float64x2_class(), |
3180 slow_path->entry_label(), | 3215 slow_path->entry_label(), |
3181 out_reg, | 3216 out_reg, |
3182 PP); | 3217 PP); |
3183 __ Bind(slow_path->exit_label()); | 3218 __ Bind(slow_path->exit_label()); |
3184 | 3219 |
3185 __ StoreQFieldToOffset(value, out_reg, Float64x2::value_offset(), PP); | 3220 __ StoreQFieldToOffset(value, out_reg, Float64x2::value_offset(), PP); |
3186 } | 3221 } |
3187 | 3222 |
3188 | 3223 |
3189 LocationSummary* UnboxFloat64x2Instr::MakeLocationSummary(bool opt) const { | 3224 LocationSummary* UnboxFloat64x2Instr::MakeLocationSummary(Isolate* isolate, |
| 3225 bool opt) const { |
3190 const intptr_t kNumInputs = 1; | 3226 const intptr_t kNumInputs = 1; |
3191 const intptr_t kNumTemps = 0; | 3227 const intptr_t kNumTemps = 0; |
3192 LocationSummary* summary = | 3228 LocationSummary* summary = new(isolate) LocationSummary( |
3193 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3229 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3194 summary->set_in(0, Location::RequiresRegister()); | 3230 summary->set_in(0, Location::RequiresRegister()); |
3195 summary->set_out(0, Location::RequiresFpuRegister()); | 3231 summary->set_out(0, Location::RequiresFpuRegister()); |
3196 return summary; | 3232 return summary; |
3197 } | 3233 } |
3198 | 3234 |
3199 | 3235 |
3200 void UnboxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3236 void UnboxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3201 const intptr_t value_cid = value()->Type()->ToCid(); | 3237 const intptr_t value_cid = value()->Type()->ToCid(); |
3202 const Register value = locs()->in(0).reg(); | 3238 const Register value = locs()->in(0).reg(); |
3203 const VRegister result = locs()->out(0).fpu_reg(); | 3239 const VRegister result = locs()->out(0).fpu_reg(); |
3204 | 3240 |
3205 if (value_cid != kFloat64x2Cid) { | 3241 if (value_cid != kFloat64x2Cid) { |
3206 Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass); | 3242 Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass); |
3207 __ tsti(value, kSmiTagMask); | 3243 __ tsti(value, kSmiTagMask); |
3208 __ b(deopt, EQ); | 3244 __ b(deopt, EQ); |
3209 __ CompareClassId(value, kFloat64x2Cid, PP); | 3245 __ CompareClassId(value, kFloat64x2Cid, PP); |
3210 __ b(deopt, NE); | 3246 __ b(deopt, NE); |
3211 } | 3247 } |
3212 | 3248 |
3213 __ LoadQFieldFromOffset(result, value, Float64x2::value_offset(), PP); | 3249 __ LoadQFieldFromOffset(result, value, Float64x2::value_offset(), PP); |
3214 } | 3250 } |
3215 | 3251 |
3216 | 3252 |
3217 LocationSummary* BoxInt32x4Instr::MakeLocationSummary(bool opt) const { | 3253 LocationSummary* BoxInt32x4Instr::MakeLocationSummary(Isolate* isolate, |
| 3254 bool opt) const { |
3218 const intptr_t kNumInputs = 1; | 3255 const intptr_t kNumInputs = 1; |
3219 const intptr_t kNumTemps = 0; | 3256 const intptr_t kNumTemps = 0; |
3220 LocationSummary* summary = | 3257 LocationSummary* summary = new(isolate) LocationSummary( |
3221 new LocationSummary(kNumInputs, | 3258 isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath); |
3222 kNumTemps, | |
3223 LocationSummary::kCallOnSlowPath); | |
3224 summary->set_in(0, Location::RequiresFpuRegister()); | 3259 summary->set_in(0, Location::RequiresFpuRegister()); |
3225 summary->set_out(0, Location::RequiresRegister()); | 3260 summary->set_out(0, Location::RequiresRegister()); |
3226 return summary; | 3261 return summary; |
3227 } | 3262 } |
3228 | 3263 |
3229 | 3264 |
3230 class BoxInt32x4SlowPath : public SlowPathCode { | 3265 class BoxInt32x4SlowPath : public SlowPathCode { |
3231 public: | 3266 public: |
3232 explicit BoxInt32x4SlowPath(BoxInt32x4Instr* instruction) | 3267 explicit BoxInt32x4SlowPath(BoxInt32x4Instr* instruction) |
3233 : instruction_(instruction) { } | 3268 : instruction_(instruction) { } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3269 __ TryAllocate(compiler->int32x4_class(), | 3304 __ TryAllocate(compiler->int32x4_class(), |
3270 slow_path->entry_label(), | 3305 slow_path->entry_label(), |
3271 out_reg, | 3306 out_reg, |
3272 PP); | 3307 PP); |
3273 __ Bind(slow_path->exit_label()); | 3308 __ Bind(slow_path->exit_label()); |
3274 | 3309 |
3275 __ StoreQFieldToOffset(value, out_reg, Int32x4::value_offset(), PP); | 3310 __ StoreQFieldToOffset(value, out_reg, Int32x4::value_offset(), PP); |
3276 } | 3311 } |
3277 | 3312 |
3278 | 3313 |
3279 LocationSummary* UnboxInt32x4Instr::MakeLocationSummary(bool opt) const { | 3314 LocationSummary* UnboxInt32x4Instr::MakeLocationSummary(Isolate* isolate, |
| 3315 bool opt) const { |
3280 const intptr_t kNumInputs = 1; | 3316 const intptr_t kNumInputs = 1; |
3281 const intptr_t kNumTemps = 0; | 3317 const intptr_t kNumTemps = 0; |
3282 LocationSummary* summary = | 3318 LocationSummary* summary = new(isolate) LocationSummary( |
3283 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3319 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3284 summary->set_in(0, Location::RequiresRegister()); | 3320 summary->set_in(0, Location::RequiresRegister()); |
3285 summary->set_out(0, Location::RequiresFpuRegister()); | 3321 summary->set_out(0, Location::RequiresFpuRegister()); |
3286 return summary; | 3322 return summary; |
3287 } | 3323 } |
3288 | 3324 |
3289 | 3325 |
3290 void UnboxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3326 void UnboxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3291 const intptr_t value_cid = value()->Type()->ToCid(); | 3327 const intptr_t value_cid = value()->Type()->ToCid(); |
3292 const Register value = locs()->in(0).reg(); | 3328 const Register value = locs()->in(0).reg(); |
3293 const VRegister result = locs()->out(0).fpu_reg(); | 3329 const VRegister result = locs()->out(0).fpu_reg(); |
3294 | 3330 |
3295 if (value_cid != kInt32x4Cid) { | 3331 if (value_cid != kInt32x4Cid) { |
3296 Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass); | 3332 Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass); |
3297 __ tsti(value, kSmiTagMask); | 3333 __ tsti(value, kSmiTagMask); |
3298 __ b(deopt, EQ); | 3334 __ b(deopt, EQ); |
3299 __ CompareClassId(value, kInt32x4Cid, PP); | 3335 __ CompareClassId(value, kInt32x4Cid, PP); |
3300 __ b(deopt, NE); | 3336 __ b(deopt, NE); |
3301 } | 3337 } |
3302 | 3338 |
3303 __ LoadQFieldFromOffset(result, value, Int32x4::value_offset(), PP); | 3339 __ LoadQFieldFromOffset(result, value, Int32x4::value_offset(), PP); |
3304 } | 3340 } |
3305 | 3341 |
3306 | 3342 |
3307 LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(bool opt) const { | 3343 LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate, |
| 3344 bool opt) const { |
3308 const intptr_t kNumInputs = 2; | 3345 const intptr_t kNumInputs = 2; |
3309 const intptr_t kNumTemps = 0; | 3346 const intptr_t kNumTemps = 0; |
3310 LocationSummary* summary = | 3347 LocationSummary* summary = new(isolate) LocationSummary( |
3311 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3348 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3312 summary->set_in(0, Location::RequiresFpuRegister()); | 3349 summary->set_in(0, Location::RequiresFpuRegister()); |
3313 summary->set_in(1, Location::RequiresFpuRegister()); | 3350 summary->set_in(1, Location::RequiresFpuRegister()); |
3314 summary->set_out(0, Location::RequiresFpuRegister()); | 3351 summary->set_out(0, Location::RequiresFpuRegister()); |
3315 return summary; | 3352 return summary; |
3316 } | 3353 } |
3317 | 3354 |
3318 | 3355 |
3319 void BinaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3356 void BinaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3320 const VRegister left = locs()->in(0).fpu_reg(); | 3357 const VRegister left = locs()->in(0).fpu_reg(); |
3321 const VRegister right = locs()->in(1).fpu_reg(); | 3358 const VRegister right = locs()->in(1).fpu_reg(); |
3322 const VRegister result = locs()->out(0).fpu_reg(); | 3359 const VRegister result = locs()->out(0).fpu_reg(); |
3323 switch (op_kind()) { | 3360 switch (op_kind()) { |
3324 case Token::kADD: __ faddd(result, left, right); break; | 3361 case Token::kADD: __ faddd(result, left, right); break; |
3325 case Token::kSUB: __ fsubd(result, left, right); break; | 3362 case Token::kSUB: __ fsubd(result, left, right); break; |
3326 case Token::kMUL: __ fmuld(result, left, right); break; | 3363 case Token::kMUL: __ fmuld(result, left, right); break; |
3327 case Token::kDIV: __ fdivd(result, left, right); break; | 3364 case Token::kDIV: __ fdivd(result, left, right); break; |
3328 default: UNREACHABLE(); | 3365 default: UNREACHABLE(); |
3329 } | 3366 } |
3330 } | 3367 } |
3331 | 3368 |
3332 | 3369 |
3333 LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(bool opt) const { | 3370 LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(Isolate* isolate, |
| 3371 bool opt) const { |
3334 const intptr_t kNumInputs = 2; | 3372 const intptr_t kNumInputs = 2; |
3335 const intptr_t kNumTemps = 0; | 3373 const intptr_t kNumTemps = 0; |
3336 LocationSummary* summary = | 3374 LocationSummary* summary = new(isolate) LocationSummary( |
3337 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3375 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3338 summary->set_in(0, Location::RequiresFpuRegister()); | 3376 summary->set_in(0, Location::RequiresFpuRegister()); |
3339 summary->set_in(1, Location::RequiresFpuRegister()); | 3377 summary->set_in(1, Location::RequiresFpuRegister()); |
3340 summary->set_out(0, Location::RequiresFpuRegister()); | 3378 summary->set_out(0, Location::RequiresFpuRegister()); |
3341 return summary; | 3379 return summary; |
3342 } | 3380 } |
3343 | 3381 |
3344 | 3382 |
3345 void BinaryFloat32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3383 void BinaryFloat32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3346 const VRegister left = locs()->in(0).fpu_reg(); | 3384 const VRegister left = locs()->in(0).fpu_reg(); |
3347 const VRegister right = locs()->in(1).fpu_reg(); | 3385 const VRegister right = locs()->in(1).fpu_reg(); |
3348 const VRegister result = locs()->out(0).fpu_reg(); | 3386 const VRegister result = locs()->out(0).fpu_reg(); |
3349 | 3387 |
3350 switch (op_kind()) { | 3388 switch (op_kind()) { |
3351 case Token::kADD: __ vadds(result, left, right); break; | 3389 case Token::kADD: __ vadds(result, left, right); break; |
3352 case Token::kSUB: __ vsubs(result, left, right); break; | 3390 case Token::kSUB: __ vsubs(result, left, right); break; |
3353 case Token::kMUL: __ vmuls(result, left, right); break; | 3391 case Token::kMUL: __ vmuls(result, left, right); break; |
3354 case Token::kDIV: __ vdivs(result, left, right); break; | 3392 case Token::kDIV: __ vdivs(result, left, right); break; |
3355 default: UNREACHABLE(); | 3393 default: UNREACHABLE(); |
3356 } | 3394 } |
3357 } | 3395 } |
3358 | 3396 |
3359 | 3397 |
3360 LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(bool opt) const { | 3398 LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(Isolate* isolate, |
| 3399 bool opt) const { |
3361 const intptr_t kNumInputs = 2; | 3400 const intptr_t kNumInputs = 2; |
3362 const intptr_t kNumTemps = 0; | 3401 const intptr_t kNumTemps = 0; |
3363 LocationSummary* summary = | 3402 LocationSummary* summary = new(isolate) LocationSummary( |
3364 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3403 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3365 summary->set_in(0, Location::RequiresFpuRegister()); | 3404 summary->set_in(0, Location::RequiresFpuRegister()); |
3366 summary->set_in(1, Location::RequiresFpuRegister()); | 3405 summary->set_in(1, Location::RequiresFpuRegister()); |
3367 summary->set_out(0, Location::RequiresFpuRegister()); | 3406 summary->set_out(0, Location::RequiresFpuRegister()); |
3368 return summary; | 3407 return summary; |
3369 } | 3408 } |
3370 | 3409 |
3371 | 3410 |
3372 void BinaryFloat64x2OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3411 void BinaryFloat64x2OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3373 const VRegister left = locs()->in(0).fpu_reg(); | 3412 const VRegister left = locs()->in(0).fpu_reg(); |
3374 const VRegister right = locs()->in(1).fpu_reg(); | 3413 const VRegister right = locs()->in(1).fpu_reg(); |
3375 const VRegister result = locs()->out(0).fpu_reg(); | 3414 const VRegister result = locs()->out(0).fpu_reg(); |
3376 | 3415 |
3377 switch (op_kind()) { | 3416 switch (op_kind()) { |
3378 case Token::kADD: __ vaddd(result, left, right); break; | 3417 case Token::kADD: __ vaddd(result, left, right); break; |
3379 case Token::kSUB: __ vsubd(result, left, right); break; | 3418 case Token::kSUB: __ vsubd(result, left, right); break; |
3380 case Token::kMUL: __ vmuld(result, left, right); break; | 3419 case Token::kMUL: __ vmuld(result, left, right); break; |
3381 case Token::kDIV: __ vdivd(result, left, right); break; | 3420 case Token::kDIV: __ vdivd(result, left, right); break; |
3382 default: UNREACHABLE(); | 3421 default: UNREACHABLE(); |
3383 } | 3422 } |
3384 } | 3423 } |
3385 | 3424 |
3386 | 3425 |
3387 LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(bool opt) const { | 3426 LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(Isolate* isolate, |
| 3427 bool opt) const { |
3388 UNIMPLEMENTED(); | 3428 UNIMPLEMENTED(); |
3389 return NULL; | 3429 return NULL; |
3390 } | 3430 } |
3391 | 3431 |
3392 | 3432 |
3393 void Simd32x4ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3433 void Simd32x4ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3394 UNIMPLEMENTED(); | 3434 UNIMPLEMENTED(); |
3395 } | 3435 } |
3396 | 3436 |
3397 | 3437 |
3398 LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(bool opt) const { | 3438 LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(Isolate* isolate, |
| 3439 bool opt) const { |
3399 UNIMPLEMENTED(); | 3440 UNIMPLEMENTED(); |
3400 return NULL; | 3441 return NULL; |
3401 } | 3442 } |
3402 | 3443 |
3403 | 3444 |
3404 void Simd32x4ShuffleMixInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3445 void Simd32x4ShuffleMixInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3405 UNIMPLEMENTED(); | 3446 UNIMPLEMENTED(); |
3406 } | 3447 } |
3407 | 3448 |
3408 | 3449 |
3409 LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(bool opt) const { | 3450 LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(Isolate* isolate, |
| 3451 bool opt) const { |
3410 UNIMPLEMENTED(); | 3452 UNIMPLEMENTED(); |
3411 return NULL; | 3453 return NULL; |
3412 } | 3454 } |
3413 | 3455 |
3414 | 3456 |
3415 void Simd32x4GetSignMaskInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3457 void Simd32x4GetSignMaskInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3416 UNIMPLEMENTED(); | 3458 UNIMPLEMENTED(); |
3417 } | 3459 } |
3418 | 3460 |
3419 | 3461 |
3420 LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary( | 3462 LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary( |
3421 bool opt) const { | 3463 Isolate* isolate, bool opt) const { |
3422 const intptr_t kNumInputs = 4; | 3464 const intptr_t kNumInputs = 4; |
3423 const intptr_t kNumTemps = 0; | 3465 const intptr_t kNumTemps = 0; |
3424 LocationSummary* summary = | 3466 LocationSummary* summary = new(isolate) LocationSummary( |
3425 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3467 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3426 summary->set_in(0, Location::RequiresFpuRegister()); | 3468 summary->set_in(0, Location::RequiresFpuRegister()); |
3427 summary->set_in(1, Location::RequiresFpuRegister()); | 3469 summary->set_in(1, Location::RequiresFpuRegister()); |
3428 summary->set_in(2, Location::RequiresFpuRegister()); | 3470 summary->set_in(2, Location::RequiresFpuRegister()); |
3429 summary->set_in(3, Location::RequiresFpuRegister()); | 3471 summary->set_in(3, Location::RequiresFpuRegister()); |
3430 summary->set_out(0, Location::RequiresFpuRegister()); | 3472 summary->set_out(0, Location::RequiresFpuRegister()); |
3431 return summary; | 3473 return summary; |
3432 } | 3474 } |
3433 | 3475 |
3434 | 3476 |
3435 void Float32x4ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3477 void Float32x4ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3436 const VRegister v0 = locs()->in(0).fpu_reg(); | 3478 const VRegister v0 = locs()->in(0).fpu_reg(); |
3437 const VRegister v1 = locs()->in(1).fpu_reg(); | 3479 const VRegister v1 = locs()->in(1).fpu_reg(); |
3438 const VRegister v2 = locs()->in(2).fpu_reg(); | 3480 const VRegister v2 = locs()->in(2).fpu_reg(); |
3439 const VRegister v3 = locs()->in(3).fpu_reg(); | 3481 const VRegister v3 = locs()->in(3).fpu_reg(); |
3440 const VRegister r = locs()->out(0).fpu_reg(); | 3482 const VRegister r = locs()->out(0).fpu_reg(); |
3441 | 3483 |
3442 __ fcvtsd(v0, v0); | 3484 __ fcvtsd(v0, v0); |
3443 __ vinss(r, 0, v0, 0); | 3485 __ vinss(r, 0, v0, 0); |
3444 __ fcvtsd(v1, v1); | 3486 __ fcvtsd(v1, v1); |
3445 __ vinss(r, 1, v1, 1); | 3487 __ vinss(r, 1, v1, 1); |
3446 __ fcvtsd(v2, v2); | 3488 __ fcvtsd(v2, v2); |
3447 __ vinss(r, 2, v2, 2); | 3489 __ vinss(r, 2, v2, 2); |
3448 __ fcvtsd(v3, v3); | 3490 __ fcvtsd(v3, v3); |
3449 __ vinss(r, 3, v3, 3); | 3491 __ vinss(r, 3, v3, 3); |
3450 } | 3492 } |
3451 | 3493 |
3452 | 3494 |
3453 LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(bool opt) const { | 3495 LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(Isolate* isolate, |
| 3496 bool opt) const { |
3454 const intptr_t kNumInputs = 0; | 3497 const intptr_t kNumInputs = 0; |
3455 const intptr_t kNumTemps = 0; | 3498 const intptr_t kNumTemps = 0; |
3456 LocationSummary* summary = | 3499 LocationSummary* summary = new(isolate) LocationSummary( |
3457 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3500 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3458 summary->set_out(0, Location::RequiresFpuRegister()); | 3501 summary->set_out(0, Location::RequiresFpuRegister()); |
3459 return summary; | 3502 return summary; |
3460 } | 3503 } |
3461 | 3504 |
3462 | 3505 |
3463 void Float32x4ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3506 void Float32x4ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3464 const VRegister v = locs()->out(0).fpu_reg(); | 3507 const VRegister v = locs()->out(0).fpu_reg(); |
3465 __ LoadDImmediate(v, 0.0, PP); | 3508 __ LoadDImmediate(v, 0.0, PP); |
3466 } | 3509 } |
3467 | 3510 |
3468 | 3511 |
3469 LocationSummary* Float32x4SplatInstr::MakeLocationSummary(bool opt) const { | 3512 LocationSummary* Float32x4SplatInstr::MakeLocationSummary(Isolate* isolate, |
| 3513 bool opt) const { |
3470 const intptr_t kNumInputs = 1; | 3514 const intptr_t kNumInputs = 1; |
3471 const intptr_t kNumTemps = 0; | 3515 const intptr_t kNumTemps = 0; |
3472 LocationSummary* summary = | 3516 LocationSummary* summary = new(isolate) LocationSummary( |
3473 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3517 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3474 summary->set_in(0, Location::RequiresFpuRegister()); | 3518 summary->set_in(0, Location::RequiresFpuRegister()); |
3475 summary->set_out(0, Location::RequiresFpuRegister()); | 3519 summary->set_out(0, Location::RequiresFpuRegister()); |
3476 return summary; | 3520 return summary; |
3477 } | 3521 } |
3478 | 3522 |
3479 | 3523 |
3480 void Float32x4SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3524 void Float32x4SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3481 const VRegister value = locs()->in(0).fpu_reg(); | 3525 const VRegister value = locs()->in(0).fpu_reg(); |
3482 const VRegister result = locs()->out(0).fpu_reg(); | 3526 const VRegister result = locs()->out(0).fpu_reg(); |
3483 | 3527 |
3484 // Convert to Float32. | 3528 // Convert to Float32. |
3485 __ fcvtsd(VTMP, value); | 3529 __ fcvtsd(VTMP, value); |
3486 | 3530 |
3487 // Splat across all lanes. | 3531 // Splat across all lanes. |
3488 __ vdups(result, VTMP, 0); | 3532 __ vdups(result, VTMP, 0); |
3489 } | 3533 } |
3490 | 3534 |
3491 | 3535 |
3492 LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(bool opt) const { | 3536 LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(Isolate* isolate, |
| 3537 bool opt) const { |
3493 UNIMPLEMENTED(); | 3538 UNIMPLEMENTED(); |
3494 return NULL; | 3539 return NULL; |
3495 } | 3540 } |
3496 | 3541 |
3497 | 3542 |
3498 void Float32x4ComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3543 void Float32x4ComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3499 UNIMPLEMENTED(); | 3544 UNIMPLEMENTED(); |
3500 } | 3545 } |
3501 | 3546 |
3502 | 3547 |
3503 LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(bool opt) const { | 3548 LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(Isolate* isolate, |
| 3549 bool opt) const { |
3504 UNIMPLEMENTED(); | 3550 UNIMPLEMENTED(); |
3505 return NULL; | 3551 return NULL; |
3506 } | 3552 } |
3507 | 3553 |
3508 | 3554 |
3509 void Float32x4MinMaxInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3555 void Float32x4MinMaxInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3510 UNIMPLEMENTED(); | 3556 UNIMPLEMENTED(); |
3511 } | 3557 } |
3512 | 3558 |
3513 | 3559 |
3514 LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(bool opt) const { | 3560 LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(Isolate* isolate, |
| 3561 bool opt) const { |
3515 UNIMPLEMENTED(); | 3562 UNIMPLEMENTED(); |
3516 return NULL; | 3563 return NULL; |
3517 } | 3564 } |
3518 | 3565 |
3519 | 3566 |
3520 void Float32x4SqrtInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3567 void Float32x4SqrtInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3521 UNIMPLEMENTED(); | 3568 UNIMPLEMENTED(); |
3522 } | 3569 } |
3523 | 3570 |
3524 | 3571 |
3525 LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(bool opt) const { | 3572 LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(Isolate* isolate, |
| 3573 bool opt) const { |
3526 const intptr_t kNumInputs = 2; | 3574 const intptr_t kNumInputs = 2; |
3527 const intptr_t kNumTemps = 0; | 3575 const intptr_t kNumTemps = 0; |
3528 LocationSummary* summary = | 3576 LocationSummary* summary = new(isolate) LocationSummary( |
3529 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3577 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3530 summary->set_in(0, Location::RequiresFpuRegister()); | 3578 summary->set_in(0, Location::RequiresFpuRegister()); |
3531 summary->set_in(1, Location::RequiresFpuRegister()); | 3579 summary->set_in(1, Location::RequiresFpuRegister()); |
3532 summary->set_out(0, Location::RequiresFpuRegister()); | 3580 summary->set_out(0, Location::RequiresFpuRegister()); |
3533 return summary; | 3581 return summary; |
3534 } | 3582 } |
3535 | 3583 |
3536 | 3584 |
3537 void Float32x4ScaleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3585 void Float32x4ScaleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3538 const VRegister left = locs()->in(0).fpu_reg(); | 3586 const VRegister left = locs()->in(0).fpu_reg(); |
3539 const VRegister right = locs()->in(1).fpu_reg(); | 3587 const VRegister right = locs()->in(1).fpu_reg(); |
3540 const VRegister result = locs()->out(0).fpu_reg(); | 3588 const VRegister result = locs()->out(0).fpu_reg(); |
3541 | 3589 |
3542 switch (op_kind()) { | 3590 switch (op_kind()) { |
3543 case MethodRecognizer::kFloat32x4Scale: | 3591 case MethodRecognizer::kFloat32x4Scale: |
3544 __ fcvtsd(VTMP, left); | 3592 __ fcvtsd(VTMP, left); |
3545 __ vdups(result, VTMP, 0); | 3593 __ vdups(result, VTMP, 0); |
3546 __ vmuls(result, result, right); | 3594 __ vmuls(result, result, right); |
3547 break; | 3595 break; |
3548 default: UNREACHABLE(); | 3596 default: UNREACHABLE(); |
3549 } | 3597 } |
3550 } | 3598 } |
3551 | 3599 |
3552 | 3600 |
3553 LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(bool opt) const { | 3601 LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(Isolate* isolate, |
| 3602 bool opt) const { |
3554 UNIMPLEMENTED(); | 3603 UNIMPLEMENTED(); |
3555 return NULL; | 3604 return NULL; |
3556 } | 3605 } |
3557 | 3606 |
3558 | 3607 |
3559 void Float32x4ZeroArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3608 void Float32x4ZeroArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3560 UNIMPLEMENTED(); | 3609 UNIMPLEMENTED(); |
3561 } | 3610 } |
3562 | 3611 |
3563 | 3612 |
3564 LocationSummary* Float32x4ClampInstr::MakeLocationSummary(bool opt) const { | 3613 LocationSummary* Float32x4ClampInstr::MakeLocationSummary(Isolate* isolate, |
| 3614 bool opt) const { |
3565 UNIMPLEMENTED(); | 3615 UNIMPLEMENTED(); |
3566 return NULL; | 3616 return NULL; |
3567 } | 3617 } |
3568 | 3618 |
3569 | 3619 |
3570 void Float32x4ClampInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3620 void Float32x4ClampInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3571 UNIMPLEMENTED(); | 3621 UNIMPLEMENTED(); |
3572 } | 3622 } |
3573 | 3623 |
3574 | 3624 |
3575 LocationSummary* Float32x4WithInstr::MakeLocationSummary(bool opt) const { | 3625 LocationSummary* Float32x4WithInstr::MakeLocationSummary(Isolate* isolate, |
| 3626 bool opt) const { |
3576 UNIMPLEMENTED(); | 3627 UNIMPLEMENTED(); |
3577 return NULL; | 3628 return NULL; |
3578 } | 3629 } |
3579 | 3630 |
3580 | 3631 |
3581 void Float32x4WithInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3632 void Float32x4WithInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3582 UNIMPLEMENTED(); | 3633 UNIMPLEMENTED(); |
3583 } | 3634 } |
3584 | 3635 |
3585 | 3636 |
3586 LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(bool opt) const { | 3637 LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(Isolate* isolate, |
| 3638 bool opt) const { |
3587 UNIMPLEMENTED(); | 3639 UNIMPLEMENTED(); |
3588 return NULL; | 3640 return NULL; |
3589 } | 3641 } |
3590 | 3642 |
3591 | 3643 |
3592 void Float32x4ToInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3644 void Float32x4ToInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3593 UNIMPLEMENTED(); | 3645 UNIMPLEMENTED(); |
3594 } | 3646 } |
3595 | 3647 |
3596 | 3648 |
3597 LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(bool opt) const { | 3649 LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(Isolate* isolate, |
| 3650 bool opt) const { |
3598 const intptr_t kNumInputs = 1; | 3651 const intptr_t kNumInputs = 1; |
3599 const intptr_t kNumTemps = 0; | 3652 const intptr_t kNumTemps = 0; |
3600 LocationSummary* summary = | 3653 LocationSummary* summary = new(isolate) LocationSummary( |
3601 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3654 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3602 summary->set_in(0, Location::RequiresFpuRegister()); | 3655 summary->set_in(0, Location::RequiresFpuRegister()); |
3603 summary->set_out(0, Location::RequiresFpuRegister()); | 3656 summary->set_out(0, Location::RequiresFpuRegister()); |
3604 return summary; | 3657 return summary; |
3605 } | 3658 } |
3606 | 3659 |
3607 | 3660 |
3608 void Simd64x2ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3661 void Simd64x2ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3609 const VRegister value = locs()->in(0).fpu_reg(); | 3662 const VRegister value = locs()->in(0).fpu_reg(); |
3610 const VRegister result = locs()->out(0).fpu_reg(); | 3663 const VRegister result = locs()->out(0).fpu_reg(); |
3611 | 3664 |
3612 switch (op_kind()) { | 3665 switch (op_kind()) { |
3613 case MethodRecognizer::kFloat64x2GetX: | 3666 case MethodRecognizer::kFloat64x2GetX: |
3614 __ vinsd(result, 0, value, 0); | 3667 __ vinsd(result, 0, value, 0); |
3615 break; | 3668 break; |
3616 case MethodRecognizer::kFloat64x2GetY: | 3669 case MethodRecognizer::kFloat64x2GetY: |
3617 __ vinsd(result, 0, value, 1); | 3670 __ vinsd(result, 0, value, 1); |
3618 break; | 3671 break; |
3619 default: UNREACHABLE(); | 3672 default: UNREACHABLE(); |
3620 } | 3673 } |
3621 } | 3674 } |
3622 | 3675 |
3623 | 3676 |
3624 LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(bool opt) const { | 3677 LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(Isolate* isolate, |
| 3678 bool opt) const { |
3625 const intptr_t kNumInputs = 0; | 3679 const intptr_t kNumInputs = 0; |
3626 const intptr_t kNumTemps = 0; | 3680 const intptr_t kNumTemps = 0; |
3627 LocationSummary* summary = | 3681 LocationSummary* summary = new(isolate) LocationSummary( |
3628 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3682 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3629 summary->set_out(0, Location::RequiresFpuRegister()); | 3683 summary->set_out(0, Location::RequiresFpuRegister()); |
3630 return summary; | 3684 return summary; |
3631 } | 3685 } |
3632 | 3686 |
3633 | 3687 |
3634 void Float64x2ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3688 void Float64x2ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3635 const VRegister v = locs()->out(0).fpu_reg(); | 3689 const VRegister v = locs()->out(0).fpu_reg(); |
3636 __ LoadDImmediate(v, 0.0, PP); | 3690 __ LoadDImmediate(v, 0.0, PP); |
3637 } | 3691 } |
3638 | 3692 |
3639 | 3693 |
3640 LocationSummary* Float64x2SplatInstr::MakeLocationSummary(bool opt) const { | 3694 LocationSummary* Float64x2SplatInstr::MakeLocationSummary(Isolate* isolate, |
| 3695 bool opt) const { |
3641 const intptr_t kNumInputs = 1; | 3696 const intptr_t kNumInputs = 1; |
3642 const intptr_t kNumTemps = 0; | 3697 const intptr_t kNumTemps = 0; |
3643 LocationSummary* summary = | 3698 LocationSummary* summary = new(isolate) LocationSummary( |
3644 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3699 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3645 summary->set_in(0, Location::RequiresFpuRegister()); | 3700 summary->set_in(0, Location::RequiresFpuRegister()); |
3646 summary->set_out(0, Location::RequiresFpuRegister()); | 3701 summary->set_out(0, Location::RequiresFpuRegister()); |
3647 return summary; | 3702 return summary; |
3648 } | 3703 } |
3649 | 3704 |
3650 | 3705 |
3651 void Float64x2SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3706 void Float64x2SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3652 const VRegister value = locs()->in(0).fpu_reg(); | 3707 const VRegister value = locs()->in(0).fpu_reg(); |
3653 const VRegister result = locs()->out(0).fpu_reg(); | 3708 const VRegister result = locs()->out(0).fpu_reg(); |
3654 __ vdupd(result, value, 0); | 3709 __ vdupd(result, value, 0); |
3655 } | 3710 } |
3656 | 3711 |
3657 | 3712 |
3658 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary( | 3713 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary( |
3659 bool opt) const { | 3714 Isolate* isolate, bool opt) const { |
3660 const intptr_t kNumInputs = 2; | 3715 const intptr_t kNumInputs = 2; |
3661 const intptr_t kNumTemps = 0; | 3716 const intptr_t kNumTemps = 0; |
3662 LocationSummary* summary = | 3717 LocationSummary* summary = new(isolate) LocationSummary( |
3663 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3718 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3664 summary->set_in(0, Location::RequiresFpuRegister()); | 3719 summary->set_in(0, Location::RequiresFpuRegister()); |
3665 summary->set_in(1, Location::RequiresFpuRegister()); | 3720 summary->set_in(1, Location::RequiresFpuRegister()); |
3666 summary->set_out(0, Location::RequiresFpuRegister()); | 3721 summary->set_out(0, Location::RequiresFpuRegister()); |
3667 return summary; | 3722 return summary; |
3668 } | 3723 } |
3669 | 3724 |
3670 | 3725 |
3671 void Float64x2ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3726 void Float64x2ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3672 const VRegister v0 = locs()->in(0).fpu_reg(); | 3727 const VRegister v0 = locs()->in(0).fpu_reg(); |
3673 const VRegister v1 = locs()->in(1).fpu_reg(); | 3728 const VRegister v1 = locs()->in(1).fpu_reg(); |
3674 const VRegister r = locs()->out(0).fpu_reg(); | 3729 const VRegister r = locs()->out(0).fpu_reg(); |
3675 __ vinsd(r, 0, v0, 0); | 3730 __ vinsd(r, 0, v0, 0); |
3676 __ vinsd(r, 0, v1, 0); | 3731 __ vinsd(r, 0, v1, 0); |
3677 } | 3732 } |
3678 | 3733 |
3679 | 3734 |
3680 LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary( | 3735 LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary( |
3681 bool opt) const { | 3736 Isolate* isolate, bool opt) const { |
3682 UNIMPLEMENTED(); | 3737 UNIMPLEMENTED(); |
3683 return NULL; | 3738 return NULL; |
3684 } | 3739 } |
3685 | 3740 |
3686 | 3741 |
3687 void Float64x2ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3742 void Float64x2ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3688 UNIMPLEMENTED(); | 3743 UNIMPLEMENTED(); |
3689 } | 3744 } |
3690 | 3745 |
3691 | 3746 |
3692 LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary( | 3747 LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary( |
3693 bool opt) const { | 3748 Isolate* isolate, bool opt) const { |
3694 UNIMPLEMENTED(); | 3749 UNIMPLEMENTED(); |
3695 return NULL; | 3750 return NULL; |
3696 } | 3751 } |
3697 | 3752 |
3698 | 3753 |
3699 void Float32x4ToFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3754 void Float32x4ToFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3700 UNIMPLEMENTED(); | 3755 UNIMPLEMENTED(); |
3701 } | 3756 } |
3702 | 3757 |
3703 | 3758 |
3704 LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(bool opt) const { | 3759 LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(Isolate* isolate, |
| 3760 bool opt) const { |
3705 UNIMPLEMENTED(); | 3761 UNIMPLEMENTED(); |
3706 return NULL; | 3762 return NULL; |
3707 } | 3763 } |
3708 | 3764 |
3709 | 3765 |
3710 void Float64x2ZeroArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3766 void Float64x2ZeroArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3711 UNIMPLEMENTED(); | 3767 UNIMPLEMENTED(); |
3712 } | 3768 } |
3713 | 3769 |
3714 | 3770 |
3715 LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(bool opt) const { | 3771 LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(Isolate* isolate, |
| 3772 bool opt) const { |
3716 UNIMPLEMENTED(); | 3773 UNIMPLEMENTED(); |
3717 return NULL; | 3774 return NULL; |
3718 } | 3775 } |
3719 | 3776 |
3720 | 3777 |
3721 void Float64x2OneArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3778 void Float64x2OneArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3722 UNIMPLEMENTED(); | 3779 UNIMPLEMENTED(); |
3723 } | 3780 } |
3724 | 3781 |
3725 | 3782 |
3726 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary( | 3783 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary( |
3727 bool opt) const { | 3784 Isolate* isolate, bool opt) const { |
3728 UNIMPLEMENTED(); | 3785 UNIMPLEMENTED(); |
3729 return NULL; | 3786 return NULL; |
3730 } | 3787 } |
3731 | 3788 |
3732 | 3789 |
3733 void Int32x4BoolConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3790 void Int32x4BoolConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3734 UNIMPLEMENTED(); | 3791 UNIMPLEMENTED(); |
3735 } | 3792 } |
3736 | 3793 |
3737 | 3794 |
3738 LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(bool opt) const { | 3795 LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(Isolate* isolate, |
| 3796 bool opt) const { |
3739 UNIMPLEMENTED(); | 3797 UNIMPLEMENTED(); |
3740 return NULL; | 3798 return NULL; |
3741 } | 3799 } |
3742 | 3800 |
3743 | 3801 |
3744 void Int32x4GetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3802 void Int32x4GetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3745 UNIMPLEMENTED(); | 3803 UNIMPLEMENTED(); |
3746 } | 3804 } |
3747 | 3805 |
3748 | 3806 |
3749 LocationSummary* Int32x4SelectInstr::MakeLocationSummary(bool opt) const { | 3807 LocationSummary* Int32x4SelectInstr::MakeLocationSummary(Isolate* isolate, |
| 3808 bool opt) const { |
3750 UNIMPLEMENTED(); | 3809 UNIMPLEMENTED(); |
3751 return NULL; | 3810 return NULL; |
3752 } | 3811 } |
3753 | 3812 |
3754 | 3813 |
3755 void Int32x4SelectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3814 void Int32x4SelectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3756 UNIMPLEMENTED(); | 3815 UNIMPLEMENTED(); |
3757 } | 3816 } |
3758 | 3817 |
3759 | 3818 |
3760 LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(bool opt) const { | 3819 LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(Isolate* isolate, |
| 3820 bool opt) const { |
3761 UNIMPLEMENTED(); | 3821 UNIMPLEMENTED(); |
3762 return NULL; | 3822 return NULL; |
3763 } | 3823 } |
3764 | 3824 |
3765 | 3825 |
3766 void Int32x4SetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3826 void Int32x4SetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3767 UNIMPLEMENTED(); | 3827 UNIMPLEMENTED(); |
3768 } | 3828 } |
3769 | 3829 |
3770 | 3830 |
3771 LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(bool opt) const { | 3831 LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(Isolate* isolate, |
| 3832 bool opt) const { |
3772 UNIMPLEMENTED(); | 3833 UNIMPLEMENTED(); |
3773 return NULL; | 3834 return NULL; |
3774 } | 3835 } |
3775 | 3836 |
3776 | 3837 |
3777 void Int32x4ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3838 void Int32x4ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3778 UNIMPLEMENTED(); | 3839 UNIMPLEMENTED(); |
3779 } | 3840 } |
3780 | 3841 |
3781 | 3842 |
3782 LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(bool opt) const { | 3843 LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(Isolate* isolate, |
| 3844 bool opt) const { |
3783 UNIMPLEMENTED(); | 3845 UNIMPLEMENTED(); |
3784 return NULL; | 3846 return NULL; |
3785 } | 3847 } |
3786 | 3848 |
3787 | 3849 |
3788 void BinaryInt32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3850 void BinaryInt32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3789 UNIMPLEMENTED(); | 3851 UNIMPLEMENTED(); |
3790 } | 3852 } |
3791 | 3853 |
3792 | 3854 |
3793 LocationSummary* MathUnaryInstr::MakeLocationSummary(bool opt) const { | 3855 LocationSummary* MathUnaryInstr::MakeLocationSummary(Isolate* isolate, |
| 3856 bool opt) const { |
3794 if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) { | 3857 if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) { |
3795 const intptr_t kNumInputs = 1; | 3858 const intptr_t kNumInputs = 1; |
3796 const intptr_t kNumTemps = 0; | 3859 const intptr_t kNumTemps = 0; |
3797 LocationSummary* summary = | 3860 LocationSummary* summary = new(isolate) LocationSummary( |
3798 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 3861 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
3799 summary->set_in(0, Location::FpuRegisterLocation(V0)); | 3862 summary->set_in(0, Location::FpuRegisterLocation(V0)); |
3800 summary->set_out(0, Location::FpuRegisterLocation(V0)); | 3863 summary->set_out(0, Location::FpuRegisterLocation(V0)); |
3801 return summary; | 3864 return summary; |
3802 } | 3865 } |
3803 ASSERT((kind() == MathUnaryInstr::kSqrt) || | 3866 ASSERT((kind() == MathUnaryInstr::kSqrt) || |
3804 (kind() == MathUnaryInstr::kDoubleSquare)); | 3867 (kind() == MathUnaryInstr::kDoubleSquare)); |
3805 const intptr_t kNumInputs = 1; | 3868 const intptr_t kNumInputs = 1; |
3806 const intptr_t kNumTemps = 0; | 3869 const intptr_t kNumTemps = 0; |
3807 LocationSummary* summary = | 3870 LocationSummary* summary = new(isolate) LocationSummary( |
3808 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3871 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3809 summary->set_in(0, Location::RequiresFpuRegister()); | 3872 summary->set_in(0, Location::RequiresFpuRegister()); |
3810 summary->set_out(0, Location::RequiresFpuRegister()); | 3873 summary->set_out(0, Location::RequiresFpuRegister()); |
3811 return summary; | 3874 return summary; |
3812 } | 3875 } |
3813 | 3876 |
3814 | 3877 |
3815 void MathUnaryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3878 void MathUnaryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3816 if (kind() == MathUnaryInstr::kSqrt) { | 3879 if (kind() == MathUnaryInstr::kSqrt) { |
3817 const VRegister val = locs()->in(0).fpu_reg(); | 3880 const VRegister val = locs()->in(0).fpu_reg(); |
3818 const VRegister result = locs()->out(0).fpu_reg(); | 3881 const VRegister result = locs()->out(0).fpu_reg(); |
3819 __ fsqrtd(result, val); | 3882 __ fsqrtd(result, val); |
3820 } else if (kind() == MathUnaryInstr::kDoubleSquare) { | 3883 } else if (kind() == MathUnaryInstr::kDoubleSquare) { |
3821 const VRegister val = locs()->in(0).fpu_reg(); | 3884 const VRegister val = locs()->in(0).fpu_reg(); |
3822 const VRegister result = locs()->out(0).fpu_reg(); | 3885 const VRegister result = locs()->out(0).fpu_reg(); |
3823 __ fmuld(result, val, val); | 3886 __ fmuld(result, val, val); |
3824 } else { | 3887 } else { |
3825 ASSERT((kind() == MathUnaryInstr::kSin) || | 3888 ASSERT((kind() == MathUnaryInstr::kSin) || |
3826 (kind() == MathUnaryInstr::kCos)); | 3889 (kind() == MathUnaryInstr::kCos)); |
3827 __ CallRuntime(TargetFunction(), InputCount()); | 3890 __ CallRuntime(TargetFunction(), InputCount()); |
3828 } | 3891 } |
3829 } | 3892 } |
3830 | 3893 |
3831 | 3894 |
3832 LocationSummary* MathMinMaxInstr::MakeLocationSummary(bool opt) const { | 3895 LocationSummary* MathMinMaxInstr::MakeLocationSummary(Isolate* isolate, |
| 3896 bool opt) const { |
3833 if (result_cid() == kDoubleCid) { | 3897 if (result_cid() == kDoubleCid) { |
3834 const intptr_t kNumInputs = 2; | 3898 const intptr_t kNumInputs = 2; |
3835 const intptr_t kNumTemps = 0; | 3899 const intptr_t kNumTemps = 0; |
3836 LocationSummary* summary = | 3900 LocationSummary* summary = new(isolate) LocationSummary( |
3837 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3901 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3838 summary->set_in(0, Location::RequiresFpuRegister()); | 3902 summary->set_in(0, Location::RequiresFpuRegister()); |
3839 summary->set_in(1, Location::RequiresFpuRegister()); | 3903 summary->set_in(1, Location::RequiresFpuRegister()); |
3840 // Reuse the left register so that code can be made shorter. | 3904 // Reuse the left register so that code can be made shorter. |
3841 summary->set_out(0, Location::SameAsFirstInput()); | 3905 summary->set_out(0, Location::SameAsFirstInput()); |
3842 return summary; | 3906 return summary; |
3843 } | 3907 } |
3844 ASSERT(result_cid() == kSmiCid); | 3908 ASSERT(result_cid() == kSmiCid); |
3845 const intptr_t kNumInputs = 2; | 3909 const intptr_t kNumInputs = 2; |
3846 const intptr_t kNumTemps = 0; | 3910 const intptr_t kNumTemps = 0; |
3847 LocationSummary* summary = | 3911 LocationSummary* summary = new(isolate) LocationSummary( |
3848 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3912 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3849 summary->set_in(0, Location::RequiresRegister()); | 3913 summary->set_in(0, Location::RequiresRegister()); |
3850 summary->set_in(1, Location::RequiresRegister()); | 3914 summary->set_in(1, Location::RequiresRegister()); |
3851 // Reuse the left register so that code can be made shorter. | 3915 // Reuse the left register so that code can be made shorter. |
3852 summary->set_out(0, Location::SameAsFirstInput()); | 3916 summary->set_out(0, Location::SameAsFirstInput()); |
3853 return summary; | 3917 return summary; |
3854 } | 3918 } |
3855 | 3919 |
3856 | 3920 |
3857 void MathMinMaxInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3921 void MathMinMaxInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3858 ASSERT((op_kind() == MethodRecognizer::kMathMin) || | 3922 ASSERT((op_kind() == MethodRecognizer::kMathMin) || |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3907 __ CompareRegisters(left, right); | 3971 __ CompareRegisters(left, right); |
3908 ASSERT(result == left); | 3972 ASSERT(result == left); |
3909 if (is_min) { | 3973 if (is_min) { |
3910 __ csel(result, right, left, GT); | 3974 __ csel(result, right, left, GT); |
3911 } else { | 3975 } else { |
3912 __ csel(result, right, left, LT); | 3976 __ csel(result, right, left, LT); |
3913 } | 3977 } |
3914 } | 3978 } |
3915 | 3979 |
3916 | 3980 |
3917 LocationSummary* UnarySmiOpInstr::MakeLocationSummary(bool opt) const { | 3981 LocationSummary* UnarySmiOpInstr::MakeLocationSummary(Isolate* isolate, |
| 3982 bool opt) const { |
3918 const intptr_t kNumInputs = 1; | 3983 const intptr_t kNumInputs = 1; |
3919 const intptr_t kNumTemps = 0; | 3984 const intptr_t kNumTemps = 0; |
3920 LocationSummary* summary = | 3985 LocationSummary* summary = new(isolate) LocationSummary( |
3921 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3986 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3922 summary->set_in(0, Location::RequiresRegister()); | 3987 summary->set_in(0, Location::RequiresRegister()); |
3923 // We make use of 3-operand instructions by not requiring result register | 3988 // We make use of 3-operand instructions by not requiring result register |
3924 // to be identical to first input register as on Intel. | 3989 // to be identical to first input register as on Intel. |
3925 summary->set_out(0, Location::RequiresRegister()); | 3990 summary->set_out(0, Location::RequiresRegister()); |
3926 return summary; | 3991 return summary; |
3927 } | 3992 } |
3928 | 3993 |
3929 | 3994 |
3930 void UnarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3995 void UnarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3931 const Register value = locs()->in(0).reg(); | 3996 const Register value = locs()->in(0).reg(); |
(...skipping 12 matching lines...) Expand all Loading... |
3944 __ mvn(result, value); | 4009 __ mvn(result, value); |
3945 // Remove inverted smi-tag. | 4010 // Remove inverted smi-tag. |
3946 __ andi(result, result, ~kSmiTagMask); | 4011 __ andi(result, result, ~kSmiTagMask); |
3947 break; | 4012 break; |
3948 default: | 4013 default: |
3949 UNREACHABLE(); | 4014 UNREACHABLE(); |
3950 } | 4015 } |
3951 } | 4016 } |
3952 | 4017 |
3953 | 4018 |
3954 LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(bool opt) const { | 4019 LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate, |
| 4020 bool opt) const { |
3955 const intptr_t kNumInputs = 1; | 4021 const intptr_t kNumInputs = 1; |
3956 const intptr_t kNumTemps = 0; | 4022 const intptr_t kNumTemps = 0; |
3957 LocationSummary* summary = | 4023 LocationSummary* summary = new(isolate) LocationSummary( |
3958 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4024 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3959 summary->set_in(0, Location::RequiresFpuRegister()); | 4025 summary->set_in(0, Location::RequiresFpuRegister()); |
3960 summary->set_out(0, Location::RequiresFpuRegister()); | 4026 summary->set_out(0, Location::RequiresFpuRegister()); |
3961 return summary; | 4027 return summary; |
3962 } | 4028 } |
3963 | 4029 |
3964 | 4030 |
3965 void UnaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4031 void UnaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3966 const VRegister result = locs()->out(0).fpu_reg(); | 4032 const VRegister result = locs()->out(0).fpu_reg(); |
3967 const VRegister value = locs()->in(0).fpu_reg(); | 4033 const VRegister value = locs()->in(0).fpu_reg(); |
3968 __ fnegd(result, value); | 4034 __ fnegd(result, value); |
3969 } | 4035 } |
3970 | 4036 |
3971 | 4037 |
3972 LocationSummary* SmiToDoubleInstr::MakeLocationSummary(bool opt) const { | 4038 LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Isolate* isolate, |
| 4039 bool opt) const { |
3973 const intptr_t kNumInputs = 1; | 4040 const intptr_t kNumInputs = 1; |
3974 const intptr_t kNumTemps = 0; | 4041 const intptr_t kNumTemps = 0; |
3975 LocationSummary* result = | 4042 LocationSummary* result = new(isolate) LocationSummary( |
3976 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4043 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
3977 result->set_in(0, Location::WritableRegister()); | 4044 result->set_in(0, Location::WritableRegister()); |
3978 result->set_out(0, Location::RequiresFpuRegister()); | 4045 result->set_out(0, Location::RequiresFpuRegister()); |
3979 return result; | 4046 return result; |
3980 } | 4047 } |
3981 | 4048 |
3982 | 4049 |
3983 void SmiToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4050 void SmiToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
3984 const Register value = locs()->in(0).reg(); | 4051 const Register value = locs()->in(0).reg(); |
3985 const VRegister result = locs()->out(0).fpu_reg(); | 4052 const VRegister result = locs()->out(0).fpu_reg(); |
3986 __ SmiUntag(value); | 4053 __ SmiUntag(value); |
3987 __ scvtfd(result, value); | 4054 __ scvtfd(result, value); |
3988 } | 4055 } |
3989 | 4056 |
3990 | 4057 |
3991 LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(bool opt) const { | 4058 LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(Isolate* isolate, |
| 4059 bool opt) const { |
3992 const intptr_t kNumInputs = 1; | 4060 const intptr_t kNumInputs = 1; |
3993 const intptr_t kNumTemps = 0; | 4061 const intptr_t kNumTemps = 0; |
3994 LocationSummary* result = | 4062 LocationSummary* result = new(isolate) LocationSummary( |
3995 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 4063 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
3996 result->set_in(0, Location::RegisterLocation(R1)); | 4064 result->set_in(0, Location::RegisterLocation(R1)); |
3997 result->set_out(0, Location::RegisterLocation(R0)); | 4065 result->set_out(0, Location::RegisterLocation(R0)); |
3998 return result; | 4066 return result; |
3999 } | 4067 } |
4000 | 4068 |
4001 | 4069 |
4002 void DoubleToIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4070 void DoubleToIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4003 const Register result = locs()->out(0).reg(); | 4071 const Register result = locs()->out(0).reg(); |
4004 const Register value_obj = locs()->in(0).reg(); | 4072 const Register value_obj = locs()->in(0).reg(); |
4005 ASSERT(result == R0); | 4073 ASSERT(result == R0); |
(...skipping 28 matching lines...) Expand all Loading... |
4034 compiler->GenerateStaticCall(deopt_id(), | 4102 compiler->GenerateStaticCall(deopt_id(), |
4035 instance_call()->token_pos(), | 4103 instance_call()->token_pos(), |
4036 target, | 4104 target, |
4037 kNumberOfArguments, | 4105 kNumberOfArguments, |
4038 Object::null_array(), // No argument names., | 4106 Object::null_array(), // No argument names., |
4039 locs()); | 4107 locs()); |
4040 __ Bind(&done); | 4108 __ Bind(&done); |
4041 } | 4109 } |
4042 | 4110 |
4043 | 4111 |
4044 LocationSummary* DoubleToSmiInstr::MakeLocationSummary(bool opt) const { | 4112 LocationSummary* DoubleToSmiInstr::MakeLocationSummary(Isolate* isolate, |
| 4113 bool opt) const { |
4045 const intptr_t kNumInputs = 1; | 4114 const intptr_t kNumInputs = 1; |
4046 const intptr_t kNumTemps = 0; | 4115 const intptr_t kNumTemps = 0; |
4047 LocationSummary* result = new LocationSummary( | 4116 LocationSummary* result = new(isolate) LocationSummary( |
4048 kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4117 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4049 result->set_in(0, Location::RequiresFpuRegister()); | 4118 result->set_in(0, Location::RequiresFpuRegister()); |
4050 result->set_out(0, Location::RequiresRegister()); | 4119 result->set_out(0, Location::RequiresRegister()); |
4051 return result; | 4120 return result; |
4052 } | 4121 } |
4053 | 4122 |
4054 | 4123 |
4055 void DoubleToSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4124 void DoubleToSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4056 Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptDoubleToSmi); | 4125 Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptDoubleToSmi); |
4057 const Register result = locs()->out(0).reg(); | 4126 const Register result = locs()->out(0).reg(); |
4058 const VRegister value = locs()->in(0).fpu_reg(); | 4127 const VRegister value = locs()->in(0).fpu_reg(); |
4059 // First check for NaN. Checking for minint after the conversion doesn't work | 4128 // First check for NaN. Checking for minint after the conversion doesn't work |
4060 // on ARM64 because fcvtzds gives 0 for NaN. | 4129 // on ARM64 because fcvtzds gives 0 for NaN. |
4061 // TODO(zra): Check spec that this is true. | 4130 // TODO(zra): Check spec that this is true. |
4062 __ fcmpd(value, value); | 4131 __ fcmpd(value, value); |
4063 __ b(deopt, VS); | 4132 __ b(deopt, VS); |
4064 | 4133 |
4065 __ fcvtzds(result, value); | 4134 __ fcvtzds(result, value); |
4066 // Check for overflow and that it fits into Smi. | 4135 // Check for overflow and that it fits into Smi. |
4067 __ CompareImmediate(result, 0xC000000000000000, PP); | 4136 __ CompareImmediate(result, 0xC000000000000000, PP); |
4068 __ b(deopt, MI); | 4137 __ b(deopt, MI); |
4069 __ SmiTag(result); | 4138 __ SmiTag(result); |
4070 if (FLAG_throw_on_javascript_int_overflow) { | 4139 if (FLAG_throw_on_javascript_int_overflow) { |
4071 EmitJavascriptOverflowCheck(compiler, range(), deopt, result); | 4140 EmitJavascriptOverflowCheck(compiler, range(), deopt, result); |
4072 } | 4141 } |
4073 } | 4142 } |
4074 | 4143 |
4075 | 4144 |
4076 LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(bool opt) const { | 4145 LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(Isolate* isolate, |
| 4146 bool opt) const { |
4077 UNIMPLEMENTED(); | 4147 UNIMPLEMENTED(); |
4078 return NULL; | 4148 return NULL; |
4079 } | 4149 } |
4080 | 4150 |
4081 | 4151 |
4082 void DoubleToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4152 void DoubleToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4083 UNIMPLEMENTED(); | 4153 UNIMPLEMENTED(); |
4084 } | 4154 } |
4085 | 4155 |
4086 | 4156 |
4087 LocationSummary* DoubleToFloatInstr::MakeLocationSummary(bool opt) const { | 4157 LocationSummary* DoubleToFloatInstr::MakeLocationSummary(Isolate* isolate, |
| 4158 bool opt) const { |
4088 const intptr_t kNumInputs = 1; | 4159 const intptr_t kNumInputs = 1; |
4089 const intptr_t kNumTemps = 0; | 4160 const intptr_t kNumTemps = 0; |
4090 LocationSummary* result = | 4161 LocationSummary* result = new(isolate) LocationSummary( |
4091 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4162 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4092 result->set_in(0, Location::RequiresFpuRegister()); | 4163 result->set_in(0, Location::RequiresFpuRegister()); |
4093 result->set_out(0, Location::RequiresFpuRegister()); | 4164 result->set_out(0, Location::RequiresFpuRegister()); |
4094 return result; | 4165 return result; |
4095 } | 4166 } |
4096 | 4167 |
4097 | 4168 |
4098 void DoubleToFloatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4169 void DoubleToFloatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4099 const VRegister value = locs()->in(0).fpu_reg(); | 4170 const VRegister value = locs()->in(0).fpu_reg(); |
4100 const VRegister result = locs()->out(0).fpu_reg(); | 4171 const VRegister result = locs()->out(0).fpu_reg(); |
4101 __ fcvtsd(result, value); | 4172 __ fcvtsd(result, value); |
4102 } | 4173 } |
4103 | 4174 |
4104 | 4175 |
4105 LocationSummary* FloatToDoubleInstr::MakeLocationSummary(bool opt) const { | 4176 LocationSummary* FloatToDoubleInstr::MakeLocationSummary(Isolate* isolate, |
| 4177 bool opt) const { |
4106 const intptr_t kNumInputs = 1; | 4178 const intptr_t kNumInputs = 1; |
4107 const intptr_t kNumTemps = 0; | 4179 const intptr_t kNumTemps = 0; |
4108 LocationSummary* result = | 4180 LocationSummary* result = new(isolate) LocationSummary( |
4109 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4181 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4110 result->set_in(0, Location::RequiresFpuRegister()); | 4182 result->set_in(0, Location::RequiresFpuRegister()); |
4111 result->set_out(0, Location::RequiresFpuRegister()); | 4183 result->set_out(0, Location::RequiresFpuRegister()); |
4112 return result; | 4184 return result; |
4113 } | 4185 } |
4114 | 4186 |
4115 | 4187 |
4116 void FloatToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4188 void FloatToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4117 const VRegister value = locs()->in(0).fpu_reg(); | 4189 const VRegister value = locs()->in(0).fpu_reg(); |
4118 const VRegister result = locs()->out(0).fpu_reg(); | 4190 const VRegister result = locs()->out(0).fpu_reg(); |
4119 __ fcvtds(result, value); | 4191 __ fcvtds(result, value); |
4120 } | 4192 } |
4121 | 4193 |
4122 | 4194 |
4123 LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(bool opt) const { | 4195 LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(Isolate* isolate, |
| 4196 bool opt) const { |
4124 ASSERT((InputCount() == 1) || (InputCount() == 2)); | 4197 ASSERT((InputCount() == 1) || (InputCount() == 2)); |
4125 const intptr_t kNumTemps = 0; | 4198 const intptr_t kNumTemps = 0; |
4126 LocationSummary* result = | 4199 LocationSummary* result = new(isolate) LocationSummary( |
4127 new LocationSummary(InputCount(), kNumTemps, LocationSummary::kCall); | 4200 isolate, InputCount(), kNumTemps, LocationSummary::kCall); |
4128 result->set_in(0, Location::FpuRegisterLocation(V0)); | 4201 result->set_in(0, Location::FpuRegisterLocation(V0)); |
4129 if (InputCount() == 2) { | 4202 if (InputCount() == 2) { |
4130 result->set_in(1, Location::FpuRegisterLocation(V1)); | 4203 result->set_in(1, Location::FpuRegisterLocation(V1)); |
4131 } | 4204 } |
4132 if (recognized_kind() == MethodRecognizer::kMathDoublePow) { | 4205 if (recognized_kind() == MethodRecognizer::kMathDoublePow) { |
4133 result->AddTemp(Location::FpuRegisterLocation(V30)); | 4206 result->AddTemp(Location::FpuRegisterLocation(V30)); |
4134 } | 4207 } |
4135 result->set_out(0, Location::FpuRegisterLocation(V0)); | 4208 result->set_out(0, Location::FpuRegisterLocation(V0)); |
4136 return result; | 4209 return result; |
4137 } | 4210 } |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4252 | 4325 |
4253 void InvokeMathCFunctionInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4326 void InvokeMathCFunctionInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4254 if (recognized_kind() == MethodRecognizer::kMathDoublePow) { | 4327 if (recognized_kind() == MethodRecognizer::kMathDoublePow) { |
4255 InvokeDoublePow(compiler, this); | 4328 InvokeDoublePow(compiler, this); |
4256 return; | 4329 return; |
4257 } | 4330 } |
4258 __ CallRuntime(TargetFunction(), InputCount()); | 4331 __ CallRuntime(TargetFunction(), InputCount()); |
4259 } | 4332 } |
4260 | 4333 |
4261 | 4334 |
4262 LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(bool opt) const { | 4335 LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(Isolate* isolate, |
| 4336 bool opt) const { |
4263 // Only use this instruction in optimized code. | 4337 // Only use this instruction in optimized code. |
4264 ASSERT(opt); | 4338 ASSERT(opt); |
4265 const intptr_t kNumInputs = 1; | 4339 const intptr_t kNumInputs = 1; |
4266 LocationSummary* summary = | 4340 LocationSummary* summary = new(isolate) LocationSummary( |
4267 new LocationSummary(kNumInputs, 0, LocationSummary::kNoCall); | 4341 isolate, kNumInputs, 0, LocationSummary::kNoCall); |
4268 if (representation() == kUnboxedDouble) { | 4342 if (representation() == kUnboxedDouble) { |
4269 if (index() == 0) { | 4343 if (index() == 0) { |
4270 summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(), | 4344 summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(), |
4271 Location::Any())); | 4345 Location::Any())); |
4272 } else { | 4346 } else { |
4273 ASSERT(index() == 1); | 4347 ASSERT(index() == 1); |
4274 summary->set_in(0, Location::Pair(Location::Any(), | 4348 summary->set_in(0, Location::Pair(Location::Any(), |
4275 Location::RequiresFpuRegister())); | 4349 Location::RequiresFpuRegister())); |
4276 } | 4350 } |
4277 summary->set_out(0, Location::RequiresFpuRegister()); | 4351 summary->set_out(0, Location::RequiresFpuRegister()); |
(...skipping 23 matching lines...) Expand all Loading... |
4301 __ fmovdd(out, in); | 4375 __ fmovdd(out, in); |
4302 } else { | 4376 } else { |
4303 ASSERT(representation() == kTagged); | 4377 ASSERT(representation() == kTagged); |
4304 const Register out = locs()->out(0).reg(); | 4378 const Register out = locs()->out(0).reg(); |
4305 const Register in = in_loc.reg(); | 4379 const Register in = in_loc.reg(); |
4306 __ mov(out, in); | 4380 __ mov(out, in); |
4307 } | 4381 } |
4308 } | 4382 } |
4309 | 4383 |
4310 | 4384 |
4311 LocationSummary* MergedMathInstr::MakeLocationSummary(bool opt) const { | 4385 LocationSummary* MergedMathInstr::MakeLocationSummary(Isolate* isolate, |
| 4386 bool opt) const { |
4312 if (kind() == MergedMathInstr::kTruncDivMod) { | 4387 if (kind() == MergedMathInstr::kTruncDivMod) { |
4313 const intptr_t kNumInputs = 2; | 4388 const intptr_t kNumInputs = 2; |
4314 const intptr_t kNumTemps = 0; | 4389 const intptr_t kNumTemps = 0; |
4315 LocationSummary* summary = | 4390 LocationSummary* summary = new(isolate) LocationSummary( |
4316 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4391 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4317 summary->set_in(0, Location::RequiresRegister()); | 4392 summary->set_in(0, Location::RequiresRegister()); |
4318 summary->set_in(1, Location::RequiresRegister()); | 4393 summary->set_in(1, Location::RequiresRegister()); |
4319 // Output is a pair of registers. | 4394 // Output is a pair of registers. |
4320 summary->set_out(0, Location::Pair(Location::RequiresRegister(), | 4395 summary->set_out(0, Location::Pair(Location::RequiresRegister(), |
4321 Location::RequiresRegister())); | 4396 Location::RequiresRegister())); |
4322 return summary; | 4397 return summary; |
4323 } | 4398 } |
4324 UNIMPLEMENTED(); | 4399 UNIMPLEMENTED(); |
4325 return NULL; | 4400 return NULL; |
4326 } | 4401 } |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4382 return; | 4457 return; |
4383 } | 4458 } |
4384 if (kind() == MergedMathInstr::kSinCos) { | 4459 if (kind() == MergedMathInstr::kSinCos) { |
4385 UNIMPLEMENTED(); | 4460 UNIMPLEMENTED(); |
4386 } | 4461 } |
4387 UNIMPLEMENTED(); | 4462 UNIMPLEMENTED(); |
4388 } | 4463 } |
4389 | 4464 |
4390 | 4465 |
4391 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary( | 4466 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary( |
4392 bool opt) const { | 4467 Isolate* isolate, bool opt) const { |
4393 return MakeCallSummary(); | 4468 return MakeCallSummary(); |
4394 } | 4469 } |
4395 | 4470 |
4396 | 4471 |
4397 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4472 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4398 Label* deopt = compiler->AddDeoptStub( | 4473 Label* deopt = compiler->AddDeoptStub( |
4399 deopt_id(), ICData::kDeoptPolymorphicInstanceCallTestFail); | 4474 deopt_id(), ICData::kDeoptPolymorphicInstanceCallTestFail); |
4400 if (ic_data().NumberOfChecks() == 0) { | 4475 if (ic_data().NumberOfChecks() == 0) { |
4401 __ b(deopt); | 4476 __ b(deopt); |
4402 return; | 4477 return; |
(...skipping 22 matching lines...) Expand all Loading... |
4425 R2, // Class id register. | 4500 R2, // Class id register. |
4426 instance_call()->ArgumentCount(), | 4501 instance_call()->ArgumentCount(), |
4427 instance_call()->argument_names(), | 4502 instance_call()->argument_names(), |
4428 deopt, | 4503 deopt, |
4429 deopt_id(), | 4504 deopt_id(), |
4430 instance_call()->token_pos(), | 4505 instance_call()->token_pos(), |
4431 locs()); | 4506 locs()); |
4432 } | 4507 } |
4433 | 4508 |
4434 | 4509 |
4435 LocationSummary* BranchInstr::MakeLocationSummary(bool opt) const { | 4510 LocationSummary* BranchInstr::MakeLocationSummary(Isolate* isolate, |
4436 comparison()->InitializeLocationSummary(opt); | 4511 bool opt) const { |
| 4512 comparison()->InitializeLocationSummary(isolate, opt); |
4437 // Branches don't produce a result. | 4513 // Branches don't produce a result. |
4438 comparison()->locs()->set_out(0, Location::NoLocation()); | 4514 comparison()->locs()->set_out(0, Location::NoLocation()); |
4439 return comparison()->locs(); | 4515 return comparison()->locs(); |
4440 } | 4516 } |
4441 | 4517 |
4442 | 4518 |
4443 void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4519 void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4444 comparison()->EmitBranchCode(compiler, this); | 4520 comparison()->EmitBranchCode(compiler, this); |
4445 } | 4521 } |
4446 | 4522 |
4447 | 4523 |
4448 LocationSummary* CheckClassInstr::MakeLocationSummary(bool opt) const { | 4524 LocationSummary* CheckClassInstr::MakeLocationSummary(Isolate* isolate, |
| 4525 bool opt) const { |
4449 const intptr_t kNumInputs = 1; | 4526 const intptr_t kNumInputs = 1; |
4450 const intptr_t kNumTemps = 0; | 4527 const intptr_t kNumTemps = 0; |
4451 LocationSummary* summary = | 4528 LocationSummary* summary = new(isolate) LocationSummary( |
4452 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4529 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4453 summary->set_in(0, Location::RequiresRegister()); | 4530 summary->set_in(0, Location::RequiresRegister()); |
4454 if (!IsNullCheck()) { | 4531 if (!IsNullCheck()) { |
4455 summary->AddTemp(Location::RequiresRegister()); | 4532 summary->AddTemp(Location::RequiresRegister()); |
4456 } | 4533 } |
4457 return summary; | 4534 return summary; |
4458 } | 4535 } |
4459 | 4536 |
4460 | 4537 |
4461 void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4538 void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4462 const ICData::DeoptReasonId deopt_reason = licm_hoisted_ ? | 4539 const ICData::DeoptReasonId deopt_reason = licm_hoisted_ ? |
(...skipping 28 matching lines...) Expand all Loading... |
4491 if (i == (num_checks - 1)) { | 4568 if (i == (num_checks - 1)) { |
4492 __ b(deopt, NE); | 4569 __ b(deopt, NE); |
4493 } else { | 4570 } else { |
4494 __ b(&is_ok, EQ); | 4571 __ b(&is_ok, EQ); |
4495 } | 4572 } |
4496 } | 4573 } |
4497 __ Bind(&is_ok); | 4574 __ Bind(&is_ok); |
4498 } | 4575 } |
4499 | 4576 |
4500 | 4577 |
4501 LocationSummary* CheckSmiInstr::MakeLocationSummary(bool opt) const { | 4578 LocationSummary* CheckSmiInstr::MakeLocationSummary(Isolate* isolate, |
| 4579 bool opt) const { |
4502 const intptr_t kNumInputs = 1; | 4580 const intptr_t kNumInputs = 1; |
4503 const intptr_t kNumTemps = 0; | 4581 const intptr_t kNumTemps = 0; |
4504 LocationSummary* summary = | 4582 LocationSummary* summary = new(isolate) LocationSummary( |
4505 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4583 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4506 summary->set_in(0, Location::RequiresRegister()); | 4584 summary->set_in(0, Location::RequiresRegister()); |
4507 return summary; | 4585 return summary; |
4508 } | 4586 } |
4509 | 4587 |
4510 | 4588 |
4511 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4589 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4512 const Register value = locs()->in(0).reg(); | 4590 const Register value = locs()->in(0).reg(); |
4513 Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckSmi); | 4591 Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckSmi); |
4514 __ tsti(value, kSmiTagMask); | 4592 __ tsti(value, kSmiTagMask); |
4515 __ b(deopt, NE); | 4593 __ b(deopt, NE); |
4516 } | 4594 } |
4517 | 4595 |
4518 | 4596 |
4519 LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(bool opt) const { | 4597 LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(Isolate* isolate, |
| 4598 bool opt) const { |
4520 const intptr_t kNumInputs = 2; | 4599 const intptr_t kNumInputs = 2; |
4521 const intptr_t kNumTemps = 0; | 4600 const intptr_t kNumTemps = 0; |
4522 LocationSummary* locs = | 4601 LocationSummary* locs = new(isolate) LocationSummary( |
4523 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4602 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4524 locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length())); | 4603 locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length())); |
4525 locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index())); | 4604 locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index())); |
4526 return locs; | 4605 return locs; |
4527 } | 4606 } |
4528 | 4607 |
4529 | 4608 |
4530 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4609 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4531 Label* deopt = compiler->AddDeoptStub(deopt_id(), | 4610 Label* deopt = compiler->AddDeoptStub(deopt_id(), |
4532 ICData::kDeoptCheckArrayBound); | 4611 ICData::kDeoptCheckArrayBound); |
4533 | 4612 |
(...skipping 29 matching lines...) Expand all Loading... |
4563 __ b(deopt, CS); | 4642 __ b(deopt, CS); |
4564 } else { | 4643 } else { |
4565 const Register length = length_loc.reg(); | 4644 const Register length = length_loc.reg(); |
4566 const Register index = index_loc.reg(); | 4645 const Register index = index_loc.reg(); |
4567 __ CompareRegisters(index, length); | 4646 __ CompareRegisters(index, length); |
4568 __ b(deopt, CS); | 4647 __ b(deopt, CS); |
4569 } | 4648 } |
4570 } | 4649 } |
4571 | 4650 |
4572 | 4651 |
4573 LocationSummary* UnboxIntegerInstr::MakeLocationSummary(bool opt) const { | 4652 LocationSummary* UnboxIntegerInstr::MakeLocationSummary(Isolate* isolate, |
| 4653 bool opt) const { |
4574 UNIMPLEMENTED(); | 4654 UNIMPLEMENTED(); |
4575 return NULL; | 4655 return NULL; |
4576 } | 4656 } |
4577 | 4657 |
4578 | 4658 |
4579 void UnboxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4659 void UnboxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4580 UNIMPLEMENTED(); | 4660 UNIMPLEMENTED(); |
4581 } | 4661 } |
4582 | 4662 |
4583 | 4663 |
4584 LocationSummary* BoxIntegerInstr::MakeLocationSummary(bool opt) const { | 4664 LocationSummary* BoxIntegerInstr::MakeLocationSummary(Isolate* isolate, |
| 4665 bool opt) const { |
4585 UNIMPLEMENTED(); | 4666 UNIMPLEMENTED(); |
4586 return NULL; | 4667 return NULL; |
4587 } | 4668 } |
4588 | 4669 |
4589 | 4670 |
4590 void BoxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4671 void BoxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4591 UNIMPLEMENTED(); | 4672 UNIMPLEMENTED(); |
4592 } | 4673 } |
4593 | 4674 |
4594 | 4675 |
4595 LocationSummary* BinaryMintOpInstr::MakeLocationSummary(bool opt) const { | 4676 LocationSummary* BinaryMintOpInstr::MakeLocationSummary(Isolate* isolate, |
| 4677 bool opt) const { |
4596 UNIMPLEMENTED(); | 4678 UNIMPLEMENTED(); |
4597 return NULL; | 4679 return NULL; |
4598 } | 4680 } |
4599 | 4681 |
4600 | 4682 |
4601 void BinaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4683 void BinaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4602 UNIMPLEMENTED(); | 4684 UNIMPLEMENTED(); |
4603 } | 4685 } |
4604 | 4686 |
4605 | 4687 |
4606 LocationSummary* ShiftMintOpInstr::MakeLocationSummary(bool opt) const { | 4688 LocationSummary* ShiftMintOpInstr::MakeLocationSummary(Isolate* isolate, |
| 4689 bool opt) const { |
4607 UNIMPLEMENTED(); | 4690 UNIMPLEMENTED(); |
4608 return NULL; | 4691 return NULL; |
4609 } | 4692 } |
4610 | 4693 |
4611 | 4694 |
4612 void ShiftMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4695 void ShiftMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4613 UNIMPLEMENTED(); | 4696 UNIMPLEMENTED(); |
4614 } | 4697 } |
4615 | 4698 |
4616 | 4699 |
4617 LocationSummary* UnaryMintOpInstr::MakeLocationSummary(bool opt) const { | 4700 LocationSummary* UnaryMintOpInstr::MakeLocationSummary(Isolate* isolate, |
| 4701 bool opt) const { |
4618 UNIMPLEMENTED(); | 4702 UNIMPLEMENTED(); |
4619 return NULL; | 4703 return NULL; |
4620 } | 4704 } |
4621 | 4705 |
4622 | 4706 |
4623 void UnaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4707 void UnaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4624 UNIMPLEMENTED(); | 4708 UNIMPLEMENTED(); |
4625 } | 4709 } |
4626 | 4710 |
4627 | 4711 |
4628 LocationSummary* ThrowInstr::MakeLocationSummary(bool opt) const { | 4712 LocationSummary* ThrowInstr::MakeLocationSummary(Isolate* isolate, |
4629 return new LocationSummary(0, 0, LocationSummary::kCall); | 4713 bool opt) const { |
| 4714 return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall); |
4630 } | 4715 } |
4631 | 4716 |
4632 | 4717 |
4633 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4718 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4634 compiler->GenerateRuntimeCall(token_pos(), | 4719 compiler->GenerateRuntimeCall(token_pos(), |
4635 deopt_id(), | 4720 deopt_id(), |
4636 kThrowRuntimeEntry, | 4721 kThrowRuntimeEntry, |
4637 1, | 4722 1, |
4638 locs()); | 4723 locs()); |
4639 __ hlt(0); | 4724 __ hlt(0); |
4640 } | 4725 } |
4641 | 4726 |
4642 | 4727 |
4643 LocationSummary* ReThrowInstr::MakeLocationSummary(bool opt) const { | 4728 LocationSummary* ReThrowInstr::MakeLocationSummary(Isolate* isolate, |
4644 return new LocationSummary(0, 0, LocationSummary::kCall); | 4729 bool opt) const { |
| 4730 return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall); |
4645 } | 4731 } |
4646 | 4732 |
4647 | 4733 |
4648 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4734 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4649 compiler->SetNeedsStacktrace(catch_try_index()); | 4735 compiler->SetNeedsStacktrace(catch_try_index()); |
4650 compiler->GenerateRuntimeCall(token_pos(), | 4736 compiler->GenerateRuntimeCall(token_pos(), |
4651 deopt_id(), | 4737 deopt_id(), |
4652 kReThrowRuntimeEntry, | 4738 kReThrowRuntimeEntry, |
4653 2, | 4739 2, |
4654 locs()); | 4740 locs()); |
(...skipping 19 matching lines...) Expand all Loading... |
4674 compiler->AddCurrentDescriptor(PcDescriptors::kDeopt, | 4760 compiler->AddCurrentDescriptor(PcDescriptors::kDeopt, |
4675 deopt_id_, | 4761 deopt_id_, |
4676 Scanner::kNoSourcePos); | 4762 Scanner::kNoSourcePos); |
4677 } | 4763 } |
4678 if (HasParallelMove()) { | 4764 if (HasParallelMove()) { |
4679 compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); | 4765 compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); |
4680 } | 4766 } |
4681 } | 4767 } |
4682 | 4768 |
4683 | 4769 |
4684 LocationSummary* GotoInstr::MakeLocationSummary(bool opt) const { | 4770 LocationSummary* GotoInstr::MakeLocationSummary(Isolate* isolate, |
4685 return new LocationSummary(0, 0, LocationSummary::kNoCall); | 4771 bool opt) const { |
| 4772 return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kNoCall); |
4686 } | 4773 } |
4687 | 4774 |
4688 | 4775 |
4689 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4776 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4690 if (!compiler->is_optimizing()) { | 4777 if (!compiler->is_optimizing()) { |
4691 compiler->EmitEdgeCounter(); | 4778 compiler->EmitEdgeCounter(); |
4692 // Add a deoptimization descriptor for deoptimizing instructions that | 4779 // Add a deoptimization descriptor for deoptimizing instructions that |
4693 // may be inserted before this instruction. On ARM64 this descriptor | 4780 // may be inserted before this instruction. On ARM64 this descriptor |
4694 // points after the edge counter code so that we can reuse the same | 4781 // points after the edge counter code so that we can reuse the same |
4695 // pattern matching code as at call sites, which matches backwards from | 4782 // pattern matching code as at call sites, which matches backwards from |
4696 // the end of the pattern. | 4783 // the end of the pattern. |
4697 compiler->AddCurrentDescriptor(PcDescriptors::kDeopt, | 4784 compiler->AddCurrentDescriptor(PcDescriptors::kDeopt, |
4698 GetDeoptId(), | 4785 GetDeoptId(), |
4699 Scanner::kNoSourcePos); | 4786 Scanner::kNoSourcePos); |
4700 } | 4787 } |
4701 if (HasParallelMove()) { | 4788 if (HasParallelMove()) { |
4702 compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); | 4789 compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); |
4703 } | 4790 } |
4704 | 4791 |
4705 // We can fall through if the successor is the next block in the list. | 4792 // We can fall through if the successor is the next block in the list. |
4706 // Otherwise, we need a jump. | 4793 // Otherwise, we need a jump. |
4707 if (!compiler->CanFallThroughTo(successor())) { | 4794 if (!compiler->CanFallThroughTo(successor())) { |
4708 __ b(compiler->GetJumpLabel(successor())); | 4795 __ b(compiler->GetJumpLabel(successor())); |
4709 } | 4796 } |
4710 } | 4797 } |
4711 | 4798 |
4712 | 4799 |
4713 LocationSummary* CurrentContextInstr::MakeLocationSummary(bool opt) const { | 4800 LocationSummary* CurrentContextInstr::MakeLocationSummary(Isolate* isolate, |
| 4801 bool opt) const { |
4714 return LocationSummary::Make(0, | 4802 return LocationSummary::Make(0, |
4715 Location::RequiresRegister(), | 4803 Location::RequiresRegister(), |
4716 LocationSummary::kNoCall); | 4804 LocationSummary::kNoCall); |
4717 } | 4805 } |
4718 | 4806 |
4719 | 4807 |
4720 void CurrentContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4808 void CurrentContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4721 __ mov(locs()->out(0).reg(), CTX); | 4809 __ mov(locs()->out(0).reg(), CTX); |
4722 } | 4810 } |
4723 | 4811 |
4724 | 4812 |
4725 LocationSummary* StrictCompareInstr::MakeLocationSummary(bool opt) const { | 4813 LocationSummary* StrictCompareInstr::MakeLocationSummary(Isolate* isolate, |
| 4814 bool opt) const { |
4726 const intptr_t kNumInputs = 2; | 4815 const intptr_t kNumInputs = 2; |
4727 const intptr_t kNumTemps = 0; | 4816 const intptr_t kNumTemps = 0; |
4728 if (needs_number_check()) { | 4817 if (needs_number_check()) { |
4729 LocationSummary* locs = | 4818 LocationSummary* locs = new(isolate) LocationSummary( |
4730 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 4819 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |
4731 locs->set_in(0, Location::RegisterLocation(R0)); | 4820 locs->set_in(0, Location::RegisterLocation(R0)); |
4732 locs->set_in(1, Location::RegisterLocation(R1)); | 4821 locs->set_in(1, Location::RegisterLocation(R1)); |
4733 locs->set_out(0, Location::RegisterLocation(R0)); | 4822 locs->set_out(0, Location::RegisterLocation(R0)); |
4734 return locs; | 4823 return locs; |
4735 } | 4824 } |
4736 LocationSummary* locs = | 4825 LocationSummary* locs = new(isolate) LocationSummary( |
4737 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 4826 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); |
4738 locs->set_in(0, Location::RegisterOrConstant(left())); | 4827 locs->set_in(0, Location::RegisterOrConstant(left())); |
4739 // Only one of the inputs can be a constant. Choose register if the first one | 4828 // Only one of the inputs can be a constant. Choose register if the first one |
4740 // is a constant. | 4829 // is a constant. |
4741 locs->set_in(1, locs->in(0).IsConstant() | 4830 locs->set_in(1, locs->in(0).IsConstant() |
4742 ? Location::RequiresRegister() | 4831 ? Location::RequiresRegister() |
4743 : Location::RegisterOrConstant(right())); | 4832 : Location::RegisterOrConstant(right())); |
4744 locs->set_out(0, Location::RequiresRegister()); | 4833 locs->set_out(0, Location::RequiresRegister()); |
4745 return locs; | 4834 return locs; |
4746 } | 4835 } |
4747 | 4836 |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4795 void StrictCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler, | 4884 void StrictCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
4796 BranchInstr* branch) { | 4885 BranchInstr* branch) { |
4797 ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT); | 4886 ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT); |
4798 | 4887 |
4799 BranchLabels labels = compiler->CreateBranchLabels(branch); | 4888 BranchLabels labels = compiler->CreateBranchLabels(branch); |
4800 Condition true_condition = EmitComparisonCode(compiler, labels); | 4889 Condition true_condition = EmitComparisonCode(compiler, labels); |
4801 EmitBranchOnCondition(compiler, true_condition, labels); | 4890 EmitBranchOnCondition(compiler, true_condition, labels); |
4802 } | 4891 } |
4803 | 4892 |
4804 | 4893 |
4805 LocationSummary* BooleanNegateInstr::MakeLocationSummary(bool opt) const { | 4894 LocationSummary* BooleanNegateInstr::MakeLocationSummary(Isolate* isolate, |
| 4895 bool opt) const { |
4806 return LocationSummary::Make(1, | 4896 return LocationSummary::Make(1, |
4807 Location::RequiresRegister(), | 4897 Location::RequiresRegister(), |
4808 LocationSummary::kNoCall); | 4898 LocationSummary::kNoCall); |
4809 } | 4899 } |
4810 | 4900 |
4811 | 4901 |
4812 void BooleanNegateInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4902 void BooleanNegateInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4813 const Register value = locs()->in(0).reg(); | 4903 const Register value = locs()->in(0).reg(); |
4814 const Register result = locs()->out(0).reg(); | 4904 const Register result = locs()->out(0).reg(); |
4815 | 4905 |
4816 __ LoadObject(result, Bool::True(), PP); | 4906 __ LoadObject(result, Bool::True(), PP); |
4817 __ LoadObject(TMP, Bool::False(), PP); | 4907 __ LoadObject(TMP, Bool::False(), PP); |
4818 __ CompareRegisters(result, value); | 4908 __ CompareRegisters(result, value); |
4819 __ csel(result, TMP, result, EQ); | 4909 __ csel(result, TMP, result, EQ); |
4820 } | 4910 } |
4821 | 4911 |
4822 | 4912 |
4823 LocationSummary* AllocateObjectInstr::MakeLocationSummary(bool opt) const { | 4913 LocationSummary* AllocateObjectInstr::MakeLocationSummary(Isolate* isolate, |
| 4914 bool opt) const { |
4824 return MakeCallSummary(); | 4915 return MakeCallSummary(); |
4825 } | 4916 } |
4826 | 4917 |
4827 | 4918 |
4828 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 4919 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
4829 const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls())); | 4920 const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls())); |
4830 const ExternalLabel label(cls().ToCString(), stub.EntryPoint()); | 4921 const ExternalLabel label(cls().ToCString(), stub.EntryPoint()); |
4831 compiler->GenerateCall(token_pos(), | 4922 compiler->GenerateCall(token_pos(), |
4832 &label, | 4923 &label, |
4833 PcDescriptors::kOther, | 4924 PcDescriptors::kOther, |
4834 locs()); | 4925 locs()); |
4835 __ Drop(ArgumentCount()); // Discard arguments. | 4926 __ Drop(ArgumentCount()); // Discard arguments. |
4836 } | 4927 } |
4837 | 4928 |
4838 } // namespace dart | 4929 } // namespace dart |
4839 | 4930 |
4840 #endif // defined TARGET_ARCH_ARM64 | 4931 #endif // defined TARGET_ARCH_ARM64 |
OLD | NEW |