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

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

Issue 296003013: - Reduce the number of Isolate::Current() calls. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 7 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
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 19 matching lines...) Expand all
30 LocationSummary* result = new LocationSummary(0, 0, LocationSummary::kCall); 30 LocationSummary* result = new LocationSummary(0, 0, LocationSummary::kCall);
31 result->set_out(0, Location::RegisterLocation(R0)); 31 result->set_out(0, Location::RegisterLocation(R0));
32 return result; 32 return result;
33 } 33 }
34 34
35 35
36 LocationSummary* PushArgumentInstr::MakeLocationSummary(bool opt) const { 36 LocationSummary* PushArgumentInstr::MakeLocationSummary(bool opt) const {
37 const intptr_t kNumInputs = 1; 37 const intptr_t kNumInputs = 1;
38 const intptr_t kNumTemps= 0; 38 const intptr_t kNumTemps= 0;
39 LocationSummary* locs = 39 LocationSummary* locs =
40 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 40 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
41 locs->set_in(0, Location::AnyOrConstant(value())); 41 locs->set_in(0, Location::AnyOrConstant(value()));
42 return locs; 42 return locs;
43 } 43 }
44 44
45 45
46 void PushArgumentInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 46 void PushArgumentInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
47 // In SSA mode, we need an explicit push. Nothing to do in non-SSA mode 47 // In SSA mode, we need an explicit push. Nothing to do in non-SSA mode
48 // where PushArgument is handled by BindInstr::EmitNativeCode. 48 // where PushArgument is handled by BindInstr::EmitNativeCode.
49 if (compiler->is_optimizing()) { 49 if (compiler->is_optimizing()) {
50 Location value = locs()->in(0); 50 Location value = locs()->in(0);
51 if (value.IsRegister()) { 51 if (value.IsRegister()) {
52 __ Push(value.reg()); 52 __ Push(value.reg());
53 } else if (value.IsConstant()) { 53 } else if (value.IsConstant()) {
54 __ PushObject(value.constant(), PP); 54 __ PushObject(value.constant(), PP);
55 } else { 55 } else {
56 ASSERT(value.IsStackSlot()); 56 ASSERT(value.IsStackSlot());
57 const intptr_t value_offset = value.ToStackSlotOffset(); 57 const intptr_t value_offset = value.ToStackSlotOffset();
58 __ LoadFromOffset(TMP, FP, value_offset, PP); 58 __ LoadFromOffset(TMP, FP, value_offset, PP);
59 __ Push(TMP); 59 __ Push(TMP);
60 } 60 }
61 } 61 }
62 } 62 }
63 63
64 64
65 LocationSummary* ReturnInstr::MakeLocationSummary(bool opt) const { 65 LocationSummary* ReturnInstr::MakeLocationSummary(bool opt) const {
66 const intptr_t kNumInputs = 1; 66 const intptr_t kNumInputs = 1;
67 const intptr_t kNumTemps = 0; 67 const intptr_t kNumTemps = 0;
68 LocationSummary* locs = 68 LocationSummary* locs =
69 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 69 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
70 locs->set_in(0, Location::RegisterLocation(R0)); 70 locs->set_in(0, Location::RegisterLocation(R0));
71 return locs; 71 return locs;
72 } 72 }
73 73
74 74
75 // Attempt optimized compilation at return instruction instead of at the entry. 75 // Attempt optimized compilation at return instruction instead of at the entry.
76 // The entry needs to be patchable, no inlined objects are allowed in the area 76 // The entry needs to be patchable, no inlined objects are allowed in the area
77 // that will be overwritten by the patch instructions: a branch macro sequence. 77 // that will be overwritten by the patch instructions: a branch macro sequence.
78 void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 78 void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
79 const Register result = locs()->in(0).reg(); 79 const Register result = locs()->in(0).reg();
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 __ AddImmediate(result, result, Smi::RawValue(false_value), PP); 176 __ AddImmediate(result, result, Smi::RawValue(false_value), PP);
177 } 177 }
178 } 178 }
179 } 179 }
180 180
181 181
182 LocationSummary* ClosureCallInstr::MakeLocationSummary(bool opt) const { 182 LocationSummary* ClosureCallInstr::MakeLocationSummary(bool opt) const {
183 const intptr_t kNumInputs = 1; 183 const intptr_t kNumInputs = 1;
184 const intptr_t kNumTemps = 0; 184 const intptr_t kNumTemps = 0;
185 LocationSummary* summary = 185 LocationSummary* summary =
186 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 186 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kCall);
187 summary->set_in(0, Location::RegisterLocation(R0)); // Function. 187 summary->set_in(0, Location::RegisterLocation(R0)); // Function.
188 summary->set_out(0, Location::RegisterLocation(R0)); 188 summary->set_out(0, Location::RegisterLocation(R0));
189 return summary; 189 return summary;
190 } 190 }
191 191
192 192
193 void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 193 void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
194 // Load arguments descriptor in R4. 194 // Load arguments descriptor in R4.
195 int argument_count = ArgumentCount(); 195 int argument_count = ArgumentCount();
196 const Array& arguments_descriptor = 196 const Array& arguments_descriptor =
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 const VRegister dst = locs()->out(0).fpu_reg(); 286 const VRegister dst = locs()->out(0).fpu_reg();
287 __ LoadDImmediate(dst, Double::Cast(value()).value(), PP); 287 __ LoadDImmediate(dst, Double::Cast(value()).value(), PP);
288 } 288 }
289 } 289 }
290 290
291 291
292 LocationSummary* AssertAssignableInstr::MakeLocationSummary(bool opt) const { 292 LocationSummary* AssertAssignableInstr::MakeLocationSummary(bool opt) const {
293 const intptr_t kNumInputs = 3; 293 const intptr_t kNumInputs = 3;
294 const intptr_t kNumTemps = 0; 294 const intptr_t kNumTemps = 0;
295 LocationSummary* summary = 295 LocationSummary* summary =
296 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 296 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kCall);
297 summary->set_in(0, Location::RegisterLocation(R0)); // Value. 297 summary->set_in(0, Location::RegisterLocation(R0)); // Value.
298 summary->set_in(1, Location::RegisterLocation(R2)); // Instantiator. 298 summary->set_in(1, Location::RegisterLocation(R2)); // Instantiator.
299 summary->set_in(2, Location::RegisterLocation(R1)); // Type arguments. 299 summary->set_in(2, Location::RegisterLocation(R1)); // Type arguments.
300 summary->set_out(0, Location::RegisterLocation(R0)); 300 summary->set_out(0, Location::RegisterLocation(R0));
301 return summary; 301 return summary;
302 } 302 }
303 303
304 304
305 LocationSummary* AssertBooleanInstr::MakeLocationSummary(bool opt) const { 305 LocationSummary* AssertBooleanInstr::MakeLocationSummary(bool opt) const {
306 const intptr_t kNumInputs = 1; 306 const intptr_t kNumInputs = 1;
307 const intptr_t kNumTemps = 0; 307 const intptr_t kNumTemps = 0;
308 LocationSummary* locs = 308 LocationSummary* locs =
309 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 309 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kCall);
310 locs->set_in(0, Location::RegisterLocation(R0)); 310 locs->set_in(0, Location::RegisterLocation(R0));
311 locs->set_out(0, Location::RegisterLocation(R0)); 311 locs->set_out(0, Location::RegisterLocation(R0));
312 return locs; 312 return locs;
313 } 313 }
314 314
315 315
316 static void EmitAssertBoolean(Register reg, 316 static void EmitAssertBoolean(Register reg,
317 intptr_t token_pos, 317 intptr_t token_pos,
318 intptr_t deopt_id, 318 intptr_t deopt_id,
319 LocationSummary* locs, 319 LocationSummary* locs,
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 } 420 }
421 return true_condition; 421 return true_condition;
422 } 422 }
423 423
424 424
425 LocationSummary* EqualityCompareInstr::MakeLocationSummary(bool opt) const { 425 LocationSummary* EqualityCompareInstr::MakeLocationSummary(bool opt) const {
426 const intptr_t kNumInputs = 2; 426 const intptr_t kNumInputs = 2;
427 if (operation_cid() == kDoubleCid) { 427 if (operation_cid() == kDoubleCid) {
428 const intptr_t kNumTemps = 0; 428 const intptr_t kNumTemps = 0;
429 LocationSummary* locs = 429 LocationSummary* locs =
430 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 430 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSu mmary::kNoCall);
431 locs->set_in(0, Location::RequiresFpuRegister()); 431 locs->set_in(0, Location::RequiresFpuRegister());
432 locs->set_in(1, Location::RequiresFpuRegister()); 432 locs->set_in(1, Location::RequiresFpuRegister());
433 locs->set_out(0, Location::RequiresRegister()); 433 locs->set_out(0, Location::RequiresRegister());
434 return locs; 434 return locs;
435 } 435 }
436 if (operation_cid() == kSmiCid) { 436 if (operation_cid() == kSmiCid) {
437 const intptr_t kNumTemps = 0; 437 const intptr_t kNumTemps = 0;
438 LocationSummary* locs = 438 LocationSummary* locs =
439 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 439 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSu mmary::kNoCall);
440 locs->set_in(0, Location::RegisterOrConstant(left())); 440 locs->set_in(0, Location::RegisterOrConstant(left()));
441 // Only one input can be a constant operand. The case of two constant 441 // Only one input can be a constant operand. The case of two constant
442 // operands should be handled by constant propagation. 442 // operands should be handled by constant propagation.
443 // Only right can be a stack slot. 443 // Only right can be a stack slot.
444 locs->set_in(1, locs->in(0).IsConstant() 444 locs->set_in(1, locs->in(0).IsConstant()
445 ? Location::RequiresRegister() 445 ? Location::RequiresRegister()
446 : Location::RegisterOrConstant(right())); 446 : Location::RegisterOrConstant(right()));
447 locs->set_out(0, Location::RequiresRegister()); 447 locs->set_out(0, Location::RequiresRegister());
448 return locs; 448 return locs;
449 } 449 }
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
525 __ b(labels.false_label, VS); 525 __ b(labels.false_label, VS);
526 } 526 }
527 EmitBranchOnCondition(compiler, true_condition, labels); 527 EmitBranchOnCondition(compiler, true_condition, labels);
528 } 528 }
529 529
530 530
531 LocationSummary* TestSmiInstr::MakeLocationSummary(bool opt) const { 531 LocationSummary* TestSmiInstr::MakeLocationSummary(bool opt) const {
532 const intptr_t kNumInputs = 2; 532 const intptr_t kNumInputs = 2;
533 const intptr_t kNumTemps = 0; 533 const intptr_t kNumTemps = 0;
534 LocationSummary* locs = 534 LocationSummary* locs =
535 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 535 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
536 locs->set_in(0, Location::RequiresRegister()); 536 locs->set_in(0, Location::RequiresRegister());
537 // Only one input can be a constant operand. The case of two constant 537 // Only one input can be a constant operand. The case of two constant
538 // operands should be handled by constant propagation. 538 // operands should be handled by constant propagation.
539 locs->set_in(1, Location::RegisterOrConstant(right())); 539 locs->set_in(1, Location::RegisterOrConstant(right()));
540 return locs; 540 return locs;
541 } 541 }
542 542
543 543
544 Condition TestSmiInstr::EmitComparisonCode(FlowGraphCompiler* compiler, 544 Condition TestSmiInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
545 BranchLabels labels) { 545 BranchLabels labels) {
(...skipping 23 matching lines...) Expand all
569 BranchLabels labels = compiler->CreateBranchLabels(branch); 569 BranchLabels labels = compiler->CreateBranchLabels(branch);
570 Condition true_condition = EmitComparisonCode(compiler, labels); 570 Condition true_condition = EmitComparisonCode(compiler, labels);
571 EmitBranchOnCondition(compiler, true_condition, labels); 571 EmitBranchOnCondition(compiler, true_condition, labels);
572 } 572 }
573 573
574 574
575 LocationSummary* TestCidsInstr::MakeLocationSummary(bool opt) const { 575 LocationSummary* TestCidsInstr::MakeLocationSummary(bool opt) const {
576 const intptr_t kNumInputs = 1; 576 const intptr_t kNumInputs = 1;
577 const intptr_t kNumTemps = 1; 577 const intptr_t kNumTemps = 1;
578 LocationSummary* locs = 578 LocationSummary* locs =
579 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 579 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
580 locs->set_in(0, Location::RequiresRegister()); 580 locs->set_in(0, Location::RequiresRegister());
581 locs->set_temp(0, Location::RequiresRegister()); 581 locs->set_temp(0, Location::RequiresRegister());
582 locs->set_out(0, Location::RequiresRegister()); 582 locs->set_out(0, Location::RequiresRegister());
583 return locs; 583 return locs;
584 } 584 }
585 585
586 586
587 Condition TestCidsInstr::EmitComparisonCode(FlowGraphCompiler* compiler, 587 Condition TestCidsInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
588 BranchLabels labels) { 588 BranchLabels labels) {
589 ASSERT((kind() == Token::kIS) || (kind() == Token::kISNOT)); 589 ASSERT((kind() == Token::kIS) || (kind() == Token::kISNOT));
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
644 __ LoadObject(result_reg, Bool::True(), PP); 644 __ LoadObject(result_reg, Bool::True(), PP);
645 __ Bind(&done); 645 __ Bind(&done);
646 } 646 }
647 647
648 648
649 LocationSummary* RelationalOpInstr::MakeLocationSummary(bool opt) const { 649 LocationSummary* RelationalOpInstr::MakeLocationSummary(bool opt) const {
650 const intptr_t kNumInputs = 2; 650 const intptr_t kNumInputs = 2;
651 const intptr_t kNumTemps = 0; 651 const intptr_t kNumTemps = 0;
652 if (operation_cid() == kDoubleCid) { 652 if (operation_cid() == kDoubleCid) {
653 LocationSummary* summary = 653 LocationSummary* summary =
654 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 654 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSu mmary::kNoCall);
655 summary->set_in(0, Location::RequiresFpuRegister()); 655 summary->set_in(0, Location::RequiresFpuRegister());
656 summary->set_in(1, Location::RequiresFpuRegister()); 656 summary->set_in(1, Location::RequiresFpuRegister());
657 summary->set_out(0, Location::RequiresRegister()); 657 summary->set_out(0, Location::RequiresRegister());
658 return summary; 658 return summary;
659 } 659 }
660 ASSERT(operation_cid() == kSmiCid); 660 ASSERT(operation_cid() == kSmiCid);
661 LocationSummary* summary = 661 LocationSummary* summary =
662 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 662 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
663 summary->set_in(0, Location::RegisterOrConstant(left())); 663 summary->set_in(0, Location::RegisterOrConstant(left()));
664 // Only one input can be a constant operand. The case of two constant 664 // Only one input can be a constant operand. The case of two constant
665 // operands should be handled by constant propagation. 665 // operands should be handled by constant propagation.
666 summary->set_in(1, summary->in(0).IsConstant() 666 summary->set_in(1, summary->in(0).IsConstant()
667 ? Location::RequiresRegister() 667 ? Location::RequiresRegister()
668 : Location::RegisterOrConstant(right())); 668 : Location::RegisterOrConstant(right()));
669 summary->set_out(0, Location::RequiresRegister()); 669 summary->set_out(0, Location::RequiresRegister());
670 return summary; 670 return summary;
671 } 671 }
672 672
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
715 __ b(labels.false_label, VS); 715 __ b(labels.false_label, VS);
716 } 716 }
717 EmitBranchOnCondition(compiler, true_condition, labels); 717 EmitBranchOnCondition(compiler, true_condition, labels);
718 } 718 }
719 719
720 720
721 LocationSummary* NativeCallInstr::MakeLocationSummary(bool opt) const { 721 LocationSummary* NativeCallInstr::MakeLocationSummary(bool opt) const {
722 const intptr_t kNumInputs = 0; 722 const intptr_t kNumInputs = 0;
723 const intptr_t kNumTemps = 3; 723 const intptr_t kNumTemps = 3;
724 LocationSummary* locs = 724 LocationSummary* locs =
725 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 725 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kCall);
726 locs->set_temp(0, Location::RegisterLocation(R1)); 726 locs->set_temp(0, Location::RegisterLocation(R1));
727 locs->set_temp(1, Location::RegisterLocation(R2)); 727 locs->set_temp(1, Location::RegisterLocation(R2));
728 locs->set_temp(2, Location::RegisterLocation(R5)); 728 locs->set_temp(2, Location::RegisterLocation(R5));
729 locs->set_out(0, Location::RegisterLocation(R0)); 729 locs->set_out(0, Location::RegisterLocation(R0));
730 return locs; 730 return locs;
731 } 731 }
732 732
733 733
734 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 734 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
735 ASSERT(locs()->temp(0).reg() == R1); 735 ASSERT(locs()->temp(0).reg() == R1);
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
818 __ LoadImmediate(result, -1, PP); 818 __ LoadImmediate(result, -1, PP);
819 __ csel(result, TMP, result, EQ); 819 __ csel(result, TMP, result, EQ);
820 __ SmiTag(result); 820 __ SmiTag(result);
821 } 821 }
822 822
823 823
824 LocationSummary* StringInterpolateInstr::MakeLocationSummary(bool opt) const { 824 LocationSummary* StringInterpolateInstr::MakeLocationSummary(bool opt) const {
825 const intptr_t kNumInputs = 1; 825 const intptr_t kNumInputs = 1;
826 const intptr_t kNumTemps = 0; 826 const intptr_t kNumTemps = 0;
827 LocationSummary* summary = 827 LocationSummary* summary =
828 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 828 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kCall);
829 summary->set_in(0, Location::RegisterLocation(R0)); 829 summary->set_in(0, Location::RegisterLocation(R0));
830 summary->set_out(0, Location::RegisterLocation(R0)); 830 summary->set_out(0, Location::RegisterLocation(R0));
831 return summary; 831 return summary;
832 } 832 }
833 833
834 834
835 void StringInterpolateInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 835 void StringInterpolateInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
836 const Register array = locs()->in(0).reg(); 836 const Register array = locs()->in(0).reg();
837 __ Push(array); 837 __ Push(array);
838 const int kNumberOfArguments = 1; 838 const int kNumberOfArguments = 1;
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
950 UNIMPLEMENTED(); 950 UNIMPLEMENTED();
951 return kTagged; 951 return kTagged;
952 } 952 }
953 } 953 }
954 954
955 955
956 LocationSummary* LoadIndexedInstr::MakeLocationSummary(bool opt) const { 956 LocationSummary* LoadIndexedInstr::MakeLocationSummary(bool opt) const {
957 const intptr_t kNumInputs = 2; 957 const intptr_t kNumInputs = 2;
958 const intptr_t kNumTemps = 0; 958 const intptr_t kNumTemps = 0;
959 LocationSummary* locs = 959 LocationSummary* locs =
960 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 960 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
961 locs->set_in(0, Location::RequiresRegister()); 961 locs->set_in(0, Location::RequiresRegister());
962 // The smi index is either untagged (element size == 1), or it is left smi 962 // The smi index is either untagged (element size == 1), or it is left smi
963 // tagged (for all element sizes > 1). 963 // tagged (for all element sizes > 1).
964 // TODO(regis): Revisit and see if the index can be immediate. 964 // TODO(regis): Revisit and see if the index can be immediate.
965 locs->set_in(1, Location::WritableRegister()); 965 locs->set_in(1, Location::WritableRegister());
966 if ((representation() == kUnboxedDouble) || 966 if ((representation() == kUnboxedDouble) ||
967 (representation() == kUnboxedFloat32x4) || 967 (representation() == kUnboxedFloat32x4) ||
968 (representation() == kUnboxedInt32x4) || 968 (representation() == kUnboxedInt32x4) ||
969 (representation() == kUnboxedFloat64x2)) { 969 (representation() == kUnboxedFloat64x2)) {
970 locs->set_out(0, Location::RequiresFpuRegister()); 970 locs->set_out(0, Location::RequiresFpuRegister());
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
1118 UNREACHABLE(); 1118 UNREACHABLE();
1119 return kTagged; 1119 return kTagged;
1120 } 1120 }
1121 } 1121 }
1122 1122
1123 1123
1124 LocationSummary* StoreIndexedInstr::MakeLocationSummary(bool opt) const { 1124 LocationSummary* StoreIndexedInstr::MakeLocationSummary(bool opt) const {
1125 const intptr_t kNumInputs = 3; 1125 const intptr_t kNumInputs = 3;
1126 const intptr_t kNumTemps = 0; 1126 const intptr_t kNumTemps = 0;
1127 LocationSummary* locs = 1127 LocationSummary* locs =
1128 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 1128 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
1129 locs->set_in(0, Location::RequiresRegister()); 1129 locs->set_in(0, Location::RequiresRegister());
1130 // The smi index is either untagged (element size == 1), or it is left smi 1130 // The smi index is either untagged (element size == 1), or it is left smi
1131 // tagged (for all element sizes > 1). 1131 // tagged (for all element sizes > 1).
1132 // TODO(regis): Revisit and see if the index can be immediate. 1132 // TODO(regis): Revisit and see if the index can be immediate.
1133 locs->set_in(1, Location::WritableRegister()); 1133 locs->set_in(1, Location::WritableRegister());
1134 switch (class_id()) { 1134 switch (class_id()) {
1135 case kArrayCid: 1135 case kArrayCid:
1136 locs->set_in(2, ShouldEmitStoreBarrier() 1136 locs->set_in(2, ShouldEmitStoreBarrier()
1137 ? Location::WritableRegister() 1137 ? Location::WritableRegister()
1138 : Location::RegisterOrConstant(value())); 1138 : Location::RegisterOrConstant(value()));
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
1329 __ b(value_is_smi, EQ); 1329 __ b(value_is_smi, EQ);
1330 } 1330 }
1331 __ LoadClassId(value_cid_reg, value_reg, PP); 1331 __ LoadClassId(value_cid_reg, value_reg, PP);
1332 __ Bind(&done); 1332 __ Bind(&done);
1333 } 1333 }
1334 1334
1335 1335
1336 LocationSummary* GuardFieldInstr::MakeLocationSummary(bool opt) const { 1336 LocationSummary* GuardFieldInstr::MakeLocationSummary(bool opt) const {
1337 const intptr_t kNumInputs = 1; 1337 const intptr_t kNumInputs = 1;
1338 LocationSummary* summary = 1338 LocationSummary* summary =
1339 new LocationSummary(kNumInputs, 0, LocationSummary::kNoCall); 1339 new (isolate) LocationSummary(isolate, kNumInputs, 0, LocationSummary::kNo Call);
1340 summary->set_in(0, Location::RequiresRegister()); 1340 summary->set_in(0, Location::RequiresRegister());
1341 const bool field_has_length = field().needs_length_check(); 1341 const bool field_has_length = field().needs_length_check();
1342 summary->AddTemp(Location::RequiresRegister()); 1342 summary->AddTemp(Location::RequiresRegister());
1343 summary->AddTemp(Location::RequiresRegister()); 1343 summary->AddTemp(Location::RequiresRegister());
1344 const bool need_field_temp_reg = 1344 const bool need_field_temp_reg =
1345 field_has_length || (field().guarded_cid() == kIllegalCid); 1345 field_has_length || (field().guarded_cid() == kIllegalCid);
1346 if (need_field_temp_reg) { 1346 if (need_field_temp_reg) {
1347 summary->AddTemp(Location::RequiresRegister()); 1347 summary->AddTemp(Location::RequiresRegister());
1348 } 1348 }
1349 return summary; 1349 return summary;
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after
1683 private: 1683 private:
1684 StoreInstanceFieldInstr* instruction_; 1684 StoreInstanceFieldInstr* instruction_;
1685 const Class& cls_; 1685 const Class& cls_;
1686 }; 1686 };
1687 1687
1688 1688
1689 LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(bool opt) const { 1689 LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(bool opt) const {
1690 const intptr_t kNumInputs = 2; 1690 const intptr_t kNumInputs = 2;
1691 const intptr_t kNumTemps = 0; 1691 const intptr_t kNumTemps = 0;
1692 LocationSummary* summary = 1692 LocationSummary* summary =
1693 new LocationSummary(kNumInputs, kNumTemps, 1693 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps,
1694 !field().IsNull() && 1694 !field().IsNull() &&
1695 ((field().guarded_cid() == kIllegalCid) || is_initialization_) 1695 ((field().guarded_cid() == kIllegalCid) || is_initialization_)
1696 ? LocationSummary::kCallOnSlowPath 1696 ? LocationSummary::kCallOnSlowPath
1697 : LocationSummary::kNoCall); 1697 : LocationSummary::kNoCall);
1698 1698
1699 summary->set_in(0, Location::RequiresRegister()); 1699 summary->set_in(0, Location::RequiresRegister());
1700 if (IsUnboxedStore() && opt) { 1700 if (IsUnboxedStore() && opt) {
1701 summary->set_in(1, Location::RequiresFpuRegister()); 1701 summary->set_in(1, Location::RequiresFpuRegister());
1702 summary->AddTemp(Location::RequiresRegister()); 1702 summary->AddTemp(Location::RequiresRegister());
1703 summary->AddTemp(Location::RequiresRegister()); 1703 summary->AddTemp(Location::RequiresRegister());
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
1915 } 1915 }
1916 } 1916 }
1917 __ Bind(&skip_store); 1917 __ Bind(&skip_store);
1918 } 1918 }
1919 1919
1920 1920
1921 LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(bool opt) const { 1921 LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(bool opt) const {
1922 const intptr_t kNumInputs = 1; 1922 const intptr_t kNumInputs = 1;
1923 const intptr_t kNumTemps = 0; 1923 const intptr_t kNumTemps = 0;
1924 LocationSummary* summary = 1924 LocationSummary* summary =
1925 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 1925 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
1926 summary->set_in(0, Location::RequiresRegister()); 1926 summary->set_in(0, Location::RequiresRegister());
1927 summary->set_out(0, Location::RequiresRegister()); 1927 summary->set_out(0, Location::RequiresRegister());
1928 return summary; 1928 return summary;
1929 } 1929 }
1930 1930
1931 1931
1932 // When the parser is building an implicit static getter for optimization, 1932 // When the parser is building an implicit static getter for optimization,
1933 // it can generate a function body where deoptimization ids do not line up 1933 // it can generate a function body where deoptimization ids do not line up
1934 // with the unoptimized code. 1934 // with the unoptimized code.
1935 // 1935 //
1936 // This is safe only so long as LoadStaticFieldInstr cannot deoptimize. 1936 // This is safe only so long as LoadStaticFieldInstr cannot deoptimize.
1937 void LoadStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 1937 void LoadStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
1938 const Register field = locs()->in(0).reg(); 1938 const Register field = locs()->in(0).reg();
1939 const Register result = locs()->out(0).reg(); 1939 const Register result = locs()->out(0).reg();
1940 __ LoadFieldFromOffset(result, field, Field::value_offset(), PP); 1940 __ LoadFieldFromOffset(result, field, Field::value_offset(), PP);
1941 } 1941 }
1942 1942
1943 1943
1944 LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(bool opt) const { 1944 LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(bool opt) const {
1945 LocationSummary* locs = new LocationSummary(1, 1, LocationSummary::kNoCall); 1945 LocationSummary* locs = new (isolate) LocationSummary(isolate, 1, 1, LocationS ummary::kNoCall);
1946 locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister() 1946 locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister()
1947 : Location::RequiresRegister()); 1947 : Location::RequiresRegister());
1948 locs->set_temp(0, Location::RequiresRegister()); 1948 locs->set_temp(0, Location::RequiresRegister());
1949 return locs; 1949 return locs;
1950 } 1950 }
1951 1951
1952 1952
1953 void StoreStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 1953 void StoreStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
1954 const Register value = locs()->in(0).reg(); 1954 const Register value = locs()->in(0).reg();
1955 const Register temp = locs()->temp(0).reg(); 1955 const Register temp = locs()->temp(0).reg();
1956 1956
1957 __ LoadObject(temp, field(), PP); 1957 __ LoadObject(temp, field(), PP);
1958 if (this->value()->NeedsStoreBuffer()) { 1958 if (this->value()->NeedsStoreBuffer()) {
1959 __ StoreIntoObjectOffset( 1959 __ StoreIntoObjectOffset(
1960 temp, Field::value_offset(), value, PP, CanValueBeSmi()); 1960 temp, Field::value_offset(), value, PP, CanValueBeSmi());
1961 } else { 1961 } else {
1962 __ StoreIntoObjectOffsetNoBarrier(temp, Field::value_offset(), value, PP); 1962 __ StoreIntoObjectOffsetNoBarrier(temp, Field::value_offset(), value, PP);
1963 } 1963 }
1964 } 1964 }
1965 1965
1966 1966
1967 LocationSummary* InstanceOfInstr::MakeLocationSummary(bool opt) const { 1967 LocationSummary* InstanceOfInstr::MakeLocationSummary(bool opt) const {
1968 const intptr_t kNumInputs = 3; 1968 const intptr_t kNumInputs = 3;
1969 const intptr_t kNumTemps = 0; 1969 const intptr_t kNumTemps = 0;
1970 LocationSummary* summary = 1970 LocationSummary* summary =
1971 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 1971 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kCall);
1972 summary->set_in(0, Location::RegisterLocation(R0)); 1972 summary->set_in(0, Location::RegisterLocation(R0));
1973 summary->set_in(1, Location::RegisterLocation(R2)); 1973 summary->set_in(1, Location::RegisterLocation(R2));
1974 summary->set_in(2, Location::RegisterLocation(R1)); 1974 summary->set_in(2, Location::RegisterLocation(R1));
1975 summary->set_out(0, Location::RegisterLocation(R0)); 1975 summary->set_out(0, Location::RegisterLocation(R0));
1976 return summary; 1976 return summary;
1977 } 1977 }
1978 1978
1979 1979
1980 void InstanceOfInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 1980 void InstanceOfInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
1981 ASSERT(locs()->in(0).reg() == R0); // Value. 1981 ASSERT(locs()->in(0).reg() == R0); // Value.
1982 ASSERT(locs()->in(1).reg() == R2); // Instantiator. 1982 ASSERT(locs()->in(1).reg() == R2); // Instantiator.
1983 ASSERT(locs()->in(2).reg() == R1); // Instantiator type arguments. 1983 ASSERT(locs()->in(2).reg() == R1); // Instantiator type arguments.
1984 1984
1985 compiler->GenerateInstanceOf(token_pos(), 1985 compiler->GenerateInstanceOf(token_pos(),
1986 deopt_id(), 1986 deopt_id(),
1987 type(), 1987 type(),
1988 negate_result(), 1988 negate_result(),
1989 locs()); 1989 locs());
1990 ASSERT(locs()->out(0).reg() == R0); 1990 ASSERT(locs()->out(0).reg() == R0);
1991 } 1991 }
1992 1992
1993 1993
1994 LocationSummary* CreateArrayInstr::MakeLocationSummary(bool opt) const { 1994 LocationSummary* CreateArrayInstr::MakeLocationSummary(bool opt) const {
1995 const intptr_t kNumInputs = 2; 1995 const intptr_t kNumInputs = 2;
1996 const intptr_t kNumTemps = 0; 1996 const intptr_t kNumTemps = 0;
1997 LocationSummary* locs = 1997 LocationSummary* locs =
1998 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 1998 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kCall);
1999 locs->set_in(kElementTypePos, Location::RegisterLocation(R1)); 1999 locs->set_in(kElementTypePos, Location::RegisterLocation(R1));
2000 locs->set_in(kLengthPos, Location::RegisterLocation(R2)); 2000 locs->set_in(kLengthPos, Location::RegisterLocation(R2));
2001 locs->set_out(0, Location::RegisterLocation(R0)); 2001 locs->set_out(0, Location::RegisterLocation(R0));
2002 return locs; 2002 return locs;
2003 } 2003 }
2004 2004
2005 2005
2006 void CreateArrayInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 2006 void CreateArrayInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
2007 // Allocate the array. R2 = length, R1 = element type. 2007 // Allocate the array. R2 = length, R1 = element type.
2008 ASSERT(locs()->in(kElementTypePos).reg() == R1); 2008 ASSERT(locs()->in(kElementTypePos).reg() == R1);
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
2108 2108
2109 private: 2109 private:
2110 Instruction* instruction_; 2110 Instruction* instruction_;
2111 }; 2111 };
2112 2112
2113 2113
2114 LocationSummary* LoadFieldInstr::MakeLocationSummary(bool opt) const { 2114 LocationSummary* LoadFieldInstr::MakeLocationSummary(bool opt) const {
2115 const intptr_t kNumInputs = 1; 2115 const intptr_t kNumInputs = 1;
2116 const intptr_t kNumTemps = 0; 2116 const intptr_t kNumTemps = 0;
2117 LocationSummary* locs = 2117 LocationSummary* locs =
2118 new LocationSummary( 2118 new (isolate) LocationSummary(isolate,
2119 kNumInputs, kNumTemps, 2119 kNumInputs, kNumTemps,
2120 (opt && !IsPotentialUnboxedLoad()) 2120 (opt && !IsPotentialUnboxedLoad())
2121 ? LocationSummary::kNoCall 2121 ? LocationSummary::kNoCall
2122 : LocationSummary::kCallOnSlowPath); 2122 : LocationSummary::kCallOnSlowPath);
2123 2123
2124 locs->set_in(0, Location::RequiresRegister()); 2124 locs->set_in(0, Location::RequiresRegister());
2125 2125
2126 if (IsUnboxedLoad() && opt) { 2126 if (IsUnboxedLoad() && opt) {
2127 locs->AddTemp(Location::RequiresRegister()); 2127 locs->AddTemp(Location::RequiresRegister());
2128 } else if (IsPotentialUnboxedLoad()) { 2128 } else if (IsPotentialUnboxedLoad()) {
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
2248 } 2248 }
2249 __ LoadFieldFromOffset(result_reg, instance_reg, offset_in_bytes(), PP); 2249 __ LoadFieldFromOffset(result_reg, instance_reg, offset_in_bytes(), PP);
2250 __ Bind(&done); 2250 __ Bind(&done);
2251 } 2251 }
2252 2252
2253 2253
2254 LocationSummary* InstantiateTypeInstr::MakeLocationSummary(bool opt) const { 2254 LocationSummary* InstantiateTypeInstr::MakeLocationSummary(bool opt) const {
2255 const intptr_t kNumInputs = 1; 2255 const intptr_t kNumInputs = 1;
2256 const intptr_t kNumTemps = 0; 2256 const intptr_t kNumTemps = 0;
2257 LocationSummary* locs = 2257 LocationSummary* locs =
2258 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 2258 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kCall);
2259 locs->set_in(0, Location::RegisterLocation(R0)); 2259 locs->set_in(0, Location::RegisterLocation(R0));
2260 locs->set_out(0, Location::RegisterLocation(R0)); 2260 locs->set_out(0, Location::RegisterLocation(R0));
2261 return locs; 2261 return locs;
2262 } 2262 }
2263 2263
2264 2264
2265 void InstantiateTypeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 2265 void InstantiateTypeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
2266 const Register instantiator_reg = locs()->in(0).reg(); 2266 const Register instantiator_reg = locs()->in(0).reg();
2267 const Register result_reg = locs()->out(0).reg(); 2267 const Register result_reg = locs()->out(0).reg();
2268 2268
(...skipping 11 matching lines...) Expand all
2280 __ Pop(result_reg); // Pop instantiated type. 2280 __ Pop(result_reg); // Pop instantiated type.
2281 ASSERT(instantiator_reg == result_reg); 2281 ASSERT(instantiator_reg == result_reg);
2282 } 2282 }
2283 2283
2284 2284
2285 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary( 2285 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary(
2286 bool opt) const { 2286 bool opt) const {
2287 const intptr_t kNumInputs = 1; 2287 const intptr_t kNumInputs = 1;
2288 const intptr_t kNumTemps = 0; 2288 const intptr_t kNumTemps = 0;
2289 LocationSummary* locs = 2289 LocationSummary* locs =
2290 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 2290 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kCall);
2291 locs->set_in(0, Location::RegisterLocation(R0)); 2291 locs->set_in(0, Location::RegisterLocation(R0));
2292 locs->set_out(0, Location::RegisterLocation(R0)); 2292 locs->set_out(0, Location::RegisterLocation(R0));
2293 return locs; 2293 return locs;
2294 } 2294 }
2295 2295
2296 2296
2297 void InstantiateTypeArgumentsInstr::EmitNativeCode( 2297 void InstantiateTypeArgumentsInstr::EmitNativeCode(
2298 FlowGraphCompiler* compiler) { 2298 FlowGraphCompiler* compiler) {
2299 const Register instantiator_reg = locs()->in(0).reg(); 2299 const Register instantiator_reg = locs()->in(0).reg();
2300 const Register result_reg = locs()->out(0).reg(); 2300 const Register result_reg = locs()->out(0).reg();
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
2347 __ Drop(2); // Drop instantiator and uninstantiated type arguments. 2347 __ Drop(2); // Drop instantiator and uninstantiated type arguments.
2348 __ Pop(result_reg); // Pop instantiated type arguments. 2348 __ Pop(result_reg); // Pop instantiated type arguments.
2349 __ Bind(&type_arguments_instantiated); 2349 __ Bind(&type_arguments_instantiated);
2350 } 2350 }
2351 2351
2352 2352
2353 LocationSummary* AllocateContextInstr::MakeLocationSummary(bool opt) const { 2353 LocationSummary* AllocateContextInstr::MakeLocationSummary(bool opt) const {
2354 const intptr_t kNumInputs = 0; 2354 const intptr_t kNumInputs = 0;
2355 const intptr_t kNumTemps = 1; 2355 const intptr_t kNumTemps = 1;
2356 LocationSummary* locs = 2356 LocationSummary* locs =
2357 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 2357 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kCall);
2358 locs->set_temp(0, Location::RegisterLocation(R1)); 2358 locs->set_temp(0, Location::RegisterLocation(R1));
2359 locs->set_out(0, Location::RegisterLocation(R0)); 2359 locs->set_out(0, Location::RegisterLocation(R0));
2360 return locs; 2360 return locs;
2361 } 2361 }
2362 2362
2363 2363
2364 void AllocateContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 2364 void AllocateContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
2365 ASSERT(locs()->temp(0).reg() == R1); 2365 ASSERT(locs()->temp(0).reg() == R1);
2366 ASSERT(locs()->out(0).reg() == R0); 2366 ASSERT(locs()->out(0).reg() == R0);
2367 2367
2368 __ LoadImmediate(R1, num_context_variables(), PP); 2368 __ LoadImmediate(R1, num_context_variables(), PP);
2369 const ExternalLabel label("alloc_context", 2369 const ExternalLabel label("alloc_context",
2370 StubCode::AllocateContextEntryPoint()); 2370 StubCode::AllocateContextEntryPoint());
2371 compiler->GenerateCall(token_pos(), 2371 compiler->GenerateCall(token_pos(),
2372 &label, 2372 &label,
2373 PcDescriptors::kOther, 2373 PcDescriptors::kOther,
2374 locs()); 2374 locs());
2375 } 2375 }
2376 2376
2377 2377
2378 LocationSummary* CloneContextInstr::MakeLocationSummary(bool opt) const { 2378 LocationSummary* CloneContextInstr::MakeLocationSummary(bool opt) const {
2379 const intptr_t kNumInputs = 1; 2379 const intptr_t kNumInputs = 1;
2380 const intptr_t kNumTemps = 0; 2380 const intptr_t kNumTemps = 0;
2381 LocationSummary* locs = 2381 LocationSummary* locs =
2382 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 2382 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kCall);
2383 locs->set_in(0, Location::RegisterLocation(R0)); 2383 locs->set_in(0, Location::RegisterLocation(R0));
2384 locs->set_out(0, Location::RegisterLocation(R0)); 2384 locs->set_out(0, Location::RegisterLocation(R0));
2385 return locs; 2385 return locs;
2386 } 2386 }
2387 2387
2388 2388
2389 void CloneContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 2389 void CloneContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
2390 const Register context_value = locs()->in(0).reg(); 2390 const Register context_value = locs()->in(0).reg();
2391 const Register result = locs()->out(0).reg(); 2391 const Register result = locs()->out(0).reg();
2392 2392
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
2436 FP, exception_var().index() * kWordSize, PP); 2436 FP, exception_var().index() * kWordSize, PP);
2437 __ StoreToOffset(kStackTraceObjectReg, 2437 __ StoreToOffset(kStackTraceObjectReg,
2438 FP, stacktrace_var().index() * kWordSize, PP); 2438 FP, stacktrace_var().index() * kWordSize, PP);
2439 } 2439 }
2440 2440
2441 2441
2442 LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(bool opt) const { 2442 LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(bool opt) const {
2443 const intptr_t kNumInputs = 0; 2443 const intptr_t kNumInputs = 0;
2444 const intptr_t kNumTemps = 1; 2444 const intptr_t kNumTemps = 1;
2445 LocationSummary* summary = 2445 LocationSummary* summary =
2446 new LocationSummary(kNumInputs, 2446 new (isolate) LocationSummary(isolate, kNumInputs,
2447 kNumTemps, 2447 kNumTemps,
2448 LocationSummary::kCallOnSlowPath); 2448 LocationSummary::kCallOnSlowPath);
2449 summary->set_temp(0, Location::RequiresRegister()); 2449 summary->set_temp(0, Location::RequiresRegister());
2450 return summary; 2450 return summary;
2451 } 2451 }
2452 2452
2453 2453
2454 class CheckStackOverflowSlowPath : public SlowPathCode { 2454 class CheckStackOverflowSlowPath : public SlowPathCode {
2455 public: 2455 public:
2456 explicit CheckStackOverflowSlowPath(CheckStackOverflowInstr* instruction) 2456 explicit CheckStackOverflowSlowPath(CheckStackOverflowInstr* instruction)
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
2663 if (FLAG_throw_on_javascript_int_overflow) { 2663 if (FLAG_throw_on_javascript_int_overflow) {
2664 EmitJavascriptOverflowCheck(compiler, shift_left->range(), deopt, result); 2664 EmitJavascriptOverflowCheck(compiler, shift_left->range(), deopt, result);
2665 } 2665 }
2666 } 2666 }
2667 2667
2668 2668
2669 LocationSummary* BinarySmiOpInstr::MakeLocationSummary(bool opt) const { 2669 LocationSummary* BinarySmiOpInstr::MakeLocationSummary(bool opt) const {
2670 const intptr_t kNumInputs = 2; 2670 const intptr_t kNumInputs = 2;
2671 const intptr_t kNumTemps = 0; 2671 const intptr_t kNumTemps = 0;
2672 LocationSummary* summary = 2672 LocationSummary* summary =
2673 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 2673 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
2674 if (op_kind() == Token::kTRUNCDIV) { 2674 if (op_kind() == Token::kTRUNCDIV) {
2675 summary->set_in(0, Location::RequiresRegister()); 2675 summary->set_in(0, Location::RequiresRegister());
2676 if (RightIsPowerOfTwoConstant()) { 2676 if (RightIsPowerOfTwoConstant()) {
2677 ConstantInstr* right_constant = right()->definition()->AsConstant(); 2677 ConstantInstr* right_constant = right()->definition()->AsConstant();
2678 summary->set_in(1, Location::Constant(right_constant->value())); 2678 summary->set_in(1, Location::Constant(right_constant->value()));
2679 } else { 2679 } else {
2680 summary->set_in(1, Location::RequiresRegister()); 2680 summary->set_in(1, Location::RequiresRegister());
2681 } 2681 }
2682 summary->set_out(0, Location::RequiresRegister()); 2682 summary->set_out(0, Location::RequiresRegister());
2683 return summary; 2683 return summary;
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after
2988 } 2988 }
2989 2989
2990 2990
2991 LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(bool opt) const { 2991 LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(bool opt) const {
2992 intptr_t left_cid = left()->Type()->ToCid(); 2992 intptr_t left_cid = left()->Type()->ToCid();
2993 intptr_t right_cid = right()->Type()->ToCid(); 2993 intptr_t right_cid = right()->Type()->ToCid();
2994 ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid)); 2994 ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid));
2995 const intptr_t kNumInputs = 2; 2995 const intptr_t kNumInputs = 2;
2996 const intptr_t kNumTemps = 0; 2996 const intptr_t kNumTemps = 0;
2997 LocationSummary* summary = 2997 LocationSummary* summary =
2998 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 2998 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSummar y::kNoCall);
2999 summary->set_in(0, Location::RequiresRegister()); 2999 summary->set_in(0, Location::RequiresRegister());
3000 summary->set_in(1, Location::RequiresRegister()); 3000 summary->set_in(1, Location::RequiresRegister());
3001 return summary; 3001 return summary;
3002 } 3002 }
3003 3003
3004 3004
3005 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3005 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3006 Label* deopt = compiler->AddDeoptStub(deopt_id(), 3006 Label* deopt = compiler->AddDeoptStub(deopt_id(),
3007 ICData::kDeoptBinaryDoubleOp); 3007 ICData::kDeoptBinaryDoubleOp);
3008 intptr_t left_cid = left()->Type()->ToCid(); 3008 intptr_t left_cid = left()->Type()->ToCid();
3009 intptr_t right_cid = right()->Type()->ToCid(); 3009 intptr_t right_cid = right()->Type()->ToCid();
3010 const Register left = locs()->in(0).reg(); 3010 const Register left = locs()->in(0).reg();
3011 const Register right = locs()->in(1).reg(); 3011 const Register right = locs()->in(1).reg();
3012 if (left_cid == kSmiCid) { 3012 if (left_cid == kSmiCid) {
3013 __ tsti(right, kSmiTagMask); 3013 __ tsti(right, kSmiTagMask);
3014 } else if (right_cid == kSmiCid) { 3014 } else if (right_cid == kSmiCid) {
3015 __ tsti(left, kSmiTagMask); 3015 __ tsti(left, kSmiTagMask);
3016 } else { 3016 } else {
3017 __ orr(TMP, left, Operand(right)); 3017 __ orr(TMP, left, Operand(right));
3018 __ tsti(TMP, kSmiTagMask); 3018 __ tsti(TMP, kSmiTagMask);
3019 } 3019 }
3020 __ b(deopt, EQ); 3020 __ b(deopt, EQ);
3021 } 3021 }
3022 3022
3023 3023
3024 LocationSummary* BoxDoubleInstr::MakeLocationSummary(bool opt) const { 3024 LocationSummary* BoxDoubleInstr::MakeLocationSummary(bool opt) const {
3025 const intptr_t kNumInputs = 1; 3025 const intptr_t kNumInputs = 1;
3026 const intptr_t kNumTemps = 0; 3026 const intptr_t kNumTemps = 0;
3027 LocationSummary* summary = 3027 LocationSummary* summary =
3028 new LocationSummary(kNumInputs, 3028 new (isolate) LocationSummary(isolate, kNumInputs,
3029 kNumTemps, 3029 kNumTemps,
3030 LocationSummary::kCallOnSlowPath); 3030 LocationSummary::kCallOnSlowPath);
3031 summary->set_in(0, Location::RequiresFpuRegister()); 3031 summary->set_in(0, Location::RequiresFpuRegister());
3032 summary->set_out(0, Location::RequiresRegister()); 3032 summary->set_out(0, Location::RequiresRegister());
3033 return summary; 3033 return summary;
3034 } 3034 }
3035 3035
3036 3036
3037 void BoxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3037 void BoxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3038 BoxDoubleSlowPath* slow_path = new BoxDoubleSlowPath(this); 3038 BoxDoubleSlowPath* slow_path = new BoxDoubleSlowPath(this);
3039 compiler->AddSlowPathCode(slow_path); 3039 compiler->AddSlowPathCode(slow_path);
3040 3040
3041 const Register out_reg = locs()->out(0).reg(); 3041 const Register out_reg = locs()->out(0).reg();
3042 const VRegister value = locs()->in(0).fpu_reg(); 3042 const VRegister value = locs()->in(0).fpu_reg();
3043 3043
3044 __ TryAllocate(compiler->double_class(), 3044 __ TryAllocate(compiler->double_class(),
3045 slow_path->entry_label(), 3045 slow_path->entry_label(),
3046 out_reg, 3046 out_reg,
3047 PP); 3047 PP);
3048 __ Bind(slow_path->exit_label()); 3048 __ Bind(slow_path->exit_label());
3049 __ StoreDFieldToOffset(value, out_reg, Double::value_offset(), PP); 3049 __ StoreDFieldToOffset(value, out_reg, Double::value_offset(), PP);
3050 } 3050 }
3051 3051
3052 3052
3053 LocationSummary* UnboxDoubleInstr::MakeLocationSummary(bool opt) const { 3053 LocationSummary* UnboxDoubleInstr::MakeLocationSummary(bool opt) const {
3054 const intptr_t kNumInputs = 1; 3054 const intptr_t kNumInputs = 1;
3055 const intptr_t kNumTemps = 0; 3055 const intptr_t kNumTemps = 0;
3056 LocationSummary* summary = 3056 LocationSummary* summary =
3057 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3057 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3058 summary->set_in(0, Location::RequiresRegister()); 3058 summary->set_in(0, Location::RequiresRegister());
3059 summary->set_out(0, Location::RequiresFpuRegister()); 3059 summary->set_out(0, Location::RequiresFpuRegister());
3060 return summary; 3060 return summary;
3061 } 3061 }
3062 3062
3063 3063
3064 void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3064 void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3065 CompileType* value_type = value()->Type(); 3065 CompileType* value_type = value()->Type();
3066 const intptr_t value_cid = value_type->ToCid(); 3066 const intptr_t value_cid = value_type->ToCid();
3067 const Register value = locs()->in(0).reg(); 3067 const Register value = locs()->in(0).reg();
(...skipping 27 matching lines...) Expand all
3095 __ Bind(&done); 3095 __ Bind(&done);
3096 } 3096 }
3097 } 3097 }
3098 } 3098 }
3099 3099
3100 3100
3101 LocationSummary* BoxFloat32x4Instr::MakeLocationSummary(bool opt) const { 3101 LocationSummary* BoxFloat32x4Instr::MakeLocationSummary(bool opt) const {
3102 const intptr_t kNumInputs = 1; 3102 const intptr_t kNumInputs = 1;
3103 const intptr_t kNumTemps = 0; 3103 const intptr_t kNumTemps = 0;
3104 LocationSummary* summary = 3104 LocationSummary* summary =
3105 new LocationSummary(kNumInputs, 3105 new (isolate) LocationSummary(isolate, kNumInputs,
3106 kNumTemps, 3106 kNumTemps,
3107 LocationSummary::kCallOnSlowPath); 3107 LocationSummary::kCallOnSlowPath);
3108 summary->set_in(0, Location::RequiresFpuRegister()); 3108 summary->set_in(0, Location::RequiresFpuRegister());
3109 summary->set_out(0, Location::RequiresRegister()); 3109 summary->set_out(0, Location::RequiresRegister());
3110 return summary; 3110 return summary;
3111 } 3111 }
3112 3112
3113 3113
3114 void BoxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { 3114 void BoxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
3115 BoxFloat32x4SlowPath* slow_path = new BoxFloat32x4SlowPath(this); 3115 BoxFloat32x4SlowPath* slow_path = new BoxFloat32x4SlowPath(this);
3116 compiler->AddSlowPathCode(slow_path); 3116 compiler->AddSlowPathCode(slow_path);
3117 3117
3118 const Register out_reg = locs()->out(0).reg(); 3118 const Register out_reg = locs()->out(0).reg();
3119 const VRegister value = locs()->in(0).fpu_reg(); 3119 const VRegister value = locs()->in(0).fpu_reg();
3120 3120
3121 __ TryAllocate(compiler->float32x4_class(), 3121 __ TryAllocate(compiler->float32x4_class(),
3122 slow_path->entry_label(), 3122 slow_path->entry_label(),
3123 out_reg, 3123 out_reg,
3124 PP); 3124 PP);
3125 __ Bind(slow_path->exit_label()); 3125 __ Bind(slow_path->exit_label());
3126 3126
3127 __ StoreQFieldToOffset(value, out_reg, Float32x4::value_offset(), PP); 3127 __ StoreQFieldToOffset(value, out_reg, Float32x4::value_offset(), PP);
3128 } 3128 }
3129 3129
3130 3130
3131 LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary(bool opt) const { 3131 LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary(bool opt) const {
3132 const intptr_t kNumInputs = 1; 3132 const intptr_t kNumInputs = 1;
3133 const intptr_t kNumTemps = 0; 3133 const intptr_t kNumTemps = 0;
3134 LocationSummary* summary = 3134 LocationSummary* summary =
3135 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3135 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3136 summary->set_in(0, Location::RequiresRegister()); 3136 summary->set_in(0, Location::RequiresRegister());
3137 summary->set_out(0, Location::RequiresFpuRegister()); 3137 summary->set_out(0, Location::RequiresFpuRegister());
3138 return summary; 3138 return summary;
3139 } 3139 }
3140 3140
3141 3141
3142 void UnboxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { 3142 void UnboxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
3143 const intptr_t value_cid = value()->Type()->ToCid(); 3143 const intptr_t value_cid = value()->Type()->ToCid();
3144 const Register value = locs()->in(0).reg(); 3144 const Register value = locs()->in(0).reg();
3145 const VRegister result = locs()->out(0).fpu_reg(); 3145 const VRegister result = locs()->out(0).fpu_reg();
3146 3146
3147 if (value_cid != kFloat32x4Cid) { 3147 if (value_cid != kFloat32x4Cid) {
3148 Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass); 3148 Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
3149 __ tsti(value, kSmiTagMask); 3149 __ tsti(value, kSmiTagMask);
3150 __ b(deopt, EQ); 3150 __ b(deopt, EQ);
3151 __ CompareClassId(value, kFloat32x4Cid, PP); 3151 __ CompareClassId(value, kFloat32x4Cid, PP);
3152 __ b(deopt, NE); 3152 __ b(deopt, NE);
3153 } 3153 }
3154 3154
3155 __ LoadQFieldFromOffset(result, value, Float32x4::value_offset(), PP); 3155 __ LoadQFieldFromOffset(result, value, Float32x4::value_offset(), PP);
3156 } 3156 }
3157 3157
3158 3158
3159 LocationSummary* BoxFloat64x2Instr::MakeLocationSummary(bool opt) const { 3159 LocationSummary* BoxFloat64x2Instr::MakeLocationSummary(bool opt) const {
3160 const intptr_t kNumInputs = 1; 3160 const intptr_t kNumInputs = 1;
3161 const intptr_t kNumTemps = 0; 3161 const intptr_t kNumTemps = 0;
3162 LocationSummary* summary = 3162 LocationSummary* summary =
3163 new LocationSummary(kNumInputs, 3163 new (isolate) LocationSummary(isolate, kNumInputs,
3164 kNumTemps, 3164 kNumTemps,
3165 LocationSummary::kCallOnSlowPath); 3165 LocationSummary::kCallOnSlowPath);
3166 summary->set_in(0, Location::RequiresFpuRegister()); 3166 summary->set_in(0, Location::RequiresFpuRegister());
3167 summary->set_out(0, Location::RequiresRegister()); 3167 summary->set_out(0, Location::RequiresRegister());
3168 return summary; 3168 return summary;
3169 } 3169 }
3170 3170
3171 3171
3172 void BoxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) { 3172 void BoxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
3173 BoxFloat64x2SlowPath* slow_path = new BoxFloat64x2SlowPath(this); 3173 BoxFloat64x2SlowPath* slow_path = new BoxFloat64x2SlowPath(this);
3174 compiler->AddSlowPathCode(slow_path); 3174 compiler->AddSlowPathCode(slow_path);
3175 3175
3176 const Register out_reg = locs()->out(0).reg(); 3176 const Register out_reg = locs()->out(0).reg();
3177 const VRegister value = locs()->in(0).fpu_reg(); 3177 const VRegister value = locs()->in(0).fpu_reg();
3178 3178
3179 __ TryAllocate(compiler->float64x2_class(), 3179 __ TryAllocate(compiler->float64x2_class(),
3180 slow_path->entry_label(), 3180 slow_path->entry_label(),
3181 out_reg, 3181 out_reg,
3182 PP); 3182 PP);
3183 __ Bind(slow_path->exit_label()); 3183 __ Bind(slow_path->exit_label());
3184 3184
3185 __ StoreQFieldToOffset(value, out_reg, Float64x2::value_offset(), PP); 3185 __ StoreQFieldToOffset(value, out_reg, Float64x2::value_offset(), PP);
3186 } 3186 }
3187 3187
3188 3188
3189 LocationSummary* UnboxFloat64x2Instr::MakeLocationSummary(bool opt) const { 3189 LocationSummary* UnboxFloat64x2Instr::MakeLocationSummary(bool opt) const {
3190 const intptr_t kNumInputs = 1; 3190 const intptr_t kNumInputs = 1;
3191 const intptr_t kNumTemps = 0; 3191 const intptr_t kNumTemps = 0;
3192 LocationSummary* summary = 3192 LocationSummary* summary =
3193 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3193 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3194 summary->set_in(0, Location::RequiresRegister()); 3194 summary->set_in(0, Location::RequiresRegister());
3195 summary->set_out(0, Location::RequiresFpuRegister()); 3195 summary->set_out(0, Location::RequiresFpuRegister());
3196 return summary; 3196 return summary;
3197 } 3197 }
3198 3198
3199 3199
3200 void UnboxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) { 3200 void UnboxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
3201 const intptr_t value_cid = value()->Type()->ToCid(); 3201 const intptr_t value_cid = value()->Type()->ToCid();
3202 const Register value = locs()->in(0).reg(); 3202 const Register value = locs()->in(0).reg();
3203 const VRegister result = locs()->out(0).fpu_reg(); 3203 const VRegister result = locs()->out(0).fpu_reg();
3204 3204
3205 if (value_cid != kFloat64x2Cid) { 3205 if (value_cid != kFloat64x2Cid) {
3206 Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass); 3206 Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
3207 __ tsti(value, kSmiTagMask); 3207 __ tsti(value, kSmiTagMask);
3208 __ b(deopt, EQ); 3208 __ b(deopt, EQ);
3209 __ CompareClassId(value, kFloat64x2Cid, PP); 3209 __ CompareClassId(value, kFloat64x2Cid, PP);
3210 __ b(deopt, NE); 3210 __ b(deopt, NE);
3211 } 3211 }
3212 3212
3213 __ LoadQFieldFromOffset(result, value, Float64x2::value_offset(), PP); 3213 __ LoadQFieldFromOffset(result, value, Float64x2::value_offset(), PP);
3214 } 3214 }
3215 3215
3216 3216
3217 LocationSummary* BoxInt32x4Instr::MakeLocationSummary(bool opt) const { 3217 LocationSummary* BoxInt32x4Instr::MakeLocationSummary(bool opt) const {
3218 const intptr_t kNumInputs = 1; 3218 const intptr_t kNumInputs = 1;
3219 const intptr_t kNumTemps = 0; 3219 const intptr_t kNumTemps = 0;
3220 LocationSummary* summary = 3220 LocationSummary* summary =
3221 new LocationSummary(kNumInputs, 3221 new (isolate) LocationSummary(isolate, kNumInputs,
3222 kNumTemps, 3222 kNumTemps,
3223 LocationSummary::kCallOnSlowPath); 3223 LocationSummary::kCallOnSlowPath);
3224 summary->set_in(0, Location::RequiresFpuRegister()); 3224 summary->set_in(0, Location::RequiresFpuRegister());
3225 summary->set_out(0, Location::RequiresRegister()); 3225 summary->set_out(0, Location::RequiresRegister());
3226 return summary; 3226 return summary;
3227 } 3227 }
3228 3228
3229 3229
3230 class BoxInt32x4SlowPath : public SlowPathCode { 3230 class BoxInt32x4SlowPath : public SlowPathCode {
3231 public: 3231 public:
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
3273 __ Bind(slow_path->exit_label()); 3273 __ Bind(slow_path->exit_label());
3274 3274
3275 __ StoreQFieldToOffset(value, out_reg, Int32x4::value_offset(), PP); 3275 __ StoreQFieldToOffset(value, out_reg, Int32x4::value_offset(), PP);
3276 } 3276 }
3277 3277
3278 3278
3279 LocationSummary* UnboxInt32x4Instr::MakeLocationSummary(bool opt) const { 3279 LocationSummary* UnboxInt32x4Instr::MakeLocationSummary(bool opt) const {
3280 const intptr_t kNumInputs = 1; 3280 const intptr_t kNumInputs = 1;
3281 const intptr_t kNumTemps = 0; 3281 const intptr_t kNumTemps = 0;
3282 LocationSummary* summary = 3282 LocationSummary* summary =
3283 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3283 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3284 summary->set_in(0, Location::RequiresRegister()); 3284 summary->set_in(0, Location::RequiresRegister());
3285 summary->set_out(0, Location::RequiresFpuRegister()); 3285 summary->set_out(0, Location::RequiresFpuRegister());
3286 return summary; 3286 return summary;
3287 } 3287 }
3288 3288
3289 3289
3290 void UnboxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { 3290 void UnboxInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
3291 const intptr_t value_cid = value()->Type()->ToCid(); 3291 const intptr_t value_cid = value()->Type()->ToCid();
3292 const Register value = locs()->in(0).reg(); 3292 const Register value = locs()->in(0).reg();
3293 const VRegister result = locs()->out(0).fpu_reg(); 3293 const VRegister result = locs()->out(0).fpu_reg();
3294 3294
3295 if (value_cid != kInt32x4Cid) { 3295 if (value_cid != kInt32x4Cid) {
3296 Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass); 3296 Label* deopt = compiler->AddDeoptStub(deopt_id_, ICData::kDeoptCheckClass);
3297 __ tsti(value, kSmiTagMask); 3297 __ tsti(value, kSmiTagMask);
3298 __ b(deopt, EQ); 3298 __ b(deopt, EQ);
3299 __ CompareClassId(value, kInt32x4Cid, PP); 3299 __ CompareClassId(value, kInt32x4Cid, PP);
3300 __ b(deopt, NE); 3300 __ b(deopt, NE);
3301 } 3301 }
3302 3302
3303 __ LoadQFieldFromOffset(result, value, Int32x4::value_offset(), PP); 3303 __ LoadQFieldFromOffset(result, value, Int32x4::value_offset(), PP);
3304 } 3304 }
3305 3305
3306 3306
3307 LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(bool opt) const { 3307 LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(bool opt) const {
3308 const intptr_t kNumInputs = 2; 3308 const intptr_t kNumInputs = 2;
3309 const intptr_t kNumTemps = 0; 3309 const intptr_t kNumTemps = 0;
3310 LocationSummary* summary = 3310 LocationSummary* summary =
3311 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3311 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3312 summary->set_in(0, Location::RequiresFpuRegister()); 3312 summary->set_in(0, Location::RequiresFpuRegister());
3313 summary->set_in(1, Location::RequiresFpuRegister()); 3313 summary->set_in(1, Location::RequiresFpuRegister());
3314 summary->set_out(0, Location::RequiresFpuRegister()); 3314 summary->set_out(0, Location::RequiresFpuRegister());
3315 return summary; 3315 return summary;
3316 } 3316 }
3317 3317
3318 3318
3319 void BinaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3319 void BinaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3320 const VRegister left = locs()->in(0).fpu_reg(); 3320 const VRegister left = locs()->in(0).fpu_reg();
3321 const VRegister right = locs()->in(1).fpu_reg(); 3321 const VRegister right = locs()->in(1).fpu_reg();
3322 const VRegister result = locs()->out(0).fpu_reg(); 3322 const VRegister result = locs()->out(0).fpu_reg();
3323 switch (op_kind()) { 3323 switch (op_kind()) {
3324 case Token::kADD: __ faddd(result, left, right); break; 3324 case Token::kADD: __ faddd(result, left, right); break;
3325 case Token::kSUB: __ fsubd(result, left, right); break; 3325 case Token::kSUB: __ fsubd(result, left, right); break;
3326 case Token::kMUL: __ fmuld(result, left, right); break; 3326 case Token::kMUL: __ fmuld(result, left, right); break;
3327 case Token::kDIV: __ fdivd(result, left, right); break; 3327 case Token::kDIV: __ fdivd(result, left, right); break;
3328 default: UNREACHABLE(); 3328 default: UNREACHABLE();
3329 } 3329 }
3330 } 3330 }
3331 3331
3332 3332
3333 LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(bool opt) const { 3333 LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(bool opt) const {
3334 const intptr_t kNumInputs = 2; 3334 const intptr_t kNumInputs = 2;
3335 const intptr_t kNumTemps = 0; 3335 const intptr_t kNumTemps = 0;
3336 LocationSummary* summary = 3336 LocationSummary* summary =
3337 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3337 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3338 summary->set_in(0, Location::RequiresFpuRegister()); 3338 summary->set_in(0, Location::RequiresFpuRegister());
3339 summary->set_in(1, Location::RequiresFpuRegister()); 3339 summary->set_in(1, Location::RequiresFpuRegister());
3340 summary->set_out(0, Location::RequiresFpuRegister()); 3340 summary->set_out(0, Location::RequiresFpuRegister());
3341 return summary; 3341 return summary;
3342 } 3342 }
3343 3343
3344 3344
3345 void BinaryFloat32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3345 void BinaryFloat32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3346 const VRegister left = locs()->in(0).fpu_reg(); 3346 const VRegister left = locs()->in(0).fpu_reg();
3347 const VRegister right = locs()->in(1).fpu_reg(); 3347 const VRegister right = locs()->in(1).fpu_reg();
3348 const VRegister result = locs()->out(0).fpu_reg(); 3348 const VRegister result = locs()->out(0).fpu_reg();
3349 3349
3350 switch (op_kind()) { 3350 switch (op_kind()) {
3351 case Token::kADD: __ vadds(result, left, right); break; 3351 case Token::kADD: __ vadds(result, left, right); break;
3352 case Token::kSUB: __ vsubs(result, left, right); break; 3352 case Token::kSUB: __ vsubs(result, left, right); break;
3353 case Token::kMUL: __ vmuls(result, left, right); break; 3353 case Token::kMUL: __ vmuls(result, left, right); break;
3354 case Token::kDIV: __ vdivs(result, left, right); break; 3354 case Token::kDIV: __ vdivs(result, left, right); break;
3355 default: UNREACHABLE(); 3355 default: UNREACHABLE();
3356 } 3356 }
3357 } 3357 }
3358 3358
3359 3359
3360 LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(bool opt) const { 3360 LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(bool opt) const {
3361 const intptr_t kNumInputs = 2; 3361 const intptr_t kNumInputs = 2;
3362 const intptr_t kNumTemps = 0; 3362 const intptr_t kNumTemps = 0;
3363 LocationSummary* summary = 3363 LocationSummary* summary =
3364 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3364 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3365 summary->set_in(0, Location::RequiresFpuRegister()); 3365 summary->set_in(0, Location::RequiresFpuRegister());
3366 summary->set_in(1, Location::RequiresFpuRegister()); 3366 summary->set_in(1, Location::RequiresFpuRegister());
3367 summary->set_out(0, Location::RequiresFpuRegister()); 3367 summary->set_out(0, Location::RequiresFpuRegister());
3368 return summary; 3368 return summary;
3369 } 3369 }
3370 3370
3371 3371
3372 void BinaryFloat64x2OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3372 void BinaryFloat64x2OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3373 const VRegister left = locs()->in(0).fpu_reg(); 3373 const VRegister left = locs()->in(0).fpu_reg();
3374 const VRegister right = locs()->in(1).fpu_reg(); 3374 const VRegister right = locs()->in(1).fpu_reg();
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
3415 void Simd32x4GetSignMaskInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3415 void Simd32x4GetSignMaskInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3416 UNIMPLEMENTED(); 3416 UNIMPLEMENTED();
3417 } 3417 }
3418 3418
3419 3419
3420 LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary( 3420 LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary(
3421 bool opt) const { 3421 bool opt) const {
3422 const intptr_t kNumInputs = 4; 3422 const intptr_t kNumInputs = 4;
3423 const intptr_t kNumTemps = 0; 3423 const intptr_t kNumTemps = 0;
3424 LocationSummary* summary = 3424 LocationSummary* summary =
3425 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3425 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3426 summary->set_in(0, Location::RequiresFpuRegister()); 3426 summary->set_in(0, Location::RequiresFpuRegister());
3427 summary->set_in(1, Location::RequiresFpuRegister()); 3427 summary->set_in(1, Location::RequiresFpuRegister());
3428 summary->set_in(2, Location::RequiresFpuRegister()); 3428 summary->set_in(2, Location::RequiresFpuRegister());
3429 summary->set_in(3, Location::RequiresFpuRegister()); 3429 summary->set_in(3, Location::RequiresFpuRegister());
3430 summary->set_out(0, Location::RequiresFpuRegister()); 3430 summary->set_out(0, Location::RequiresFpuRegister());
3431 return summary; 3431 return summary;
3432 } 3432 }
3433 3433
3434 3434
3435 void Float32x4ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3435 void Float32x4ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
(...skipping 11 matching lines...) Expand all
3447 __ vinss(r, 2, v2, 2); 3447 __ vinss(r, 2, v2, 2);
3448 __ fcvtsd(v3, v3); 3448 __ fcvtsd(v3, v3);
3449 __ vinss(r, 3, v3, 3); 3449 __ vinss(r, 3, v3, 3);
3450 } 3450 }
3451 3451
3452 3452
3453 LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(bool opt) const { 3453 LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(bool opt) const {
3454 const intptr_t kNumInputs = 0; 3454 const intptr_t kNumInputs = 0;
3455 const intptr_t kNumTemps = 0; 3455 const intptr_t kNumTemps = 0;
3456 LocationSummary* summary = 3456 LocationSummary* summary =
3457 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3457 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3458 summary->set_out(0, Location::RequiresFpuRegister()); 3458 summary->set_out(0, Location::RequiresFpuRegister());
3459 return summary; 3459 return summary;
3460 } 3460 }
3461 3461
3462 3462
3463 void Float32x4ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3463 void Float32x4ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3464 const VRegister v = locs()->out(0).fpu_reg(); 3464 const VRegister v = locs()->out(0).fpu_reg();
3465 __ LoadDImmediate(v, 0.0, PP); 3465 __ LoadDImmediate(v, 0.0, PP);
3466 } 3466 }
3467 3467
3468 3468
3469 LocationSummary* Float32x4SplatInstr::MakeLocationSummary(bool opt) const { 3469 LocationSummary* Float32x4SplatInstr::MakeLocationSummary(bool opt) const {
3470 const intptr_t kNumInputs = 1; 3470 const intptr_t kNumInputs = 1;
3471 const intptr_t kNumTemps = 0; 3471 const intptr_t kNumTemps = 0;
3472 LocationSummary* summary = 3472 LocationSummary* summary =
3473 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3473 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3474 summary->set_in(0, Location::RequiresFpuRegister()); 3474 summary->set_in(0, Location::RequiresFpuRegister());
3475 summary->set_out(0, Location::RequiresFpuRegister()); 3475 summary->set_out(0, Location::RequiresFpuRegister());
3476 return summary; 3476 return summary;
3477 } 3477 }
3478 3478
3479 3479
3480 void Float32x4SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3480 void Float32x4SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3481 const VRegister value = locs()->in(0).fpu_reg(); 3481 const VRegister value = locs()->in(0).fpu_reg();
3482 const VRegister result = locs()->out(0).fpu_reg(); 3482 const VRegister result = locs()->out(0).fpu_reg();
3483 3483
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
3519 3519
3520 void Float32x4SqrtInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3520 void Float32x4SqrtInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3521 UNIMPLEMENTED(); 3521 UNIMPLEMENTED();
3522 } 3522 }
3523 3523
3524 3524
3525 LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(bool opt) const { 3525 LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(bool opt) const {
3526 const intptr_t kNumInputs = 2; 3526 const intptr_t kNumInputs = 2;
3527 const intptr_t kNumTemps = 0; 3527 const intptr_t kNumTemps = 0;
3528 LocationSummary* summary = 3528 LocationSummary* summary =
3529 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3529 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3530 summary->set_in(0, Location::RequiresFpuRegister()); 3530 summary->set_in(0, Location::RequiresFpuRegister());
3531 summary->set_in(1, Location::RequiresFpuRegister()); 3531 summary->set_in(1, Location::RequiresFpuRegister());
3532 summary->set_out(0, Location::RequiresFpuRegister()); 3532 summary->set_out(0, Location::RequiresFpuRegister());
3533 return summary; 3533 return summary;
3534 } 3534 }
3535 3535
3536 3536
3537 void Float32x4ScaleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3537 void Float32x4ScaleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3538 const VRegister left = locs()->in(0).fpu_reg(); 3538 const VRegister left = locs()->in(0).fpu_reg();
3539 const VRegister right = locs()->in(1).fpu_reg(); 3539 const VRegister right = locs()->in(1).fpu_reg();
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
3591 3591
3592 void Float32x4ToInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { 3592 void Float32x4ToInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
3593 UNIMPLEMENTED(); 3593 UNIMPLEMENTED();
3594 } 3594 }
3595 3595
3596 3596
3597 LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(bool opt) const { 3597 LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(bool opt) const {
3598 const intptr_t kNumInputs = 1; 3598 const intptr_t kNumInputs = 1;
3599 const intptr_t kNumTemps = 0; 3599 const intptr_t kNumTemps = 0;
3600 LocationSummary* summary = 3600 LocationSummary* summary =
3601 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3601 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3602 summary->set_in(0, Location::RequiresFpuRegister()); 3602 summary->set_in(0, Location::RequiresFpuRegister());
3603 summary->set_out(0, Location::RequiresFpuRegister()); 3603 summary->set_out(0, Location::RequiresFpuRegister());
3604 return summary; 3604 return summary;
3605 } 3605 }
3606 3606
3607 3607
3608 void Simd64x2ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3608 void Simd64x2ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3609 const VRegister value = locs()->in(0).fpu_reg(); 3609 const VRegister value = locs()->in(0).fpu_reg();
3610 const VRegister result = locs()->out(0).fpu_reg(); 3610 const VRegister result = locs()->out(0).fpu_reg();
3611 3611
3612 switch (op_kind()) { 3612 switch (op_kind()) {
3613 case MethodRecognizer::kFloat64x2GetX: 3613 case MethodRecognizer::kFloat64x2GetX:
3614 __ vinsd(result, 0, value, 0); 3614 __ vinsd(result, 0, value, 0);
3615 break; 3615 break;
3616 case MethodRecognizer::kFloat64x2GetY: 3616 case MethodRecognizer::kFloat64x2GetY:
3617 __ vinsd(result, 0, value, 1); 3617 __ vinsd(result, 0, value, 1);
3618 break; 3618 break;
3619 default: UNREACHABLE(); 3619 default: UNREACHABLE();
3620 } 3620 }
3621 } 3621 }
3622 3622
3623 3623
3624 LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(bool opt) const { 3624 LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(bool opt) const {
3625 const intptr_t kNumInputs = 0; 3625 const intptr_t kNumInputs = 0;
3626 const intptr_t kNumTemps = 0; 3626 const intptr_t kNumTemps = 0;
3627 LocationSummary* summary = 3627 LocationSummary* summary =
3628 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3628 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3629 summary->set_out(0, Location::RequiresFpuRegister()); 3629 summary->set_out(0, Location::RequiresFpuRegister());
3630 return summary; 3630 return summary;
3631 } 3631 }
3632 3632
3633 3633
3634 void Float64x2ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3634 void Float64x2ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3635 const VRegister v = locs()->out(0).fpu_reg(); 3635 const VRegister v = locs()->out(0).fpu_reg();
3636 __ LoadDImmediate(v, 0.0, PP); 3636 __ LoadDImmediate(v, 0.0, PP);
3637 } 3637 }
3638 3638
3639 3639
3640 LocationSummary* Float64x2SplatInstr::MakeLocationSummary(bool opt) const { 3640 LocationSummary* Float64x2SplatInstr::MakeLocationSummary(bool opt) const {
3641 const intptr_t kNumInputs = 1; 3641 const intptr_t kNumInputs = 1;
3642 const intptr_t kNumTemps = 0; 3642 const intptr_t kNumTemps = 0;
3643 LocationSummary* summary = 3643 LocationSummary* summary =
3644 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3644 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3645 summary->set_in(0, Location::RequiresFpuRegister()); 3645 summary->set_in(0, Location::RequiresFpuRegister());
3646 summary->set_out(0, Location::RequiresFpuRegister()); 3646 summary->set_out(0, Location::RequiresFpuRegister());
3647 return summary; 3647 return summary;
3648 } 3648 }
3649 3649
3650 3650
3651 void Float64x2SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3651 void Float64x2SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3652 const VRegister value = locs()->in(0).fpu_reg(); 3652 const VRegister value = locs()->in(0).fpu_reg();
3653 const VRegister result = locs()->out(0).fpu_reg(); 3653 const VRegister result = locs()->out(0).fpu_reg();
3654 __ vdupd(result, value, 0); 3654 __ vdupd(result, value, 0);
3655 } 3655 }
3656 3656
3657 3657
3658 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary( 3658 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary(
3659 bool opt) const { 3659 bool opt) const {
3660 const intptr_t kNumInputs = 2; 3660 const intptr_t kNumInputs = 2;
3661 const intptr_t kNumTemps = 0; 3661 const intptr_t kNumTemps = 0;
3662 LocationSummary* summary = 3662 LocationSummary* summary =
3663 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3663 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3664 summary->set_in(0, Location::RequiresFpuRegister()); 3664 summary->set_in(0, Location::RequiresFpuRegister());
3665 summary->set_in(1, Location::RequiresFpuRegister()); 3665 summary->set_in(1, Location::RequiresFpuRegister());
3666 summary->set_out(0, Location::RequiresFpuRegister()); 3666 summary->set_out(0, Location::RequiresFpuRegister());
3667 return summary; 3667 return summary;
3668 } 3668 }
3669 3669
3670 3670
3671 void Float64x2ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3671 void Float64x2ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3672 const VRegister v0 = locs()->in(0).fpu_reg(); 3672 const VRegister v0 = locs()->in(0).fpu_reg();
3673 const VRegister v1 = locs()->in(1).fpu_reg(); 3673 const VRegister v1 = locs()->in(1).fpu_reg();
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
3788 void BinaryInt32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3788 void BinaryInt32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3789 UNIMPLEMENTED(); 3789 UNIMPLEMENTED();
3790 } 3790 }
3791 3791
3792 3792
3793 LocationSummary* MathUnaryInstr::MakeLocationSummary(bool opt) const { 3793 LocationSummary* MathUnaryInstr::MakeLocationSummary(bool opt) const {
3794 if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) { 3794 if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) {
3795 const intptr_t kNumInputs = 1; 3795 const intptr_t kNumInputs = 1;
3796 const intptr_t kNumTemps = 0; 3796 const intptr_t kNumTemps = 0;
3797 LocationSummary* summary = 3797 LocationSummary* summary =
3798 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 3798 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSu mmary::kCall);
3799 summary->set_in(0, Location::FpuRegisterLocation(V0)); 3799 summary->set_in(0, Location::FpuRegisterLocation(V0));
3800 summary->set_out(0, Location::FpuRegisterLocation(V0)); 3800 summary->set_out(0, Location::FpuRegisterLocation(V0));
3801 return summary; 3801 return summary;
3802 } 3802 }
3803 ASSERT((kind() == MathUnaryInstr::kSqrt) || 3803 ASSERT((kind() == MathUnaryInstr::kSqrt) ||
3804 (kind() == MathUnaryInstr::kDoubleSquare)); 3804 (kind() == MathUnaryInstr::kDoubleSquare));
3805 const intptr_t kNumInputs = 1; 3805 const intptr_t kNumInputs = 1;
3806 const intptr_t kNumTemps = 0; 3806 const intptr_t kNumTemps = 0;
3807 LocationSummary* summary = 3807 LocationSummary* summary =
3808 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3808 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3809 summary->set_in(0, Location::RequiresFpuRegister()); 3809 summary->set_in(0, 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 MathUnaryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3815 void MathUnaryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3816 if (kind() == MathUnaryInstr::kSqrt) { 3816 if (kind() == MathUnaryInstr::kSqrt) {
3817 const VRegister val = locs()->in(0).fpu_reg(); 3817 const VRegister val = locs()->in(0).fpu_reg();
3818 const VRegister result = locs()->out(0).fpu_reg(); 3818 const VRegister result = locs()->out(0).fpu_reg();
3819 __ fsqrtd(result, val); 3819 __ fsqrtd(result, val);
3820 } else if (kind() == MathUnaryInstr::kDoubleSquare) { 3820 } else if (kind() == MathUnaryInstr::kDoubleSquare) {
3821 const VRegister val = locs()->in(0).fpu_reg(); 3821 const VRegister val = locs()->in(0).fpu_reg();
3822 const VRegister result = locs()->out(0).fpu_reg(); 3822 const VRegister result = locs()->out(0).fpu_reg();
3823 __ fmuld(result, val, val); 3823 __ fmuld(result, val, val);
3824 } else { 3824 } else {
3825 ASSERT((kind() == MathUnaryInstr::kSin) || 3825 ASSERT((kind() == MathUnaryInstr::kSin) ||
3826 (kind() == MathUnaryInstr::kCos)); 3826 (kind() == MathUnaryInstr::kCos));
3827 __ CallRuntime(TargetFunction(), InputCount()); 3827 __ CallRuntime(TargetFunction(), InputCount());
3828 } 3828 }
3829 } 3829 }
3830 3830
3831 3831
3832 LocationSummary* MathMinMaxInstr::MakeLocationSummary(bool opt) const { 3832 LocationSummary* MathMinMaxInstr::MakeLocationSummary(bool opt) const {
3833 if (result_cid() == kDoubleCid) { 3833 if (result_cid() == kDoubleCid) {
3834 const intptr_t kNumInputs = 2; 3834 const intptr_t kNumInputs = 2;
3835 const intptr_t kNumTemps = 0; 3835 const intptr_t kNumTemps = 0;
3836 LocationSummary* summary = 3836 LocationSummary* summary =
3837 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3837 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSu mmary::kNoCall);
3838 summary->set_in(0, Location::RequiresFpuRegister()); 3838 summary->set_in(0, Location::RequiresFpuRegister());
3839 summary->set_in(1, Location::RequiresFpuRegister()); 3839 summary->set_in(1, Location::RequiresFpuRegister());
3840 // Reuse the left register so that code can be made shorter. 3840 // Reuse the left register so that code can be made shorter.
3841 summary->set_out(0, Location::SameAsFirstInput()); 3841 summary->set_out(0, Location::SameAsFirstInput());
3842 return summary; 3842 return summary;
3843 } 3843 }
3844 ASSERT(result_cid() == kSmiCid); 3844 ASSERT(result_cid() == kSmiCid);
3845 const intptr_t kNumInputs = 2; 3845 const intptr_t kNumInputs = 2;
3846 const intptr_t kNumTemps = 0; 3846 const intptr_t kNumTemps = 0;
3847 LocationSummary* summary = 3847 LocationSummary* summary =
3848 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3848 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3849 summary->set_in(0, Location::RequiresRegister()); 3849 summary->set_in(0, Location::RequiresRegister());
3850 summary->set_in(1, Location::RequiresRegister()); 3850 summary->set_in(1, Location::RequiresRegister());
3851 // Reuse the left register so that code can be made shorter. 3851 // Reuse the left register so that code can be made shorter.
3852 summary->set_out(0, Location::SameAsFirstInput()); 3852 summary->set_out(0, Location::SameAsFirstInput());
3853 return summary; 3853 return summary;
3854 } 3854 }
3855 3855
3856 3856
3857 void MathMinMaxInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3857 void MathMinMaxInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3858 ASSERT((op_kind() == MethodRecognizer::kMathMin) || 3858 ASSERT((op_kind() == MethodRecognizer::kMathMin) ||
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
3911 } else { 3911 } else {
3912 __ csel(result, right, left, LT); 3912 __ csel(result, right, left, LT);
3913 } 3913 }
3914 } 3914 }
3915 3915
3916 3916
3917 LocationSummary* UnarySmiOpInstr::MakeLocationSummary(bool opt) const { 3917 LocationSummary* UnarySmiOpInstr::MakeLocationSummary(bool opt) const {
3918 const intptr_t kNumInputs = 1; 3918 const intptr_t kNumInputs = 1;
3919 const intptr_t kNumTemps = 0; 3919 const intptr_t kNumTemps = 0;
3920 LocationSummary* summary = 3920 LocationSummary* summary =
3921 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3921 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3922 summary->set_in(0, Location::RequiresRegister()); 3922 summary->set_in(0, Location::RequiresRegister());
3923 // We make use of 3-operand instructions by not requiring result register 3923 // We make use of 3-operand instructions by not requiring result register
3924 // to be identical to first input register as on Intel. 3924 // to be identical to first input register as on Intel.
3925 summary->set_out(0, Location::RequiresRegister()); 3925 summary->set_out(0, Location::RequiresRegister());
3926 return summary; 3926 return summary;
3927 } 3927 }
3928 3928
3929 3929
3930 void UnarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3930 void UnarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3931 const Register value = locs()->in(0).reg(); 3931 const Register value = locs()->in(0).reg();
(...skipping 16 matching lines...) Expand all
3948 default: 3948 default:
3949 UNREACHABLE(); 3949 UNREACHABLE();
3950 } 3950 }
3951 } 3951 }
3952 3952
3953 3953
3954 LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(bool opt) const { 3954 LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(bool opt) const {
3955 const intptr_t kNumInputs = 1; 3955 const intptr_t kNumInputs = 1;
3956 const intptr_t kNumTemps = 0; 3956 const intptr_t kNumTemps = 0;
3957 LocationSummary* summary = 3957 LocationSummary* summary =
3958 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3958 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3959 summary->set_in(0, Location::RequiresFpuRegister()); 3959 summary->set_in(0, Location::RequiresFpuRegister());
3960 summary->set_out(0, Location::RequiresFpuRegister()); 3960 summary->set_out(0, Location::RequiresFpuRegister());
3961 return summary; 3961 return summary;
3962 } 3962 }
3963 3963
3964 3964
3965 void UnaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3965 void UnaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3966 const VRegister result = locs()->out(0).fpu_reg(); 3966 const VRegister result = locs()->out(0).fpu_reg();
3967 const VRegister value = locs()->in(0).fpu_reg(); 3967 const VRegister value = locs()->in(0).fpu_reg();
3968 __ fnegd(result, value); 3968 __ fnegd(result, value);
3969 } 3969 }
3970 3970
3971 3971
3972 LocationSummary* SmiToDoubleInstr::MakeLocationSummary(bool opt) const { 3972 LocationSummary* SmiToDoubleInstr::MakeLocationSummary(bool opt) const {
3973 const intptr_t kNumInputs = 1; 3973 const intptr_t kNumInputs = 1;
3974 const intptr_t kNumTemps = 0; 3974 const intptr_t kNumTemps = 0;
3975 LocationSummary* result = 3975 LocationSummary* result =
3976 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3976 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3977 result->set_in(0, Location::WritableRegister()); 3977 result->set_in(0, Location::WritableRegister());
3978 result->set_out(0, Location::RequiresFpuRegister()); 3978 result->set_out(0, Location::RequiresFpuRegister());
3979 return result; 3979 return result;
3980 } 3980 }
3981 3981
3982 3982
3983 void SmiToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3983 void SmiToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3984 const Register value = locs()->in(0).reg(); 3984 const Register value = locs()->in(0).reg();
3985 const VRegister result = locs()->out(0).fpu_reg(); 3985 const VRegister result = locs()->out(0).fpu_reg();
3986 __ SmiUntag(value); 3986 __ SmiUntag(value);
3987 __ scvtfd(result, value); 3987 __ scvtfd(result, value);
3988 } 3988 }
3989 3989
3990 3990
3991 LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(bool opt) const { 3991 LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(bool opt) const {
3992 const intptr_t kNumInputs = 1; 3992 const intptr_t kNumInputs = 1;
3993 const intptr_t kNumTemps = 0; 3993 const intptr_t kNumTemps = 0;
3994 LocationSummary* result = 3994 LocationSummary* result =
3995 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 3995 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kCall);
3996 result->set_in(0, Location::RegisterLocation(R1)); 3996 result->set_in(0, Location::RegisterLocation(R1));
3997 result->set_out(0, Location::RegisterLocation(R0)); 3997 result->set_out(0, Location::RegisterLocation(R0));
3998 return result; 3998 return result;
3999 } 3999 }
4000 4000
4001 4001
4002 void DoubleToIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4002 void DoubleToIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4003 const Register result = locs()->out(0).reg(); 4003 const Register result = locs()->out(0).reg();
4004 const Register value_obj = locs()->in(0).reg(); 4004 const Register value_obj = locs()->in(0).reg();
4005 ASSERT(result == R0); 4005 ASSERT(result == R0);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
4037 kNumberOfArguments, 4037 kNumberOfArguments,
4038 Object::null_array(), // No argument names., 4038 Object::null_array(), // No argument names.,
4039 locs()); 4039 locs());
4040 __ Bind(&done); 4040 __ Bind(&done);
4041 } 4041 }
4042 4042
4043 4043
4044 LocationSummary* DoubleToSmiInstr::MakeLocationSummary(bool opt) const { 4044 LocationSummary* DoubleToSmiInstr::MakeLocationSummary(bool opt) const {
4045 const intptr_t kNumInputs = 1; 4045 const intptr_t kNumInputs = 1;
4046 const intptr_t kNumTemps = 0; 4046 const intptr_t kNumTemps = 0;
4047 LocationSummary* result = new LocationSummary( 4047 LocationSummary* result = new (isolate) LocationSummary(isolate,
4048 kNumInputs, kNumTemps, LocationSummary::kNoCall); 4048 kNumInputs, kNumTemps, LocationSummary::kNoCall);
4049 result->set_in(0, Location::RequiresFpuRegister()); 4049 result->set_in(0, Location::RequiresFpuRegister());
4050 result->set_out(0, Location::RequiresRegister()); 4050 result->set_out(0, Location::RequiresRegister());
4051 return result; 4051 return result;
4052 } 4052 }
4053 4053
4054 4054
4055 void DoubleToSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4055 void DoubleToSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4056 Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptDoubleToSmi); 4056 Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptDoubleToSmi);
4057 const Register result = locs()->out(0).reg(); 4057 const Register result = locs()->out(0).reg();
(...skipping 23 matching lines...) Expand all
4081 4081
4082 void DoubleToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4082 void DoubleToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4083 UNIMPLEMENTED(); 4083 UNIMPLEMENTED();
4084 } 4084 }
4085 4085
4086 4086
4087 LocationSummary* DoubleToFloatInstr::MakeLocationSummary(bool opt) const { 4087 LocationSummary* DoubleToFloatInstr::MakeLocationSummary(bool opt) const {
4088 const intptr_t kNumInputs = 1; 4088 const intptr_t kNumInputs = 1;
4089 const intptr_t kNumTemps = 0; 4089 const intptr_t kNumTemps = 0;
4090 LocationSummary* result = 4090 LocationSummary* result =
4091 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4091 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4092 result->set_in(0, Location::RequiresFpuRegister()); 4092 result->set_in(0, Location::RequiresFpuRegister());
4093 result->set_out(0, Location::RequiresFpuRegister()); 4093 result->set_out(0, Location::RequiresFpuRegister());
4094 return result; 4094 return result;
4095 } 4095 }
4096 4096
4097 4097
4098 void DoubleToFloatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4098 void DoubleToFloatInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4099 const VRegister value = locs()->in(0).fpu_reg(); 4099 const VRegister value = locs()->in(0).fpu_reg();
4100 const VRegister result = locs()->out(0).fpu_reg(); 4100 const VRegister result = locs()->out(0).fpu_reg();
4101 __ fcvtsd(result, value); 4101 __ fcvtsd(result, value);
4102 } 4102 }
4103 4103
4104 4104
4105 LocationSummary* FloatToDoubleInstr::MakeLocationSummary(bool opt) const { 4105 LocationSummary* FloatToDoubleInstr::MakeLocationSummary(bool opt) const {
4106 const intptr_t kNumInputs = 1; 4106 const intptr_t kNumInputs = 1;
4107 const intptr_t kNumTemps = 0; 4107 const intptr_t kNumTemps = 0;
4108 LocationSummary* result = 4108 LocationSummary* result =
4109 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4109 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4110 result->set_in(0, Location::RequiresFpuRegister()); 4110 result->set_in(0, Location::RequiresFpuRegister());
4111 result->set_out(0, Location::RequiresFpuRegister()); 4111 result->set_out(0, Location::RequiresFpuRegister());
4112 return result; 4112 return result;
4113 } 4113 }
4114 4114
4115 4115
4116 void FloatToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4116 void FloatToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4117 const VRegister value = locs()->in(0).fpu_reg(); 4117 const VRegister value = locs()->in(0).fpu_reg();
4118 const VRegister result = locs()->out(0).fpu_reg(); 4118 const VRegister result = locs()->out(0).fpu_reg();
4119 __ fcvtds(result, value); 4119 __ fcvtds(result, value);
4120 } 4120 }
4121 4121
4122 4122
4123 LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(bool opt) const { 4123 LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(bool opt) const {
4124 ASSERT((InputCount() == 1) || (InputCount() == 2)); 4124 ASSERT((InputCount() == 1) || (InputCount() == 2));
4125 const intptr_t kNumTemps = 0; 4125 const intptr_t kNumTemps = 0;
4126 LocationSummary* result = 4126 LocationSummary* result =
4127 new LocationSummary(InputCount(), kNumTemps, LocationSummary::kCall); 4127 new (isolate) LocationSummary(isolate, InputCount(), kNumTemps, LocationSu mmary::kCall);
4128 result->set_in(0, Location::FpuRegisterLocation(V0)); 4128 result->set_in(0, Location::FpuRegisterLocation(V0));
4129 if (InputCount() == 2) { 4129 if (InputCount() == 2) {
4130 result->set_in(1, Location::FpuRegisterLocation(V1)); 4130 result->set_in(1, Location::FpuRegisterLocation(V1));
4131 } 4131 }
4132 if (recognized_kind() == MethodRecognizer::kMathDoublePow) { 4132 if (recognized_kind() == MethodRecognizer::kMathDoublePow) {
4133 result->AddTemp(Location::FpuRegisterLocation(V30)); 4133 result->AddTemp(Location::FpuRegisterLocation(V30));
4134 } 4134 }
4135 result->set_out(0, Location::FpuRegisterLocation(V0)); 4135 result->set_out(0, Location::FpuRegisterLocation(V0));
4136 return result; 4136 return result;
4137 } 4137 }
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
4257 } 4257 }
4258 __ CallRuntime(TargetFunction(), InputCount()); 4258 __ CallRuntime(TargetFunction(), InputCount());
4259 } 4259 }
4260 4260
4261 4261
4262 LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(bool opt) const { 4262 LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(bool opt) const {
4263 // Only use this instruction in optimized code. 4263 // Only use this instruction in optimized code.
4264 ASSERT(opt); 4264 ASSERT(opt);
4265 const intptr_t kNumInputs = 1; 4265 const intptr_t kNumInputs = 1;
4266 LocationSummary* summary = 4266 LocationSummary* summary =
4267 new LocationSummary(kNumInputs, 0, LocationSummary::kNoCall); 4267 new (isolate) LocationSummary(isolate, kNumInputs, 0, LocationSummary::kNo Call);
4268 if (representation() == kUnboxedDouble) { 4268 if (representation() == kUnboxedDouble) {
4269 if (index() == 0) { 4269 if (index() == 0) {
4270 summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(), 4270 summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(),
4271 Location::Any())); 4271 Location::Any()));
4272 } else { 4272 } else {
4273 ASSERT(index() == 1); 4273 ASSERT(index() == 1);
4274 summary->set_in(0, Location::Pair(Location::Any(), 4274 summary->set_in(0, Location::Pair(Location::Any(),
4275 Location::RequiresFpuRegister())); 4275 Location::RequiresFpuRegister()));
4276 } 4276 }
4277 summary->set_out(0, Location::RequiresFpuRegister()); 4277 summary->set_out(0, Location::RequiresFpuRegister());
(...skipping 28 matching lines...) Expand all
4306 __ mov(out, in); 4306 __ mov(out, in);
4307 } 4307 }
4308 } 4308 }
4309 4309
4310 4310
4311 LocationSummary* MergedMathInstr::MakeLocationSummary(bool opt) const { 4311 LocationSummary* MergedMathInstr::MakeLocationSummary(bool opt) const {
4312 if (kind() == MergedMathInstr::kTruncDivMod) { 4312 if (kind() == MergedMathInstr::kTruncDivMod) {
4313 const intptr_t kNumInputs = 2; 4313 const intptr_t kNumInputs = 2;
4314 const intptr_t kNumTemps = 0; 4314 const intptr_t kNumTemps = 0;
4315 LocationSummary* summary = 4315 LocationSummary* summary =
4316 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4316 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSu mmary::kNoCall);
4317 summary->set_in(0, Location::RequiresRegister()); 4317 summary->set_in(0, Location::RequiresRegister());
4318 summary->set_in(1, Location::RequiresRegister()); 4318 summary->set_in(1, Location::RequiresRegister());
4319 // Output is a pair of registers. 4319 // Output is a pair of registers.
4320 summary->set_out(0, Location::Pair(Location::RequiresRegister(), 4320 summary->set_out(0, Location::Pair(Location::RequiresRegister(),
4321 Location::RequiresRegister())); 4321 Location::RequiresRegister()));
4322 return summary; 4322 return summary;
4323 } 4323 }
4324 UNIMPLEMENTED(); 4324 UNIMPLEMENTED();
4325 return NULL; 4325 return NULL;
4326 } 4326 }
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
4442 4442
4443 void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4443 void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4444 comparison()->EmitBranchCode(compiler, this); 4444 comparison()->EmitBranchCode(compiler, this);
4445 } 4445 }
4446 4446
4447 4447
4448 LocationSummary* CheckClassInstr::MakeLocationSummary(bool opt) const { 4448 LocationSummary* CheckClassInstr::MakeLocationSummary(bool opt) const {
4449 const intptr_t kNumInputs = 1; 4449 const intptr_t kNumInputs = 1;
4450 const intptr_t kNumTemps = 0; 4450 const intptr_t kNumTemps = 0;
4451 LocationSummary* summary = 4451 LocationSummary* summary =
4452 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4452 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4453 summary->set_in(0, Location::RequiresRegister()); 4453 summary->set_in(0, Location::RequiresRegister());
4454 if (!IsNullCheck()) { 4454 if (!IsNullCheck()) {
4455 summary->AddTemp(Location::RequiresRegister()); 4455 summary->AddTemp(Location::RequiresRegister());
4456 } 4456 }
4457 return summary; 4457 return summary;
4458 } 4458 }
4459 4459
4460 4460
4461 void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4461 void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4462 const ICData::DeoptReasonId deopt_reason = licm_hoisted_ ? 4462 const ICData::DeoptReasonId deopt_reason = licm_hoisted_ ?
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
4495 } 4495 }
4496 } 4496 }
4497 __ Bind(&is_ok); 4497 __ Bind(&is_ok);
4498 } 4498 }
4499 4499
4500 4500
4501 LocationSummary* CheckSmiInstr::MakeLocationSummary(bool opt) const { 4501 LocationSummary* CheckSmiInstr::MakeLocationSummary(bool opt) const {
4502 const intptr_t kNumInputs = 1; 4502 const intptr_t kNumInputs = 1;
4503 const intptr_t kNumTemps = 0; 4503 const intptr_t kNumTemps = 0;
4504 LocationSummary* summary = 4504 LocationSummary* summary =
4505 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4505 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4506 summary->set_in(0, Location::RequiresRegister()); 4506 summary->set_in(0, Location::RequiresRegister());
4507 return summary; 4507 return summary;
4508 } 4508 }
4509 4509
4510 4510
4511 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4511 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4512 const Register value = locs()->in(0).reg(); 4512 const Register value = locs()->in(0).reg();
4513 Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckSmi); 4513 Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckSmi);
4514 __ tsti(value, kSmiTagMask); 4514 __ tsti(value, kSmiTagMask);
4515 __ b(deopt, NE); 4515 __ b(deopt, NE);
4516 } 4516 }
4517 4517
4518 4518
4519 LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(bool opt) const { 4519 LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(bool opt) const {
4520 const intptr_t kNumInputs = 2; 4520 const intptr_t kNumInputs = 2;
4521 const intptr_t kNumTemps = 0; 4521 const intptr_t kNumTemps = 0;
4522 LocationSummary* locs = 4522 LocationSummary* locs =
4523 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4523 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4524 locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length())); 4524 locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length()));
4525 locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index())); 4525 locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index()));
4526 return locs; 4526 return locs;
4527 } 4527 }
4528 4528
4529 4529
4530 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4530 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4531 Label* deopt = compiler->AddDeoptStub(deopt_id(), 4531 Label* deopt = compiler->AddDeoptStub(deopt_id(),
4532 ICData::kDeoptCheckArrayBound); 4532 ICData::kDeoptCheckArrayBound);
4533 4533
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
4619 return NULL; 4619 return NULL;
4620 } 4620 }
4621 4621
4622 4622
4623 void UnaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4623 void UnaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4624 UNIMPLEMENTED(); 4624 UNIMPLEMENTED();
4625 } 4625 }
4626 4626
4627 4627
4628 LocationSummary* ThrowInstr::MakeLocationSummary(bool opt) const { 4628 LocationSummary* ThrowInstr::MakeLocationSummary(bool opt) const {
4629 return new LocationSummary(0, 0, LocationSummary::kCall); 4629 return new (isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
4630 } 4630 }
4631 4631
4632 4632
4633 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4633 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4634 compiler->GenerateRuntimeCall(token_pos(), 4634 compiler->GenerateRuntimeCall(token_pos(),
4635 deopt_id(), 4635 deopt_id(),
4636 kThrowRuntimeEntry, 4636 kThrowRuntimeEntry,
4637 1, 4637 1,
4638 locs()); 4638 locs());
4639 __ hlt(0); 4639 __ hlt(0);
4640 } 4640 }
4641 4641
4642 4642
4643 LocationSummary* ReThrowInstr::MakeLocationSummary(bool opt) const { 4643 LocationSummary* ReThrowInstr::MakeLocationSummary(bool opt) const {
4644 return new LocationSummary(0, 0, LocationSummary::kCall); 4644 return new (isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
4645 } 4645 }
4646 4646
4647 4647
4648 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4648 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4649 compiler->SetNeedsStacktrace(catch_try_index()); 4649 compiler->SetNeedsStacktrace(catch_try_index());
4650 compiler->GenerateRuntimeCall(token_pos(), 4650 compiler->GenerateRuntimeCall(token_pos(),
4651 deopt_id(), 4651 deopt_id(),
4652 kReThrowRuntimeEntry, 4652 kReThrowRuntimeEntry,
4653 2, 4653 2,
4654 locs()); 4654 locs());
(...skipping 20 matching lines...) Expand all
4675 deopt_id_, 4675 deopt_id_,
4676 Scanner::kNoSourcePos); 4676 Scanner::kNoSourcePos);
4677 } 4677 }
4678 if (HasParallelMove()) { 4678 if (HasParallelMove()) {
4679 compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); 4679 compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
4680 } 4680 }
4681 } 4681 }
4682 4682
4683 4683
4684 LocationSummary* GotoInstr::MakeLocationSummary(bool opt) const { 4684 LocationSummary* GotoInstr::MakeLocationSummary(bool opt) const {
4685 return new LocationSummary(0, 0, LocationSummary::kNoCall); 4685 return new (isolate) LocationSummary(isolate, 0, 0, LocationSummary::kNoCall);
4686 } 4686 }
4687 4687
4688 4688
4689 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4689 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4690 if (!compiler->is_optimizing()) { 4690 if (!compiler->is_optimizing()) {
4691 compiler->EmitEdgeCounter(); 4691 compiler->EmitEdgeCounter();
4692 // Add a deoptimization descriptor for deoptimizing instructions that 4692 // Add a deoptimization descriptor for deoptimizing instructions that
4693 // may be inserted before this instruction. On ARM64 this descriptor 4693 // may be inserted before this instruction. On ARM64 this descriptor
4694 // points after the edge counter code so that we can reuse the same 4694 // points after the edge counter code so that we can reuse the same
4695 // pattern matching code as at call sites, which matches backwards from 4695 // pattern matching code as at call sites, which matches backwards from
(...skipping 24 matching lines...) Expand all
4720 void CurrentContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4720 void CurrentContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4721 __ mov(locs()->out(0).reg(), CTX); 4721 __ mov(locs()->out(0).reg(), CTX);
4722 } 4722 }
4723 4723
4724 4724
4725 LocationSummary* StrictCompareInstr::MakeLocationSummary(bool opt) const { 4725 LocationSummary* StrictCompareInstr::MakeLocationSummary(bool opt) const {
4726 const intptr_t kNumInputs = 2; 4726 const intptr_t kNumInputs = 2;
4727 const intptr_t kNumTemps = 0; 4727 const intptr_t kNumTemps = 0;
4728 if (needs_number_check()) { 4728 if (needs_number_check()) {
4729 LocationSummary* locs = 4729 LocationSummary* locs =
4730 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 4730 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSu mmary::kCall);
4731 locs->set_in(0, Location::RegisterLocation(R0)); 4731 locs->set_in(0, Location::RegisterLocation(R0));
4732 locs->set_in(1, Location::RegisterLocation(R1)); 4732 locs->set_in(1, Location::RegisterLocation(R1));
4733 locs->set_out(0, Location::RegisterLocation(R0)); 4733 locs->set_out(0, Location::RegisterLocation(R0));
4734 return locs; 4734 return locs;
4735 } 4735 }
4736 LocationSummary* locs = 4736 LocationSummary* locs =
4737 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4737 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4738 locs->set_in(0, Location::RegisterOrConstant(left())); 4738 locs->set_in(0, Location::RegisterOrConstant(left()));
4739 // Only one of the inputs can be a constant. Choose register if the first one 4739 // Only one of the inputs can be a constant. Choose register if the first one
4740 // is a constant. 4740 // is a constant.
4741 locs->set_in(1, locs->in(0).IsConstant() 4741 locs->set_in(1, locs->in(0).IsConstant()
4742 ? Location::RequiresRegister() 4742 ? Location::RequiresRegister()
4743 : Location::RegisterOrConstant(right())); 4743 : Location::RegisterOrConstant(right()));
4744 locs->set_out(0, Location::RequiresRegister()); 4744 locs->set_out(0, Location::RequiresRegister());
4745 return locs; 4745 return locs;
4746 } 4746 }
4747 4747
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
4831 compiler->GenerateCall(token_pos(), 4831 compiler->GenerateCall(token_pos(),
4832 &label, 4832 &label,
4833 PcDescriptors::kOther, 4833 PcDescriptors::kOther,
4834 locs()); 4834 locs());
4835 __ Drop(ArgumentCount()); // Discard arguments. 4835 __ Drop(ArgumentCount()); // Discard arguments.
4836 } 4836 }
4837 4837
4838 } // namespace dart 4838 } // namespace dart
4839 4839
4840 #endif // defined TARGET_ARCH_ARM64 4840 #endif // defined TARGET_ARCH_ARM64
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698