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

Side by Side Diff: runtime/vm/intermediate_language_arm64.cc

Issue 855533002: Isolate/Thread split: Isolate -> Zone for LocationSummary. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/intermediate_language_arm.cc ('k') | runtime/vm/intermediate_language_ia32.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (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"
(...skipping 13 matching lines...) Expand all
24 namespace dart { 24 namespace dart {
25 25
26 DECLARE_FLAG(bool, emit_edge_counters); 26 DECLARE_FLAG(bool, emit_edge_counters);
27 DECLARE_FLAG(bool, enable_asserts); 27 DECLARE_FLAG(bool, enable_asserts);
28 DECLARE_FLAG(bool, enable_type_checks); 28 DECLARE_FLAG(bool, enable_type_checks);
29 DECLARE_FLAG(int, optimization_counter_threshold); 29 DECLARE_FLAG(int, optimization_counter_threshold);
30 DECLARE_FLAG(bool, use_osr); 30 DECLARE_FLAG(bool, use_osr);
31 31
32 // Generic summary for call instructions that have all arguments pushed 32 // Generic summary for call instructions that have all arguments pushed
33 // on the stack and return the result in a fixed register R0. 33 // on the stack and return the result in a fixed register R0.
34 LocationSummary* Instruction::MakeCallSummary(Isolate* isolate) { 34 LocationSummary* Instruction::MakeCallSummary(Zone* zone) {
35 LocationSummary* result = new(isolate) LocationSummary( 35 LocationSummary* result = new(zone) LocationSummary(
36 isolate, 0, 0, LocationSummary::kCall); 36 zone, 0, 0, LocationSummary::kCall);
37 result->set_out(0, Location::RegisterLocation(R0)); 37 result->set_out(0, Location::RegisterLocation(R0));
38 return result; 38 return result;
39 } 39 }
40 40
41 41
42 LocationSummary* PushArgumentInstr::MakeLocationSummary(Isolate* isolate, 42 LocationSummary* PushArgumentInstr::MakeLocationSummary(Zone* zone,
43 bool opt) const { 43 bool opt) const {
44 const intptr_t kNumInputs = 1; 44 const intptr_t kNumInputs = 1;
45 const intptr_t kNumTemps = 0; 45 const intptr_t kNumTemps = 0;
46 LocationSummary* locs = new(isolate) LocationSummary( 46 LocationSummary* locs = new(zone) LocationSummary(
47 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 47 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
48 locs->set_in(0, Location::AnyOrConstant(value())); 48 locs->set_in(0, Location::AnyOrConstant(value()));
49 return locs; 49 return locs;
50 } 50 }
51 51
52 52
53 void PushArgumentInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 53 void PushArgumentInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
54 // In SSA mode, we need an explicit push. Nothing to do in non-SSA mode 54 // In SSA mode, we need an explicit push. Nothing to do in non-SSA mode
55 // where PushArgument is handled by BindInstr::EmitNativeCode. 55 // where PushArgument is handled by BindInstr::EmitNativeCode.
56 if (compiler->is_optimizing()) { 56 if (compiler->is_optimizing()) {
57 Location value = locs()->in(0); 57 Location value = locs()->in(0);
58 if (value.IsRegister()) { 58 if (value.IsRegister()) {
59 __ Push(value.reg()); 59 __ Push(value.reg());
60 } else if (value.IsConstant()) { 60 } else if (value.IsConstant()) {
61 __ PushObject(value.constant(), PP); 61 __ PushObject(value.constant(), PP);
62 } else { 62 } else {
63 ASSERT(value.IsStackSlot()); 63 ASSERT(value.IsStackSlot());
64 const intptr_t value_offset = value.ToStackSlotOffset(); 64 const intptr_t value_offset = value.ToStackSlotOffset();
65 __ LoadFromOffset(TMP, value.base_reg(), value_offset, PP); 65 __ LoadFromOffset(TMP, value.base_reg(), value_offset, PP);
66 __ Push(TMP); 66 __ Push(TMP);
67 } 67 }
68 } 68 }
69 } 69 }
70 70
71 71
72 LocationSummary* ReturnInstr::MakeLocationSummary(Isolate* isolate, 72 LocationSummary* ReturnInstr::MakeLocationSummary(Zone* zone,
73 bool opt) const { 73 bool opt) const {
74 const intptr_t kNumInputs = 1; 74 const intptr_t kNumInputs = 1;
75 const intptr_t kNumTemps = 0; 75 const intptr_t kNumTemps = 0;
76 LocationSummary* locs = new(isolate) LocationSummary( 76 LocationSummary* locs = new(zone) LocationSummary(
77 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 77 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
78 locs->set_in(0, Location::RegisterLocation(R0)); 78 locs->set_in(0, Location::RegisterLocation(R0));
79 return locs; 79 return locs;
80 } 80 }
81 81
82 82
83 // Attempt optimized compilation at return instruction instead of at the entry. 83 // Attempt optimized compilation at return instruction instead of at the entry.
84 // The entry needs to be patchable, no inlined objects are allowed in the area 84 // The entry needs to be patchable, no inlined objects are allowed in the area
85 // that will be overwritten by the patch instructions: a branch macro sequence. 85 // that will be overwritten by the patch instructions: a branch macro sequence.
86 void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 86 void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
87 const Register result = locs()->in(0).reg(); 87 const Register result = locs()->in(0).reg();
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
129 } 129 }
130 130
131 131
132 // Detect pattern when one value is zero and another is a power of 2. 132 // Detect pattern when one value is zero and another is a power of 2.
133 static bool IsPowerOfTwoKind(intptr_t v1, intptr_t v2) { 133 static bool IsPowerOfTwoKind(intptr_t v1, intptr_t v2) {
134 return (Utils::IsPowerOfTwo(v1) && (v2 == 0)) || 134 return (Utils::IsPowerOfTwo(v1) && (v2 == 0)) ||
135 (Utils::IsPowerOfTwo(v2) && (v1 == 0)); 135 (Utils::IsPowerOfTwo(v2) && (v1 == 0));
136 } 136 }
137 137
138 138
139 LocationSummary* IfThenElseInstr::MakeLocationSummary(Isolate* isolate, 139 LocationSummary* IfThenElseInstr::MakeLocationSummary(Zone* zone,
140 bool opt) const { 140 bool opt) const {
141 comparison()->InitializeLocationSummary(isolate, opt); 141 comparison()->InitializeLocationSummary(zone, opt);
142 return comparison()->locs(); 142 return comparison()->locs();
143 } 143 }
144 144
145 145
146 void IfThenElseInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 146 void IfThenElseInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
147 const Register result = locs()->out(0).reg(); 147 const Register result = locs()->out(0).reg();
148 148
149 Location left = locs()->in(0); 149 Location left = locs()->in(0);
150 Location right = locs()->in(1); 150 Location right = locs()->in(1);
151 ASSERT(!left.IsConstant() || !right.IsConstant()); 151 ASSERT(!left.IsConstant() || !right.IsConstant());
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 const int64_t val = 186 const int64_t val =
187 Smi::RawValue(true_value) - Smi::RawValue(false_value); 187 Smi::RawValue(true_value) - Smi::RawValue(false_value);
188 __ AndImmediate(result, result, val, PP); 188 __ AndImmediate(result, result, val, PP);
189 if (false_value != 0) { 189 if (false_value != 0) {
190 __ AddImmediate(result, result, Smi::RawValue(false_value), PP); 190 __ AddImmediate(result, result, Smi::RawValue(false_value), PP);
191 } 191 }
192 } 192 }
193 } 193 }
194 194
195 195
196 LocationSummary* ClosureCallInstr::MakeLocationSummary(Isolate* isolate, 196 LocationSummary* ClosureCallInstr::MakeLocationSummary(Zone* zone,
197 bool opt) const { 197 bool opt) const {
198 const intptr_t kNumInputs = 1; 198 const intptr_t kNumInputs = 1;
199 const intptr_t kNumTemps = 0; 199 const intptr_t kNumTemps = 0;
200 LocationSummary* summary = new(isolate) LocationSummary( 200 LocationSummary* summary = new(zone) LocationSummary(
201 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); 201 zone, kNumInputs, kNumTemps, LocationSummary::kCall);
202 summary->set_in(0, Location::RegisterLocation(R0)); // Function. 202 summary->set_in(0, Location::RegisterLocation(R0)); // Function.
203 summary->set_out(0, Location::RegisterLocation(R0)); 203 summary->set_out(0, Location::RegisterLocation(R0));
204 return summary; 204 return summary;
205 } 205 }
206 206
207 207
208 void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 208 void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
209 // Load arguments descriptor in R4. 209 // Load arguments descriptor in R4.
210 int argument_count = ArgumentCount(); 210 int argument_count = ArgumentCount();
211 const Array& arguments_descriptor = 211 const Array& arguments_descriptor =
(...skipping 24 matching lines...) Expand all
236 // Add deoptimization continuation point after the call and before the 236 // Add deoptimization continuation point after the call and before the
237 // arguments are removed. 237 // arguments are removed.
238 compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, 238 compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
239 deopt_id_after, 239 deopt_id_after,
240 token_pos()); 240 token_pos());
241 } 241 }
242 __ Drop(argument_count); 242 __ Drop(argument_count);
243 } 243 }
244 244
245 245
246 LocationSummary* LoadLocalInstr::MakeLocationSummary(Isolate* isolate, 246 LocationSummary* LoadLocalInstr::MakeLocationSummary(Zone* zone,
247 bool opt) const { 247 bool opt) const {
248 return LocationSummary::Make(isolate, 248 return LocationSummary::Make(zone,
249 0, 249 0,
250 Location::RequiresRegister(), 250 Location::RequiresRegister(),
251 LocationSummary::kNoCall); 251 LocationSummary::kNoCall);
252 } 252 }
253 253
254 254
255 void LoadLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 255 void LoadLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
256 const Register result = locs()->out(0).reg(); 256 const Register result = locs()->out(0).reg();
257 __ LoadFromOffset(result, FP, local().index() * kWordSize, PP); 257 __ LoadFromOffset(result, FP, local().index() * kWordSize, PP);
258 } 258 }
259 259
260 260
261 LocationSummary* StoreLocalInstr::MakeLocationSummary(Isolate* isolate, 261 LocationSummary* StoreLocalInstr::MakeLocationSummary(Zone* zone,
262 bool opt) const { 262 bool opt) const {
263 return LocationSummary::Make(isolate, 263 return LocationSummary::Make(zone,
264 1, 264 1,
265 Location::SameAsFirstInput(), 265 Location::SameAsFirstInput(),
266 LocationSummary::kNoCall); 266 LocationSummary::kNoCall);
267 } 267 }
268 268
269 269
270 void StoreLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 270 void StoreLocalInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
271 const Register value = locs()->in(0).reg(); 271 const Register value = locs()->in(0).reg();
272 const Register result = locs()->out(0).reg(); 272 const Register result = locs()->out(0).reg();
273 ASSERT(result == value); // Assert that register assignment is correct. 273 ASSERT(result == value); // Assert that register assignment is correct.
274 __ StoreToOffset(value, FP, local().index() * kWordSize, PP); 274 __ StoreToOffset(value, FP, local().index() * kWordSize, PP);
275 } 275 }
276 276
277 277
278 LocationSummary* ConstantInstr::MakeLocationSummary(Isolate* isolate, 278 LocationSummary* ConstantInstr::MakeLocationSummary(Zone* zone,
279 bool opt) const { 279 bool opt) const {
280 return LocationSummary::Make(isolate, 280 return LocationSummary::Make(zone,
281 0, 281 0,
282 Location::RequiresRegister(), 282 Location::RequiresRegister(),
283 LocationSummary::kNoCall); 283 LocationSummary::kNoCall);
284 } 284 }
285 285
286 286
287 void ConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 287 void ConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
288 // The register allocator drops constant definitions that have no uses. 288 // The register allocator drops constant definitions that have no uses.
289 if (!locs()->out(0).IsInvalid()) { 289 if (!locs()->out(0).IsInvalid()) {
290 const Register result = locs()->out(0).reg(); 290 const Register result = locs()->out(0).reg();
291 __ LoadObject(result, value(), PP); 291 __ LoadObject(result, value(), PP);
292 } 292 }
293 } 293 }
294 294
295 295
296 LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Isolate* isolate, 296 LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Zone* zone,
297 bool opt) const { 297 bool opt) const {
298 const intptr_t kNumInputs = 0; 298 const intptr_t kNumInputs = 0;
299 const Location out = (representation_ == kUnboxedInt32) ? 299 const Location out = (representation_ == kUnboxedInt32) ?
300 Location::RequiresRegister() : Location::RequiresFpuRegister(); 300 Location::RequiresRegister() : Location::RequiresFpuRegister();
301 return LocationSummary::Make(isolate, 301 return LocationSummary::Make(zone,
302 kNumInputs, 302 kNumInputs,
303 out, 303 out,
304 LocationSummary::kNoCall); 304 LocationSummary::kNoCall);
305 } 305 }
306 306
307 307
308 void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 308 void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
309 if (!locs()->out(0).IsInvalid()) { 309 if (!locs()->out(0).IsInvalid()) {
310 switch (representation_) { 310 switch (representation_) {
311 case kUnboxedDouble: 311 case kUnboxedDouble:
(...skipping 11 matching lines...) Expand all
323 PP); 323 PP);
324 break; 324 break;
325 default: 325 default:
326 UNREACHABLE(); 326 UNREACHABLE();
327 break; 327 break;
328 } 328 }
329 } 329 }
330 } 330 }
331 331
332 332
333 LocationSummary* AssertAssignableInstr::MakeLocationSummary(Isolate* isolate, 333 LocationSummary* AssertAssignableInstr::MakeLocationSummary(Zone* zone,
334 bool opt) const { 334 bool opt) const {
335 const intptr_t kNumInputs = 3; 335 const intptr_t kNumInputs = 3;
336 const intptr_t kNumTemps = 0; 336 const intptr_t kNumTemps = 0;
337 LocationSummary* summary = new(isolate) LocationSummary( 337 LocationSummary* summary = new(zone) LocationSummary(
338 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); 338 zone, kNumInputs, kNumTemps, LocationSummary::kCall);
339 summary->set_in(0, Location::RegisterLocation(R0)); // Value. 339 summary->set_in(0, Location::RegisterLocation(R0)); // Value.
340 summary->set_in(1, Location::RegisterLocation(R2)); // Instantiator. 340 summary->set_in(1, Location::RegisterLocation(R2)); // Instantiator.
341 summary->set_in(2, Location::RegisterLocation(R1)); // Type arguments. 341 summary->set_in(2, Location::RegisterLocation(R1)); // Type arguments.
342 summary->set_out(0, Location::RegisterLocation(R0)); 342 summary->set_out(0, Location::RegisterLocation(R0));
343 return summary; 343 return summary;
344 } 344 }
345 345
346 346
347 LocationSummary* AssertBooleanInstr::MakeLocationSummary(Isolate* isolate, 347 LocationSummary* AssertBooleanInstr::MakeLocationSummary(Zone* zone,
348 bool opt) const { 348 bool opt) const {
349 const intptr_t kNumInputs = 1; 349 const intptr_t kNumInputs = 1;
350 const intptr_t kNumTemps = 0; 350 const intptr_t kNumTemps = 0;
351 LocationSummary* locs = new(isolate) LocationSummary( 351 LocationSummary* locs = new(zone) LocationSummary(
352 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); 352 zone, kNumInputs, kNumTemps, LocationSummary::kCall);
353 locs->set_in(0, Location::RegisterLocation(R0)); 353 locs->set_in(0, Location::RegisterLocation(R0));
354 locs->set_out(0, Location::RegisterLocation(R0)); 354 locs->set_out(0, Location::RegisterLocation(R0));
355 return locs; 355 return locs;
356 } 356 }
357 357
358 358
359 static void EmitAssertBoolean(Register reg, 359 static void EmitAssertBoolean(Register reg,
360 intptr_t token_pos, 360 intptr_t token_pos,
361 intptr_t deopt_id, 361 intptr_t deopt_id,
362 LocationSummary* locs, 362 LocationSummary* locs,
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
465 true_condition = FlipCondition(true_condition); 465 true_condition = FlipCondition(true_condition);
466 } else if (right.IsConstant()) { 466 } else if (right.IsConstant()) {
467 __ CompareObject(left.reg(), right.constant(), PP); 467 __ CompareObject(left.reg(), right.constant(), PP);
468 } else { 468 } else {
469 __ CompareRegisters(left.reg(), right.reg()); 469 __ CompareRegisters(left.reg(), right.reg());
470 } 470 }
471 return true_condition; 471 return true_condition;
472 } 472 }
473 473
474 474
475 LocationSummary* EqualityCompareInstr::MakeLocationSummary(Isolate* isolate, 475 LocationSummary* EqualityCompareInstr::MakeLocationSummary(Zone* zone,
476 bool opt) const { 476 bool opt) const {
477 const intptr_t kNumInputs = 2; 477 const intptr_t kNumInputs = 2;
478 if (operation_cid() == kDoubleCid) { 478 if (operation_cid() == kDoubleCid) {
479 const intptr_t kNumTemps = 0; 479 const intptr_t kNumTemps = 0;
480 LocationSummary* locs = new(isolate) LocationSummary( 480 LocationSummary* locs = new(zone) LocationSummary(
481 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 481 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
482 locs->set_in(0, Location::RequiresFpuRegister()); 482 locs->set_in(0, Location::RequiresFpuRegister());
483 locs->set_in(1, Location::RequiresFpuRegister()); 483 locs->set_in(1, Location::RequiresFpuRegister());
484 locs->set_out(0, Location::RequiresRegister()); 484 locs->set_out(0, Location::RequiresRegister());
485 return locs; 485 return locs;
486 } 486 }
487 if (operation_cid() == kSmiCid) { 487 if (operation_cid() == kSmiCid) {
488 const intptr_t kNumTemps = 0; 488 const intptr_t kNumTemps = 0;
489 LocationSummary* locs = new(isolate) LocationSummary( 489 LocationSummary* locs = new(zone) LocationSummary(
490 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 490 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
491 locs->set_in(0, Location::RegisterOrConstant(left())); 491 locs->set_in(0, Location::RegisterOrConstant(left()));
492 // Only one input can be a constant operand. The case of two constant 492 // Only one input can be a constant operand. The case of two constant
493 // operands should be handled by constant propagation. 493 // operands should be handled by constant propagation.
494 // Only right can be a stack slot. 494 // Only right can be a stack slot.
495 locs->set_in(1, locs->in(0).IsConstant() 495 locs->set_in(1, locs->in(0).IsConstant()
496 ? Location::RequiresRegister() 496 ? Location::RequiresRegister()
497 : Location::RegisterOrConstant(right())); 497 : Location::RegisterOrConstant(right()));
498 locs->set_out(0, Location::RequiresRegister()); 498 locs->set_out(0, Location::RequiresRegister());
499 return locs; 499 return locs;
500 } 500 }
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
572 Condition true_condition = EmitComparisonCode(compiler, labels); 572 Condition true_condition = EmitComparisonCode(compiler, labels);
573 if ((operation_cid() == kDoubleCid) && (true_condition != NE)) { 573 if ((operation_cid() == kDoubleCid) && (true_condition != NE)) {
574 // Special case for NaN comparison. Result is always false unless 574 // Special case for NaN comparison. Result is always false unless
575 // relational operator is !=. 575 // relational operator is !=.
576 __ b(labels.false_label, VS); 576 __ b(labels.false_label, VS);
577 } 577 }
578 EmitBranchOnCondition(compiler, true_condition, labels); 578 EmitBranchOnCondition(compiler, true_condition, labels);
579 } 579 }
580 580
581 581
582 LocationSummary* TestSmiInstr::MakeLocationSummary(Isolate* isolate, 582 LocationSummary* TestSmiInstr::MakeLocationSummary(Zone* zone,
583 bool opt) const { 583 bool opt) const {
584 const intptr_t kNumInputs = 2; 584 const intptr_t kNumInputs = 2;
585 const intptr_t kNumTemps = 0; 585 const intptr_t kNumTemps = 0;
586 LocationSummary* locs = new(isolate) LocationSummary( 586 LocationSummary* locs = new(zone) LocationSummary(
587 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 587 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
588 locs->set_in(0, Location::RequiresRegister()); 588 locs->set_in(0, Location::RequiresRegister());
589 // Only one input can be a constant operand. The case of two constant 589 // Only one input can be a constant operand. The case of two constant
590 // operands should be handled by constant propagation. 590 // operands should be handled by constant propagation.
591 locs->set_in(1, Location::RegisterOrConstant(right())); 591 locs->set_in(1, Location::RegisterOrConstant(right()));
592 return locs; 592 return locs;
593 } 593 }
594 594
595 595
596 Condition TestSmiInstr::EmitComparisonCode(FlowGraphCompiler* compiler, 596 Condition TestSmiInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
597 BranchLabels labels) { 597 BranchLabels labels) {
(...skipping 19 matching lines...) Expand all
617 617
618 618
619 void TestSmiInstr::EmitBranchCode(FlowGraphCompiler* compiler, 619 void TestSmiInstr::EmitBranchCode(FlowGraphCompiler* compiler,
620 BranchInstr* branch) { 620 BranchInstr* branch) {
621 BranchLabels labels = compiler->CreateBranchLabels(branch); 621 BranchLabels labels = compiler->CreateBranchLabels(branch);
622 Condition true_condition = EmitComparisonCode(compiler, labels); 622 Condition true_condition = EmitComparisonCode(compiler, labels);
623 EmitBranchOnCondition(compiler, true_condition, labels); 623 EmitBranchOnCondition(compiler, true_condition, labels);
624 } 624 }
625 625
626 626
627 LocationSummary* TestCidsInstr::MakeLocationSummary(Isolate* isolate, 627 LocationSummary* TestCidsInstr::MakeLocationSummary(Zone* zone,
628 bool opt) const { 628 bool opt) const {
629 const intptr_t kNumInputs = 1; 629 const intptr_t kNumInputs = 1;
630 const intptr_t kNumTemps = 1; 630 const intptr_t kNumTemps = 1;
631 LocationSummary* locs = new(isolate) LocationSummary( 631 LocationSummary* locs = new(zone) LocationSummary(
632 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 632 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
633 locs->set_in(0, Location::RequiresRegister()); 633 locs->set_in(0, Location::RequiresRegister());
634 locs->set_temp(0, Location::RequiresRegister()); 634 locs->set_temp(0, Location::RequiresRegister());
635 locs->set_out(0, Location::RequiresRegister()); 635 locs->set_out(0, Location::RequiresRegister());
636 return locs; 636 return locs;
637 } 637 }
638 638
639 639
640 Condition TestCidsInstr::EmitComparisonCode(FlowGraphCompiler* compiler, 640 Condition TestCidsInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
641 BranchLabels labels) { 641 BranchLabels labels) {
642 ASSERT((kind() == Token::kIS) || (kind() == Token::kISNOT)); 642 ASSERT((kind() == Token::kIS) || (kind() == Token::kISNOT));
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
692 // True or False into result. 692 // True or False into result.
693 __ Bind(&is_false); 693 __ Bind(&is_false);
694 __ LoadObject(result_reg, Bool::False(), PP); 694 __ LoadObject(result_reg, Bool::False(), PP);
695 __ b(&done); 695 __ b(&done);
696 __ Bind(&is_true); 696 __ Bind(&is_true);
697 __ LoadObject(result_reg, Bool::True(), PP); 697 __ LoadObject(result_reg, Bool::True(), PP);
698 __ Bind(&done); 698 __ Bind(&done);
699 } 699 }
700 700
701 701
702 LocationSummary* RelationalOpInstr::MakeLocationSummary(Isolate* isolate, 702 LocationSummary* RelationalOpInstr::MakeLocationSummary(Zone* zone,
703 bool opt) const { 703 bool opt) const {
704 const intptr_t kNumInputs = 2; 704 const intptr_t kNumInputs = 2;
705 const intptr_t kNumTemps = 0; 705 const intptr_t kNumTemps = 0;
706 if (operation_cid() == kDoubleCid) { 706 if (operation_cid() == kDoubleCid) {
707 LocationSummary* summary = new(isolate) LocationSummary( 707 LocationSummary* summary = new(zone) LocationSummary(
708 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 708 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
709 summary->set_in(0, Location::RequiresFpuRegister()); 709 summary->set_in(0, Location::RequiresFpuRegister());
710 summary->set_in(1, Location::RequiresFpuRegister()); 710 summary->set_in(1, Location::RequiresFpuRegister());
711 summary->set_out(0, Location::RequiresRegister()); 711 summary->set_out(0, Location::RequiresRegister());
712 return summary; 712 return summary;
713 } 713 }
714 ASSERT(operation_cid() == kSmiCid); 714 ASSERT(operation_cid() == kSmiCid);
715 LocationSummary* summary = new(isolate) LocationSummary( 715 LocationSummary* summary = new(zone) LocationSummary(
716 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 716 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
717 summary->set_in(0, Location::RegisterOrConstant(left())); 717 summary->set_in(0, Location::RegisterOrConstant(left()));
718 // Only one input can be a constant operand. The case of two constant 718 // Only one input can be a constant operand. The case of two constant
719 // operands should be handled by constant propagation. 719 // operands should be handled by constant propagation.
720 summary->set_in(1, summary->in(0).IsConstant() 720 summary->set_in(1, summary->in(0).IsConstant()
721 ? Location::RequiresRegister() 721 ? Location::RequiresRegister()
722 : Location::RegisterOrConstant(right())); 722 : Location::RegisterOrConstant(right()));
723 summary->set_out(0, Location::RequiresRegister()); 723 summary->set_out(0, Location::RequiresRegister());
724 return summary; 724 return summary;
725 } 725 }
726 726
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
765 Condition true_condition = EmitComparisonCode(compiler, labels); 765 Condition true_condition = EmitComparisonCode(compiler, labels);
766 if ((operation_cid() == kDoubleCid) && (true_condition != NE)) { 766 if ((operation_cid() == kDoubleCid) && (true_condition != NE)) {
767 // Special case for NaN comparison. Result is always false unless 767 // Special case for NaN comparison. Result is always false unless
768 // relational operator is !=. 768 // relational operator is !=.
769 __ b(labels.false_label, VS); 769 __ b(labels.false_label, VS);
770 } 770 }
771 EmitBranchOnCondition(compiler, true_condition, labels); 771 EmitBranchOnCondition(compiler, true_condition, labels);
772 } 772 }
773 773
774 774
775 LocationSummary* NativeCallInstr::MakeLocationSummary(Isolate* isolate, 775 LocationSummary* NativeCallInstr::MakeLocationSummary(Zone* zone,
776 bool opt) const { 776 bool opt) const {
777 return MakeCallSummary(isolate); 777 return MakeCallSummary(zone);
778 } 778 }
779 779
780 780
781 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 781 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
782 const Register result = locs()->out(0).reg(); 782 const Register result = locs()->out(0).reg();
783 783
784 // Push the result place holder initialized to NULL. 784 // Push the result place holder initialized to NULL.
785 __ PushObject(Object::null_object(), PP); 785 __ PushObject(Object::null_object(), PP);
786 // Pass a pointer to the first argument in R2. 786 // Pass a pointer to the first argument in R2.
787 if (!function().HasOptionalParameters()) { 787 if (!function().HasOptionalParameters()) {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
820 __ LoadImmediate(R5, entry, PP); 820 __ LoadImmediate(R5, entry, PP);
821 __ LoadImmediate(R1, argc_tag, PP); 821 __ LoadImmediate(R1, argc_tag, PP);
822 compiler->GenerateCall(token_pos(), 822 compiler->GenerateCall(token_pos(),
823 stub_entry, 823 stub_entry,
824 RawPcDescriptors::kOther, 824 RawPcDescriptors::kOther,
825 locs()); 825 locs());
826 __ Pop(result); 826 __ Pop(result);
827 } 827 }
828 828
829 829
830 LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(Isolate* isolate, 830 LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(Zone* zone,
831 bool opt) const { 831 bool opt) const {
832 const intptr_t kNumInputs = 1; 832 const intptr_t kNumInputs = 1;
833 // TODO(fschneider): Allow immediate operands for the char code. 833 // TODO(fschneider): Allow immediate operands for the char code.
834 return LocationSummary::Make(isolate, 834 return LocationSummary::Make(zone,
835 kNumInputs, 835 kNumInputs,
836 Location::RequiresRegister(), 836 Location::RequiresRegister(),
837 LocationSummary::kNoCall); 837 LocationSummary::kNoCall);
838 } 838 }
839 839
840 840
841 void StringFromCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 841 void StringFromCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
842 const Register char_code = locs()->in(0).reg(); 842 const Register char_code = locs()->in(0).reg();
843 const Register result = locs()->out(0).reg(); 843 const Register result = locs()->out(0).reg();
844 __ LoadImmediate( 844 __ LoadImmediate(
845 result, reinterpret_cast<uword>(Symbols::PredefinedAddress()), PP); 845 result, reinterpret_cast<uword>(Symbols::PredefinedAddress()), PP);
846 __ AddImmediate( 846 __ AddImmediate(
847 result, result, Symbols::kNullCharCodeSymbolOffset * kWordSize, PP); 847 result, result, Symbols::kNullCharCodeSymbolOffset * kWordSize, PP);
848 __ SmiUntag(TMP, char_code); // Untag to use scaled adress mode. 848 __ SmiUntag(TMP, char_code); // Untag to use scaled adress mode.
849 __ ldr(result, Address(result, TMP, UXTX, Address::Scaled)); 849 __ ldr(result, Address(result, TMP, UXTX, Address::Scaled));
850 } 850 }
851 851
852 852
853 LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Isolate* isolate, 853 LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Zone* zone,
854 bool opt) const { 854 bool opt) const {
855 const intptr_t kNumInputs = 1; 855 const intptr_t kNumInputs = 1;
856 return LocationSummary::Make(isolate, 856 return LocationSummary::Make(zone,
857 kNumInputs, 857 kNumInputs,
858 Location::RequiresRegister(), 858 Location::RequiresRegister(),
859 LocationSummary::kNoCall); 859 LocationSummary::kNoCall);
860 } 860 }
861 861
862 862
863 void StringToCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 863 void StringToCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
864 ASSERT(cid_ == kOneByteStringCid); 864 ASSERT(cid_ == kOneByteStringCid);
865 const Register str = locs()->in(0).reg(); 865 const Register str = locs()->in(0).reg();
866 const Register result = locs()->out(0).reg(); 866 const Register result = locs()->out(0).reg();
867 __ LoadFieldFromOffset(result, str, String::length_offset(), PP); 867 __ LoadFieldFromOffset(result, str, String::length_offset(), PP);
868 __ ldr(TMP, FieldAddress(str, OneByteString::data_offset()), kUnsignedByte); 868 __ ldr(TMP, FieldAddress(str, OneByteString::data_offset()), kUnsignedByte);
869 __ CompareImmediate(result, Smi::RawValue(1), PP); 869 __ CompareImmediate(result, Smi::RawValue(1), PP);
870 __ LoadImmediate(result, -1, PP); 870 __ LoadImmediate(result, -1, PP);
871 __ csel(result, TMP, result, EQ); 871 __ csel(result, TMP, result, EQ);
872 __ SmiTag(result); 872 __ SmiTag(result);
873 } 873 }
874 874
875 875
876 LocationSummary* StringInterpolateInstr::MakeLocationSummary(Isolate* isolate, 876 LocationSummary* StringInterpolateInstr::MakeLocationSummary(Zone* zone,
877 bool opt) const { 877 bool opt) const {
878 const intptr_t kNumInputs = 1; 878 const intptr_t kNumInputs = 1;
879 const intptr_t kNumTemps = 0; 879 const intptr_t kNumTemps = 0;
880 LocationSummary* summary = new(isolate) LocationSummary( 880 LocationSummary* summary = new(zone) LocationSummary(
881 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); 881 zone, kNumInputs, kNumTemps, LocationSummary::kCall);
882 summary->set_in(0, Location::RegisterLocation(R0)); 882 summary->set_in(0, Location::RegisterLocation(R0));
883 summary->set_out(0, Location::RegisterLocation(R0)); 883 summary->set_out(0, Location::RegisterLocation(R0));
884 return summary; 884 return summary;
885 } 885 }
886 886
887 887
888 void StringInterpolateInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 888 void StringInterpolateInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
889 const Register array = locs()->in(0).reg(); 889 const Register array = locs()->in(0).reg();
890 __ Push(array); 890 __ Push(array);
891 const int kNumberOfArguments = 1; 891 const int kNumberOfArguments = 1;
892 const Array& kNoArgumentNames = Object::null_array(); 892 const Array& kNoArgumentNames = Object::null_array();
893 compiler->GenerateStaticCall(deopt_id(), 893 compiler->GenerateStaticCall(deopt_id(),
894 token_pos(), 894 token_pos(),
895 CallFunction(), 895 CallFunction(),
896 kNumberOfArguments, 896 kNumberOfArguments,
897 kNoArgumentNames, 897 kNoArgumentNames,
898 locs(), 898 locs(),
899 ICData::Handle()); 899 ICData::Handle());
900 ASSERT(locs()->out(0).reg() == R0); 900 ASSERT(locs()->out(0).reg() == R0);
901 } 901 }
902 902
903 903
904 LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Isolate* isolate, 904 LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Zone* zone,
905 bool opt) const { 905 bool opt) const {
906 const intptr_t kNumInputs = 1; 906 const intptr_t kNumInputs = 1;
907 return LocationSummary::Make(isolate, 907 return LocationSummary::Make(zone,
908 kNumInputs, 908 kNumInputs,
909 Location::RequiresRegister(), 909 Location::RequiresRegister(),
910 LocationSummary::kNoCall); 910 LocationSummary::kNoCall);
911 } 911 }
912 912
913 913
914 void LoadUntaggedInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 914 void LoadUntaggedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
915 const Register obj = locs()->in(0).reg(); 915 const Register obj = locs()->in(0).reg();
916 const Register result = locs()->out(0).reg(); 916 const Register result = locs()->out(0).reg();
917 if (object()->definition()->representation() == kUntagged) { 917 if (object()->definition()->representation() == kUntagged) {
918 __ LoadFromOffset(result, obj, offset(), PP); 918 __ LoadFromOffset(result, obj, offset(), PP);
919 } else { 919 } else {
920 ASSERT(object()->definition()->representation() == kTagged); 920 ASSERT(object()->definition()->representation() == kTagged);
921 __ LoadFieldFromOffset(result, obj, offset(), PP); 921 __ LoadFieldFromOffset(result, obj, offset(), PP);
922 } 922 }
923 } 923 }
924 924
925 925
926 LocationSummary* LoadClassIdInstr::MakeLocationSummary(Isolate* isolate, 926 LocationSummary* LoadClassIdInstr::MakeLocationSummary(Zone* zone,
927 bool opt) const { 927 bool opt) const {
928 const intptr_t kNumInputs = 1; 928 const intptr_t kNumInputs = 1;
929 return LocationSummary::Make(isolate, 929 return LocationSummary::Make(zone,
930 kNumInputs, 930 kNumInputs,
931 Location::RequiresRegister(), 931 Location::RequiresRegister(),
932 LocationSummary::kNoCall); 932 LocationSummary::kNoCall);
933 } 933 }
934 934
935 935
936 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 936 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
937 const Register object = locs()->in(0).reg(); 937 const Register object = locs()->in(0).reg();
938 const Register result = locs()->out(0).reg(); 938 const Register result = locs()->out(0).reg();
939 static const intptr_t kSmiCidSource = kSmiCid << RawObject::kClassIdTagPos; 939 static const intptr_t kSmiCidSource = kSmiCid << RawObject::kClassIdTagPos;
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
1027 (is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag)); 1027 (is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag));
1028 if (!Utils::IsInt(32, offset)) { 1028 if (!Utils::IsInt(32, offset)) {
1029 return false; 1029 return false;
1030 } 1030 }
1031 return Address::CanHoldOffset(static_cast<int32_t>(offset), 1031 return Address::CanHoldOffset(static_cast<int32_t>(offset),
1032 Address::Offset, 1032 Address::Offset,
1033 Address::OperandSizeFor(cid)); 1033 Address::OperandSizeFor(cid));
1034 } 1034 }
1035 1035
1036 1036
1037 LocationSummary* LoadIndexedInstr::MakeLocationSummary(Isolate* isolate, 1037 LocationSummary* LoadIndexedInstr::MakeLocationSummary(Zone* zone,
1038 bool opt) const { 1038 bool opt) const {
1039 const intptr_t kNumInputs = 2; 1039 const intptr_t kNumInputs = 2;
1040 const intptr_t kNumTemps = 0; 1040 const intptr_t kNumTemps = 0;
1041 LocationSummary* locs = new(isolate) LocationSummary( 1041 LocationSummary* locs = new(zone) LocationSummary(
1042 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 1042 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
1043 locs->set_in(0, Location::RequiresRegister()); 1043 locs->set_in(0, Location::RequiresRegister());
1044 if (CanBeImmediateIndex(index(), class_id(), IsExternal())) { 1044 if (CanBeImmediateIndex(index(), class_id(), IsExternal())) {
1045 locs->set_in(1, Location::Constant(index()->definition()->AsConstant())); 1045 locs->set_in(1, Location::Constant(index()->definition()->AsConstant()));
1046 } else { 1046 } else {
1047 locs->set_in(1, Location::RequiresRegister()); 1047 locs->set_in(1, Location::RequiresRegister());
1048 } 1048 }
1049 if ((representation() == kUnboxedDouble) || 1049 if ((representation() == kUnboxedDouble) ||
1050 (representation() == kUnboxedFloat32x4) || 1050 (representation() == kUnboxedFloat32x4) ||
1051 (representation() == kUnboxedInt32x4) || 1051 (representation() == kUnboxedInt32x4) ||
1052 (representation() == kUnboxedFloat64x2)) { 1052 (representation() == kUnboxedFloat64x2)) {
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
1142 __ SmiTag(result); 1142 __ SmiTag(result);
1143 break; 1143 break;
1144 default: 1144 default:
1145 ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid)); 1145 ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid));
1146 __ ldr(result, element_address); 1146 __ ldr(result, element_address);
1147 break; 1147 break;
1148 } 1148 }
1149 } 1149 }
1150 1150
1151 1151
1152 LocationSummary* LoadCodeUnitsInstr::MakeLocationSummary(Isolate* isolate, 1152 LocationSummary* LoadCodeUnitsInstr::MakeLocationSummary(Zone* zone,
1153 bool opt) const { 1153 bool opt) const {
1154 const intptr_t kNumInputs = 2; 1154 const intptr_t kNumInputs = 2;
1155 const intptr_t kNumTemps = 0; 1155 const intptr_t kNumTemps = 0;
1156 LocationSummary* summary = new(isolate) LocationSummary( 1156 LocationSummary* summary = new(zone) LocationSummary(
1157 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 1157 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
1158 summary->set_in(0, Location::RequiresRegister()); 1158 summary->set_in(0, Location::RequiresRegister());
1159 summary->set_in(1, Location::RequiresRegister()); 1159 summary->set_in(1, Location::RequiresRegister());
1160 summary->set_out(0, Location::RequiresRegister()); 1160 summary->set_out(0, Location::RequiresRegister());
1161 return summary; 1161 return summary;
1162 } 1162 }
1163 1163
1164 1164
1165 void LoadCodeUnitsInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 1165 void LoadCodeUnitsInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
1166 // The string register points to the backing store for external strings. 1166 // The string register points to the backing store for external strings.
1167 const Register str = locs()->in(0).reg(); 1167 const Register str = locs()->in(0).reg();
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1229 return kUnboxedInt32x4; 1229 return kUnboxedInt32x4;
1230 case kTypedDataFloat64x2ArrayCid: 1230 case kTypedDataFloat64x2ArrayCid:
1231 return kUnboxedFloat64x2; 1231 return kUnboxedFloat64x2;
1232 default: 1232 default:
1233 UNREACHABLE(); 1233 UNREACHABLE();
1234 return kTagged; 1234 return kTagged;
1235 } 1235 }
1236 } 1236 }
1237 1237
1238 1238
1239 LocationSummary* StoreIndexedInstr::MakeLocationSummary(Isolate* isolate, 1239 LocationSummary* StoreIndexedInstr::MakeLocationSummary(Zone* zone,
1240 bool opt) const { 1240 bool opt) const {
1241 const intptr_t kNumInputs = 3; 1241 const intptr_t kNumInputs = 3;
1242 const intptr_t kNumTemps = 0; 1242 const intptr_t kNumTemps = 0;
1243 LocationSummary* locs = new(isolate) LocationSummary( 1243 LocationSummary* locs = new(zone) LocationSummary(
1244 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 1244 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
1245 locs->set_in(0, Location::RequiresRegister()); 1245 locs->set_in(0, Location::RequiresRegister());
1246 if (CanBeImmediateIndex(index(), class_id(), IsExternal())) { 1246 if (CanBeImmediateIndex(index(), class_id(), IsExternal())) {
1247 locs->set_in(1, Location::Constant(index()->definition()->AsConstant())); 1247 locs->set_in(1, Location::Constant(index()->definition()->AsConstant()));
1248 } else { 1248 } else {
1249 locs->set_in(1, Location::WritableRegister()); 1249 locs->set_in(1, Location::WritableRegister());
1250 } 1250 }
1251 switch (class_id()) { 1251 switch (class_id()) {
1252 case kArrayCid: 1252 case kArrayCid:
1253 locs->set_in(2, ShouldEmitStoreBarrier() 1253 locs->set_in(2, ShouldEmitStoreBarrier()
1254 ? Location::WritableRegister() 1254 ? Location::WritableRegister()
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
1396 if (value_is_smi == NULL) { 1396 if (value_is_smi == NULL) {
1397 __ b(&done, EQ); 1397 __ b(&done, EQ);
1398 } else { 1398 } else {
1399 __ b(value_is_smi, EQ); 1399 __ b(value_is_smi, EQ);
1400 } 1400 }
1401 __ LoadClassId(value_cid_reg, value_reg, PP); 1401 __ LoadClassId(value_cid_reg, value_reg, PP);
1402 __ Bind(&done); 1402 __ Bind(&done);
1403 } 1403 }
1404 1404
1405 1405
1406 LocationSummary* GuardFieldClassInstr::MakeLocationSummary(Isolate* isolate, 1406 LocationSummary* GuardFieldClassInstr::MakeLocationSummary(Zone* zone,
1407 bool opt) const { 1407 bool opt) const {
1408 const intptr_t kNumInputs = 1; 1408 const intptr_t kNumInputs = 1;
1409 1409
1410 const intptr_t value_cid = value()->Type()->ToCid(); 1410 const intptr_t value_cid = value()->Type()->ToCid();
1411 const intptr_t field_cid = field().guarded_cid(); 1411 const intptr_t field_cid = field().guarded_cid();
1412 1412
1413 const bool emit_full_guard = 1413 const bool emit_full_guard =
1414 !opt || (field_cid == kIllegalCid); 1414 !opt || (field_cid == kIllegalCid);
1415 1415
1416 const bool needs_value_cid_temp_reg = emit_full_guard || 1416 const bool needs_value_cid_temp_reg = emit_full_guard ||
1417 ((value_cid == kDynamicCid) && (field_cid != kSmiCid)); 1417 ((value_cid == kDynamicCid) && (field_cid != kSmiCid));
1418 1418
1419 const bool needs_field_temp_reg = emit_full_guard; 1419 const bool needs_field_temp_reg = emit_full_guard;
1420 1420
1421 intptr_t num_temps = 0; 1421 intptr_t num_temps = 0;
1422 if (needs_value_cid_temp_reg) { 1422 if (needs_value_cid_temp_reg) {
1423 num_temps++; 1423 num_temps++;
1424 } 1424 }
1425 if (needs_field_temp_reg) { 1425 if (needs_field_temp_reg) {
1426 num_temps++; 1426 num_temps++;
1427 } 1427 }
1428 1428
1429 LocationSummary* summary = new(isolate) LocationSummary( 1429 LocationSummary* summary = new(zone) LocationSummary(
1430 isolate, kNumInputs, num_temps, LocationSummary::kNoCall); 1430 zone, kNumInputs, num_temps, LocationSummary::kNoCall);
1431 summary->set_in(0, Location::RequiresRegister()); 1431 summary->set_in(0, Location::RequiresRegister());
1432 1432
1433 for (intptr_t i = 0; i < num_temps; i++) { 1433 for (intptr_t i = 0; i < num_temps; i++) {
1434 summary->set_temp(i, Location::RequiresRegister()); 1434 summary->set_temp(i, Location::RequiresRegister());
1435 } 1435 }
1436 1436
1437 return summary; 1437 return summary;
1438 } 1438 }
1439 1439
1440 1440
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
1563 } else { 1563 } else {
1564 // Both value's and field's class id is known. 1564 // Both value's and field's class id is known.
1565 ASSERT((value_cid != field_cid) && (value_cid != nullability)); 1565 ASSERT((value_cid != field_cid) && (value_cid != nullability));
1566 __ b(fail); 1566 __ b(fail);
1567 } 1567 }
1568 } 1568 }
1569 __ Bind(&ok); 1569 __ Bind(&ok);
1570 } 1570 }
1571 1571
1572 1572
1573 LocationSummary* GuardFieldLengthInstr::MakeLocationSummary(Isolate* isolate, 1573 LocationSummary* GuardFieldLengthInstr::MakeLocationSummary(Zone* zone,
1574 bool opt) const { 1574 bool opt) const {
1575 const intptr_t kNumInputs = 1; 1575 const intptr_t kNumInputs = 1;
1576 if (!opt || (field().guarded_list_length() == Field::kUnknownFixedLength)) { 1576 if (!opt || (field().guarded_list_length() == Field::kUnknownFixedLength)) {
1577 const intptr_t kNumTemps = 3; 1577 const intptr_t kNumTemps = 3;
1578 LocationSummary* summary = new(isolate) LocationSummary( 1578 LocationSummary* summary = new(zone) LocationSummary(
1579 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 1579 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
1580 summary->set_in(0, Location::RequiresRegister()); 1580 summary->set_in(0, Location::RequiresRegister());
1581 // We need temporaries for field object, length offset and expected length. 1581 // We need temporaries for field object, length offset and expected length.
1582 summary->set_temp(0, Location::RequiresRegister()); 1582 summary->set_temp(0, Location::RequiresRegister());
1583 summary->set_temp(1, Location::RequiresRegister()); 1583 summary->set_temp(1, Location::RequiresRegister());
1584 summary->set_temp(2, Location::RequiresRegister()); 1584 summary->set_temp(2, Location::RequiresRegister());
1585 return summary; 1585 return summary;
1586 } else { 1586 } else {
1587 LocationSummary* summary = new(isolate) LocationSummary( 1587 LocationSummary* summary = new(zone) LocationSummary(
1588 isolate, kNumInputs, 0, LocationSummary::kNoCall); 1588 zone, kNumInputs, 0, LocationSummary::kNoCall);
1589 summary->set_in(0, Location::RequiresRegister()); 1589 summary->set_in(0, Location::RequiresRegister());
1590 return summary; 1590 return summary;
1591 } 1591 }
1592 UNREACHABLE(); 1592 UNREACHABLE();
1593 } 1593 }
1594 1594
1595 1595
1596 void GuardFieldLengthInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 1596 void GuardFieldLengthInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
1597 if (field().guarded_list_length() == Field::kNoFixedLength) { 1597 if (field().guarded_list_length() == Field::kNoFixedLength) {
1598 ASSERT(!compiler->is_optimizing()); 1598 ASSERT(!compiler->is_optimizing());
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
1738 __ CompareObject(box_reg, Object::null_object(), PP); 1738 __ CompareObject(box_reg, Object::null_object(), PP);
1739 __ b(&done, NE); 1739 __ b(&done, NE);
1740 BoxAllocationSlowPath::Allocate( 1740 BoxAllocationSlowPath::Allocate(
1741 compiler, instruction, cls, box_reg, temp); 1741 compiler, instruction, cls, box_reg, temp);
1742 __ mov(temp, box_reg); 1742 __ mov(temp, box_reg);
1743 __ StoreIntoObjectOffset(instance_reg, offset, temp, PP); 1743 __ StoreIntoObjectOffset(instance_reg, offset, temp, PP);
1744 __ Bind(&done); 1744 __ Bind(&done);
1745 } 1745 }
1746 1746
1747 1747
1748 LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(Isolate* isolate, 1748 LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(Zone* zone,
1749 bool opt) const { 1749 bool opt) const {
1750 const intptr_t kNumInputs = 2; 1750 const intptr_t kNumInputs = 2;
1751 const intptr_t kNumTemps = 1751 const intptr_t kNumTemps =
1752 (IsUnboxedStore() && opt) ? 2 : 1752 (IsUnboxedStore() && opt) ? 2 :
1753 ((IsPotentialUnboxedStore()) ? 2 : 0); 1753 ((IsPotentialUnboxedStore()) ? 2 : 0);
1754 LocationSummary* summary = new(isolate) LocationSummary( 1754 LocationSummary* summary = new(zone) LocationSummary(
1755 isolate, kNumInputs, kNumTemps, 1755 zone, kNumInputs, kNumTemps,
1756 ((IsUnboxedStore() && opt && is_potential_unboxed_initialization_) || 1756 ((IsUnboxedStore() && opt && is_potential_unboxed_initialization_) ||
1757 IsPotentialUnboxedStore()) 1757 IsPotentialUnboxedStore())
1758 ? LocationSummary::kCallOnSlowPath 1758 ? LocationSummary::kCallOnSlowPath
1759 : LocationSummary::kNoCall); 1759 : LocationSummary::kNoCall);
1760 1760
1761 summary->set_in(0, Location::RequiresRegister()); 1761 summary->set_in(0, Location::RequiresRegister());
1762 if (IsUnboxedStore() && opt) { 1762 if (IsUnboxedStore() && opt) {
1763 summary->set_in(1, Location::RequiresFpuRegister()); 1763 summary->set_in(1, Location::RequiresFpuRegister());
1764 summary->set_temp(0, Location::RequiresRegister()); 1764 summary->set_temp(0, Location::RequiresRegister());
1765 summary->set_temp(1, Location::RequiresRegister()); 1765 summary->set_temp(1, Location::RequiresRegister());
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
1941 instance_reg, 1941 instance_reg,
1942 offset_in_bytes_, 1942 offset_in_bytes_,
1943 value_reg, 1943 value_reg,
1944 PP); 1944 PP);
1945 } 1945 }
1946 } 1946 }
1947 __ Bind(&skip_store); 1947 __ Bind(&skip_store);
1948 } 1948 }
1949 1949
1950 1950
1951 LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(Isolate* isolate, 1951 LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(Zone* zone,
1952 bool opt) const { 1952 bool opt) const {
1953 const intptr_t kNumInputs = 1; 1953 const intptr_t kNumInputs = 1;
1954 const intptr_t kNumTemps = 0; 1954 const intptr_t kNumTemps = 0;
1955 LocationSummary* summary = new(isolate) LocationSummary( 1955 LocationSummary* summary = new(zone) LocationSummary(
1956 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 1956 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
1957 summary->set_in(0, Location::RequiresRegister()); 1957 summary->set_in(0, Location::RequiresRegister());
1958 summary->set_out(0, Location::RequiresRegister()); 1958 summary->set_out(0, Location::RequiresRegister());
1959 return summary; 1959 return summary;
1960 } 1960 }
1961 1961
1962 1962
1963 // When the parser is building an implicit static getter for optimization, 1963 // When the parser is building an implicit static getter for optimization,
1964 // it can generate a function body where deoptimization ids do not line up 1964 // it can generate a function body where deoptimization ids do not line up
1965 // with the unoptimized code. 1965 // with the unoptimized code.
1966 // 1966 //
1967 // This is safe only so long as LoadStaticFieldInstr cannot deoptimize. 1967 // This is safe only so long as LoadStaticFieldInstr cannot deoptimize.
1968 void LoadStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 1968 void LoadStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
1969 const Register field = locs()->in(0).reg(); 1969 const Register field = locs()->in(0).reg();
1970 const Register result = locs()->out(0).reg(); 1970 const Register result = locs()->out(0).reg();
1971 __ LoadFieldFromOffset(result, field, Field::value_offset(), PP); 1971 __ LoadFieldFromOffset(result, field, Field::value_offset(), PP);
1972 } 1972 }
1973 1973
1974 1974
1975 LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Isolate* isolate, 1975 LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Zone* zone,
1976 bool opt) const { 1976 bool opt) const {
1977 LocationSummary* locs = new(isolate) LocationSummary( 1977 LocationSummary* locs = new(zone) LocationSummary(
1978 isolate, 1, 1, LocationSummary::kNoCall); 1978 zone, 1, 1, LocationSummary::kNoCall);
1979 locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister() 1979 locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister()
1980 : Location::RequiresRegister()); 1980 : Location::RequiresRegister());
1981 locs->set_temp(0, Location::RequiresRegister()); 1981 locs->set_temp(0, Location::RequiresRegister());
1982 return locs; 1982 return locs;
1983 } 1983 }
1984 1984
1985 1985
1986 void StoreStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 1986 void StoreStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
1987 const Register value = locs()->in(0).reg(); 1987 const Register value = locs()->in(0).reg();
1988 const Register temp = locs()->temp(0).reg(); 1988 const Register temp = locs()->temp(0).reg();
1989 1989
1990 __ LoadObject(temp, field(), PP); 1990 __ LoadObject(temp, field(), PP);
1991 if (this->value()->NeedsStoreBuffer()) { 1991 if (this->value()->NeedsStoreBuffer()) {
1992 __ StoreIntoObjectOffset( 1992 __ StoreIntoObjectOffset(
1993 temp, Field::value_offset(), value, PP, CanValueBeSmi()); 1993 temp, Field::value_offset(), value, PP, CanValueBeSmi());
1994 } else { 1994 } else {
1995 __ StoreIntoObjectOffsetNoBarrier(temp, Field::value_offset(), value, PP); 1995 __ StoreIntoObjectOffsetNoBarrier(temp, Field::value_offset(), value, PP);
1996 } 1996 }
1997 } 1997 }
1998 1998
1999 1999
2000 LocationSummary* InstanceOfInstr::MakeLocationSummary(Isolate* isolate, 2000 LocationSummary* InstanceOfInstr::MakeLocationSummary(Zone* zone,
2001 bool opt) const { 2001 bool opt) const {
2002 const intptr_t kNumInputs = 3; 2002 const intptr_t kNumInputs = 3;
2003 const intptr_t kNumTemps = 0; 2003 const intptr_t kNumTemps = 0;
2004 LocationSummary* summary = new(isolate) LocationSummary( 2004 LocationSummary* summary = new(zone) LocationSummary(
2005 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); 2005 zone, kNumInputs, kNumTemps, LocationSummary::kCall);
2006 summary->set_in(0, Location::RegisterLocation(R0)); 2006 summary->set_in(0, Location::RegisterLocation(R0));
2007 summary->set_in(1, Location::RegisterLocation(R2)); 2007 summary->set_in(1, Location::RegisterLocation(R2));
2008 summary->set_in(2, Location::RegisterLocation(R1)); 2008 summary->set_in(2, Location::RegisterLocation(R1));
2009 summary->set_out(0, Location::RegisterLocation(R0)); 2009 summary->set_out(0, Location::RegisterLocation(R0));
2010 return summary; 2010 return summary;
2011 } 2011 }
2012 2012
2013 2013
2014 void InstanceOfInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 2014 void InstanceOfInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
2015 ASSERT(locs()->in(0).reg() == R0); // Value. 2015 ASSERT(locs()->in(0).reg() == R0); // Value.
2016 ASSERT(locs()->in(1).reg() == R2); // Instantiator. 2016 ASSERT(locs()->in(1).reg() == R2); // Instantiator.
2017 ASSERT(locs()->in(2).reg() == R1); // Instantiator type arguments. 2017 ASSERT(locs()->in(2).reg() == R1); // Instantiator type arguments.
2018 2018
2019 compiler->GenerateInstanceOf(token_pos(), 2019 compiler->GenerateInstanceOf(token_pos(),
2020 deopt_id(), 2020 deopt_id(),
2021 type(), 2021 type(),
2022 negate_result(), 2022 negate_result(),
2023 locs()); 2023 locs());
2024 ASSERT(locs()->out(0).reg() == R0); 2024 ASSERT(locs()->out(0).reg() == R0);
2025 } 2025 }
2026 2026
2027 2027
2028 LocationSummary* CreateArrayInstr::MakeLocationSummary(Isolate* isolate, 2028 LocationSummary* CreateArrayInstr::MakeLocationSummary(Zone* zone,
2029 bool opt) const { 2029 bool opt) const {
2030 const intptr_t kNumInputs = 2; 2030 const intptr_t kNumInputs = 2;
2031 const intptr_t kNumTemps = 0; 2031 const intptr_t kNumTemps = 0;
2032 LocationSummary* locs = new(isolate) LocationSummary( 2032 LocationSummary* locs = new(zone) LocationSummary(
2033 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); 2033 zone, kNumInputs, kNumTemps, LocationSummary::kCall);
2034 locs->set_in(kElementTypePos, Location::RegisterLocation(R1)); 2034 locs->set_in(kElementTypePos, Location::RegisterLocation(R1));
2035 locs->set_in(kLengthPos, Location::RegisterLocation(R2)); 2035 locs->set_in(kLengthPos, Location::RegisterLocation(R2));
2036 locs->set_out(0, Location::RegisterLocation(R0)); 2036 locs->set_out(0, Location::RegisterLocation(R0));
2037 return locs; 2037 return locs;
2038 } 2038 }
2039 2039
2040 2040
2041 // Inlines array allocation for known constant values. 2041 // Inlines array allocation for known constant values.
2042 static void InlineArrayAllocation(FlowGraphCompiler* compiler, 2042 static void InlineArrayAllocation(FlowGraphCompiler* compiler,
2043 intptr_t num_elements, 2043 intptr_t num_elements,
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
2133 const ExternalLabel label(stub.EntryPoint()); 2133 const ExternalLabel label(stub.EntryPoint());
2134 compiler->GenerateCall(token_pos(), 2134 compiler->GenerateCall(token_pos(),
2135 &label, 2135 &label,
2136 RawPcDescriptors::kOther, 2136 RawPcDescriptors::kOther,
2137 locs()); 2137 locs());
2138 compiler->AddStubCallTarget(stub); 2138 compiler->AddStubCallTarget(stub);
2139 ASSERT(locs()->out(0).reg() == kResultReg); 2139 ASSERT(locs()->out(0).reg() == kResultReg);
2140 } 2140 }
2141 2141
2142 2142
2143 LocationSummary* LoadFieldInstr::MakeLocationSummary(Isolate* isolate, 2143 LocationSummary* LoadFieldInstr::MakeLocationSummary(Zone* zone,
2144 bool opt) const { 2144 bool opt) const {
2145 const intptr_t kNumInputs = 1; 2145 const intptr_t kNumInputs = 1;
2146 const intptr_t kNumTemps = 2146 const intptr_t kNumTemps =
2147 (IsUnboxedLoad() && opt) ? 1 : 2147 (IsUnboxedLoad() && opt) ? 1 :
2148 ((IsPotentialUnboxedLoad()) ? 1 : 0); 2148 ((IsPotentialUnboxedLoad()) ? 1 : 0);
2149 LocationSummary* locs = new(isolate) LocationSummary( 2149 LocationSummary* locs = new(zone) LocationSummary(
2150 isolate, kNumInputs, kNumTemps, 2150 zone, kNumInputs, kNumTemps,
2151 (opt && !IsPotentialUnboxedLoad()) 2151 (opt && !IsPotentialUnboxedLoad())
2152 ? LocationSummary::kNoCall 2152 ? LocationSummary::kNoCall
2153 : LocationSummary::kCallOnSlowPath); 2153 : LocationSummary::kCallOnSlowPath);
2154 2154
2155 locs->set_in(0, Location::RequiresRegister()); 2155 locs->set_in(0, Location::RequiresRegister());
2156 2156
2157 if (IsUnboxedLoad() && opt) { 2157 if (IsUnboxedLoad() && opt) {
2158 locs->set_temp(0, Location::RequiresRegister()); 2158 locs->set_temp(0, Location::RequiresRegister());
2159 } else if (IsPotentialUnboxedLoad()) { 2159 } else if (IsPotentialUnboxedLoad()) {
2160 locs->set_temp(0, Location::RequiresRegister()); 2160 locs->set_temp(0, Location::RequiresRegister());
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
2267 __ b(&done); 2267 __ b(&done);
2268 } 2268 }
2269 2269
2270 __ Bind(&load_pointer); 2270 __ Bind(&load_pointer);
2271 } 2271 }
2272 __ LoadFieldFromOffset(result_reg, instance_reg, offset_in_bytes(), PP); 2272 __ LoadFieldFromOffset(result_reg, instance_reg, offset_in_bytes(), PP);
2273 __ Bind(&done); 2273 __ Bind(&done);
2274 } 2274 }
2275 2275
2276 2276
2277 LocationSummary* InstantiateTypeInstr::MakeLocationSummary(Isolate* isolate, 2277 LocationSummary* InstantiateTypeInstr::MakeLocationSummary(Zone* zone,
2278 bool opt) const { 2278 bool opt) const {
2279 const intptr_t kNumInputs = 1; 2279 const intptr_t kNumInputs = 1;
2280 const intptr_t kNumTemps = 0; 2280 const intptr_t kNumTemps = 0;
2281 LocationSummary* locs = new(isolate) LocationSummary( 2281 LocationSummary* locs = new(zone) LocationSummary(
2282 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); 2282 zone, kNumInputs, kNumTemps, LocationSummary::kCall);
2283 locs->set_in(0, Location::RegisterLocation(R0)); 2283 locs->set_in(0, Location::RegisterLocation(R0));
2284 locs->set_out(0, Location::RegisterLocation(R0)); 2284 locs->set_out(0, Location::RegisterLocation(R0));
2285 return locs; 2285 return locs;
2286 } 2286 }
2287 2287
2288 2288
2289 void InstantiateTypeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 2289 void InstantiateTypeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
2290 const Register instantiator_reg = locs()->in(0).reg(); 2290 const Register instantiator_reg = locs()->in(0).reg();
2291 const Register result_reg = locs()->out(0).reg(); 2291 const Register result_reg = locs()->out(0).reg();
2292 2292
2293 // 'instantiator_reg' is the instantiator TypeArguments object (or null). 2293 // 'instantiator_reg' is the instantiator TypeArguments object (or null).
2294 // A runtime call to instantiate the type is required. 2294 // A runtime call to instantiate the type is required.
2295 __ PushObject(Object::null_object(), PP); // Make room for the result. 2295 __ PushObject(Object::null_object(), PP); // Make room for the result.
2296 __ PushObject(type(), PP); 2296 __ PushObject(type(), PP);
2297 __ Push(instantiator_reg); // Push instantiator type arguments. 2297 __ Push(instantiator_reg); // Push instantiator type arguments.
2298 compiler->GenerateRuntimeCall(token_pos(), 2298 compiler->GenerateRuntimeCall(token_pos(),
2299 deopt_id(), 2299 deopt_id(),
2300 kInstantiateTypeRuntimeEntry, 2300 kInstantiateTypeRuntimeEntry,
2301 2, 2301 2,
2302 locs()); 2302 locs());
2303 __ Drop(2); // Drop instantiator and uninstantiated type. 2303 __ Drop(2); // Drop instantiator and uninstantiated type.
2304 __ Pop(result_reg); // Pop instantiated type. 2304 __ Pop(result_reg); // Pop instantiated type.
2305 ASSERT(instantiator_reg == result_reg); 2305 ASSERT(instantiator_reg == result_reg);
2306 } 2306 }
2307 2307
2308 2308
2309 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary( 2309 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary(
2310 Isolate* isolate, bool opt) const { 2310 Zone* zone, bool opt) const {
2311 const intptr_t kNumInputs = 1; 2311 const intptr_t kNumInputs = 1;
2312 const intptr_t kNumTemps = 0; 2312 const intptr_t kNumTemps = 0;
2313 LocationSummary* locs = new(isolate) LocationSummary( 2313 LocationSummary* locs = new(zone) LocationSummary(
2314 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); 2314 zone, kNumInputs, kNumTemps, LocationSummary::kCall);
2315 locs->set_in(0, Location::RegisterLocation(R0)); 2315 locs->set_in(0, Location::RegisterLocation(R0));
2316 locs->set_out(0, Location::RegisterLocation(R0)); 2316 locs->set_out(0, Location::RegisterLocation(R0));
2317 return locs; 2317 return locs;
2318 } 2318 }
2319 2319
2320 2320
2321 void InstantiateTypeArgumentsInstr::EmitNativeCode( 2321 void InstantiateTypeArgumentsInstr::EmitNativeCode(
2322 FlowGraphCompiler* compiler) { 2322 FlowGraphCompiler* compiler) {
2323 const Register instantiator_reg = locs()->in(0).reg(); 2323 const Register instantiator_reg = locs()->in(0).reg();
2324 const Register result_reg = locs()->out(0).reg(); 2324 const Register result_reg = locs()->out(0).reg();
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
2368 kInstantiateTypeArgumentsRuntimeEntry, 2368 kInstantiateTypeArgumentsRuntimeEntry,
2369 2, 2369 2,
2370 locs()); 2370 locs());
2371 __ Drop(2); // Drop instantiator and uninstantiated type arguments. 2371 __ Drop(2); // Drop instantiator and uninstantiated type arguments.
2372 __ Pop(result_reg); // Pop instantiated type arguments. 2372 __ Pop(result_reg); // Pop instantiated type arguments.
2373 __ Bind(&type_arguments_instantiated); 2373 __ Bind(&type_arguments_instantiated);
2374 } 2374 }
2375 2375
2376 2376
2377 LocationSummary* AllocateUninitializedContextInstr::MakeLocationSummary( 2377 LocationSummary* AllocateUninitializedContextInstr::MakeLocationSummary(
2378 Isolate* isolate, 2378 Zone* zone,
2379 bool opt) const { 2379 bool opt) const {
2380 ASSERT(opt); 2380 ASSERT(opt);
2381 const intptr_t kNumInputs = 0; 2381 const intptr_t kNumInputs = 0;
2382 const intptr_t kNumTemps = 3; 2382 const intptr_t kNumTemps = 3;
2383 LocationSummary* locs = new(isolate) LocationSummary( 2383 LocationSummary* locs = new(zone) LocationSummary(
2384 isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath); 2384 zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
2385 locs->set_temp(0, Location::RegisterLocation(R1)); 2385 locs->set_temp(0, Location::RegisterLocation(R1));
2386 locs->set_temp(1, Location::RegisterLocation(R2)); 2386 locs->set_temp(1, Location::RegisterLocation(R2));
2387 locs->set_temp(2, Location::RegisterLocation(R3)); 2387 locs->set_temp(2, Location::RegisterLocation(R3));
2388 locs->set_out(0, Location::RegisterLocation(R0)); 2388 locs->set_out(0, Location::RegisterLocation(R0));
2389 return locs; 2389 return locs;
2390 } 2390 }
2391 2391
2392 2392
2393 class AllocateContextSlowPath : public SlowPathCode { 2393 class AllocateContextSlowPath : public SlowPathCode {
2394 public: 2394 public:
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
2441 temp2); 2441 temp2);
2442 2442
2443 // Setup up number of context variables field. 2443 // Setup up number of context variables field.
2444 __ LoadImmediate(temp0, num_context_variables(), PP); 2444 __ LoadImmediate(temp0, num_context_variables(), PP);
2445 __ str(temp0, FieldAddress(result, Context::num_variables_offset())); 2445 __ str(temp0, FieldAddress(result, Context::num_variables_offset()));
2446 2446
2447 __ Bind(slow_path->exit_label()); 2447 __ Bind(slow_path->exit_label());
2448 } 2448 }
2449 2449
2450 2450
2451 LocationSummary* AllocateContextInstr::MakeLocationSummary(Isolate* isolate, 2451 LocationSummary* AllocateContextInstr::MakeLocationSummary(Zone* zone,
2452 bool opt) const { 2452 bool opt) const {
2453 const intptr_t kNumInputs = 0; 2453 const intptr_t kNumInputs = 0;
2454 const intptr_t kNumTemps = 1; 2454 const intptr_t kNumTemps = 1;
2455 LocationSummary* locs = new(isolate) LocationSummary( 2455 LocationSummary* locs = new(zone) LocationSummary(
2456 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); 2456 zone, kNumInputs, kNumTemps, LocationSummary::kCall);
2457 locs->set_temp(0, Location::RegisterLocation(R1)); 2457 locs->set_temp(0, Location::RegisterLocation(R1));
2458 locs->set_out(0, Location::RegisterLocation(R0)); 2458 locs->set_out(0, Location::RegisterLocation(R0));
2459 return locs; 2459 return locs;
2460 } 2460 }
2461 2461
2462 2462
2463 void AllocateContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 2463 void AllocateContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
2464 ASSERT(locs()->temp(0).reg() == R1); 2464 ASSERT(locs()->temp(0).reg() == R1);
2465 ASSERT(locs()->out(0).reg() == R0); 2465 ASSERT(locs()->out(0).reg() == R0);
2466 2466
2467 __ LoadImmediate(R1, num_context_variables(), PP); 2467 __ LoadImmediate(R1, num_context_variables(), PP);
2468 StubCode* stub_code = compiler->isolate()->stub_code(); 2468 StubCode* stub_code = compiler->isolate()->stub_code();
2469 const ExternalLabel label(stub_code->AllocateContextEntryPoint()); 2469 const ExternalLabel label(stub_code->AllocateContextEntryPoint());
2470 compiler->GenerateCall(token_pos(), 2470 compiler->GenerateCall(token_pos(),
2471 &label, 2471 &label,
2472 RawPcDescriptors::kOther, 2472 RawPcDescriptors::kOther,
2473 locs()); 2473 locs());
2474 } 2474 }
2475 2475
2476 LocationSummary* InitStaticFieldInstr::MakeLocationSummary(Isolate* isolate, 2476 LocationSummary* InitStaticFieldInstr::MakeLocationSummary(Zone* zone,
2477 bool opt) const { 2477 bool opt) const {
2478 const intptr_t kNumInputs = 1; 2478 const intptr_t kNumInputs = 1;
2479 const intptr_t kNumTemps = 1; 2479 const intptr_t kNumTemps = 1;
2480 LocationSummary* locs = new(isolate) LocationSummary( 2480 LocationSummary* locs = new(zone) LocationSummary(
2481 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); 2481 zone, kNumInputs, kNumTemps, LocationSummary::kCall);
2482 locs->set_in(0, Location::RegisterLocation(R0)); 2482 locs->set_in(0, Location::RegisterLocation(R0));
2483 locs->set_temp(0, Location::RegisterLocation(R1)); 2483 locs->set_temp(0, Location::RegisterLocation(R1));
2484 return locs; 2484 return locs;
2485 } 2485 }
2486 2486
2487 2487
2488 void InitStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 2488 void InitStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
2489 Register field = locs()->in(0).reg(); 2489 Register field = locs()->in(0).reg();
2490 Register temp = locs()->temp(0).reg(); 2490 Register temp = locs()->temp(0).reg();
2491 Label call_runtime, no_call; 2491 Label call_runtime, no_call;
(...skipping 11 matching lines...) Expand all
2503 compiler->GenerateRuntimeCall(token_pos(), 2503 compiler->GenerateRuntimeCall(token_pos(),
2504 deopt_id(), 2504 deopt_id(),
2505 kInitStaticFieldRuntimeEntry, 2505 kInitStaticFieldRuntimeEntry,
2506 1, 2506 1,
2507 locs()); 2507 locs());
2508 __ Drop(2); // Remove argument and result placeholder. 2508 __ Drop(2); // Remove argument and result placeholder.
2509 __ Bind(&no_call); 2509 __ Bind(&no_call);
2510 } 2510 }
2511 2511
2512 2512
2513 LocationSummary* CloneContextInstr::MakeLocationSummary(Isolate* isolate, 2513 LocationSummary* CloneContextInstr::MakeLocationSummary(Zone* zone,
2514 bool opt) const { 2514 bool opt) const {
2515 const intptr_t kNumInputs = 1; 2515 const intptr_t kNumInputs = 1;
2516 const intptr_t kNumTemps = 0; 2516 const intptr_t kNumTemps = 0;
2517 LocationSummary* locs = new(isolate) LocationSummary( 2517 LocationSummary* locs = new(zone) LocationSummary(
2518 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); 2518 zone, kNumInputs, kNumTemps, LocationSummary::kCall);
2519 locs->set_in(0, Location::RegisterLocation(R0)); 2519 locs->set_in(0, Location::RegisterLocation(R0));
2520 locs->set_out(0, Location::RegisterLocation(R0)); 2520 locs->set_out(0, Location::RegisterLocation(R0));
2521 return locs; 2521 return locs;
2522 } 2522 }
2523 2523
2524 2524
2525 void CloneContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 2525 void CloneContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
2526 const Register context_value = locs()->in(0).reg(); 2526 const Register context_value = locs()->in(0).reg();
2527 const Register result = locs()->out(0).reg(); 2527 const Register result = locs()->out(0).reg();
2528 2528
2529 __ PushObject(Object::null_object(), PP); // Make room for the result. 2529 __ PushObject(Object::null_object(), PP); // Make room for the result.
2530 __ Push(context_value); 2530 __ Push(context_value);
2531 compiler->GenerateRuntimeCall(token_pos(), 2531 compiler->GenerateRuntimeCall(token_pos(),
2532 deopt_id(), 2532 deopt_id(),
2533 kCloneContextRuntimeEntry, 2533 kCloneContextRuntimeEntry,
2534 1, 2534 1,
2535 locs()); 2535 locs());
2536 __ Drop(1); // Remove argument. 2536 __ Drop(1); // Remove argument.
2537 __ Pop(result); // Get result (cloned context). 2537 __ Pop(result); // Get result (cloned context).
2538 } 2538 }
2539 2539
2540 2540
2541 LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(Isolate* isolate, 2541 LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(Zone* zone,
2542 bool opt) const { 2542 bool opt) const {
2543 UNREACHABLE(); 2543 UNREACHABLE();
2544 return NULL; 2544 return NULL;
2545 } 2545 }
2546 2546
2547 2547
2548 void CatchBlockEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 2548 void CatchBlockEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
2549 __ Bind(compiler->GetJumpLabel(this)); 2549 __ Bind(compiler->GetJumpLabel(this));
2550 compiler->AddExceptionHandler(catch_try_index(), 2550 compiler->AddExceptionHandler(catch_try_index(),
2551 try_index(), 2551 try_index(),
(...skipping 17 matching lines...) Expand all
2569 2569
2570 // Restore stack and initialize the two exception variables: 2570 // Restore stack and initialize the two exception variables:
2571 // exception and stack trace variables. 2571 // exception and stack trace variables.
2572 __ StoreToOffset(kExceptionObjectReg, 2572 __ StoreToOffset(kExceptionObjectReg,
2573 FP, exception_var().index() * kWordSize, PP); 2573 FP, exception_var().index() * kWordSize, PP);
2574 __ StoreToOffset(kStackTraceObjectReg, 2574 __ StoreToOffset(kStackTraceObjectReg,
2575 FP, stacktrace_var().index() * kWordSize, PP); 2575 FP, stacktrace_var().index() * kWordSize, PP);
2576 } 2576 }
2577 2577
2578 2578
2579 LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(Isolate* isolate, 2579 LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(Zone* zone,
2580 bool opt) const { 2580 bool opt) const {
2581 const intptr_t kNumInputs = 0; 2581 const intptr_t kNumInputs = 0;
2582 const intptr_t kNumTemps = 1; 2582 const intptr_t kNumTemps = 1;
2583 LocationSummary* summary = new(isolate) LocationSummary( 2583 LocationSummary* summary = new(zone) LocationSummary(
2584 isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath); 2584 zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
2585 summary->set_temp(0, Location::RequiresRegister()); 2585 summary->set_temp(0, Location::RequiresRegister());
2586 return summary; 2586 return summary;
2587 } 2587 }
2588 2588
2589 2589
2590 class CheckStackOverflowSlowPath : public SlowPathCode { 2590 class CheckStackOverflowSlowPath : public SlowPathCode {
2591 public: 2591 public:
2592 explicit CheckStackOverflowSlowPath(CheckStackOverflowInstr* instruction) 2592 explicit CheckStackOverflowSlowPath(CheckStackOverflowInstr* instruction)
2593 : instruction_(instruction) { } 2593 : instruction_(instruction) { }
2594 2594
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
2781 __ b(deopt, NE); // Overflow. 2781 __ b(deopt, NE); // Overflow.
2782 // Shift for result now we know there is no overflow. 2782 // Shift for result now we know there is no overflow.
2783 __ lslv(result, left, TMP); 2783 __ lslv(result, left, TMP);
2784 } 2784 }
2785 if (FLAG_throw_on_javascript_int_overflow) { 2785 if (FLAG_throw_on_javascript_int_overflow) {
2786 EmitJavascriptOverflowCheck(compiler, shift_left->range(), deopt, result); 2786 EmitJavascriptOverflowCheck(compiler, shift_left->range(), deopt, result);
2787 } 2787 }
2788 } 2788 }
2789 2789
2790 2790
2791 LocationSummary* BinarySmiOpInstr::MakeLocationSummary(Isolate* isolate, 2791 LocationSummary* BinarySmiOpInstr::MakeLocationSummary(Zone* zone,
2792 bool opt) const { 2792 bool opt) const {
2793 const intptr_t kNumInputs = 2; 2793 const intptr_t kNumInputs = 2;
2794 const intptr_t kNumTemps = 2794 const intptr_t kNumTemps =
2795 (((op_kind() == Token::kSHL) && can_overflow()) || 2795 (((op_kind() == Token::kSHL) && can_overflow()) ||
2796 (op_kind() == Token::kSHR)) ? 1 : 0; 2796 (op_kind() == Token::kSHR)) ? 1 : 0;
2797 LocationSummary* summary = new(isolate) LocationSummary( 2797 LocationSummary* summary = new(zone) LocationSummary(
2798 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 2798 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
2799 if (op_kind() == Token::kTRUNCDIV) { 2799 if (op_kind() == Token::kTRUNCDIV) {
2800 summary->set_in(0, Location::RequiresRegister()); 2800 summary->set_in(0, Location::RequiresRegister());
2801 if (RightIsPowerOfTwoConstant()) { 2801 if (RightIsPowerOfTwoConstant()) {
2802 ConstantInstr* right_constant = right()->definition()->AsConstant(); 2802 ConstantInstr* right_constant = right()->definition()->AsConstant();
2803 summary->set_in(1, Location::Constant(right_constant)); 2803 summary->set_in(1, Location::Constant(right_constant));
2804 } else { 2804 } else {
2805 summary->set_in(1, Location::RequiresRegister()); 2805 summary->set_in(1, Location::RequiresRegister());
2806 } 2806 }
2807 summary->set_out(0, Location::RequiresRegister()); 2807 summary->set_out(0, Location::RequiresRegister());
2808 return summary; 2808 return summary;
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after
3064 default: 3064 default:
3065 UNREACHABLE(); 3065 UNREACHABLE();
3066 break; 3066 break;
3067 } 3067 }
3068 if (FLAG_throw_on_javascript_int_overflow) { 3068 if (FLAG_throw_on_javascript_int_overflow) {
3069 EmitJavascriptOverflowCheck(compiler, range(), deopt, result); 3069 EmitJavascriptOverflowCheck(compiler, range(), deopt, result);
3070 } 3070 }
3071 } 3071 }
3072 3072
3073 3073
3074 LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(Isolate* isolate, 3074 LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(Zone* zone,
3075 bool opt) const { 3075 bool opt) const {
3076 intptr_t left_cid = left()->Type()->ToCid(); 3076 intptr_t left_cid = left()->Type()->ToCid();
3077 intptr_t right_cid = right()->Type()->ToCid(); 3077 intptr_t right_cid = right()->Type()->ToCid();
3078 ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid)); 3078 ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid));
3079 const intptr_t kNumInputs = 2; 3079 const intptr_t kNumInputs = 2;
3080 const intptr_t kNumTemps = 0; 3080 const intptr_t kNumTemps = 0;
3081 LocationSummary* summary = new(isolate) LocationSummary( 3081 LocationSummary* summary = new(zone) LocationSummary(
3082 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 3082 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
3083 summary->set_in(0, Location::RequiresRegister()); 3083 summary->set_in(0, Location::RequiresRegister());
3084 summary->set_in(1, Location::RequiresRegister()); 3084 summary->set_in(1, Location::RequiresRegister());
3085 return summary; 3085 return summary;
3086 } 3086 }
3087 3087
3088 3088
3089 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3089 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3090 Label* deopt = compiler->AddDeoptStub(deopt_id(), 3090 Label* deopt = compiler->AddDeoptStub(deopt_id(),
3091 ICData::kDeoptBinaryDoubleOp, 3091 ICData::kDeoptBinaryDoubleOp,
3092 licm_hoisted_ ? ICData::kHoisted : 0); 3092 licm_hoisted_ ? ICData::kHoisted : 0);
3093 intptr_t left_cid = left()->Type()->ToCid(); 3093 intptr_t left_cid = left()->Type()->ToCid();
3094 intptr_t right_cid = right()->Type()->ToCid(); 3094 intptr_t right_cid = right()->Type()->ToCid();
3095 const Register left = locs()->in(0).reg(); 3095 const Register left = locs()->in(0).reg();
3096 const Register right = locs()->in(1).reg(); 3096 const Register right = locs()->in(1).reg();
3097 if (left_cid == kSmiCid) { 3097 if (left_cid == kSmiCid) {
3098 __ tsti(right, Immediate(kSmiTagMask)); 3098 __ tsti(right, Immediate(kSmiTagMask));
3099 } else if (right_cid == kSmiCid) { 3099 } else if (right_cid == kSmiCid) {
3100 __ tsti(left, Immediate(kSmiTagMask)); 3100 __ tsti(left, Immediate(kSmiTagMask));
3101 } else { 3101 } else {
3102 __ orr(TMP, left, Operand(right)); 3102 __ orr(TMP, left, Operand(right));
3103 __ tsti(TMP, Immediate(kSmiTagMask)); 3103 __ tsti(TMP, Immediate(kSmiTagMask));
3104 } 3104 }
3105 __ b(deopt, EQ); 3105 __ b(deopt, EQ);
3106 } 3106 }
3107 3107
3108 3108
3109 LocationSummary* BoxInstr::MakeLocationSummary(Isolate* isolate, 3109 LocationSummary* BoxInstr::MakeLocationSummary(Zone* zone,
3110 bool opt) const { 3110 bool opt) const {
3111 const intptr_t kNumInputs = 1; 3111 const intptr_t kNumInputs = 1;
3112 const intptr_t kNumTemps = 1; 3112 const intptr_t kNumTemps = 1;
3113 LocationSummary* summary = new(isolate) LocationSummary( 3113 LocationSummary* summary = new(zone) LocationSummary(
3114 isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath); 3114 zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
3115 summary->set_in(0, Location::RequiresFpuRegister()); 3115 summary->set_in(0, Location::RequiresFpuRegister());
3116 summary->set_temp(0, Location::RequiresRegister()); 3116 summary->set_temp(0, Location::RequiresRegister());
3117 summary->set_out(0, Location::RequiresRegister()); 3117 summary->set_out(0, Location::RequiresRegister());
3118 return summary; 3118 return summary;
3119 } 3119 }
3120 3120
3121 3121
3122 void BoxInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3122 void BoxInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3123 const Register out_reg = locs()->out(0).reg(); 3123 const Register out_reg = locs()->out(0).reg();
3124 const Register temp_reg = locs()->temp(0).reg(); 3124 const Register temp_reg = locs()->temp(0).reg();
(...skipping 15 matching lines...) Expand all
3140 case kUnboxedInt32x4: 3140 case kUnboxedInt32x4:
3141 __ StoreQFieldToOffset(value, out_reg, ValueOffset(), PP); 3141 __ StoreQFieldToOffset(value, out_reg, ValueOffset(), PP);
3142 break; 3142 break;
3143 default: 3143 default:
3144 UNREACHABLE(); 3144 UNREACHABLE();
3145 break; 3145 break;
3146 } 3146 }
3147 } 3147 }
3148 3148
3149 3149
3150 LocationSummary* UnboxInstr::MakeLocationSummary(Isolate* isolate, 3150 LocationSummary* UnboxInstr::MakeLocationSummary(Zone* zone,
3151 bool opt) const { 3151 bool opt) const {
3152 const intptr_t kNumInputs = 1; 3152 const intptr_t kNumInputs = 1;
3153 const intptr_t kNumTemps = 0; 3153 const intptr_t kNumTemps = 0;
3154 LocationSummary* summary = new(isolate) LocationSummary( 3154 LocationSummary* summary = new(zone) LocationSummary(
3155 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 3155 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
3156 summary->set_in(0, Location::RequiresRegister()); 3156 summary->set_in(0, Location::RequiresRegister());
3157 summary->set_out(0, Location::RequiresFpuRegister()); 3157 summary->set_out(0, Location::RequiresFpuRegister());
3158 return summary; 3158 return summary;
3159 } 3159 }
3160 3160
3161 3161
3162 void UnboxInstr::EmitLoadFromBox(FlowGraphCompiler* compiler) { 3162 void UnboxInstr::EmitLoadFromBox(FlowGraphCompiler* compiler) {
3163 const Register box = locs()->in(0).reg(); 3163 const Register box = locs()->in(0).reg();
3164 3164
3165 switch (representation()) { 3165 switch (representation()) {
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
3243 Label done; 3243 Label done;
3244 __ b(&done); 3244 __ b(&done);
3245 __ Bind(&is_smi); 3245 __ Bind(&is_smi);
3246 EmitSmiConversion(compiler); 3246 EmitSmiConversion(compiler);
3247 __ Bind(&done); 3247 __ Bind(&done);
3248 } 3248 }
3249 } 3249 }
3250 } 3250 }
3251 3251
3252 3252
3253 LocationSummary* BoxInteger32Instr::MakeLocationSummary(Isolate* isolate, 3253 LocationSummary* BoxInteger32Instr::MakeLocationSummary(Zone* zone,
3254 bool opt) const { 3254 bool opt) const {
3255 ASSERT((from_representation() == kUnboxedInt32) || 3255 ASSERT((from_representation() == kUnboxedInt32) ||
3256 (from_representation() == kUnboxedUint32)); 3256 (from_representation() == kUnboxedUint32));
3257 const intptr_t kNumInputs = 1; 3257 const intptr_t kNumInputs = 1;
3258 const intptr_t kNumTemps = 0; 3258 const intptr_t kNumTemps = 0;
3259 LocationSummary* summary = new(isolate) LocationSummary( 3259 LocationSummary* summary = new(zone) LocationSummary(
3260 isolate, 3260 zone,
3261 kNumInputs, 3261 kNumInputs,
3262 kNumTemps, 3262 kNumTemps,
3263 LocationSummary::kNoCall); 3263 LocationSummary::kNoCall);
3264 summary->set_in(0, Location::RequiresRegister()); 3264 summary->set_in(0, Location::RequiresRegister());
3265 summary->set_out(0, Location::RequiresRegister()); 3265 summary->set_out(0, Location::RequiresRegister());
3266 return summary; 3266 return summary;
3267 } 3267 }
3268 3268
3269 3269
3270 void BoxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) { 3270 void BoxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
3271 Register value = locs()->in(0).reg(); 3271 Register value = locs()->in(0).reg();
3272 Register out = locs()->out(0).reg(); 3272 Register out = locs()->out(0).reg();
3273 ASSERT(value != out); 3273 ASSERT(value != out);
3274 3274
3275 ASSERT(kSmiTagSize == 1); 3275 ASSERT(kSmiTagSize == 1);
3276 // TODO(vegorov) implement and use UBFM/SBFM for this. 3276 // TODO(vegorov) implement and use UBFM/SBFM for this.
3277 __ LslImmediate(out, value, 32); 3277 __ LslImmediate(out, value, 32);
3278 if (from_representation() == kUnboxedInt32) { 3278 if (from_representation() == kUnboxedInt32) {
3279 __ AsrImmediate(out, out, 32 - kSmiTagSize); 3279 __ AsrImmediate(out, out, 32 - kSmiTagSize);
3280 } else { 3280 } else {
3281 ASSERT(from_representation() == kUnboxedUint32); 3281 ASSERT(from_representation() == kUnboxedUint32);
3282 __ LsrImmediate(out, out, 32 - kSmiTagSize); 3282 __ LsrImmediate(out, out, 32 - kSmiTagSize);
3283 } 3283 }
3284 } 3284 }
3285 3285
3286 3286
3287 DEFINE_UNIMPLEMENTED_INSTRUCTION(BoxInt64Instr) 3287 DEFINE_UNIMPLEMENTED_INSTRUCTION(BoxInt64Instr)
3288 3288
3289 3289
3290 LocationSummary* UnboxInteger32Instr::MakeLocationSummary(Isolate* isolate, 3290 LocationSummary* UnboxInteger32Instr::MakeLocationSummary(Zone* zone,
3291 bool opt) const { 3291 bool opt) const {
3292 const intptr_t kNumInputs = 1; 3292 const intptr_t kNumInputs = 1;
3293 const intptr_t kNumTemps = 0; 3293 const intptr_t kNumTemps = 0;
3294 LocationSummary* summary = new(isolate) LocationSummary( 3294 LocationSummary* summary = new(zone) LocationSummary(
3295 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 3295 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
3296 summary->set_in(0, Location::RequiresRegister()); 3296 summary->set_in(0, Location::RequiresRegister());
3297 summary->set_out(0, Location::RequiresRegister()); 3297 summary->set_out(0, Location::RequiresRegister());
3298 return summary; 3298 return summary;
3299 } 3299 }
3300 3300
3301 3301
3302 void UnboxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) { 3302 void UnboxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
3303 const intptr_t value_cid = value()->Type()->ToCid(); 3303 const intptr_t value_cid = value()->Type()->ToCid();
3304 const Register out = locs()->out(0).reg(); 3304 const Register out = locs()->out(0).reg();
3305 const Register value = locs()->in(0).reg(); 3305 const Register value = locs()->in(0).reg();
(...skipping 18 matching lines...) Expand all
3324 // TODO(vegorov): as it is implemented right now truncating unboxing would 3324 // TODO(vegorov): as it is implemented right now truncating unboxing would
3325 // leave "garbage" in the higher word. 3325 // leave "garbage" in the higher word.
3326 if (!is_truncating() && (deopt != NULL)) { 3326 if (!is_truncating() && (deopt != NULL)) {
3327 ASSERT(representation() == kUnboxedInt32); 3327 ASSERT(representation() == kUnboxedInt32);
3328 __ cmp(out, Operand(out, SXTW, 0)); 3328 __ cmp(out, Operand(out, SXTW, 0));
3329 __ b(deopt, NE); 3329 __ b(deopt, NE);
3330 } 3330 }
3331 } 3331 }
3332 3332
3333 3333
3334 LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate, 3334 LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Zone* zone,
3335 bool opt) const { 3335 bool opt) const {
3336 const intptr_t kNumInputs = 2; 3336 const intptr_t kNumInputs = 2;
3337 const intptr_t kNumTemps = 0; 3337 const intptr_t kNumTemps = 0;
3338 LocationSummary* summary = new(isolate) LocationSummary( 3338 LocationSummary* summary = new(zone) LocationSummary(
3339 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 3339 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
3340 summary->set_in(0, Location::RequiresFpuRegister()); 3340 summary->set_in(0, Location::RequiresFpuRegister());
3341 summary->set_in(1, Location::RequiresFpuRegister()); 3341 summary->set_in(1, Location::RequiresFpuRegister());
3342 summary->set_out(0, Location::RequiresFpuRegister()); 3342 summary->set_out(0, Location::RequiresFpuRegister());
3343 return summary; 3343 return summary;
3344 } 3344 }
3345 3345
3346 3346
3347 void BinaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3347 void BinaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3348 const VRegister left = locs()->in(0).fpu_reg(); 3348 const VRegister left = locs()->in(0).fpu_reg();
3349 const VRegister right = locs()->in(1).fpu_reg(); 3349 const VRegister right = locs()->in(1).fpu_reg();
3350 const VRegister result = locs()->out(0).fpu_reg(); 3350 const VRegister result = locs()->out(0).fpu_reg();
3351 switch (op_kind()) { 3351 switch (op_kind()) {
3352 case Token::kADD: __ faddd(result, left, right); break; 3352 case Token::kADD: __ faddd(result, left, right); break;
3353 case Token::kSUB: __ fsubd(result, left, right); break; 3353 case Token::kSUB: __ fsubd(result, left, right); break;
3354 case Token::kMUL: __ fmuld(result, left, right); break; 3354 case Token::kMUL: __ fmuld(result, left, right); break;
3355 case Token::kDIV: __ fdivd(result, left, right); break; 3355 case Token::kDIV: __ fdivd(result, left, right); break;
3356 default: UNREACHABLE(); 3356 default: UNREACHABLE();
3357 } 3357 }
3358 } 3358 }
3359 3359
3360 3360
3361 LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(Isolate* isolate, 3361 LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(Zone* zone,
3362 bool opt) const { 3362 bool opt) const {
3363 const intptr_t kNumInputs = 2; 3363 const intptr_t kNumInputs = 2;
3364 const intptr_t kNumTemps = 0; 3364 const intptr_t kNumTemps = 0;
3365 LocationSummary* summary = new(isolate) LocationSummary( 3365 LocationSummary* summary = new(zone) LocationSummary(
3366 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 3366 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
3367 summary->set_in(0, Location::RequiresFpuRegister()); 3367 summary->set_in(0, Location::RequiresFpuRegister());
3368 summary->set_in(1, Location::RequiresFpuRegister()); 3368 summary->set_in(1, Location::RequiresFpuRegister());
3369 summary->set_out(0, Location::RequiresFpuRegister()); 3369 summary->set_out(0, Location::RequiresFpuRegister());
3370 return summary; 3370 return summary;
3371 } 3371 }
3372 3372
3373 3373
3374 void BinaryFloat32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3374 void BinaryFloat32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3375 const VRegister left = locs()->in(0).fpu_reg(); 3375 const VRegister left = locs()->in(0).fpu_reg();
3376 const VRegister right = locs()->in(1).fpu_reg(); 3376 const VRegister right = locs()->in(1).fpu_reg();
3377 const VRegister result = locs()->out(0).fpu_reg(); 3377 const VRegister result = locs()->out(0).fpu_reg();
3378 3378
3379 switch (op_kind()) { 3379 switch (op_kind()) {
3380 case Token::kADD: __ vadds(result, left, right); break; 3380 case Token::kADD: __ vadds(result, left, right); break;
3381 case Token::kSUB: __ vsubs(result, left, right); break; 3381 case Token::kSUB: __ vsubs(result, left, right); break;
3382 case Token::kMUL: __ vmuls(result, left, right); break; 3382 case Token::kMUL: __ vmuls(result, left, right); break;
3383 case Token::kDIV: __ vdivs(result, left, right); break; 3383 case Token::kDIV: __ vdivs(result, left, right); break;
3384 default: UNREACHABLE(); 3384 default: UNREACHABLE();
3385 } 3385 }
3386 } 3386 }
3387 3387
3388 3388
3389 LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(Isolate* isolate, 3389 LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(Zone* zone,
3390 bool opt) const { 3390 bool opt) const {
3391 const intptr_t kNumInputs = 2; 3391 const intptr_t kNumInputs = 2;
3392 const intptr_t kNumTemps = 0; 3392 const intptr_t kNumTemps = 0;
3393 LocationSummary* summary = new(isolate) LocationSummary( 3393 LocationSummary* summary = new(zone) LocationSummary(
3394 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 3394 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
3395 summary->set_in(0, Location::RequiresFpuRegister()); 3395 summary->set_in(0, Location::RequiresFpuRegister());
3396 summary->set_in(1, Location::RequiresFpuRegister()); 3396 summary->set_in(1, Location::RequiresFpuRegister());
3397 summary->set_out(0, Location::RequiresFpuRegister()); 3397 summary->set_out(0, Location::RequiresFpuRegister());
3398 return summary; 3398 return summary;
3399 } 3399 }
3400 3400
3401 3401
3402 void BinaryFloat64x2OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3402 void BinaryFloat64x2OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3403 const VRegister left = locs()->in(0).fpu_reg(); 3403 const VRegister left = locs()->in(0).fpu_reg();
3404 const VRegister right = locs()->in(1).fpu_reg(); 3404 const VRegister right = locs()->in(1).fpu_reg();
3405 const VRegister result = locs()->out(0).fpu_reg(); 3405 const VRegister result = locs()->out(0).fpu_reg();
3406 3406
3407 switch (op_kind()) { 3407 switch (op_kind()) {
3408 case Token::kADD: __ vaddd(result, left, right); break; 3408 case Token::kADD: __ vaddd(result, left, right); break;
3409 case Token::kSUB: __ vsubd(result, left, right); break; 3409 case Token::kSUB: __ vsubd(result, left, right); break;
3410 case Token::kMUL: __ vmuld(result, left, right); break; 3410 case Token::kMUL: __ vmuld(result, left, right); break;
3411 case Token::kDIV: __ vdivd(result, left, right); break; 3411 case Token::kDIV: __ vdivd(result, left, right); break;
3412 default: UNREACHABLE(); 3412 default: UNREACHABLE();
3413 } 3413 }
3414 } 3414 }
3415 3415
3416 3416
3417 LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(Isolate* isolate, 3417 LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(Zone* zone,
3418 bool opt) const { 3418 bool opt) const {
3419 const intptr_t kNumInputs = 1; 3419 const intptr_t kNumInputs = 1;
3420 const intptr_t kNumTemps = 0; 3420 const intptr_t kNumTemps = 0;
3421 LocationSummary* summary = new LocationSummary( 3421 LocationSummary* summary = new LocationSummary(
3422 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 3422 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
3423 summary->set_in(0, Location::RequiresFpuRegister()); 3423 summary->set_in(0, Location::RequiresFpuRegister());
3424 summary->set_out(0, Location::RequiresFpuRegister()); 3424 summary->set_out(0, Location::RequiresFpuRegister());
3425 return summary; 3425 return summary;
3426 } 3426 }
3427 3427
3428 3428
3429 void Simd32x4ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3429 void Simd32x4ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3430 const VRegister value = locs()->in(0).fpu_reg(); 3430 const VRegister value = locs()->in(0).fpu_reg();
3431 const VRegister result = locs()->out(0).fpu_reg(); 3431 const VRegister result = locs()->out(0).fpu_reg();
3432 3432
(...skipping 29 matching lines...) Expand all
3462 __ vinss(result, 1, value, (mask_ >> 2) & 0x3); 3462 __ vinss(result, 1, value, (mask_ >> 2) & 0x3);
3463 __ vinss(result, 2, value, (mask_ >> 4) & 0x3); 3463 __ vinss(result, 2, value, (mask_ >> 4) & 0x3);
3464 __ vinss(result, 3, value, (mask_ >> 6) & 0x3); 3464 __ vinss(result, 3, value, (mask_ >> 6) & 0x3);
3465 } 3465 }
3466 break; 3466 break;
3467 default: UNREACHABLE(); 3467 default: UNREACHABLE();
3468 } 3468 }
3469 } 3469 }
3470 3470
3471 3471
3472 LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(Isolate* isolate, 3472 LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(Zone* zone,
3473 bool opt) const { 3473 bool opt) const {
3474 const intptr_t kNumInputs = 2; 3474 const intptr_t kNumInputs = 2;
3475 const intptr_t kNumTemps = 0; 3475 const intptr_t kNumTemps = 0;
3476 LocationSummary* summary = new LocationSummary( 3476 LocationSummary* summary = new LocationSummary(
3477 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 3477 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
3478 summary->set_in(0, Location::RequiresFpuRegister()); 3478 summary->set_in(0, Location::RequiresFpuRegister());
3479 summary->set_in(1, Location::RequiresFpuRegister()); 3479 summary->set_in(1, Location::RequiresFpuRegister());
3480 summary->set_out(0, Location::RequiresFpuRegister()); 3480 summary->set_out(0, Location::RequiresFpuRegister());
3481 return summary; 3481 return summary;
3482 } 3482 }
3483 3483
3484 3484
3485 void Simd32x4ShuffleMixInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3485 void Simd32x4ShuffleMixInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3486 const VRegister left = locs()->in(0).fpu_reg(); 3486 const VRegister left = locs()->in(0).fpu_reg();
3487 const VRegister right = locs()->in(1).fpu_reg(); 3487 const VRegister right = locs()->in(1).fpu_reg();
3488 const VRegister result = locs()->out(0).fpu_reg(); 3488 const VRegister result = locs()->out(0).fpu_reg();
3489 3489
3490 switch (op_kind()) { 3490 switch (op_kind()) {
3491 case MethodRecognizer::kFloat32x4ShuffleMix: 3491 case MethodRecognizer::kFloat32x4ShuffleMix:
3492 case MethodRecognizer::kInt32x4ShuffleMix: 3492 case MethodRecognizer::kInt32x4ShuffleMix:
3493 __ vinss(result, 0, left, mask_ & 0x3); 3493 __ vinss(result, 0, left, mask_ & 0x3);
3494 __ vinss(result, 1, left, (mask_ >> 2) & 0x3); 3494 __ vinss(result, 1, left, (mask_ >> 2) & 0x3);
3495 __ vinss(result, 2, right, (mask_ >> 4) & 0x3); 3495 __ vinss(result, 2, right, (mask_ >> 4) & 0x3);
3496 __ vinss(result, 3, right, (mask_ >> 6) & 0x3); 3496 __ vinss(result, 3, right, (mask_ >> 6) & 0x3);
3497 break; 3497 break;
3498 default: UNREACHABLE(); 3498 default: UNREACHABLE();
3499 } 3499 }
3500 } 3500 }
3501 3501
3502 3502
3503 LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(Isolate* isolate, 3503 LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(Zone* zone,
3504 bool opt) const { 3504 bool opt) const {
3505 const intptr_t kNumInputs = 1; 3505 const intptr_t kNumInputs = 1;
3506 const intptr_t kNumTemps = 1; 3506 const intptr_t kNumTemps = 1;
3507 LocationSummary* summary = new LocationSummary( 3507 LocationSummary* summary = new LocationSummary(
3508 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 3508 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
3509 summary->set_in(0, Location::RequiresFpuRegister()); 3509 summary->set_in(0, Location::RequiresFpuRegister());
3510 summary->set_temp(0, Location::RequiresRegister()); 3510 summary->set_temp(0, Location::RequiresRegister());
3511 summary->set_out(0, Location::RequiresRegister()); 3511 summary->set_out(0, Location::RequiresRegister());
3512 return summary; 3512 return summary;
3513 } 3513 }
3514 3514
3515 3515
3516 void Simd32x4GetSignMaskInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3516 void Simd32x4GetSignMaskInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3517 const VRegister value = locs()->in(0).fpu_reg(); 3517 const VRegister value = locs()->in(0).fpu_reg();
3518 const Register out = locs()->out(0).reg(); 3518 const Register out = locs()->out(0).reg();
(...skipping 13 matching lines...) Expand all
3532 // W lane. 3532 // W lane.
3533 __ vmovrs(temp, value, 3); 3533 __ vmovrs(temp, value, 3);
3534 __ LsrImmediate(temp, temp, 31); 3534 __ LsrImmediate(temp, temp, 31);
3535 __ orr(out, out, Operand(temp, LSL, 3)); 3535 __ orr(out, out, Operand(temp, LSL, 3));
3536 // Tag. 3536 // Tag.
3537 __ SmiTag(out); 3537 __ SmiTag(out);
3538 } 3538 }
3539 3539
3540 3540
3541 LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary( 3541 LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary(
3542 Isolate* isolate, bool opt) const { 3542 Zone* zone, bool opt) const {
3543 const intptr_t kNumInputs = 4; 3543 const intptr_t kNumInputs = 4;
3544 const intptr_t kNumTemps = 0; 3544 const intptr_t kNumTemps = 0;
3545 LocationSummary* summary = new(isolate) LocationSummary( 3545 LocationSummary* summary = new(zone) LocationSummary(
3546 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 3546 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
3547 summary->set_in(0, Location::RequiresFpuRegister()); 3547 summary->set_in(0, Location::RequiresFpuRegister());
3548 summary->set_in(1, Location::RequiresFpuRegister()); 3548 summary->set_in(1, Location::RequiresFpuRegister());
3549 summary->set_in(2, Location::RequiresFpuRegister()); 3549 summary->set_in(2, Location::RequiresFpuRegister());
3550 summary->set_in(3, Location::RequiresFpuRegister()); 3550 summary->set_in(3, Location::RequiresFpuRegister());
3551 summary->set_out(0, Location::RequiresFpuRegister()); 3551 summary->set_out(0, Location::RequiresFpuRegister());
3552 return summary; 3552 return summary;
3553 } 3553 }
3554 3554
3555 3555
3556 void Float32x4ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3556 void Float32x4ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3557 const VRegister v0 = locs()->in(0).fpu_reg(); 3557 const VRegister v0 = locs()->in(0).fpu_reg();
3558 const VRegister v1 = locs()->in(1).fpu_reg(); 3558 const VRegister v1 = locs()->in(1).fpu_reg();
3559 const VRegister v2 = locs()->in(2).fpu_reg(); 3559 const VRegister v2 = locs()->in(2).fpu_reg();
3560 const VRegister v3 = locs()->in(3).fpu_reg(); 3560 const VRegister v3 = locs()->in(3).fpu_reg();
3561 const VRegister r = locs()->out(0).fpu_reg(); 3561 const VRegister r = locs()->out(0).fpu_reg();
3562 3562
3563 __ fcvtsd(VTMP, v0); 3563 __ fcvtsd(VTMP, v0);
3564 __ vinss(r, 0, VTMP, 0); 3564 __ vinss(r, 0, VTMP, 0);
3565 __ fcvtsd(VTMP, v1); 3565 __ fcvtsd(VTMP, v1);
3566 __ vinss(r, 1, VTMP, 0); 3566 __ vinss(r, 1, VTMP, 0);
3567 __ fcvtsd(VTMP, v2); 3567 __ fcvtsd(VTMP, v2);
3568 __ vinss(r, 2, VTMP, 0); 3568 __ vinss(r, 2, VTMP, 0);
3569 __ fcvtsd(VTMP, v3); 3569 __ fcvtsd(VTMP, v3);
3570 __ vinss(r, 3, VTMP, 0); 3570 __ vinss(r, 3, VTMP, 0);
3571 } 3571 }
3572 3572
3573 3573
3574 LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(Isolate* isolate, 3574 LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(Zone* zone,
3575 bool opt) const { 3575 bool opt) const {
3576 const intptr_t kNumInputs = 0; 3576 const intptr_t kNumInputs = 0;
3577 const intptr_t kNumTemps = 0; 3577 const intptr_t kNumTemps = 0;
3578 LocationSummary* summary = new(isolate) LocationSummary( 3578 LocationSummary* summary = new(zone) LocationSummary(
3579 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 3579 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
3580 summary->set_out(0, Location::RequiresFpuRegister()); 3580 summary->set_out(0, Location::RequiresFpuRegister());
3581 return summary; 3581 return summary;
3582 } 3582 }
3583 3583
3584 3584
3585 void Float32x4ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3585 void Float32x4ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3586 const VRegister v = locs()->out(0).fpu_reg(); 3586 const VRegister v = locs()->out(0).fpu_reg();
3587 __ veor(v, v, v); 3587 __ veor(v, v, v);
3588 } 3588 }
3589 3589
3590 3590
3591 LocationSummary* Float32x4SplatInstr::MakeLocationSummary(Isolate* isolate, 3591 LocationSummary* Float32x4SplatInstr::MakeLocationSummary(Zone* zone,
3592 bool opt) const { 3592 bool opt) const {
3593 const intptr_t kNumInputs = 1; 3593 const intptr_t kNumInputs = 1;
3594 const intptr_t kNumTemps = 0; 3594 const intptr_t kNumTemps = 0;
3595 LocationSummary* summary = new(isolate) LocationSummary( 3595 LocationSummary* summary = new(zone) LocationSummary(
3596 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 3596 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
3597 summary->set_in(0, Location::RequiresFpuRegister()); 3597 summary->set_in(0, Location::RequiresFpuRegister());
3598 summary->set_out(0, Location::RequiresFpuRegister()); 3598 summary->set_out(0, Location::RequiresFpuRegister());
3599 return summary; 3599 return summary;
3600 } 3600 }
3601 3601
3602 3602
3603 void Float32x4SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3603 void Float32x4SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3604 const VRegister value = locs()->in(0).fpu_reg(); 3604 const VRegister value = locs()->in(0).fpu_reg();
3605 const VRegister result = locs()->out(0).fpu_reg(); 3605 const VRegister result = locs()->out(0).fpu_reg();
3606 3606
3607 // Convert to Float32. 3607 // Convert to Float32.
3608 __ fcvtsd(VTMP, value); 3608 __ fcvtsd(VTMP, value);
3609 3609
3610 // Splat across all lanes. 3610 // Splat across all lanes.
3611 __ vdups(result, VTMP, 0); 3611 __ vdups(result, VTMP, 0);
3612 } 3612 }
3613 3613
3614 3614
3615 LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(Isolate* isolate, 3615 LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(Zone* zone,
3616 bool opt) const { 3616 bool opt) const {
3617 const intptr_t kNumInputs = 2; 3617 const intptr_t kNumInputs = 2;
3618 const intptr_t kNumTemps = 0; 3618 const intptr_t kNumTemps = 0;
3619 LocationSummary* summary = new(isolate) LocationSummary( 3619 LocationSummary* summary = new(zone) LocationSummary(
3620 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 3620 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
3621 summary->set_in(0, Location::RequiresFpuRegister()); 3621 summary->set_in(0, Location::RequiresFpuRegister());
3622 summary->set_in(1, Location::RequiresFpuRegister()); 3622 summary->set_in(1, Location::RequiresFpuRegister());
3623 summary->set_out(0, Location::RequiresFpuRegister()); 3623 summary->set_out(0, Location::RequiresFpuRegister());
3624 return summary; 3624 return summary;
3625 } 3625 }
3626 3626
3627 3627
3628 void Float32x4ComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3628 void Float32x4ComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3629 const VRegister left = locs()->in(0).fpu_reg(); 3629 const VRegister left = locs()->in(0).fpu_reg();
3630 const VRegister right = locs()->in(1).fpu_reg(); 3630 const VRegister right = locs()->in(1).fpu_reg();
(...skipping 19 matching lines...) Expand all
3650 break; 3650 break;
3651 case MethodRecognizer::kFloat32x4LessThanOrEqual: 3651 case MethodRecognizer::kFloat32x4LessThanOrEqual:
3652 __ vcges(result, right, left); 3652 __ vcges(result, right, left);
3653 break; 3653 break;
3654 3654
3655 default: UNREACHABLE(); 3655 default: UNREACHABLE();
3656 } 3656 }
3657 } 3657 }
3658 3658
3659 3659
3660 LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(Isolate* isolate, 3660 LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(Zone* zone,
3661 bool opt) const { 3661 bool opt) const {
3662 const intptr_t kNumInputs = 2; 3662 const intptr_t kNumInputs = 2;
3663 const intptr_t kNumTemps = 0; 3663 const intptr_t kNumTemps = 0;
3664 LocationSummary* summary = new(isolate) LocationSummary( 3664 LocationSummary* summary = new(zone) LocationSummary(
3665 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 3665 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
3666 summary->set_in(0, Location::RequiresFpuRegister()); 3666 summary->set_in(0, Location::RequiresFpuRegister());
3667 summary->set_in(1, Location::RequiresFpuRegister()); 3667 summary->set_in(1, Location::RequiresFpuRegister());
3668 summary->set_out(0, Location::RequiresFpuRegister()); 3668 summary->set_out(0, Location::RequiresFpuRegister());
3669 return summary; 3669 return summary;
3670 } 3670 }
3671 3671
3672 3672
3673 void Float32x4MinMaxInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3673 void Float32x4MinMaxInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3674 const VRegister left = locs()->in(0).fpu_reg(); 3674 const VRegister left = locs()->in(0).fpu_reg();
3675 const VRegister right = locs()->in(1).fpu_reg(); 3675 const VRegister right = locs()->in(1).fpu_reg();
3676 const VRegister result = locs()->out(0).fpu_reg(); 3676 const VRegister result = locs()->out(0).fpu_reg();
3677 3677
3678 switch (op_kind()) { 3678 switch (op_kind()) {
3679 case MethodRecognizer::kFloat32x4Min: 3679 case MethodRecognizer::kFloat32x4Min:
3680 __ vmins(result, left, right); 3680 __ vmins(result, left, right);
3681 break; 3681 break;
3682 case MethodRecognizer::kFloat32x4Max: 3682 case MethodRecognizer::kFloat32x4Max:
3683 __ vmaxs(result, left, right); 3683 __ vmaxs(result, left, right);
3684 break; 3684 break;
3685 default: UNREACHABLE(); 3685 default: UNREACHABLE();
3686 } 3686 }
3687 } 3687 }
3688 3688
3689 3689
3690 LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(Isolate* isolate, 3690 LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(Zone* zone,
3691 bool opt) const { 3691 bool opt) const {
3692 const intptr_t kNumInputs = 1; 3692 const intptr_t kNumInputs = 1;
3693 const intptr_t kNumTemps = 0; 3693 const intptr_t kNumTemps = 0;
3694 LocationSummary* summary = new(isolate) LocationSummary( 3694 LocationSummary* summary = new(zone) LocationSummary(
3695 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 3695 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
3696 summary->set_in(0, Location::RequiresFpuRegister()); 3696 summary->set_in(0, Location::RequiresFpuRegister());
3697 summary->set_out(0, Location::RequiresFpuRegister()); 3697 summary->set_out(0, Location::RequiresFpuRegister());
3698 return summary; 3698 return summary;
3699 } 3699 }
3700 3700
3701 3701
3702 void Float32x4SqrtInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3702 void Float32x4SqrtInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3703 const VRegister left = locs()->in(0).fpu_reg(); 3703 const VRegister left = locs()->in(0).fpu_reg();
3704 const VRegister result = locs()->out(0).fpu_reg(); 3704 const VRegister result = locs()->out(0).fpu_reg();
3705 3705
3706 switch (op_kind()) { 3706 switch (op_kind()) {
3707 case MethodRecognizer::kFloat32x4Sqrt: 3707 case MethodRecognizer::kFloat32x4Sqrt:
3708 __ vsqrts(result, left); 3708 __ vsqrts(result, left);
3709 break; 3709 break;
3710 case MethodRecognizer::kFloat32x4Reciprocal: 3710 case MethodRecognizer::kFloat32x4Reciprocal:
3711 __ VRecps(result, left); 3711 __ VRecps(result, left);
3712 break; 3712 break;
3713 case MethodRecognizer::kFloat32x4ReciprocalSqrt: 3713 case MethodRecognizer::kFloat32x4ReciprocalSqrt:
3714 __ VRSqrts(result, left); 3714 __ VRSqrts(result, left);
3715 break; 3715 break;
3716 default: UNREACHABLE(); 3716 default: UNREACHABLE();
3717 } 3717 }
3718 } 3718 }
3719 3719
3720 3720
3721 LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(Isolate* isolate, 3721 LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(Zone* zone,
3722 bool opt) const { 3722 bool opt) const {
3723 const intptr_t kNumInputs = 2; 3723 const intptr_t kNumInputs = 2;
3724 const intptr_t kNumTemps = 0; 3724 const intptr_t kNumTemps = 0;
3725 LocationSummary* summary = new(isolate) LocationSummary( 3725 LocationSummary* summary = new(zone) LocationSummary(
3726 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 3726 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
3727 summary->set_in(0, Location::RequiresFpuRegister()); 3727 summary->set_in(0, Location::RequiresFpuRegister());
3728 summary->set_in(1, Location::RequiresFpuRegister()); 3728 summary->set_in(1, Location::RequiresFpuRegister());
3729 summary->set_out(0, Location::RequiresFpuRegister()); 3729 summary->set_out(0, Location::RequiresFpuRegister());
3730 return summary; 3730 return summary;
3731 } 3731 }
3732 3732
3733 3733
3734 void Float32x4ScaleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3734 void Float32x4ScaleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3735 const VRegister left = locs()->in(0).fpu_reg(); 3735 const VRegister left = locs()->in(0).fpu_reg();
3736 const VRegister right = locs()->in(1).fpu_reg(); 3736 const VRegister right = locs()->in(1).fpu_reg();
3737 const VRegister result = locs()->out(0).fpu_reg(); 3737 const VRegister result = locs()->out(0).fpu_reg();
3738 3738
3739 switch (op_kind()) { 3739 switch (op_kind()) {
3740 case MethodRecognizer::kFloat32x4Scale: 3740 case MethodRecognizer::kFloat32x4Scale:
3741 __ fcvtsd(VTMP, left); 3741 __ fcvtsd(VTMP, left);
3742 __ vdups(result, VTMP, 0); 3742 __ vdups(result, VTMP, 0);
3743 __ vmuls(result, result, right); 3743 __ vmuls(result, result, right);
3744 break; 3744 break;
3745 default: UNREACHABLE(); 3745 default: UNREACHABLE();
3746 } 3746 }
3747 } 3747 }
3748 3748
3749 3749
3750 LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(Isolate* isolate, 3750 LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(Zone* zone,
3751 bool opt) const { 3751 bool opt) const {
3752 const intptr_t kNumInputs = 1; 3752 const intptr_t kNumInputs = 1;
3753 const intptr_t kNumTemps = 0; 3753 const intptr_t kNumTemps = 0;
3754 LocationSummary* summary = new LocationSummary( 3754 LocationSummary* summary = new LocationSummary(
3755 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 3755 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
3756 summary->set_in(0, Location::RequiresFpuRegister()); 3756 summary->set_in(0, Location::RequiresFpuRegister());
3757 summary->set_out(0, Location::RequiresFpuRegister()); 3757 summary->set_out(0, Location::RequiresFpuRegister());
3758 return summary; 3758 return summary;
3759 } 3759 }
3760 3760
3761 3761
3762 void Float32x4ZeroArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3762 void Float32x4ZeroArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3763 const VRegister left = locs()->in(0).fpu_reg(); 3763 const VRegister left = locs()->in(0).fpu_reg();
3764 const VRegister result = locs()->out(0).fpu_reg(); 3764 const VRegister result = locs()->out(0).fpu_reg();
3765 3765
3766 switch (op_kind()) { 3766 switch (op_kind()) {
3767 case MethodRecognizer::kFloat32x4Negate: 3767 case MethodRecognizer::kFloat32x4Negate:
3768 __ vnegs(result, left); 3768 __ vnegs(result, left);
3769 break; 3769 break;
3770 case MethodRecognizer::kFloat32x4Absolute: 3770 case MethodRecognizer::kFloat32x4Absolute:
3771 __ vabss(result, left); 3771 __ vabss(result, left);
3772 break; 3772 break;
3773 default: UNREACHABLE(); 3773 default: UNREACHABLE();
3774 } 3774 }
3775 } 3775 }
3776 3776
3777 3777
3778 LocationSummary* Float32x4ClampInstr::MakeLocationSummary(Isolate* isolate, 3778 LocationSummary* Float32x4ClampInstr::MakeLocationSummary(Zone* zone,
3779 bool opt) const { 3779 bool opt) const {
3780 const intptr_t kNumInputs = 3; 3780 const intptr_t kNumInputs = 3;
3781 const intptr_t kNumTemps = 0; 3781 const intptr_t kNumTemps = 0;
3782 LocationSummary* summary = new(isolate) LocationSummary( 3782 LocationSummary* summary = new(zone) LocationSummary(
3783 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 3783 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
3784 summary->set_in(0, Location::RequiresFpuRegister()); 3784 summary->set_in(0, Location::RequiresFpuRegister());
3785 summary->set_in(1, Location::RequiresFpuRegister()); 3785 summary->set_in(1, Location::RequiresFpuRegister());
3786 summary->set_in(2, Location::RequiresFpuRegister()); 3786 summary->set_in(2, Location::RequiresFpuRegister());
3787 summary->set_out(0, Location::RequiresFpuRegister()); 3787 summary->set_out(0, Location::RequiresFpuRegister());
3788 return summary; 3788 return summary;
3789 } 3789 }
3790 3790
3791 3791
3792 void Float32x4ClampInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3792 void Float32x4ClampInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3793 const VRegister left = locs()->in(0).fpu_reg(); 3793 const VRegister left = locs()->in(0).fpu_reg();
3794 const VRegister lower = locs()->in(1).fpu_reg(); 3794 const VRegister lower = locs()->in(1).fpu_reg();
3795 const VRegister upper = locs()->in(2).fpu_reg(); 3795 const VRegister upper = locs()->in(2).fpu_reg();
3796 const VRegister result = locs()->out(0).fpu_reg(); 3796 const VRegister result = locs()->out(0).fpu_reg();
3797 __ vmins(result, left, upper); 3797 __ vmins(result, left, upper);
3798 __ vmaxs(result, result, lower); 3798 __ vmaxs(result, result, lower);
3799 } 3799 }
3800 3800
3801 3801
3802 LocationSummary* Float32x4WithInstr::MakeLocationSummary(Isolate* isolate, 3802 LocationSummary* Float32x4WithInstr::MakeLocationSummary(Zone* zone,
3803 bool opt) const { 3803 bool opt) const {
3804 const intptr_t kNumInputs = 2; 3804 const intptr_t kNumInputs = 2;
3805 const intptr_t kNumTemps = 0; 3805 const intptr_t kNumTemps = 0;
3806 LocationSummary* summary = new LocationSummary( 3806 LocationSummary* summary = new LocationSummary(
3807 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 3807 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
3808 summary->set_in(0, Location::RequiresFpuRegister()); 3808 summary->set_in(0, Location::RequiresFpuRegister());
3809 summary->set_in(1, Location::RequiresFpuRegister()); 3809 summary->set_in(1, Location::RequiresFpuRegister());
3810 summary->set_out(0, Location::RequiresFpuRegister()); 3810 summary->set_out(0, Location::RequiresFpuRegister());
3811 return summary; 3811 return summary;
3812 } 3812 }
3813 3813
3814 3814
3815 void Float32x4WithInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3815 void Float32x4WithInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3816 const VRegister replacement = locs()->in(0).fpu_reg(); 3816 const VRegister replacement = locs()->in(0).fpu_reg();
3817 const VRegister value = locs()->in(1).fpu_reg(); 3817 const VRegister value = locs()->in(1).fpu_reg();
(...skipping 15 matching lines...) Expand all
3833 __ vinss(result, 2, VTMP, 0); 3833 __ vinss(result, 2, VTMP, 0);
3834 break; 3834 break;
3835 case MethodRecognizer::kFloat32x4WithW: 3835 case MethodRecognizer::kFloat32x4WithW:
3836 __ vinss(result, 3, VTMP, 0); 3836 __ vinss(result, 3, VTMP, 0);
3837 break; 3837 break;
3838 default: UNREACHABLE(); 3838 default: UNREACHABLE();
3839 } 3839 }
3840 } 3840 }
3841 3841
3842 3842
3843 LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(Isolate* isolate, 3843 LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(Zone* zone,
3844 bool opt) const { 3844 bool opt) const {
3845 const intptr_t kNumInputs = 1; 3845 const intptr_t kNumInputs = 1;
3846 const intptr_t kNumTemps = 0; 3846 const intptr_t kNumTemps = 0;
3847 LocationSummary* summary = new LocationSummary( 3847 LocationSummary* summary = new LocationSummary(
3848 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 3848 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
3849 summary->set_in(0, Location::RequiresFpuRegister()); 3849 summary->set_in(0, Location::RequiresFpuRegister());
3850 summary->set_out(0, Location::RequiresFpuRegister()); 3850 summary->set_out(0, Location::RequiresFpuRegister());
3851 return summary; 3851 return summary;
3852 } 3852 }
3853 3853
3854 3854
3855 void Float32x4ToInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { 3855 void Float32x4ToInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
3856 const VRegister value = locs()->in(0).fpu_reg(); 3856 const VRegister value = locs()->in(0).fpu_reg();
3857 const VRegister result = locs()->out(0).fpu_reg(); 3857 const VRegister result = locs()->out(0).fpu_reg();
3858 3858
3859 if (value != result) { 3859 if (value != result) {
3860 __ vmov(result, value); 3860 __ vmov(result, value);
3861 } 3861 }
3862 } 3862 }
3863 3863
3864 3864
3865 LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(Isolate* isolate, 3865 LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(Zone* zone,
3866 bool opt) const { 3866 bool opt) const {
3867 const intptr_t kNumInputs = 1; 3867 const intptr_t kNumInputs = 1;
3868 const intptr_t kNumTemps = 0; 3868 const intptr_t kNumTemps = 0;
3869 LocationSummary* summary = new(isolate) LocationSummary( 3869 LocationSummary* summary = new(zone) LocationSummary(
3870 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 3870 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
3871 summary->set_in(0, Location::RequiresFpuRegister()); 3871 summary->set_in(0, Location::RequiresFpuRegister());
3872 summary->set_out(0, Location::RequiresFpuRegister()); 3872 summary->set_out(0, Location::RequiresFpuRegister());
3873 return summary; 3873 return summary;
3874 } 3874 }
3875 3875
3876 3876
3877 void Simd64x2ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3877 void Simd64x2ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3878 const VRegister value = locs()->in(0).fpu_reg(); 3878 const VRegister value = locs()->in(0).fpu_reg();
3879 const VRegister result = locs()->out(0).fpu_reg(); 3879 const VRegister result = locs()->out(0).fpu_reg();
3880 3880
3881 switch (op_kind()) { 3881 switch (op_kind()) {
3882 case MethodRecognizer::kFloat64x2GetX: 3882 case MethodRecognizer::kFloat64x2GetX:
3883 __ vinsd(result, 0, value, 0); 3883 __ vinsd(result, 0, value, 0);
3884 break; 3884 break;
3885 case MethodRecognizer::kFloat64x2GetY: 3885 case MethodRecognizer::kFloat64x2GetY:
3886 __ vinsd(result, 0, value, 1); 3886 __ vinsd(result, 0, value, 1);
3887 break; 3887 break;
3888 default: UNREACHABLE(); 3888 default: UNREACHABLE();
3889 } 3889 }
3890 } 3890 }
3891 3891
3892 3892
3893 LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(Isolate* isolate, 3893 LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(Zone* zone,
3894 bool opt) const { 3894 bool opt) const {
3895 const intptr_t kNumInputs = 0; 3895 const intptr_t kNumInputs = 0;
3896 const intptr_t kNumTemps = 0; 3896 const intptr_t kNumTemps = 0;
3897 LocationSummary* summary = new(isolate) LocationSummary( 3897 LocationSummary* summary = new(zone) LocationSummary(
3898 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 3898 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
3899 summary->set_out(0, Location::RequiresFpuRegister()); 3899 summary->set_out(0, Location::RequiresFpuRegister());
3900 return summary; 3900 return summary;
3901 } 3901 }
3902 3902
3903 3903
3904 void Float64x2ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3904 void Float64x2ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3905 const VRegister v = locs()->out(0).fpu_reg(); 3905 const VRegister v = locs()->out(0).fpu_reg();
3906 __ veor(v, v, v); 3906 __ veor(v, v, v);
3907 } 3907 }
3908 3908
3909 3909
3910 LocationSummary* Float64x2SplatInstr::MakeLocationSummary(Isolate* isolate, 3910 LocationSummary* Float64x2SplatInstr::MakeLocationSummary(Zone* zone,
3911 bool opt) const { 3911 bool opt) const {
3912 const intptr_t kNumInputs = 1; 3912 const intptr_t kNumInputs = 1;
3913 const intptr_t kNumTemps = 0; 3913 const intptr_t kNumTemps = 0;
3914 LocationSummary* summary = new(isolate) LocationSummary( 3914 LocationSummary* summary = new(zone) LocationSummary(
3915 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 3915 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
3916 summary->set_in(0, Location::RequiresFpuRegister()); 3916 summary->set_in(0, Location::RequiresFpuRegister());
3917 summary->set_out(0, Location::RequiresFpuRegister()); 3917 summary->set_out(0, Location::RequiresFpuRegister());
3918 return summary; 3918 return summary;
3919 } 3919 }
3920 3920
3921 3921
3922 void Float64x2SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3922 void Float64x2SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3923 const VRegister value = locs()->in(0).fpu_reg(); 3923 const VRegister value = locs()->in(0).fpu_reg();
3924 const VRegister result = locs()->out(0).fpu_reg(); 3924 const VRegister result = locs()->out(0).fpu_reg();
3925 __ vdupd(result, value, 0); 3925 __ vdupd(result, value, 0);
3926 } 3926 }
3927 3927
3928 3928
3929 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary( 3929 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary(
3930 Isolate* isolate, bool opt) const { 3930 Zone* zone, bool opt) const {
3931 const intptr_t kNumInputs = 2; 3931 const intptr_t kNumInputs = 2;
3932 const intptr_t kNumTemps = 0; 3932 const intptr_t kNumTemps = 0;
3933 LocationSummary* summary = new(isolate) LocationSummary( 3933 LocationSummary* summary = new(zone) LocationSummary(
3934 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 3934 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
3935 summary->set_in(0, Location::RequiresFpuRegister()); 3935 summary->set_in(0, Location::RequiresFpuRegister());
3936 summary->set_in(1, Location::RequiresFpuRegister()); 3936 summary->set_in(1, Location::RequiresFpuRegister());
3937 summary->set_out(0, Location::RequiresFpuRegister()); 3937 summary->set_out(0, Location::RequiresFpuRegister());
3938 return summary; 3938 return summary;
3939 } 3939 }
3940 3940
3941 3941
3942 void Float64x2ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3942 void Float64x2ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3943 const VRegister v0 = locs()->in(0).fpu_reg(); 3943 const VRegister v0 = locs()->in(0).fpu_reg();
3944 const VRegister v1 = locs()->in(1).fpu_reg(); 3944 const VRegister v1 = locs()->in(1).fpu_reg();
3945 const VRegister r = locs()->out(0).fpu_reg(); 3945 const VRegister r = locs()->out(0).fpu_reg();
3946 __ vinsd(r, 0, v0, 0); 3946 __ vinsd(r, 0, v0, 0);
3947 __ vinsd(r, 1, v1, 0); 3947 __ vinsd(r, 1, v1, 0);
3948 } 3948 }
3949 3949
3950 3950
3951 LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary( 3951 LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary(
3952 Isolate* isolate, bool opt) const { 3952 Zone* zone, bool opt) const {
3953 const intptr_t kNumInputs = 1; 3953 const intptr_t kNumInputs = 1;
3954 const intptr_t kNumTemps = 0; 3954 const intptr_t kNumTemps = 0;
3955 LocationSummary* summary = new LocationSummary( 3955 LocationSummary* summary = new LocationSummary(
3956 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 3956 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
3957 summary->set_in(0, Location::RequiresFpuRegister()); 3957 summary->set_in(0, Location::RequiresFpuRegister());
3958 summary->set_out(0, Location::RequiresFpuRegister()); 3958 summary->set_out(0, Location::RequiresFpuRegister());
3959 return summary; 3959 return summary;
3960 } 3960 }
3961 3961
3962 3962
3963 void Float64x2ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { 3963 void Float64x2ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
3964 const VRegister q = locs()->in(0).fpu_reg(); 3964 const VRegister q = locs()->in(0).fpu_reg();
3965 const VRegister r = locs()->out(0).fpu_reg(); 3965 const VRegister r = locs()->out(0).fpu_reg();
3966 3966
3967 // Zero register. 3967 // Zero register.
3968 __ veor(r, r, r); 3968 __ veor(r, r, r);
3969 // Set X lane. 3969 // Set X lane.
3970 __ vinsd(VTMP, 0, q, 0); 3970 __ vinsd(VTMP, 0, q, 0);
3971 __ fcvtsd(VTMP, VTMP); 3971 __ fcvtsd(VTMP, VTMP);
3972 __ vinss(r, 0, VTMP, 0); 3972 __ vinss(r, 0, VTMP, 0);
3973 // Set Y lane. 3973 // Set Y lane.
3974 __ vinsd(VTMP, 0, q, 1); 3974 __ vinsd(VTMP, 0, q, 1);
3975 __ fcvtsd(VTMP, VTMP); 3975 __ fcvtsd(VTMP, VTMP);
3976 __ vinss(r, 1, VTMP, 0); 3976 __ vinss(r, 1, VTMP, 0);
3977 } 3977 }
3978 3978
3979 3979
3980 LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary( 3980 LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary(
3981 Isolate* isolate, bool opt) const { 3981 Zone* zone, bool opt) const {
3982 const intptr_t kNumInputs = 1; 3982 const intptr_t kNumInputs = 1;
3983 const intptr_t kNumTemps = 0; 3983 const intptr_t kNumTemps = 0;
3984 LocationSummary* summary = new LocationSummary( 3984 LocationSummary* summary = new LocationSummary(
3985 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 3985 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
3986 summary->set_in(0, Location::RequiresFpuRegister()); 3986 summary->set_in(0, Location::RequiresFpuRegister());
3987 summary->set_out(0, Location::RequiresFpuRegister()); 3987 summary->set_out(0, Location::RequiresFpuRegister());
3988 return summary; 3988 return summary;
3989 } 3989 }
3990 3990
3991 3991
3992 void Float32x4ToFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) { 3992 void Float32x4ToFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
3993 const VRegister q = locs()->in(0).fpu_reg(); 3993 const VRegister q = locs()->in(0).fpu_reg();
3994 const VRegister r = locs()->out(0).fpu_reg(); 3994 const VRegister r = locs()->out(0).fpu_reg();
3995 3995
3996 // Set X. 3996 // Set X.
3997 __ vinss(VTMP, 0, q, 0); 3997 __ vinss(VTMP, 0, q, 0);
3998 __ fcvtds(VTMP, VTMP); 3998 __ fcvtds(VTMP, VTMP);
3999 __ vinsd(r, 0, VTMP, 0); 3999 __ vinsd(r, 0, VTMP, 0);
4000 // Set Y. 4000 // Set Y.
4001 __ vinss(VTMP, 0, q, 1); 4001 __ vinss(VTMP, 0, q, 1);
4002 __ fcvtds(VTMP, VTMP); 4002 __ fcvtds(VTMP, VTMP);
4003 __ vinsd(r, 1, VTMP, 0); 4003 __ vinsd(r, 1, VTMP, 0);
4004 } 4004 }
4005 4005
4006 4006
4007 LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(Isolate* isolate, 4007 LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(Zone* zone,
4008 bool opt) const { 4008 bool opt) const {
4009 const intptr_t kNumInputs = 1; 4009 const intptr_t kNumInputs = 1;
4010 const intptr_t kNumTemps = 0; 4010 const intptr_t kNumTemps = 0;
4011 LocationSummary* summary = new(isolate) LocationSummary( 4011 LocationSummary* summary = new(zone) LocationSummary(
4012 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 4012 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
4013 4013
4014 if (representation() == kTagged) { 4014 if (representation() == kTagged) {
4015 ASSERT(op_kind() == MethodRecognizer::kFloat64x2GetSignMask); 4015 ASSERT(op_kind() == MethodRecognizer::kFloat64x2GetSignMask);
4016 summary->set_in(0, Location::RequiresFpuRegister()); 4016 summary->set_in(0, Location::RequiresFpuRegister());
4017 summary->set_out(0, Location::RequiresRegister()); 4017 summary->set_out(0, Location::RequiresRegister());
4018 } else { 4018 } else {
4019 summary->set_in(0, Location::RequiresFpuRegister()); 4019 summary->set_in(0, Location::RequiresFpuRegister());
4020 summary->set_out(0, Location::RequiresFpuRegister()); 4020 summary->set_out(0, Location::RequiresFpuRegister());
4021 } 4021 }
4022 return summary; 4022 return summary;
(...skipping 28 matching lines...) Expand all
4051 __ vabsd(result, value); 4051 __ vabsd(result, value);
4052 break; 4052 break;
4053 case MethodRecognizer::kFloat64x2Sqrt: 4053 case MethodRecognizer::kFloat64x2Sqrt:
4054 __ vsqrtd(result, value); 4054 __ vsqrtd(result, value);
4055 break; 4055 break;
4056 default: UNREACHABLE(); 4056 default: UNREACHABLE();
4057 } 4057 }
4058 } 4058 }
4059 4059
4060 4060
4061 LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(Isolate* isolate, 4061 LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(Zone* zone,
4062 bool opt) const { 4062 bool opt) const {
4063 const intptr_t kNumInputs = 2; 4063 const intptr_t kNumInputs = 2;
4064 const intptr_t kNumTemps = 0; 4064 const intptr_t kNumTemps = 0;
4065 LocationSummary* summary = new LocationSummary( 4065 LocationSummary* summary = new LocationSummary(
4066 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 4066 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
4067 summary->set_in(0, Location::RequiresFpuRegister()); 4067 summary->set_in(0, Location::RequiresFpuRegister());
4068 summary->set_in(1, Location::RequiresFpuRegister()); 4068 summary->set_in(1, Location::RequiresFpuRegister());
4069 summary->set_out(0, Location::SameAsFirstInput()); 4069 summary->set_out(0, Location::SameAsFirstInput());
4070 return summary; 4070 return summary;
4071 } 4071 }
4072 4072
4073 4073
4074 void Float64x2OneArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4074 void Float64x2OneArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4075 const VRegister left = locs()->in(0).fpu_reg(); 4075 const VRegister left = locs()->in(0).fpu_reg();
4076 const VRegister right = locs()->in(1).fpu_reg(); 4076 const VRegister right = locs()->in(1).fpu_reg();
(...skipping 16 matching lines...) Expand all
4093 break; 4093 break;
4094 case MethodRecognizer::kFloat64x2Max: 4094 case MethodRecognizer::kFloat64x2Max:
4095 __ vmaxd(out, left, right); 4095 __ vmaxd(out, left, right);
4096 break; 4096 break;
4097 default: UNREACHABLE(); 4097 default: UNREACHABLE();
4098 } 4098 }
4099 } 4099 }
4100 4100
4101 4101
4102 LocationSummary* Int32x4ConstructorInstr::MakeLocationSummary( 4102 LocationSummary* Int32x4ConstructorInstr::MakeLocationSummary(
4103 Isolate* isolate, bool opt) const { 4103 Zone* zone, bool opt) const {
4104 const intptr_t kNumInputs = 4; 4104 const intptr_t kNumInputs = 4;
4105 const intptr_t kNumTemps = 0; 4105 const intptr_t kNumTemps = 0;
4106 LocationSummary* summary = new(isolate) LocationSummary( 4106 LocationSummary* summary = new(zone) LocationSummary(
4107 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 4107 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
4108 summary->set_in(0, Location::RequiresRegister()); 4108 summary->set_in(0, Location::RequiresRegister());
4109 summary->set_in(1, Location::RequiresRegister()); 4109 summary->set_in(1, Location::RequiresRegister());
4110 summary->set_in(2, Location::RequiresRegister()); 4110 summary->set_in(2, Location::RequiresRegister());
4111 summary->set_in(3, Location::RequiresRegister()); 4111 summary->set_in(3, Location::RequiresRegister());
4112 summary->set_out(0, Location::RequiresFpuRegister()); 4112 summary->set_out(0, Location::RequiresFpuRegister());
4113 return summary; 4113 return summary;
4114 } 4114 }
4115 4115
4116 4116
4117 void Int32x4ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4117 void Int32x4ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4118 const Register v0 = locs()->in(0).reg(); 4118 const Register v0 = locs()->in(0).reg();
4119 const Register v1 = locs()->in(1).reg(); 4119 const Register v1 = locs()->in(1).reg();
4120 const Register v2 = locs()->in(2).reg(); 4120 const Register v2 = locs()->in(2).reg();
4121 const Register v3 = locs()->in(3).reg(); 4121 const Register v3 = locs()->in(3).reg();
4122 const VRegister result = locs()->out(0).fpu_reg(); 4122 const VRegister result = locs()->out(0).fpu_reg();
4123 __ veor(result, result, result); 4123 __ veor(result, result, result);
4124 __ vinsw(result, 0, v0); 4124 __ vinsw(result, 0, v0);
4125 __ vinsw(result, 1, v1); 4125 __ vinsw(result, 1, v1);
4126 __ vinsw(result, 2, v2); 4126 __ vinsw(result, 2, v2);
4127 __ vinsw(result, 3, v3); 4127 __ vinsw(result, 3, v3);
4128 } 4128 }
4129 4129
4130 4130
4131 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary( 4131 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary(
4132 Isolate* isolate, bool opt) const { 4132 Zone* zone, bool opt) const {
4133 const intptr_t kNumInputs = 4; 4133 const intptr_t kNumInputs = 4;
4134 const intptr_t kNumTemps = 1; 4134 const intptr_t kNumTemps = 1;
4135 LocationSummary* summary = new LocationSummary( 4135 LocationSummary* summary = new LocationSummary(
4136 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 4136 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
4137 summary->set_in(0, Location::RequiresRegister()); 4137 summary->set_in(0, Location::RequiresRegister());
4138 summary->set_in(1, Location::RequiresRegister()); 4138 summary->set_in(1, Location::RequiresRegister());
4139 summary->set_in(2, Location::RequiresRegister()); 4139 summary->set_in(2, Location::RequiresRegister());
4140 summary->set_in(3, Location::RequiresRegister()); 4140 summary->set_in(3, Location::RequiresRegister());
4141 summary->set_temp(0, Location::RequiresRegister()); 4141 summary->set_temp(0, Location::RequiresRegister());
4142 summary->set_out(0, Location::RequiresFpuRegister()); 4142 summary->set_out(0, Location::RequiresFpuRegister());
4143 return summary; 4143 return summary;
4144 } 4144 }
4145 4145
4146 4146
(...skipping 24 matching lines...) Expand all
4171 __ csel(TMP, temp, ZR, EQ); 4171 __ csel(TMP, temp, ZR, EQ);
4172 __ vinsw(result, 2, TMP); 4172 __ vinsw(result, 2, TMP);
4173 4173
4174 // __ CompareObject(v3, Bool::True(), PP); 4174 // __ CompareObject(v3, Bool::True(), PP);
4175 __ CompareRegisters(v3, TMP2); 4175 __ CompareRegisters(v3, TMP2);
4176 __ csel(TMP, temp, ZR, EQ); 4176 __ csel(TMP, temp, ZR, EQ);
4177 __ vinsw(result, 3, TMP); 4177 __ vinsw(result, 3, TMP);
4178 } 4178 }
4179 4179
4180 4180
4181 LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(Isolate* isolate, 4181 LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(Zone* zone,
4182 bool opt) const { 4182 bool opt) const {
4183 const intptr_t kNumInputs = 1; 4183 const intptr_t kNumInputs = 1;
4184 const intptr_t kNumTemps = 0; 4184 const intptr_t kNumTemps = 0;
4185 LocationSummary* summary = new LocationSummary( 4185 LocationSummary* summary = new LocationSummary(
4186 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 4186 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
4187 summary->set_in(0, Location::RequiresFpuRegister()); 4187 summary->set_in(0, Location::RequiresFpuRegister());
4188 summary->set_out(0, Location::RequiresRegister()); 4188 summary->set_out(0, Location::RequiresRegister());
4189 return summary; 4189 return summary;
4190 } 4190 }
4191 4191
4192 4192
4193 void Int32x4GetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4193 void Int32x4GetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4194 const VRegister value = locs()->in(0).fpu_reg(); 4194 const VRegister value = locs()->in(0).fpu_reg();
4195 const Register result = locs()->out(0).reg(); 4195 const Register result = locs()->out(0).reg();
4196 4196
(...skipping 13 matching lines...) Expand all
4210 default: UNREACHABLE(); 4210 default: UNREACHABLE();
4211 } 4211 }
4212 4212
4213 __ tst(result, Operand(result)); 4213 __ tst(result, Operand(result));
4214 __ LoadObject(result, Bool::True(), PP); 4214 __ LoadObject(result, Bool::True(), PP);
4215 __ LoadObject(TMP, Bool::False(), PP); 4215 __ LoadObject(TMP, Bool::False(), PP);
4216 __ csel(result, TMP, result, EQ); 4216 __ csel(result, TMP, result, EQ);
4217 } 4217 }
4218 4218
4219 4219
4220 LocationSummary* Int32x4SelectInstr::MakeLocationSummary(Isolate* isolate, 4220 LocationSummary* Int32x4SelectInstr::MakeLocationSummary(Zone* zone,
4221 bool opt) const { 4221 bool opt) const {
4222 const intptr_t kNumInputs = 3; 4222 const intptr_t kNumInputs = 3;
4223 const intptr_t kNumTemps = 1; 4223 const intptr_t kNumTemps = 1;
4224 LocationSummary* summary = new LocationSummary( 4224 LocationSummary* summary = new LocationSummary(
4225 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 4225 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
4226 summary->set_in(0, Location::RequiresFpuRegister()); 4226 summary->set_in(0, Location::RequiresFpuRegister());
4227 summary->set_in(1, Location::RequiresFpuRegister()); 4227 summary->set_in(1, Location::RequiresFpuRegister());
4228 summary->set_in(2, Location::RequiresFpuRegister()); 4228 summary->set_in(2, Location::RequiresFpuRegister());
4229 summary->set_temp(0, Location::RequiresFpuRegister()); 4229 summary->set_temp(0, Location::RequiresFpuRegister());
4230 summary->set_out(0, Location::RequiresFpuRegister()); 4230 summary->set_out(0, Location::RequiresFpuRegister());
4231 return summary; 4231 return summary;
4232 } 4232 }
4233 4233
4234 4234
4235 void Int32x4SelectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4235 void Int32x4SelectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4236 const VRegister mask = locs()->in(0).fpu_reg(); 4236 const VRegister mask = locs()->in(0).fpu_reg();
4237 const VRegister trueValue = locs()->in(1).fpu_reg(); 4237 const VRegister trueValue = locs()->in(1).fpu_reg();
4238 const VRegister falseValue = locs()->in(2).fpu_reg(); 4238 const VRegister falseValue = locs()->in(2).fpu_reg();
4239 const VRegister out = locs()->out(0).fpu_reg(); 4239 const VRegister out = locs()->out(0).fpu_reg();
4240 const VRegister temp = locs()->temp(0).fpu_reg(); 4240 const VRegister temp = locs()->temp(0).fpu_reg();
4241 4241
4242 // Copy mask. 4242 // Copy mask.
4243 __ vmov(temp, mask); 4243 __ vmov(temp, mask);
4244 // Invert it. 4244 // Invert it.
4245 __ vnot(temp, temp); 4245 __ vnot(temp, temp);
4246 // mask = mask & trueValue. 4246 // mask = mask & trueValue.
4247 __ vand(mask, mask, trueValue); 4247 __ vand(mask, mask, trueValue);
4248 // temp = temp & falseValue. 4248 // temp = temp & falseValue.
4249 __ vand(temp, temp, falseValue); 4249 __ vand(temp, temp, falseValue);
4250 // out = mask | temp. 4250 // out = mask | temp.
4251 __ vorr(out, mask, temp); 4251 __ vorr(out, mask, temp);
4252 } 4252 }
4253 4253
4254 4254
4255 LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(Isolate* isolate, 4255 LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(Zone* zone,
4256 bool opt) const { 4256 bool opt) const {
4257 const intptr_t kNumInputs = 2; 4257 const intptr_t kNumInputs = 2;
4258 const intptr_t kNumTemps = 0; 4258 const intptr_t kNumTemps = 0;
4259 LocationSummary* summary = new LocationSummary( 4259 LocationSummary* summary = new LocationSummary(
4260 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 4260 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
4261 summary->set_in(0, Location::RequiresFpuRegister()); 4261 summary->set_in(0, Location::RequiresFpuRegister());
4262 summary->set_in(1, Location::RequiresRegister()); 4262 summary->set_in(1, Location::RequiresRegister());
4263 summary->set_out(0, Location::RequiresFpuRegister()); 4263 summary->set_out(0, Location::RequiresFpuRegister());
4264 return summary; 4264 return summary;
4265 } 4265 }
4266 4266
4267 4267
4268 void Int32x4SetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4268 void Int32x4SetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4269 const VRegister mask = locs()->in(0).fpu_reg(); 4269 const VRegister mask = locs()->in(0).fpu_reg();
4270 const Register flag = locs()->in(1).reg(); 4270 const Register flag = locs()->in(1).reg();
(...skipping 17 matching lines...) Expand all
4288 __ vinsw(result, 2, TMP); 4288 __ vinsw(result, 2, TMP);
4289 break; 4289 break;
4290 case MethodRecognizer::kInt32x4WithFlagW: 4290 case MethodRecognizer::kInt32x4WithFlagW:
4291 __ vinsw(result, 3, TMP); 4291 __ vinsw(result, 3, TMP);
4292 break; 4292 break;
4293 default: UNREACHABLE(); 4293 default: UNREACHABLE();
4294 } 4294 }
4295 } 4295 }
4296 4296
4297 4297
4298 LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(Isolate* isolate, 4298 LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(Zone* zone,
4299 bool opt) const { 4299 bool opt) const {
4300 const intptr_t kNumInputs = 1; 4300 const intptr_t kNumInputs = 1;
4301 const intptr_t kNumTemps = 0; 4301 const intptr_t kNumTemps = 0;
4302 LocationSummary* summary = new LocationSummary( 4302 LocationSummary* summary = new LocationSummary(
4303 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 4303 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
4304 summary->set_in(0, Location::RequiresFpuRegister()); 4304 summary->set_in(0, Location::RequiresFpuRegister());
4305 summary->set_out(0, Location::RequiresFpuRegister()); 4305 summary->set_out(0, Location::RequiresFpuRegister());
4306 return summary; 4306 return summary;
4307 } 4307 }
4308 4308
4309 4309
4310 void Int32x4ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { 4310 void Int32x4ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
4311 const VRegister value = locs()->in(0).fpu_reg(); 4311 const VRegister value = locs()->in(0).fpu_reg();
4312 const VRegister result = locs()->out(0).fpu_reg(); 4312 const VRegister result = locs()->out(0).fpu_reg();
4313 4313
4314 if (value != result) { 4314 if (value != result) {
4315 __ vmov(result, value); 4315 __ vmov(result, value);
4316 } 4316 }
4317 } 4317 }
4318 4318
4319 4319
4320 LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(Isolate* isolate, 4320 LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(Zone* zone,
4321 bool opt) const { 4321 bool opt) const {
4322 const intptr_t kNumInputs = 2; 4322 const intptr_t kNumInputs = 2;
4323 const intptr_t kNumTemps = 0; 4323 const intptr_t kNumTemps = 0;
4324 LocationSummary* summary = new LocationSummary( 4324 LocationSummary* summary = new LocationSummary(
4325 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 4325 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
4326 summary->set_in(0, Location::RequiresFpuRegister()); 4326 summary->set_in(0, Location::RequiresFpuRegister());
4327 summary->set_in(1, Location::RequiresFpuRegister()); 4327 summary->set_in(1, Location::RequiresFpuRegister());
4328 summary->set_out(0, Location::RequiresFpuRegister()); 4328 summary->set_out(0, Location::RequiresFpuRegister());
4329 return summary; 4329 return summary;
4330 } 4330 }
4331 4331
4332 4332
4333 void BinaryInt32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4333 void BinaryInt32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4334 const VRegister left = locs()->in(0).fpu_reg(); 4334 const VRegister left = locs()->in(0).fpu_reg();
4335 const VRegister right = locs()->in(1).fpu_reg(); 4335 const VRegister right = locs()->in(1).fpu_reg();
4336 const VRegister result = locs()->out(0).fpu_reg(); 4336 const VRegister result = locs()->out(0).fpu_reg();
4337 switch (op_kind()) { 4337 switch (op_kind()) {
4338 case Token::kBIT_AND: __ vand(result, left, right); break; 4338 case Token::kBIT_AND: __ vand(result, left, right); break;
4339 case Token::kBIT_OR: __ vorr(result, left, right); break; 4339 case Token::kBIT_OR: __ vorr(result, left, right); break;
4340 case Token::kBIT_XOR: __ veor(result, left, right); break; 4340 case Token::kBIT_XOR: __ veor(result, left, right); break;
4341 case Token::kADD: __ vaddw(result, left, right); break; 4341 case Token::kADD: __ vaddw(result, left, right); break;
4342 case Token::kSUB: __ vsubw(result, left, right); break; 4342 case Token::kSUB: __ vsubw(result, left, right); break;
4343 default: UNREACHABLE(); 4343 default: UNREACHABLE();
4344 } 4344 }
4345 } 4345 }
4346 4346
4347 4347
4348 LocationSummary* MathUnaryInstr::MakeLocationSummary(Isolate* isolate, 4348 LocationSummary* MathUnaryInstr::MakeLocationSummary(Zone* zone,
4349 bool opt) const { 4349 bool opt) const {
4350 if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) { 4350 if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) {
4351 const intptr_t kNumInputs = 1; 4351 const intptr_t kNumInputs = 1;
4352 const intptr_t kNumTemps = 0; 4352 const intptr_t kNumTemps = 0;
4353 LocationSummary* summary = new(isolate) LocationSummary( 4353 LocationSummary* summary = new(zone) LocationSummary(
4354 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); 4354 zone, kNumInputs, kNumTemps, LocationSummary::kCall);
4355 summary->set_in(0, Location::FpuRegisterLocation(V0)); 4355 summary->set_in(0, Location::FpuRegisterLocation(V0));
4356 summary->set_out(0, Location::FpuRegisterLocation(V0)); 4356 summary->set_out(0, Location::FpuRegisterLocation(V0));
4357 return summary; 4357 return summary;
4358 } 4358 }
4359 ASSERT((kind() == MathUnaryInstr::kSqrt) || 4359 ASSERT((kind() == MathUnaryInstr::kSqrt) ||
4360 (kind() == MathUnaryInstr::kDoubleSquare)); 4360 (kind() == MathUnaryInstr::kDoubleSquare));
4361 const intptr_t kNumInputs = 1; 4361 const intptr_t kNumInputs = 1;
4362 const intptr_t kNumTemps = 0; 4362 const intptr_t kNumTemps = 0;
4363 LocationSummary* summary = new(isolate) LocationSummary( 4363 LocationSummary* summary = new(zone) LocationSummary(
4364 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 4364 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
4365 summary->set_in(0, Location::RequiresFpuRegister()); 4365 summary->set_in(0, Location::RequiresFpuRegister());
4366 summary->set_out(0, Location::RequiresFpuRegister()); 4366 summary->set_out(0, Location::RequiresFpuRegister());
4367 return summary; 4367 return summary;
4368 } 4368 }
4369 4369
4370 4370
4371 void MathUnaryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4371 void MathUnaryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4372 if (kind() == MathUnaryInstr::kSqrt) { 4372 if (kind() == MathUnaryInstr::kSqrt) {
4373 const VRegister val = locs()->in(0).fpu_reg(); 4373 const VRegister val = locs()->in(0).fpu_reg();
4374 const VRegister result = locs()->out(0).fpu_reg(); 4374 const VRegister result = locs()->out(0).fpu_reg();
4375 __ fsqrtd(result, val); 4375 __ fsqrtd(result, val);
4376 } else if (kind() == MathUnaryInstr::kDoubleSquare) { 4376 } else if (kind() == MathUnaryInstr::kDoubleSquare) {
4377 const VRegister val = locs()->in(0).fpu_reg(); 4377 const VRegister val = locs()->in(0).fpu_reg();
4378 const VRegister result = locs()->out(0).fpu_reg(); 4378 const VRegister result = locs()->out(0).fpu_reg();
4379 __ fmuld(result, val, val); 4379 __ fmuld(result, val, val);
4380 } else { 4380 } else {
4381 ASSERT((kind() == MathUnaryInstr::kSin) || 4381 ASSERT((kind() == MathUnaryInstr::kSin) ||
4382 (kind() == MathUnaryInstr::kCos)); 4382 (kind() == MathUnaryInstr::kCos));
4383 __ CallRuntime(TargetFunction(), InputCount()); 4383 __ CallRuntime(TargetFunction(), InputCount());
4384 } 4384 }
4385 } 4385 }
4386 4386
4387 4387
4388 LocationSummary* CaseInsensitiveCompareUC16Instr::MakeLocationSummary( 4388 LocationSummary* CaseInsensitiveCompareUC16Instr::MakeLocationSummary(
4389 Isolate* isolate, bool opt) const { 4389 Zone* zone, bool opt) const {
4390 const intptr_t kNumTemps = 0; 4390 const intptr_t kNumTemps = 0;
4391 LocationSummary* summary = new(isolate) LocationSummary( 4391 LocationSummary* summary = new(zone) LocationSummary(
4392 isolate, InputCount(), kNumTemps, LocationSummary::kCall); 4392 zone, InputCount(), kNumTemps, LocationSummary::kCall);
4393 summary->set_in(0, Location::RegisterLocation(R0)); 4393 summary->set_in(0, Location::RegisterLocation(R0));
4394 summary->set_in(1, Location::RegisterLocation(R1)); 4394 summary->set_in(1, Location::RegisterLocation(R1));
4395 summary->set_in(2, Location::RegisterLocation(R2)); 4395 summary->set_in(2, Location::RegisterLocation(R2));
4396 summary->set_in(3, Location::RegisterLocation(R3)); 4396 summary->set_in(3, Location::RegisterLocation(R3));
4397 summary->set_out(0, Location::RegisterLocation(R0)); 4397 summary->set_out(0, Location::RegisterLocation(R0));
4398 return summary; 4398 return summary;
4399 } 4399 }
4400 4400
4401 4401
4402 void CaseInsensitiveCompareUC16Instr::EmitNativeCode( 4402 void CaseInsensitiveCompareUC16Instr::EmitNativeCode(
4403 FlowGraphCompiler* compiler) { 4403 FlowGraphCompiler* compiler) {
4404 4404
4405 // Call the function. 4405 // Call the function.
4406 __ CallRuntime(TargetFunction(), TargetFunction().argument_count()); 4406 __ CallRuntime(TargetFunction(), TargetFunction().argument_count());
4407 } 4407 }
4408 4408
4409 4409
4410 LocationSummary* MathMinMaxInstr::MakeLocationSummary(Isolate* isolate, 4410 LocationSummary* MathMinMaxInstr::MakeLocationSummary(Zone* zone,
4411 bool opt) const { 4411 bool opt) const {
4412 if (result_cid() == kDoubleCid) { 4412 if (result_cid() == kDoubleCid) {
4413 const intptr_t kNumInputs = 2; 4413 const intptr_t kNumInputs = 2;
4414 const intptr_t kNumTemps = 0; 4414 const intptr_t kNumTemps = 0;
4415 LocationSummary* summary = new(isolate) LocationSummary( 4415 LocationSummary* summary = new(zone) LocationSummary(
4416 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 4416 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
4417 summary->set_in(0, Location::RequiresFpuRegister()); 4417 summary->set_in(0, Location::RequiresFpuRegister());
4418 summary->set_in(1, Location::RequiresFpuRegister()); 4418 summary->set_in(1, Location::RequiresFpuRegister());
4419 // Reuse the left register so that code can be made shorter. 4419 // Reuse the left register so that code can be made shorter.
4420 summary->set_out(0, Location::SameAsFirstInput()); 4420 summary->set_out(0, Location::SameAsFirstInput());
4421 return summary; 4421 return summary;
4422 } 4422 }
4423 ASSERT(result_cid() == kSmiCid); 4423 ASSERT(result_cid() == kSmiCid);
4424 const intptr_t kNumInputs = 2; 4424 const intptr_t kNumInputs = 2;
4425 const intptr_t kNumTemps = 0; 4425 const intptr_t kNumTemps = 0;
4426 LocationSummary* summary = new(isolate) LocationSummary( 4426 LocationSummary* summary = new(zone) LocationSummary(
4427 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 4427 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
4428 summary->set_in(0, Location::RequiresRegister()); 4428 summary->set_in(0, Location::RequiresRegister());
4429 summary->set_in(1, Location::RequiresRegister()); 4429 summary->set_in(1, Location::RequiresRegister());
4430 // Reuse the left register so that code can be made shorter. 4430 // Reuse the left register so that code can be made shorter.
4431 summary->set_out(0, Location::SameAsFirstInput()); 4431 summary->set_out(0, Location::SameAsFirstInput());
4432 return summary; 4432 return summary;
4433 } 4433 }
4434 4434
4435 4435
4436 void MathMinMaxInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4436 void MathMinMaxInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4437 ASSERT((op_kind() == MethodRecognizer::kMathMin) || 4437 ASSERT((op_kind() == MethodRecognizer::kMathMin) ||
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
4486 __ CompareRegisters(left, right); 4486 __ CompareRegisters(left, right);
4487 ASSERT(result == left); 4487 ASSERT(result == left);
4488 if (is_min) { 4488 if (is_min) {
4489 __ csel(result, right, left, GT); 4489 __ csel(result, right, left, GT);
4490 } else { 4490 } else {
4491 __ csel(result, right, left, LT); 4491 __ csel(result, right, left, LT);
4492 } 4492 }
4493 } 4493 }
4494 4494
4495 4495
4496 LocationSummary* UnarySmiOpInstr::MakeLocationSummary(Isolate* isolate, 4496 LocationSummary* UnarySmiOpInstr::MakeLocationSummary(Zone* zone,
4497 bool opt) const { 4497 bool opt) const {
4498 const intptr_t kNumInputs = 1; 4498 const intptr_t kNumInputs = 1;
4499 const intptr_t kNumTemps = 0; 4499 const intptr_t kNumTemps = 0;
4500 LocationSummary* summary = new(isolate) LocationSummary( 4500 LocationSummary* summary = new(zone) LocationSummary(
4501 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 4501 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
4502 summary->set_in(0, Location::RequiresRegister()); 4502 summary->set_in(0, Location::RequiresRegister());
4503 // We make use of 3-operand instructions by not requiring result register 4503 // We make use of 3-operand instructions by not requiring result register
4504 // to be identical to first input register as on Intel. 4504 // to be identical to first input register as on Intel.
4505 summary->set_out(0, Location::RequiresRegister()); 4505 summary->set_out(0, Location::RequiresRegister());
4506 return summary; 4506 return summary;
4507 } 4507 }
4508 4508
4509 4509
4510 void UnarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4510 void UnarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4511 const Register value = locs()->in(0).reg(); 4511 const Register value = locs()->in(0).reg();
(...skipping 12 matching lines...) Expand all
4524 __ mvn(result, value); 4524 __ mvn(result, value);
4525 // Remove inverted smi-tag. 4525 // Remove inverted smi-tag.
4526 __ andi(result, result, Immediate(~kSmiTagMask)); 4526 __ andi(result, result, Immediate(~kSmiTagMask));
4527 break; 4527 break;
4528 default: 4528 default:
4529 UNREACHABLE(); 4529 UNREACHABLE();
4530 } 4530 }
4531 } 4531 }
4532 4532
4533 4533
4534 LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate, 4534 LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(Zone* zone,
4535 bool opt) const { 4535 bool opt) const {
4536 const intptr_t kNumInputs = 1; 4536 const intptr_t kNumInputs = 1;
4537 const intptr_t kNumTemps = 0; 4537 const intptr_t kNumTemps = 0;
4538 LocationSummary* summary = new(isolate) LocationSummary( 4538 LocationSummary* summary = new(zone) LocationSummary(
4539 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 4539 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
4540 summary->set_in(0, Location::RequiresFpuRegister()); 4540 summary->set_in(0, Location::RequiresFpuRegister());
4541 summary->set_out(0, Location::RequiresFpuRegister()); 4541 summary->set_out(0, Location::RequiresFpuRegister());
4542 return summary; 4542 return summary;
4543 } 4543 }
4544 4544
4545 4545
4546 void UnaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4546 void UnaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4547 const VRegister result = locs()->out(0).fpu_reg(); 4547 const VRegister result = locs()->out(0).fpu_reg();
4548 const VRegister value = locs()->in(0).fpu_reg(); 4548 const VRegister value = locs()->in(0).fpu_reg();
4549 __ fnegd(result, value); 4549 __ fnegd(result, value);
4550 } 4550 }
4551 4551
4552 4552
4553 LocationSummary* Int32ToDoubleInstr::MakeLocationSummary(Isolate* isolate, 4553 LocationSummary* Int32ToDoubleInstr::MakeLocationSummary(Zone* zone,
4554 bool opt) const { 4554 bool opt) const {
4555 const intptr_t kNumInputs = 1; 4555 const intptr_t kNumInputs = 1;
4556 const intptr_t kNumTemps = 0; 4556 const intptr_t kNumTemps = 0;
4557 LocationSummary* result = new(isolate) LocationSummary( 4557 LocationSummary* result = new(zone) LocationSummary(
4558 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 4558 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
4559 result->set_in(0, Location::RequiresRegister()); 4559 result->set_in(0, Location::RequiresRegister());
4560 result->set_out(0, Location::RequiresFpuRegister()); 4560 result->set_out(0, Location::RequiresFpuRegister());
4561 return result; 4561 return result;
4562 } 4562 }
4563 4563
4564 4564
4565 void Int32ToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4565 void Int32ToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4566 const Register value = locs()->in(0).reg(); 4566 const Register value = locs()->in(0).reg();
4567 const VRegister result = locs()->out(0).fpu_reg(); 4567 const VRegister result = locs()->out(0).fpu_reg();
4568 __ scvtfdw(result, value); 4568 __ scvtfdw(result, value);
4569 } 4569 }
4570 4570
4571 4571
4572 LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Isolate* isolate, 4572 LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Zone* zone,
4573 bool opt) const { 4573 bool opt) const {
4574 const intptr_t kNumInputs = 1; 4574 const intptr_t kNumInputs = 1;
4575 const intptr_t kNumTemps = 0; 4575 const intptr_t kNumTemps = 0;
4576 LocationSummary* result = new(isolate) LocationSummary( 4576 LocationSummary* result = new(zone) LocationSummary(
4577 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 4577 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
4578 result->set_in(0, Location::RequiresRegister()); 4578 result->set_in(0, Location::RequiresRegister());
4579 result->set_out(0, Location::RequiresFpuRegister()); 4579 result->set_out(0, Location::RequiresFpuRegister());
4580 return result; 4580 return result;
4581 } 4581 }
4582 4582
4583 4583
4584 void SmiToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4584 void SmiToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4585 const Register value = locs()->in(0).reg(); 4585 const Register value = locs()->in(0).reg();
4586 const VRegister result = locs()->out(0).fpu_reg(); 4586 const VRegister result = locs()->out(0).fpu_reg();
4587 __ SmiUntag(TMP, value); 4587 __ SmiUntag(TMP, value);
4588 __ scvtfdx(result, TMP); 4588 __ scvtfdx(result, TMP);
4589 } 4589 }
4590 4590
4591 4591
4592 LocationSummary* MintToDoubleInstr::MakeLocationSummary(Isolate* isolate, 4592 LocationSummary* MintToDoubleInstr::MakeLocationSummary(Zone* zone,
4593 bool opt) const { 4593 bool opt) const {
4594 UNIMPLEMENTED(); 4594 UNIMPLEMENTED();
4595 return NULL; 4595 return NULL;
4596 } 4596 }
4597 4597
4598 4598
4599 void MintToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4599 void MintToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4600 UNIMPLEMENTED(); 4600 UNIMPLEMENTED();
4601 } 4601 }
4602 4602
4603 4603
4604 LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(Isolate* isolate, 4604 LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(Zone* zone,
4605 bool opt) const { 4605 bool opt) const {
4606 const intptr_t kNumInputs = 1; 4606 const intptr_t kNumInputs = 1;
4607 const intptr_t kNumTemps = 0; 4607 const intptr_t kNumTemps = 0;
4608 LocationSummary* result = new(isolate) LocationSummary( 4608 LocationSummary* result = new(zone) LocationSummary(
4609 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); 4609 zone, kNumInputs, kNumTemps, LocationSummary::kCall);
4610 result->set_in(0, Location::RegisterLocation(R1)); 4610 result->set_in(0, Location::RegisterLocation(R1));
4611 result->set_out(0, Location::RegisterLocation(R0)); 4611 result->set_out(0, Location::RegisterLocation(R0));
4612 return result; 4612 return result;
4613 } 4613 }
4614 4614
4615 4615
4616 void DoubleToIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4616 void DoubleToIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4617 const Register result = locs()->out(0).reg(); 4617 const Register result = locs()->out(0).reg();
4618 const Register value_obj = locs()->in(0).reg(); 4618 const Register value_obj = locs()->in(0).reg();
4619 ASSERT(result == R0); 4619 ASSERT(result == R0);
(...skipping 29 matching lines...) Expand all
4649 instance_call()->token_pos(), 4649 instance_call()->token_pos(),
4650 target, 4650 target,
4651 kNumberOfArguments, 4651 kNumberOfArguments,
4652 Object::null_array(), // No argument names., 4652 Object::null_array(), // No argument names.,
4653 locs(), 4653 locs(),
4654 ICData::Handle()); 4654 ICData::Handle());
4655 __ Bind(&done); 4655 __ Bind(&done);
4656 } 4656 }
4657 4657
4658 4658
4659 LocationSummary* DoubleToSmiInstr::MakeLocationSummary(Isolate* isolate, 4659 LocationSummary* DoubleToSmiInstr::MakeLocationSummary(Zone* zone,
4660 bool opt) const { 4660 bool opt) const {
4661 const intptr_t kNumInputs = 1; 4661 const intptr_t kNumInputs = 1;
4662 const intptr_t kNumTemps = 0; 4662 const intptr_t kNumTemps = 0;
4663 LocationSummary* result = new(isolate) LocationSummary( 4663 LocationSummary* result = new(zone) LocationSummary(
4664 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 4664 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
4665 result->set_in(0, Location::RequiresFpuRegister()); 4665 result->set_in(0, Location::RequiresFpuRegister());
4666 result->set_out(0, Location::RequiresRegister()); 4666 result->set_out(0, Location::RequiresRegister());
4667 return result; 4667 return result;
4668 } 4668 }
4669 4669
4670 4670
4671 void DoubleToSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4671 void DoubleToSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4672 Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptDoubleToSmi); 4672 Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptDoubleToSmi);
4673 const Register result = locs()->out(0).reg(); 4673 const Register result = locs()->out(0).reg();
4674 const VRegister value = locs()->in(0).fpu_reg(); 4674 const VRegister value = locs()->in(0).fpu_reg();
4675 // First check for NaN. Checking for minint after the conversion doesn't work 4675 // First check for NaN. Checking for minint after the conversion doesn't work
4676 // on ARM64 because fcvtzds gives 0 for NaN. 4676 // on ARM64 because fcvtzds gives 0 for NaN.
4677 // TODO(zra): Check spec that this is true. 4677 // TODO(zra): Check spec that this is true.
4678 __ fcmpd(value, value); 4678 __ fcmpd(value, value);
4679 __ b(deopt, VS); 4679 __ b(deopt, VS);
4680 4680
4681 __ fcvtzds(result, value); 4681 __ fcvtzds(result, value);
4682 // Check for overflow and that it fits into Smi. 4682 // Check for overflow and that it fits into Smi.
4683 __ CompareImmediate(result, 0xC000000000000000, PP); 4683 __ CompareImmediate(result, 0xC000000000000000, PP);
4684 __ b(deopt, MI); 4684 __ b(deopt, MI);
4685 __ SmiTag(result); 4685 __ SmiTag(result);
4686 if (FLAG_throw_on_javascript_int_overflow) { 4686 if (FLAG_throw_on_javascript_int_overflow) {
4687 EmitJavascriptOverflowCheck(compiler, range(), deopt, result); 4687 EmitJavascriptOverflowCheck(compiler, range(), deopt, result);
4688 } 4688 }
4689 } 4689 }
4690 4690
4691 4691
4692 LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(Isolate* isolate, 4692 LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(Zone* zone,
4693 bool opt) const { 4693 bool opt) const {
4694 UNIMPLEMENTED(); 4694 UNIMPLEMENTED();
4695 return NULL; 4695 return NULL;
4696 } 4696 }
4697 4697
4698 4698
4699 void DoubleToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4699 void DoubleToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4700 UNIMPLEMENTED(); 4700 UNIMPLEMENTED();
4701 } 4701 }
4702 4702
4703 4703
4704 LocationSummary* DoubleToFloatInstr::MakeLocationSummary(Isolate* isolate, 4704 LocationSummary* DoubleToFloatInstr::MakeLocationSummary(Zone* zone,
4705 bool opt) const { 4705 bool opt) const {
4706 const intptr_t kNumInputs = 1; 4706 const intptr_t kNumInputs = 1;
4707 const intptr_t kNumTemps = 0; 4707 const intptr_t kNumTemps = 0;
4708 LocationSummary* result = new(isolate) LocationSummary( 4708 LocationSummary* result = new(zone) LocationSummary(
4709 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 4709 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
4710 result->set_in(0, Location::RequiresFpuRegister()); 4710 result->set_in(0, Location::RequiresFpuRegister());
4711 result->set_out(0, Location::RequiresFpuRegister()); 4711 result->set_out(0, Location::RequiresFpuRegister());
4712 return result; 4712 return result;
4713 } 4713 }
4714 4714
4715 4715
4716 void DoubleToFloatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4716 void DoubleToFloatInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4717 const VRegister value = locs()->in(0).fpu_reg(); 4717 const VRegister value = locs()->in(0).fpu_reg();
4718 const VRegister result = locs()->out(0).fpu_reg(); 4718 const VRegister result = locs()->out(0).fpu_reg();
4719 __ fcvtsd(result, value); 4719 __ fcvtsd(result, value);
4720 } 4720 }
4721 4721
4722 4722
4723 LocationSummary* FloatToDoubleInstr::MakeLocationSummary(Isolate* isolate, 4723 LocationSummary* FloatToDoubleInstr::MakeLocationSummary(Zone* zone,
4724 bool opt) const { 4724 bool opt) const {
4725 const intptr_t kNumInputs = 1; 4725 const intptr_t kNumInputs = 1;
4726 const intptr_t kNumTemps = 0; 4726 const intptr_t kNumTemps = 0;
4727 LocationSummary* result = new(isolate) LocationSummary( 4727 LocationSummary* result = new(zone) LocationSummary(
4728 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 4728 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
4729 result->set_in(0, Location::RequiresFpuRegister()); 4729 result->set_in(0, Location::RequiresFpuRegister());
4730 result->set_out(0, Location::RequiresFpuRegister()); 4730 result->set_out(0, Location::RequiresFpuRegister());
4731 return result; 4731 return result;
4732 } 4732 }
4733 4733
4734 4734
4735 void FloatToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4735 void FloatToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4736 const VRegister value = locs()->in(0).fpu_reg(); 4736 const VRegister value = locs()->in(0).fpu_reg();
4737 const VRegister result = locs()->out(0).fpu_reg(); 4737 const VRegister result = locs()->out(0).fpu_reg();
4738 __ fcvtds(result, value); 4738 __ fcvtds(result, value);
4739 } 4739 }
4740 4740
4741 4741
4742 LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(Isolate* isolate, 4742 LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(Zone* zone,
4743 bool opt) const { 4743 bool opt) const {
4744 ASSERT((InputCount() == 1) || (InputCount() == 2)); 4744 ASSERT((InputCount() == 1) || (InputCount() == 2));
4745 const intptr_t kNumTemps = 4745 const intptr_t kNumTemps =
4746 (recognized_kind() == MethodRecognizer::kMathDoublePow) ? 1 : 0; 4746 (recognized_kind() == MethodRecognizer::kMathDoublePow) ? 1 : 0;
4747 LocationSummary* result = new(isolate) LocationSummary( 4747 LocationSummary* result = new(zone) LocationSummary(
4748 isolate, InputCount(), kNumTemps, LocationSummary::kCall); 4748 zone, InputCount(), kNumTemps, LocationSummary::kCall);
4749 result->set_in(0, Location::FpuRegisterLocation(V0)); 4749 result->set_in(0, Location::FpuRegisterLocation(V0));
4750 if (InputCount() == 2) { 4750 if (InputCount() == 2) {
4751 result->set_in(1, Location::FpuRegisterLocation(V1)); 4751 result->set_in(1, Location::FpuRegisterLocation(V1));
4752 } 4752 }
4753 if (recognized_kind() == MethodRecognizer::kMathDoublePow) { 4753 if (recognized_kind() == MethodRecognizer::kMathDoublePow) {
4754 result->set_temp(0, Location::FpuRegisterLocation(V30)); 4754 result->set_temp(0, Location::FpuRegisterLocation(V30));
4755 } 4755 }
4756 result->set_out(0, Location::FpuRegisterLocation(V0)); 4756 result->set_out(0, Location::FpuRegisterLocation(V0));
4757 return result; 4757 return result;
4758 } 4758 }
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
4873 4873
4874 void InvokeMathCFunctionInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4874 void InvokeMathCFunctionInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4875 if (recognized_kind() == MethodRecognizer::kMathDoublePow) { 4875 if (recognized_kind() == MethodRecognizer::kMathDoublePow) {
4876 InvokeDoublePow(compiler, this); 4876 InvokeDoublePow(compiler, this);
4877 return; 4877 return;
4878 } 4878 }
4879 __ CallRuntime(TargetFunction(), InputCount()); 4879 __ CallRuntime(TargetFunction(), InputCount());
4880 } 4880 }
4881 4881
4882 4882
4883 LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(Isolate* isolate, 4883 LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(Zone* zone,
4884 bool opt) const { 4884 bool opt) const {
4885 // Only use this instruction in optimized code. 4885 // Only use this instruction in optimized code.
4886 ASSERT(opt); 4886 ASSERT(opt);
4887 const intptr_t kNumInputs = 1; 4887 const intptr_t kNumInputs = 1;
4888 LocationSummary* summary = new(isolate) LocationSummary( 4888 LocationSummary* summary = new(zone) LocationSummary(
4889 isolate, kNumInputs, 0, LocationSummary::kNoCall); 4889 zone, kNumInputs, 0, LocationSummary::kNoCall);
4890 if (representation() == kUnboxedDouble) { 4890 if (representation() == kUnboxedDouble) {
4891 if (index() == 0) { 4891 if (index() == 0) {
4892 summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(), 4892 summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(),
4893 Location::Any())); 4893 Location::Any()));
4894 } else { 4894 } else {
4895 ASSERT(index() == 1); 4895 ASSERT(index() == 1);
4896 summary->set_in(0, Location::Pair(Location::Any(), 4896 summary->set_in(0, Location::Pair(Location::Any(),
4897 Location::RequiresFpuRegister())); 4897 Location::RequiresFpuRegister()));
4898 } 4898 }
4899 summary->set_out(0, Location::RequiresFpuRegister()); 4899 summary->set_out(0, Location::RequiresFpuRegister());
(...skipping 23 matching lines...) Expand all
4923 __ fmovdd(out, in); 4923 __ fmovdd(out, in);
4924 } else { 4924 } else {
4925 ASSERT(representation() == kTagged); 4925 ASSERT(representation() == kTagged);
4926 const Register out = locs()->out(0).reg(); 4926 const Register out = locs()->out(0).reg();
4927 const Register in = in_loc.reg(); 4927 const Register in = in_loc.reg();
4928 __ mov(out, in); 4928 __ mov(out, in);
4929 } 4929 }
4930 } 4930 }
4931 4931
4932 4932
4933 LocationSummary* MergedMathInstr::MakeLocationSummary(Isolate* isolate, 4933 LocationSummary* MergedMathInstr::MakeLocationSummary(Zone* zone,
4934 bool opt) const { 4934 bool opt) const {
4935 if (kind() == MergedMathInstr::kTruncDivMod) { 4935 if (kind() == MergedMathInstr::kTruncDivMod) {
4936 const intptr_t kNumInputs = 2; 4936 const intptr_t kNumInputs = 2;
4937 const intptr_t kNumTemps = 0; 4937 const intptr_t kNumTemps = 0;
4938 LocationSummary* summary = new(isolate) LocationSummary( 4938 LocationSummary* summary = new(zone) LocationSummary(
4939 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 4939 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
4940 summary->set_in(0, Location::RequiresRegister()); 4940 summary->set_in(0, Location::RequiresRegister());
4941 summary->set_in(1, Location::RequiresRegister()); 4941 summary->set_in(1, Location::RequiresRegister());
4942 // Output is a pair of registers. 4942 // Output is a pair of registers.
4943 summary->set_out(0, Location::Pair(Location::RequiresRegister(), 4943 summary->set_out(0, Location::Pair(Location::RequiresRegister(),
4944 Location::RequiresRegister())); 4944 Location::RequiresRegister()));
4945 return summary; 4945 return summary;
4946 } 4946 }
4947 UNIMPLEMENTED(); 4947 UNIMPLEMENTED();
4948 return NULL; 4948 return NULL;
4949 } 4949 }
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
5005 return; 5005 return;
5006 } 5006 }
5007 if (kind() == MergedMathInstr::kSinCos) { 5007 if (kind() == MergedMathInstr::kSinCos) {
5008 UNIMPLEMENTED(); 5008 UNIMPLEMENTED();
5009 } 5009 }
5010 UNIMPLEMENTED(); 5010 UNIMPLEMENTED();
5011 } 5011 }
5012 5012
5013 5013
5014 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary( 5014 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(
5015 Isolate* isolate, bool opt) const { 5015 Zone* zone, bool opt) const {
5016 return MakeCallSummary(isolate); 5016 return MakeCallSummary(zone);
5017 } 5017 }
5018 5018
5019 5019
5020 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5020 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5021 ASSERT(ic_data().NumArgsTested() == 1); 5021 ASSERT(ic_data().NumArgsTested() == 1);
5022 if (!with_checks()) { 5022 if (!with_checks()) {
5023 ASSERT(ic_data().HasOneTarget()); 5023 ASSERT(ic_data().HasOneTarget());
5024 const Function& target = Function::ZoneHandle(ic_data().GetTargetAt(0)); 5024 const Function& target = Function::ZoneHandle(ic_data().GetTargetAt(0));
5025 compiler->GenerateStaticCall(deopt_id(), 5025 compiler->GenerateStaticCall(deopt_id(),
5026 instance_call()->token_pos(), 5026 instance_call()->token_pos(),
(...skipping 18 matching lines...) Expand all
5045 R2, // Class id register. 5045 R2, // Class id register.
5046 instance_call()->ArgumentCount(), 5046 instance_call()->ArgumentCount(),
5047 instance_call()->argument_names(), 5047 instance_call()->argument_names(),
5048 deopt, 5048 deopt,
5049 deopt_id(), 5049 deopt_id(),
5050 instance_call()->token_pos(), 5050 instance_call()->token_pos(),
5051 locs()); 5051 locs());
5052 } 5052 }
5053 5053
5054 5054
5055 LocationSummary* BranchInstr::MakeLocationSummary(Isolate* isolate, 5055 LocationSummary* BranchInstr::MakeLocationSummary(Zone* zone,
5056 bool opt) const { 5056 bool opt) const {
5057 comparison()->InitializeLocationSummary(isolate, opt); 5057 comparison()->InitializeLocationSummary(zone, opt);
5058 // Branches don't produce a result. 5058 // Branches don't produce a result.
5059 comparison()->locs()->set_out(0, Location::NoLocation()); 5059 comparison()->locs()->set_out(0, Location::NoLocation());
5060 return comparison()->locs(); 5060 return comparison()->locs();
5061 } 5061 }
5062 5062
5063 5063
5064 void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5064 void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5065 comparison()->EmitBranchCode(compiler, this); 5065 comparison()->EmitBranchCode(compiler, this);
5066 } 5066 }
5067 5067
5068 5068
5069 LocationSummary* CheckClassInstr::MakeLocationSummary(Isolate* isolate, 5069 LocationSummary* CheckClassInstr::MakeLocationSummary(Zone* zone,
5070 bool opt) const { 5070 bool opt) const {
5071 const intptr_t kNumInputs = 1; 5071 const intptr_t kNumInputs = 1;
5072 const bool need_mask_temp = IsDenseSwitch() && !IsDenseMask(ComputeCidMask()); 5072 const bool need_mask_temp = IsDenseSwitch() && !IsDenseMask(ComputeCidMask());
5073 const intptr_t kNumTemps = !IsNullCheck() ? (need_mask_temp ? 2 : 1) : 0; 5073 const intptr_t kNumTemps = !IsNullCheck() ? (need_mask_temp ? 2 : 1) : 0;
5074 LocationSummary* summary = new(isolate) LocationSummary( 5074 LocationSummary* summary = new(zone) LocationSummary(
5075 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 5075 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
5076 summary->set_in(0, Location::RequiresRegister()); 5076 summary->set_in(0, Location::RequiresRegister());
5077 if (!IsNullCheck()) { 5077 if (!IsNullCheck()) {
5078 summary->set_temp(0, Location::RequiresRegister()); 5078 summary->set_temp(0, Location::RequiresRegister());
5079 if (need_mask_temp) { 5079 if (need_mask_temp) {
5080 summary->set_temp(1, Location::RequiresRegister()); 5080 summary->set_temp(1, Location::RequiresRegister());
5081 } 5081 }
5082 } 5082 }
5083 return summary; 5083 return summary;
5084 } 5084 }
5085 5085
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
5136 __ b(deopt, NE); 5136 __ b(deopt, NE);
5137 } else { 5137 } else {
5138 __ b(&is_ok, EQ); 5138 __ b(&is_ok, EQ);
5139 } 5139 }
5140 } 5140 }
5141 } 5141 }
5142 __ Bind(&is_ok); 5142 __ Bind(&is_ok);
5143 } 5143 }
5144 5144
5145 5145
5146 LocationSummary* CheckClassIdInstr::MakeLocationSummary(Isolate* isolate, 5146 LocationSummary* CheckClassIdInstr::MakeLocationSummary(Zone* zone,
5147 bool opt) const { 5147 bool opt) const {
5148 const intptr_t kNumInputs = 1; 5148 const intptr_t kNumInputs = 1;
5149 const intptr_t kNumTemps = 0; 5149 const intptr_t kNumTemps = 0;
5150 LocationSummary* summary = new(isolate) LocationSummary( 5150 LocationSummary* summary = new(zone) LocationSummary(
5151 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 5151 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
5152 summary->set_in(0, Location::RequiresRegister()); 5152 summary->set_in(0, Location::RequiresRegister());
5153 return summary; 5153 return summary;
5154 } 5154 }
5155 5155
5156 5156
5157 void CheckClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5157 void CheckClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5158 Register value = locs()->in(0).reg(); 5158 Register value = locs()->in(0).reg();
5159 Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckClass); 5159 Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckClass);
5160 __ CompareImmediate(value, Smi::RawValue(cid_), PP); 5160 __ CompareImmediate(value, Smi::RawValue(cid_), PP);
5161 __ b(deopt, NE); 5161 __ b(deopt, NE);
5162 } 5162 }
5163 5163
5164 5164
5165 LocationSummary* CheckSmiInstr::MakeLocationSummary(Isolate* isolate, 5165 LocationSummary* CheckSmiInstr::MakeLocationSummary(Zone* zone,
5166 bool opt) const { 5166 bool opt) const {
5167 const intptr_t kNumInputs = 1; 5167 const intptr_t kNumInputs = 1;
5168 const intptr_t kNumTemps = 0; 5168 const intptr_t kNumTemps = 0;
5169 LocationSummary* summary = new(isolate) LocationSummary( 5169 LocationSummary* summary = new(zone) LocationSummary(
5170 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 5170 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
5171 summary->set_in(0, Location::RequiresRegister()); 5171 summary->set_in(0, Location::RequiresRegister());
5172 return summary; 5172 return summary;
5173 } 5173 }
5174 5174
5175 5175
5176 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5176 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5177 const Register value = locs()->in(0).reg(); 5177 const Register value = locs()->in(0).reg();
5178 Label* deopt = compiler->AddDeoptStub(deopt_id(), 5178 Label* deopt = compiler->AddDeoptStub(deopt_id(),
5179 ICData::kDeoptCheckSmi, 5179 ICData::kDeoptCheckSmi,
5180 licm_hoisted_ ? ICData::kHoisted : 0); 5180 licm_hoisted_ ? ICData::kHoisted : 0);
5181 __ tsti(value, Immediate(kSmiTagMask)); 5181 __ tsti(value, Immediate(kSmiTagMask));
5182 __ b(deopt, NE); 5182 __ b(deopt, NE);
5183 } 5183 }
5184 5184
5185 5185
5186 LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(Isolate* isolate, 5186 LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(Zone* zone,
5187 bool opt) const { 5187 bool opt) const {
5188 const intptr_t kNumInputs = 2; 5188 const intptr_t kNumInputs = 2;
5189 const intptr_t kNumTemps = 0; 5189 const intptr_t kNumTemps = 0;
5190 LocationSummary* locs = new(isolate) LocationSummary( 5190 LocationSummary* locs = new(zone) LocationSummary(
5191 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 5191 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
5192 locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length())); 5192 locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length()));
5193 locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index())); 5193 locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index()));
5194 return locs; 5194 return locs;
5195 } 5195 }
5196 5196
5197 5197
5198 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5198 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5199 uint32_t flags = generalized_ ? ICData::kGeneralized : 0; 5199 uint32_t flags = generalized_ ? ICData::kGeneralized : 0;
5200 flags |= licm_hoisted_ ? ICData::kHoisted : 0; 5200 flags |= licm_hoisted_ ? ICData::kHoisted : 0;
5201 Label* deopt = compiler->AddDeoptStub( 5201 Label* deopt = compiler->AddDeoptStub(
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
5240 } 5240 }
5241 } else { 5241 } else {
5242 const Register length = length_loc.reg(); 5242 const Register length = length_loc.reg();
5243 const Register index = index_loc.reg(); 5243 const Register index = index_loc.reg();
5244 __ CompareRegisters(index, length); 5244 __ CompareRegisters(index, length);
5245 __ b(deopt, CS); 5245 __ b(deopt, CS);
5246 } 5246 }
5247 } 5247 }
5248 5248
5249 5249
5250 LocationSummary* BinaryMintOpInstr::MakeLocationSummary(Isolate* isolate, 5250 LocationSummary* BinaryMintOpInstr::MakeLocationSummary(Zone* zone,
5251 bool opt) const { 5251 bool opt) const {
5252 UNIMPLEMENTED(); 5252 UNIMPLEMENTED();
5253 return NULL; 5253 return NULL;
5254 } 5254 }
5255 5255
5256 5256
5257 void BinaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5257 void BinaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5258 UNIMPLEMENTED(); 5258 UNIMPLEMENTED();
5259 } 5259 }
5260 5260
5261 5261
5262 bool ShiftMintOpInstr::has_shift_count_check() const { 5262 bool ShiftMintOpInstr::has_shift_count_check() const {
5263 UNREACHABLE(); 5263 UNREACHABLE();
5264 return false; 5264 return false;
5265 } 5265 }
5266 5266
5267 5267
5268 LocationSummary* ShiftMintOpInstr::MakeLocationSummary(Isolate* isolate, 5268 LocationSummary* ShiftMintOpInstr::MakeLocationSummary(Zone* zone,
5269 bool opt) const { 5269 bool opt) const {
5270 UNIMPLEMENTED(); 5270 UNIMPLEMENTED();
5271 return NULL; 5271 return NULL;
5272 } 5272 }
5273 5273
5274 5274
5275 void ShiftMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5275 void ShiftMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5276 UNIMPLEMENTED(); 5276 UNIMPLEMENTED();
5277 } 5277 }
5278 5278
5279 5279
5280 LocationSummary* UnaryMintOpInstr::MakeLocationSummary(Isolate* isolate, 5280 LocationSummary* UnaryMintOpInstr::MakeLocationSummary(Zone* zone,
5281 bool opt) const { 5281 bool opt) const {
5282 UNIMPLEMENTED(); 5282 UNIMPLEMENTED();
5283 return NULL; 5283 return NULL;
5284 } 5284 }
5285 5285
5286 5286
5287 void UnaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5287 void UnaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5288 UNIMPLEMENTED(); 5288 UNIMPLEMENTED();
5289 } 5289 }
5290 5290
(...skipping 12 matching lines...) Expand all
5303 return CompileType::FromCid(kSmiCid); 5303 return CompileType::FromCid(kSmiCid);
5304 } 5304 }
5305 5305
5306 5306
5307 DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryUint32OpInstr) 5307 DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryUint32OpInstr)
5308 DEFINE_UNIMPLEMENTED_INSTRUCTION(ShiftUint32OpInstr) 5308 DEFINE_UNIMPLEMENTED_INSTRUCTION(ShiftUint32OpInstr)
5309 DEFINE_UNIMPLEMENTED_INSTRUCTION(UnaryUint32OpInstr) 5309 DEFINE_UNIMPLEMENTED_INSTRUCTION(UnaryUint32OpInstr)
5310 DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryInt32OpInstr) 5310 DEFINE_UNIMPLEMENTED_INSTRUCTION(BinaryInt32OpInstr)
5311 5311
5312 5312
5313 LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Isolate* isolate, 5313 LocationSummary* UnboxedIntConverterInstr::MakeLocationSummary(Zone* zone,
5314 bool opt) const { 5314 bool opt) const {
5315 const intptr_t kNumInputs = 1; 5315 const intptr_t kNumInputs = 1;
5316 const intptr_t kNumTemps = 0; 5316 const intptr_t kNumTemps = 0;
5317 LocationSummary* summary = new(isolate) LocationSummary( 5317 LocationSummary* summary = new(zone) LocationSummary(
5318 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 5318 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
5319 if (from() == kUnboxedMint) { 5319 if (from() == kUnboxedMint) {
5320 UNREACHABLE(); 5320 UNREACHABLE();
5321 } else if (to() == kUnboxedMint) { 5321 } else if (to() == kUnboxedMint) {
5322 UNREACHABLE(); 5322 UNREACHABLE();
5323 } else { 5323 } else {
5324 ASSERT((to() == kUnboxedUint32) || (to() == kUnboxedInt32)); 5324 ASSERT((to() == kUnboxedUint32) || (to() == kUnboxedInt32));
5325 ASSERT((from() == kUnboxedUint32) || (from() == kUnboxedInt32)); 5325 ASSERT((from() == kUnboxedUint32) || (from() == kUnboxedInt32));
5326 summary->set_in(0, Location::RequiresRegister()); 5326 summary->set_in(0, Location::RequiresRegister());
5327 summary->set_out(0, Location::RequiresRegister()); 5327 summary->set_out(0, Location::RequiresRegister());
5328 } 5328 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
5360 UNREACHABLE(); 5360 UNREACHABLE();
5361 } else if (to() == kUnboxedMint) { 5361 } else if (to() == kUnboxedMint) {
5362 ASSERT((from() == kUnboxedUint32) || (from() == kUnboxedInt32)); 5362 ASSERT((from() == kUnboxedUint32) || (from() == kUnboxedInt32));
5363 UNREACHABLE(); 5363 UNREACHABLE();
5364 } else { 5364 } else {
5365 UNREACHABLE(); 5365 UNREACHABLE();
5366 } 5366 }
5367 } 5367 }
5368 5368
5369 5369
5370 LocationSummary* ThrowInstr::MakeLocationSummary(Isolate* isolate, 5370 LocationSummary* ThrowInstr::MakeLocationSummary(Zone* zone,
5371 bool opt) const { 5371 bool opt) const {
5372 return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall); 5372 return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
5373 } 5373 }
5374 5374
5375 5375
5376 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5376 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5377 compiler->GenerateRuntimeCall(token_pos(), 5377 compiler->GenerateRuntimeCall(token_pos(),
5378 deopt_id(), 5378 deopt_id(),
5379 kThrowRuntimeEntry, 5379 kThrowRuntimeEntry,
5380 1, 5380 1,
5381 locs()); 5381 locs());
5382 __ brk(0); 5382 __ brk(0);
5383 } 5383 }
5384 5384
5385 5385
5386 LocationSummary* ReThrowInstr::MakeLocationSummary(Isolate* isolate, 5386 LocationSummary* ReThrowInstr::MakeLocationSummary(Zone* zone,
5387 bool opt) const { 5387 bool opt) const {
5388 return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall); 5388 return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kCall);
5389 } 5389 }
5390 5390
5391 5391
5392 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5392 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5393 compiler->SetNeedsStacktrace(catch_try_index()); 5393 compiler->SetNeedsStacktrace(catch_try_index());
5394 compiler->GenerateRuntimeCall(token_pos(), 5394 compiler->GenerateRuntimeCall(token_pos(),
5395 deopt_id(), 5395 deopt_id(),
5396 kReThrowRuntimeEntry, 5396 kReThrowRuntimeEntry,
5397 2, 5397 2,
5398 locs()); 5398 locs());
5399 __ brk(0); 5399 __ brk(0);
5400 } 5400 }
5401 5401
5402 5402
5403 void GraphEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5403 void GraphEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5404 if (!compiler->CanFallThroughTo(normal_entry())) { 5404 if (!compiler->CanFallThroughTo(normal_entry())) {
5405 __ b(compiler->GetJumpLabel(normal_entry())); 5405 __ b(compiler->GetJumpLabel(normal_entry()));
5406 } 5406 }
5407 } 5407 }
5408 5408
5409 5409
5410 LocationSummary* GotoInstr::MakeLocationSummary(Isolate* isolate, 5410 LocationSummary* GotoInstr::MakeLocationSummary(Zone* zone,
5411 bool opt) const { 5411 bool opt) const {
5412 return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kNoCall); 5412 return new(zone) LocationSummary(zone, 0, 0, LocationSummary::kNoCall);
5413 } 5413 }
5414 5414
5415 5415
5416 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5416 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5417 if (!compiler->is_optimizing()) { 5417 if (!compiler->is_optimizing()) {
5418 if (FLAG_emit_edge_counters) { 5418 if (FLAG_emit_edge_counters) {
5419 compiler->EmitEdgeCounter(); 5419 compiler->EmitEdgeCounter();
5420 } 5420 }
5421 // Add a deoptimization descriptor for deoptimizing instructions that 5421 // Add a deoptimization descriptor for deoptimizing instructions that
5422 // may be inserted before this instruction. On ARM64 this descriptor 5422 // may be inserted before this instruction. On ARM64 this descriptor
5423 // points after the edge counter code so that we can reuse the same 5423 // points after the edge counter code so that we can reuse the same
5424 // pattern matching code as at call sites, which matches backwards from 5424 // pattern matching code as at call sites, which matches backwards from
5425 // the end of the pattern. 5425 // the end of the pattern.
5426 compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, 5426 compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt,
5427 GetDeoptId(), 5427 GetDeoptId(),
5428 Scanner::kNoSourcePos); 5428 Scanner::kNoSourcePos);
5429 } 5429 }
5430 if (HasParallelMove()) { 5430 if (HasParallelMove()) {
5431 compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); 5431 compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
5432 } 5432 }
5433 5433
5434 // We can fall through if the successor is the next block in the list. 5434 // We can fall through if the successor is the next block in the list.
5435 // Otherwise, we need a jump. 5435 // Otherwise, we need a jump.
5436 if (!compiler->CanFallThroughTo(successor())) { 5436 if (!compiler->CanFallThroughTo(successor())) {
5437 __ b(compiler->GetJumpLabel(successor())); 5437 __ b(compiler->GetJumpLabel(successor()));
5438 } 5438 }
5439 } 5439 }
5440 5440
5441 5441
5442 LocationSummary* IndirectGotoInstr::MakeLocationSummary(Isolate* isolate, 5442 LocationSummary* IndirectGotoInstr::MakeLocationSummary(Zone* zone,
5443 bool opt) const { 5443 bool opt) const {
5444 const intptr_t kNumInputs = 1; 5444 const intptr_t kNumInputs = 1;
5445 const intptr_t kNumTemps = 1; 5445 const intptr_t kNumTemps = 1;
5446 5446
5447 LocationSummary* summary = new(isolate) LocationSummary( 5447 LocationSummary* summary = new(zone) LocationSummary(
5448 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 5448 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
5449 5449
5450 summary->set_in(0, Location::RequiresRegister()); 5450 summary->set_in(0, Location::RequiresRegister());
5451 summary->set_temp(0, Location::RequiresRegister()); 5451 summary->set_temp(0, Location::RequiresRegister());
5452 5452
5453 return summary; 5453 return summary;
5454 } 5454 }
5455 5455
5456 5456
5457 void IndirectGotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5457 void IndirectGotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5458 Register target_address_reg = locs()->temp_slot(0)->reg(); 5458 Register target_address_reg = locs()->temp_slot(0)->reg();
5459 5459
5460 // Load from [current frame pointer] + kPcMarkerSlotFromFp. 5460 // Load from [current frame pointer] + kPcMarkerSlotFromFp.
5461 __ ldr(target_address_reg, Address(FP, kPcMarkerSlotFromFp * kWordSize)); 5461 __ ldr(target_address_reg, Address(FP, kPcMarkerSlotFromFp * kWordSize));
5462 5462
5463 // Add the offset. 5463 // Add the offset.
5464 Register offset_reg = locs()->in(0).reg(); 5464 Register offset_reg = locs()->in(0).reg();
5465 Operand offset_opr = 5465 Operand offset_opr =
5466 (offset()->definition()->representation() == kTagged) ? 5466 (offset()->definition()->representation() == kTagged) ?
5467 Operand(offset_reg, ASR, kSmiTagSize) : 5467 Operand(offset_reg, ASR, kSmiTagSize) :
5468 Operand(offset_reg); 5468 Operand(offset_reg);
5469 __ add(target_address_reg, target_address_reg, offset_opr); 5469 __ add(target_address_reg, target_address_reg, offset_opr);
5470 5470
5471 // Jump to the absolute address. 5471 // Jump to the absolute address.
5472 __ br(target_address_reg); 5472 __ br(target_address_reg);
5473 } 5473 }
5474 5474
5475 5475
5476 LocationSummary* StrictCompareInstr::MakeLocationSummary(Isolate* isolate, 5476 LocationSummary* StrictCompareInstr::MakeLocationSummary(Zone* zone,
5477 bool opt) const { 5477 bool opt) const {
5478 const intptr_t kNumInputs = 2; 5478 const intptr_t kNumInputs = 2;
5479 const intptr_t kNumTemps = 0; 5479 const intptr_t kNumTemps = 0;
5480 if (needs_number_check()) { 5480 if (needs_number_check()) {
5481 LocationSummary* locs = new(isolate) LocationSummary( 5481 LocationSummary* locs = new(zone) LocationSummary(
5482 isolate, kNumInputs, kNumTemps, LocationSummary::kCall); 5482 zone, kNumInputs, kNumTemps, LocationSummary::kCall);
5483 locs->set_in(0, Location::RegisterLocation(R0)); 5483 locs->set_in(0, Location::RegisterLocation(R0));
5484 locs->set_in(1, Location::RegisterLocation(R1)); 5484 locs->set_in(1, Location::RegisterLocation(R1));
5485 locs->set_out(0, Location::RegisterLocation(R0)); 5485 locs->set_out(0, Location::RegisterLocation(R0));
5486 return locs; 5486 return locs;
5487 } 5487 }
5488 LocationSummary* locs = new(isolate) LocationSummary( 5488 LocationSummary* locs = new(zone) LocationSummary(
5489 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 5489 zone, kNumInputs, kNumTemps, LocationSummary::kNoCall);
5490 locs->set_in(0, Location::RegisterOrConstant(left())); 5490 locs->set_in(0, Location::RegisterOrConstant(left()));
5491 // Only one of the inputs can be a constant. Choose register if the first one 5491 // Only one of the inputs can be a constant. Choose register if the first one
5492 // is a constant. 5492 // is a constant.
5493 locs->set_in(1, locs->in(0).IsConstant() 5493 locs->set_in(1, locs->in(0).IsConstant()
5494 ? Location::RequiresRegister() 5494 ? Location::RequiresRegister()
5495 : Location::RegisterOrConstant(right())); 5495 : Location::RegisterOrConstant(right()));
5496 locs->set_out(0, Location::RequiresRegister()); 5496 locs->set_out(0, Location::RequiresRegister());
5497 return locs; 5497 return locs;
5498 } 5498 }
5499 5499
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
5551 void StrictCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler, 5551 void StrictCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler,
5552 BranchInstr* branch) { 5552 BranchInstr* branch) {
5553 ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT); 5553 ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT);
5554 5554
5555 BranchLabels labels = compiler->CreateBranchLabels(branch); 5555 BranchLabels labels = compiler->CreateBranchLabels(branch);
5556 Condition true_condition = EmitComparisonCode(compiler, labels); 5556 Condition true_condition = EmitComparisonCode(compiler, labels);
5557 EmitBranchOnCondition(compiler, true_condition, labels); 5557 EmitBranchOnCondition(compiler, true_condition, labels);
5558 } 5558 }
5559 5559
5560 5560
5561 LocationSummary* BooleanNegateInstr::MakeLocationSummary(Isolate* isolate, 5561 LocationSummary* BooleanNegateInstr::MakeLocationSummary(Zone* zone,
5562 bool opt) const { 5562 bool opt) const {
5563 return LocationSummary::Make(isolate, 5563 return LocationSummary::Make(zone,
5564 1, 5564 1,
5565 Location::RequiresRegister(), 5565 Location::RequiresRegister(),
5566 LocationSummary::kNoCall); 5566 LocationSummary::kNoCall);
5567 } 5567 }
5568 5568
5569 5569
5570 void BooleanNegateInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5570 void BooleanNegateInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5571 const Register value = locs()->in(0).reg(); 5571 const Register value = locs()->in(0).reg();
5572 const Register result = locs()->out(0).reg(); 5572 const Register result = locs()->out(0).reg();
5573 5573
5574 __ LoadObject(result, Bool::True(), PP); 5574 __ LoadObject(result, Bool::True(), PP);
5575 __ LoadObject(TMP, Bool::False(), PP); 5575 __ LoadObject(TMP, Bool::False(), PP);
5576 __ CompareRegisters(result, value); 5576 __ CompareRegisters(result, value);
5577 __ csel(result, TMP, result, EQ); 5577 __ csel(result, TMP, result, EQ);
5578 } 5578 }
5579 5579
5580 5580
5581 LocationSummary* AllocateObjectInstr::MakeLocationSummary(Isolate* isolate, 5581 LocationSummary* AllocateObjectInstr::MakeLocationSummary(Zone* zone,
5582 bool opt) const { 5582 bool opt) const {
5583 return MakeCallSummary(isolate); 5583 return MakeCallSummary(zone);
5584 } 5584 }
5585 5585
5586 5586
5587 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5587 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5588 Isolate* isolate = compiler->isolate(); 5588 Isolate* isolate = compiler->isolate();
5589 StubCode* stub_code = isolate->stub_code(); 5589 StubCode* stub_code = isolate->stub_code();
5590 const Code& stub = Code::Handle(isolate, 5590 const Code& stub = Code::Handle(isolate,
5591 stub_code->GetAllocationStubForClass(cls())); 5591 stub_code->GetAllocationStubForClass(cls()));
5592 const ExternalLabel label(stub.EntryPoint()); 5592 const ExternalLabel label(stub.EntryPoint());
5593 compiler->GenerateCall(token_pos(), 5593 compiler->GenerateCall(token_pos(),
(...skipping 12 matching lines...) Expand all
5606 compiler->GenerateCall(token_pos(), &label, stub_kind_, locs()); 5606 compiler->GenerateCall(token_pos(), &label, stub_kind_, locs());
5607 #if defined(DEBUG) 5607 #if defined(DEBUG)
5608 __ LoadImmediate(R4, kInvalidObjectPointer, kNoPP); 5608 __ LoadImmediate(R4, kInvalidObjectPointer, kNoPP);
5609 __ LoadImmediate(R5, kInvalidObjectPointer, kNoPP); 5609 __ LoadImmediate(R5, kInvalidObjectPointer, kNoPP);
5610 #endif 5610 #endif
5611 } 5611 }
5612 5612
5613 } // namespace dart 5613 } // namespace dart
5614 5614
5615 #endif // defined TARGET_ARCH_ARM64 5615 #endif // defined TARGET_ARCH_ARM64
OLDNEW
« no previous file with comments | « runtime/vm/intermediate_language_arm.cc ('k') | runtime/vm/intermediate_language_ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698