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

Side by Side Diff: runtime/vm/intermediate_language_arm.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) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, 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_ARM. 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_ARM.
6 #if defined(TARGET_ARCH_ARM) 6 #if defined(TARGET_ARCH_ARM)
7 7
8 #include "vm/intermediate_language.h" 8 #include "vm/intermediate_language.h"
9 9
10 #include "vm/cpu.h" 10 #include "vm/cpu.h"
(...skipping 21 matching lines...) Expand all
32 LocationSummary* result = new LocationSummary(0, 0, LocationSummary::kCall); 32 LocationSummary* result = new LocationSummary(0, 0, LocationSummary::kCall);
33 result->set_out(0, Location::RegisterLocation(R0)); 33 result->set_out(0, Location::RegisterLocation(R0));
34 return result; 34 return result;
35 } 35 }
36 36
37 37
38 LocationSummary* PushArgumentInstr::MakeLocationSummary(bool opt) const { 38 LocationSummary* PushArgumentInstr::MakeLocationSummary(bool opt) const {
39 const intptr_t kNumInputs = 1; 39 const intptr_t kNumInputs = 1;
40 const intptr_t kNumTemps= 0; 40 const intptr_t kNumTemps= 0;
41 LocationSummary* locs = 41 LocationSummary* locs =
42 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 42 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
43 locs->set_in(0, Location::AnyOrConstant(value())); 43 locs->set_in(0, Location::AnyOrConstant(value()));
44 return locs; 44 return locs;
45 } 45 }
46 46
47 47
48 void PushArgumentInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 48 void PushArgumentInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
49 // In SSA mode, we need an explicit push. Nothing to do in non-SSA mode 49 // In SSA mode, we need an explicit push. Nothing to do in non-SSA mode
50 // where PushArgument is handled by BindInstr::EmitNativeCode. 50 // where PushArgument is handled by BindInstr::EmitNativeCode.
51 if (compiler->is_optimizing()) { 51 if (compiler->is_optimizing()) {
52 Location value = locs()->in(0); 52 Location value = locs()->in(0);
53 if (value.IsRegister()) { 53 if (value.IsRegister()) {
54 __ Push(value.reg()); 54 __ Push(value.reg());
55 } else if (value.IsConstant()) { 55 } else if (value.IsConstant()) {
56 __ PushObject(value.constant()); 56 __ PushObject(value.constant());
57 } else { 57 } else {
58 ASSERT(value.IsStackSlot()); 58 ASSERT(value.IsStackSlot());
59 const intptr_t value_offset = value.ToStackSlotOffset(); 59 const intptr_t value_offset = value.ToStackSlotOffset();
60 __ LoadFromOffset(kWord, IP, FP, value_offset); 60 __ LoadFromOffset(kWord, IP, FP, value_offset);
61 __ Push(IP); 61 __ Push(IP);
62 } 62 }
63 } 63 }
64 } 64 }
65 65
66 66
67 LocationSummary* ReturnInstr::MakeLocationSummary(bool opt) const { 67 LocationSummary* ReturnInstr::MakeLocationSummary(bool opt) const {
68 const intptr_t kNumInputs = 1; 68 const intptr_t kNumInputs = 1;
69 const intptr_t kNumTemps = 0; 69 const intptr_t kNumTemps = 0;
70 LocationSummary* locs = 70 LocationSummary* locs =
71 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 71 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
72 locs->set_in(0, Location::RegisterLocation(R0)); 72 locs->set_in(0, Location::RegisterLocation(R0));
73 return locs; 73 return locs;
74 } 74 }
75 75
76 76
77 // Attempt optimized compilation at return instruction instead of at the entry. 77 // Attempt optimized compilation at return instruction instead of at the entry.
78 // The entry needs to be patchable, no inlined objects are allowed in the area 78 // The entry needs to be patchable, no inlined objects are allowed in the area
79 // that will be overwritten by the patch instructions: a branch macro sequence. 79 // that will be overwritten by the patch instructions: a branch macro sequence.
80 void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 80 void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
81 const Register result = locs()->in(0).reg(); 81 const Register result = locs()->in(0).reg();
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
179 __ AddImmediate(result, Smi::RawValue(false_value)); 179 __ AddImmediate(result, Smi::RawValue(false_value));
180 } 180 }
181 } 181 }
182 } 182 }
183 183
184 184
185 LocationSummary* ClosureCallInstr::MakeLocationSummary(bool opt) const { 185 LocationSummary* ClosureCallInstr::MakeLocationSummary(bool opt) const {
186 const intptr_t kNumInputs = 1; 186 const intptr_t kNumInputs = 1;
187 const intptr_t kNumTemps = 0; 187 const intptr_t kNumTemps = 0;
188 LocationSummary* summary = 188 LocationSummary* summary =
189 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 189 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kCall);
190 summary->set_in(0, Location::RegisterLocation(R0)); // Function. 190 summary->set_in(0, Location::RegisterLocation(R0)); // Function.
191 summary->set_out(0, Location::RegisterLocation(R0)); 191 summary->set_out(0, Location::RegisterLocation(R0));
192 return summary; 192 return summary;
193 } 193 }
194 194
195 195
196 void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 196 void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
197 // Load arguments descriptor in R4. 197 // Load arguments descriptor in R4.
198 int argument_count = ArgumentCount(); 198 int argument_count = ArgumentCount();
199 const Array& arguments_descriptor = 199 const Array& arguments_descriptor =
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
273 const Register result = locs()->out(0).reg(); 273 const Register result = locs()->out(0).reg();
274 __ LoadObject(result, value()); 274 __ LoadObject(result, value());
275 } 275 }
276 } 276 }
277 277
278 278
279 LocationSummary* UnboxedConstantInstr::MakeLocationSummary(bool opt) const { 279 LocationSummary* UnboxedConstantInstr::MakeLocationSummary(bool opt) const {
280 const intptr_t kNumInputs = 0; 280 const intptr_t kNumInputs = 0;
281 const intptr_t kNumTemps = 1; 281 const intptr_t kNumTemps = 1;
282 LocationSummary* locs = 282 LocationSummary* locs =
283 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 283 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
284 locs->set_out(0, Location::RequiresFpuRegister()); 284 locs->set_out(0, Location::RequiresFpuRegister());
285 locs->set_temp(0, Location::RequiresRegister()); 285 locs->set_temp(0, Location::RequiresRegister());
286 return locs; 286 return locs;
287 } 287 }
288 288
289 289
290 void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 290 void UnboxedConstantInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
291 // The register allocator drops constant definitions that have no uses. 291 // The register allocator drops constant definitions that have no uses.
292 if (!locs()->out(0).IsInvalid()) { 292 if (!locs()->out(0).IsInvalid()) {
293 if (Utils::DoublesBitEqual(Double::Cast(value()).value(), 0.0) && 293 if (Utils::DoublesBitEqual(Double::Cast(value()).value(), 0.0) &&
294 TargetCPUFeatures::neon_supported()) { 294 TargetCPUFeatures::neon_supported()) {
295 const QRegister dst = locs()->out(0).fpu_reg(); 295 const QRegister dst = locs()->out(0).fpu_reg();
296 __ veorq(dst, dst, dst); 296 __ veorq(dst, dst, dst);
297 } else { 297 } else {
298 const DRegister dst = EvenDRegisterOf(locs()->out(0).fpu_reg()); 298 const DRegister dst = EvenDRegisterOf(locs()->out(0).fpu_reg());
299 const Register temp = locs()->temp(0).reg(); 299 const Register temp = locs()->temp(0).reg();
300 __ LoadDImmediate(dst, Double::Cast(value()).value(), temp); 300 __ LoadDImmediate(dst, Double::Cast(value()).value(), temp);
301 } 301 }
302 } 302 }
303 } 303 }
304 304
305 305
306 LocationSummary* AssertAssignableInstr::MakeLocationSummary(bool opt) const { 306 LocationSummary* AssertAssignableInstr::MakeLocationSummary(bool opt) const {
307 const intptr_t kNumInputs = 3; 307 const intptr_t kNumInputs = 3;
308 const intptr_t kNumTemps = 0; 308 const intptr_t kNumTemps = 0;
309 LocationSummary* summary = 309 LocationSummary* summary =
310 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 310 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kCall);
311 summary->set_in(0, Location::RegisterLocation(R0)); // Value. 311 summary->set_in(0, Location::RegisterLocation(R0)); // Value.
312 summary->set_in(1, Location::RegisterLocation(R2)); // Instantiator. 312 summary->set_in(1, Location::RegisterLocation(R2)); // Instantiator.
313 summary->set_in(2, Location::RegisterLocation(R1)); // Type arguments. 313 summary->set_in(2, Location::RegisterLocation(R1)); // Type arguments.
314 summary->set_out(0, Location::RegisterLocation(R0)); 314 summary->set_out(0, Location::RegisterLocation(R0));
315 return summary; 315 return summary;
316 } 316 }
317 317
318 318
319 LocationSummary* AssertBooleanInstr::MakeLocationSummary(bool opt) const { 319 LocationSummary* AssertBooleanInstr::MakeLocationSummary(bool opt) const {
320 const intptr_t kNumInputs = 1; 320 const intptr_t kNumInputs = 1;
321 const intptr_t kNumTemps = 0; 321 const intptr_t kNumTemps = 0;
322 LocationSummary* locs = 322 LocationSummary* locs =
323 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 323 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kCall);
324 locs->set_in(0, Location::RegisterLocation(R0)); 324 locs->set_in(0, Location::RegisterLocation(R0));
325 locs->set_out(0, Location::RegisterLocation(R0)); 325 locs->set_out(0, Location::RegisterLocation(R0));
326 return locs; 326 return locs;
327 } 327 }
328 328
329 329
330 static void EmitAssertBoolean(Register reg, 330 static void EmitAssertBoolean(Register reg,
331 intptr_t token_pos, 331 intptr_t token_pos,
332 intptr_t deopt_id, 332 intptr_t deopt_id,
333 LocationSummary* locs, 333 LocationSummary* locs,
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
375 return VS; 375 return VS;
376 } 376 }
377 } 377 }
378 378
379 379
380 LocationSummary* EqualityCompareInstr::MakeLocationSummary(bool opt) const { 380 LocationSummary* EqualityCompareInstr::MakeLocationSummary(bool opt) const {
381 const intptr_t kNumInputs = 2; 381 const intptr_t kNumInputs = 2;
382 if (operation_cid() == kMintCid) { 382 if (operation_cid() == kMintCid) {
383 const intptr_t kNumTemps = 0; 383 const intptr_t kNumTemps = 0;
384 LocationSummary* locs = 384 LocationSummary* locs =
385 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 385 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSu mmary::kNoCall);
386 locs->set_in(0, Location::Pair(Location::RequiresRegister(), 386 locs->set_in(0, Location::Pair(Location::RequiresRegister(),
387 Location::RequiresRegister())); 387 Location::RequiresRegister()));
388 locs->set_in(1, Location::Pair(Location::RequiresRegister(), 388 locs->set_in(1, Location::Pair(Location::RequiresRegister(),
389 Location::RequiresRegister())); 389 Location::RequiresRegister()));
390 locs->set_out(0, Location::RequiresRegister()); 390 locs->set_out(0, Location::RequiresRegister());
391 return locs; 391 return locs;
392 } 392 }
393 if (operation_cid() == kDoubleCid) { 393 if (operation_cid() == kDoubleCid) {
394 const intptr_t kNumTemps = 0; 394 const intptr_t kNumTemps = 0;
395 LocationSummary* locs = 395 LocationSummary* locs =
396 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 396 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSu mmary::kNoCall);
397 locs->set_in(0, Location::RequiresFpuRegister()); 397 locs->set_in(0, Location::RequiresFpuRegister());
398 locs->set_in(1, Location::RequiresFpuRegister()); 398 locs->set_in(1, Location::RequiresFpuRegister());
399 locs->set_out(0, Location::RequiresRegister()); 399 locs->set_out(0, Location::RequiresRegister());
400 return locs; 400 return locs;
401 } 401 }
402 if (operation_cid() == kSmiCid) { 402 if (operation_cid() == kSmiCid) {
403 const intptr_t kNumTemps = 0; 403 const intptr_t kNumTemps = 0;
404 LocationSummary* locs = 404 LocationSummary* locs =
405 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 405 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSu mmary::kNoCall);
406 locs->set_in(0, Location::RegisterOrConstant(left())); 406 locs->set_in(0, Location::RegisterOrConstant(left()));
407 // Only one input can be a constant operand. The case of two constant 407 // Only one input can be a constant operand. The case of two constant
408 // operands should be handled by constant propagation. 408 // operands should be handled by constant propagation.
409 locs->set_in(1, locs->in(0).IsConstant() 409 locs->set_in(1, locs->in(0).IsConstant()
410 ? Location::RequiresRegister() 410 ? Location::RequiresRegister()
411 : Location::RegisterOrConstant(right())); 411 : Location::RegisterOrConstant(right()));
412 locs->set_out(0, Location::RequiresRegister()); 412 locs->set_out(0, Location::RequiresRegister());
413 return locs; 413 return locs;
414 } 414 }
415 UNREACHABLE(); 415 UNREACHABLE();
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
657 __ b(nan_result, VS); 657 __ b(nan_result, VS);
658 } 658 }
659 EmitBranchOnCondition(compiler, true_condition, labels); 659 EmitBranchOnCondition(compiler, true_condition, labels);
660 } 660 }
661 661
662 662
663 LocationSummary* TestSmiInstr::MakeLocationSummary(bool opt) const { 663 LocationSummary* TestSmiInstr::MakeLocationSummary(bool opt) const {
664 const intptr_t kNumInputs = 2; 664 const intptr_t kNumInputs = 2;
665 const intptr_t kNumTemps = 0; 665 const intptr_t kNumTemps = 0;
666 LocationSummary* locs = 666 LocationSummary* locs =
667 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 667 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
668 locs->set_in(0, Location::RequiresRegister()); 668 locs->set_in(0, Location::RequiresRegister());
669 // Only one input can be a constant operand. The case of two constant 669 // Only one input can be a constant operand. The case of two constant
670 // operands should be handled by constant propagation. 670 // operands should be handled by constant propagation.
671 locs->set_in(1, Location::RegisterOrConstant(right())); 671 locs->set_in(1, Location::RegisterOrConstant(right()));
672 return locs; 672 return locs;
673 } 673 }
674 674
675 675
676 Condition TestSmiInstr::EmitComparisonCode(FlowGraphCompiler* compiler, 676 Condition TestSmiInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
677 BranchLabels labels) { 677 BranchLabels labels) {
(...skipping 23 matching lines...) Expand all
701 BranchLabels labels = compiler->CreateBranchLabels(branch); 701 BranchLabels labels = compiler->CreateBranchLabels(branch);
702 Condition true_condition = EmitComparisonCode(compiler, labels); 702 Condition true_condition = EmitComparisonCode(compiler, labels);
703 EmitBranchOnCondition(compiler, true_condition, labels); 703 EmitBranchOnCondition(compiler, true_condition, labels);
704 } 704 }
705 705
706 706
707 LocationSummary* TestCidsInstr::MakeLocationSummary(bool opt) const { 707 LocationSummary* TestCidsInstr::MakeLocationSummary(bool opt) const {
708 const intptr_t kNumInputs = 1; 708 const intptr_t kNumInputs = 1;
709 const intptr_t kNumTemps = 1; 709 const intptr_t kNumTemps = 1;
710 LocationSummary* locs = 710 LocationSummary* locs =
711 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 711 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
712 locs->set_in(0, Location::RequiresRegister()); 712 locs->set_in(0, Location::RequiresRegister());
713 locs->set_temp(0, Location::RequiresRegister()); 713 locs->set_temp(0, Location::RequiresRegister());
714 locs->set_out(0, Location::RequiresRegister()); 714 locs->set_out(0, Location::RequiresRegister());
715 return locs; 715 return locs;
716 } 716 }
717 717
718 718
719 Condition TestCidsInstr::EmitComparisonCode(FlowGraphCompiler* compiler, 719 Condition TestCidsInstr::EmitComparisonCode(FlowGraphCompiler* compiler,
720 BranchLabels labels) { 720 BranchLabels labels) {
721 ASSERT((kind() == Token::kIS) || (kind() == Token::kISNOT)); 721 ASSERT((kind() == Token::kIS) || (kind() == Token::kISNOT));
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
775 __ Bind(&done); 775 __ Bind(&done);
776 } 776 }
777 777
778 778
779 LocationSummary* RelationalOpInstr::MakeLocationSummary(bool opt) const { 779 LocationSummary* RelationalOpInstr::MakeLocationSummary(bool opt) const {
780 const intptr_t kNumInputs = 2; 780 const intptr_t kNumInputs = 2;
781 const intptr_t kNumTemps = 0; 781 const intptr_t kNumTemps = 0;
782 if (operation_cid() == kMintCid) { 782 if (operation_cid() == kMintCid) {
783 const intptr_t kNumTemps = 1; 783 const intptr_t kNumTemps = 1;
784 LocationSummary* locs = 784 LocationSummary* locs =
785 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 785 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSu mmary::kNoCall);
786 locs->set_in(0, Location::Pair(Location::RequiresRegister(), 786 locs->set_in(0, Location::Pair(Location::RequiresRegister(),
787 Location::RequiresRegister())); 787 Location::RequiresRegister()));
788 locs->set_in(1, Location::Pair(Location::RequiresRegister(), 788 locs->set_in(1, Location::Pair(Location::RequiresRegister(),
789 Location::RequiresRegister())); 789 Location::RequiresRegister()));
790 locs->set_temp(0, Location::RequiresRegister()); 790 locs->set_temp(0, Location::RequiresRegister());
791 locs->set_out(0, Location::RequiresRegister()); 791 locs->set_out(0, Location::RequiresRegister());
792 return locs; 792 return locs;
793 } 793 }
794 if (operation_cid() == kDoubleCid) { 794 if (operation_cid() == kDoubleCid) {
795 LocationSummary* summary = 795 LocationSummary* summary =
796 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 796 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSu mmary::kNoCall);
797 summary->set_in(0, Location::RequiresFpuRegister()); 797 summary->set_in(0, Location::RequiresFpuRegister());
798 summary->set_in(1, Location::RequiresFpuRegister()); 798 summary->set_in(1, Location::RequiresFpuRegister());
799 summary->set_out(0, Location::RequiresRegister()); 799 summary->set_out(0, Location::RequiresRegister());
800 return summary; 800 return summary;
801 } 801 }
802 ASSERT(operation_cid() == kSmiCid); 802 ASSERT(operation_cid() == kSmiCid);
803 LocationSummary* summary = 803 LocationSummary* summary =
804 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 804 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
805 summary->set_in(0, Location::RegisterOrConstant(left())); 805 summary->set_in(0, Location::RegisterOrConstant(left()));
806 // Only one input can be a constant operand. The case of two constant 806 // Only one input can be a constant operand. The case of two constant
807 // operands should be handled by constant propagation. 807 // operands should be handled by constant propagation.
808 summary->set_in(1, summary->in(0).IsConstant() 808 summary->set_in(1, summary->in(0).IsConstant()
809 ? Location::RequiresRegister() 809 ? Location::RequiresRegister()
810 : Location::RegisterOrConstant(right())); 810 : Location::RegisterOrConstant(right()));
811 summary->set_out(0, Location::RequiresRegister()); 811 summary->set_out(0, Location::RequiresRegister());
812 return summary; 812 return summary;
813 } 813 }
814 814
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
871 __ b(nan_result, VS); 871 __ b(nan_result, VS);
872 EmitBranchOnCondition(compiler, true_condition, labels); 872 EmitBranchOnCondition(compiler, true_condition, labels);
873 } 873 }
874 } 874 }
875 875
876 876
877 LocationSummary* NativeCallInstr::MakeLocationSummary(bool opt) const { 877 LocationSummary* NativeCallInstr::MakeLocationSummary(bool opt) const {
878 const intptr_t kNumInputs = 0; 878 const intptr_t kNumInputs = 0;
879 const intptr_t kNumTemps = 3; 879 const intptr_t kNumTemps = 3;
880 LocationSummary* locs = 880 LocationSummary* locs =
881 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 881 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kCall);
882 locs->set_temp(0, Location::RegisterLocation(R1)); 882 locs->set_temp(0, Location::RegisterLocation(R1));
883 locs->set_temp(1, Location::RegisterLocation(R2)); 883 locs->set_temp(1, Location::RegisterLocation(R2));
884 locs->set_temp(2, Location::RegisterLocation(R5)); 884 locs->set_temp(2, Location::RegisterLocation(R5));
885 locs->set_out(0, Location::RegisterLocation(R0)); 885 locs->set_out(0, Location::RegisterLocation(R0));
886 return locs; 886 return locs;
887 } 887 }
888 888
889 889
890 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 890 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
891 ASSERT(locs()->temp(0).reg() == R1); 891 ASSERT(locs()->temp(0).reg() == R1);
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
971 __ LoadImmediate(result, -1, NE); 971 __ LoadImmediate(result, -1, NE);
972 __ ldrb(result, FieldAddress(str, OneByteString::data_offset()), EQ); 972 __ ldrb(result, FieldAddress(str, OneByteString::data_offset()), EQ);
973 __ SmiTag(result); 973 __ SmiTag(result);
974 } 974 }
975 975
976 976
977 LocationSummary* StringInterpolateInstr::MakeLocationSummary(bool opt) const { 977 LocationSummary* StringInterpolateInstr::MakeLocationSummary(bool opt) const {
978 const intptr_t kNumInputs = 1; 978 const intptr_t kNumInputs = 1;
979 const intptr_t kNumTemps = 0; 979 const intptr_t kNumTemps = 0;
980 LocationSummary* summary = 980 LocationSummary* summary =
981 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 981 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kCall);
982 summary->set_in(0, Location::RegisterLocation(R0)); 982 summary->set_in(0, Location::RegisterLocation(R0));
983 summary->set_out(0, Location::RegisterLocation(R0)); 983 summary->set_out(0, Location::RegisterLocation(R0));
984 return summary; 984 return summary;
985 } 985 }
986 986
987 987
988 void StringInterpolateInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 988 void StringInterpolateInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
989 const Register array = locs()->in(0).reg(); 989 const Register array = locs()->in(0).reg();
990 __ Push(array); 990 __ Push(array);
991 const int kNumberOfArguments = 1; 991 const int kNumberOfArguments = 1;
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
1112 UNREACHABLE(); 1112 UNREACHABLE();
1113 return kTagged; 1113 return kTagged;
1114 } 1114 }
1115 } 1115 }
1116 1116
1117 1117
1118 LocationSummary* LoadIndexedInstr::MakeLocationSummary(bool opt) const { 1118 LocationSummary* LoadIndexedInstr::MakeLocationSummary(bool opt) const {
1119 const intptr_t kNumInputs = 2; 1119 const intptr_t kNumInputs = 2;
1120 const intptr_t kNumTemps = 0; 1120 const intptr_t kNumTemps = 0;
1121 LocationSummary* locs = 1121 LocationSummary* locs =
1122 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 1122 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
1123 locs->set_in(0, Location::RequiresRegister()); 1123 locs->set_in(0, Location::RequiresRegister());
1124 // The smi index is either untagged (element size == 1), or it is left smi 1124 // The smi index is either untagged (element size == 1), or it is left smi
1125 // tagged (for all element sizes > 1). 1125 // tagged (for all element sizes > 1).
1126 // TODO(regis): Revisit and see if the index can be immediate. 1126 // TODO(regis): Revisit and see if the index can be immediate.
1127 if (index_scale() == 2 && IsExternal()) { 1127 if (index_scale() == 2 && IsExternal()) {
1128 locs->set_in(1, Location::RequiresRegister()); 1128 locs->set_in(1, Location::RequiresRegister());
1129 } else { 1129 } else {
1130 locs->set_in(1, Location::WritableRegister()); 1130 locs->set_in(1, Location::WritableRegister());
1131 } 1131 }
1132 if ((representation() == kUnboxedDouble) || 1132 if ((representation() == kUnboxedDouble) ||
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
1356 UNREACHABLE(); 1356 UNREACHABLE();
1357 return kTagged; 1357 return kTagged;
1358 } 1358 }
1359 } 1359 }
1360 1360
1361 1361
1362 LocationSummary* StoreIndexedInstr::MakeLocationSummary(bool opt) const { 1362 LocationSummary* StoreIndexedInstr::MakeLocationSummary(bool opt) const {
1363 const intptr_t kNumInputs = 3; 1363 const intptr_t kNumInputs = 3;
1364 const intptr_t kNumTemps = 0; 1364 const intptr_t kNumTemps = 0;
1365 LocationSummary* locs = 1365 LocationSummary* locs =
1366 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 1366 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
1367 locs->set_in(0, Location::RequiresRegister()); 1367 locs->set_in(0, Location::RequiresRegister());
1368 // The smi index is either untagged (element size == 1), or it is left smi 1368 // The smi index is either untagged (element size == 1), or it is left smi
1369 // tagged (for all element sizes > 1). 1369 // tagged (for all element sizes > 1).
1370 // TODO(regis): Revisit and see if the index can be immediate. 1370 // TODO(regis): Revisit and see if the index can be immediate.
1371 locs->set_in(1, Location::WritableRegister()); 1371 locs->set_in(1, Location::WritableRegister());
1372 switch (class_id()) { 1372 switch (class_id()) {
1373 case kArrayCid: 1373 case kArrayCid:
1374 locs->set_in(2, ShouldEmitStoreBarrier() 1374 locs->set_in(2, ShouldEmitStoreBarrier()
1375 ? Location::WritableRegister() 1375 ? Location::WritableRegister()
1376 : Location::RegisterOrConstant(value())); 1376 : Location::RegisterOrConstant(value()));
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
1589 } 1589 }
1590 default: 1590 default:
1591 UNREACHABLE(); 1591 UNREACHABLE();
1592 } 1592 }
1593 } 1593 }
1594 1594
1595 1595
1596 LocationSummary* GuardFieldInstr::MakeLocationSummary(bool opt) const { 1596 LocationSummary* GuardFieldInstr::MakeLocationSummary(bool opt) const {
1597 const intptr_t kNumInputs = 1; 1597 const intptr_t kNumInputs = 1;
1598 LocationSummary* summary = 1598 LocationSummary* summary =
1599 new LocationSummary(kNumInputs, 0, LocationSummary::kNoCall); 1599 new (isolate) LocationSummary(isolate, kNumInputs, 0, LocationSummary::kNo Call);
1600 summary->set_in(0, Location::RequiresRegister()); 1600 summary->set_in(0, Location::RequiresRegister());
1601 const bool field_has_length = field().needs_length_check(); 1601 const bool field_has_length = field().needs_length_check();
1602 summary->AddTemp(Location::RequiresRegister()); 1602 summary->AddTemp(Location::RequiresRegister());
1603 summary->AddTemp(Location::RequiresRegister()); 1603 summary->AddTemp(Location::RequiresRegister());
1604 const bool need_field_temp_reg = 1604 const bool need_field_temp_reg =
1605 field_has_length || (field().guarded_cid() == kIllegalCid); 1605 field_has_length || (field().guarded_cid() == kIllegalCid);
1606 if (need_field_temp_reg) { 1606 if (need_field_temp_reg) {
1607 summary->AddTemp(Location::RequiresRegister()); 1607 summary->AddTemp(Location::RequiresRegister());
1608 } 1608 }
1609 return summary; 1609 return summary;
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
1944 private: 1944 private:
1945 StoreInstanceFieldInstr* instruction_; 1945 StoreInstanceFieldInstr* instruction_;
1946 const Class& cls_; 1946 const Class& cls_;
1947 }; 1947 };
1948 1948
1949 1949
1950 LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(bool opt) const { 1950 LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(bool opt) const {
1951 const intptr_t kNumInputs = 2; 1951 const intptr_t kNumInputs = 2;
1952 const intptr_t kNumTemps = 0; 1952 const intptr_t kNumTemps = 0;
1953 LocationSummary* summary = 1953 LocationSummary* summary =
1954 new LocationSummary(kNumInputs, kNumTemps, 1954 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps,
1955 !field().IsNull() && 1955 !field().IsNull() &&
1956 ((field().guarded_cid() == kIllegalCid) || is_initialization_) 1956 ((field().guarded_cid() == kIllegalCid) || is_initialization_)
1957 ? LocationSummary::kCallOnSlowPath 1957 ? LocationSummary::kCallOnSlowPath
1958 : LocationSummary::kNoCall); 1958 : LocationSummary::kNoCall);
1959 1959
1960 summary->set_in(0, Location::RequiresRegister()); 1960 summary->set_in(0, Location::RequiresRegister());
1961 if (IsUnboxedStore() && opt) { 1961 if (IsUnboxedStore() && opt) {
1962 summary->set_in(1, Location::RequiresFpuRegister()); 1962 summary->set_in(1, Location::RequiresFpuRegister());
1963 summary->AddTemp(Location::RequiresRegister()); 1963 summary->AddTemp(Location::RequiresRegister());
1964 summary->AddTemp(Location::RequiresRegister()); 1964 summary->AddTemp(Location::RequiresRegister());
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
2185 } 2185 }
2186 } 2186 }
2187 __ Bind(&skip_store); 2187 __ Bind(&skip_store);
2188 } 2188 }
2189 2189
2190 2190
2191 LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(bool opt) const { 2191 LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(bool opt) const {
2192 const intptr_t kNumInputs = 1; 2192 const intptr_t kNumInputs = 1;
2193 const intptr_t kNumTemps = 0; 2193 const intptr_t kNumTemps = 0;
2194 LocationSummary* summary = 2194 LocationSummary* summary =
2195 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 2195 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
2196 summary->set_in(0, Location::RequiresRegister()); 2196 summary->set_in(0, Location::RequiresRegister());
2197 summary->set_out(0, Location::RequiresRegister()); 2197 summary->set_out(0, Location::RequiresRegister());
2198 return summary; 2198 return summary;
2199 } 2199 }
2200 2200
2201 2201
2202 // When the parser is building an implicit static getter for optimization, 2202 // When the parser is building an implicit static getter for optimization,
2203 // it can generate a function body where deoptimization ids do not line up 2203 // it can generate a function body where deoptimization ids do not line up
2204 // with the unoptimized code. 2204 // with the unoptimized code.
2205 // 2205 //
2206 // This is safe only so long as LoadStaticFieldInstr cannot deoptimize. 2206 // This is safe only so long as LoadStaticFieldInstr cannot deoptimize.
2207 void LoadStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 2207 void LoadStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
2208 const Register field = locs()->in(0).reg(); 2208 const Register field = locs()->in(0).reg();
2209 const Register result = locs()->out(0).reg(); 2209 const Register result = locs()->out(0).reg();
2210 __ LoadFromOffset(kWord, result, 2210 __ LoadFromOffset(kWord, result,
2211 field, Field::value_offset() - kHeapObjectTag); 2211 field, Field::value_offset() - kHeapObjectTag);
2212 } 2212 }
2213 2213
2214 2214
2215 LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(bool opt) const { 2215 LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(bool opt) const {
2216 LocationSummary* locs = new LocationSummary(1, 1, LocationSummary::kNoCall); 2216 LocationSummary* locs = new (isolate) LocationSummary(isolate, 1, 1, LocationS ummary::kNoCall);
2217 locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister() 2217 locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister()
2218 : Location::RequiresRegister()); 2218 : Location::RequiresRegister());
2219 locs->set_temp(0, Location::RequiresRegister()); 2219 locs->set_temp(0, Location::RequiresRegister());
2220 return locs; 2220 return locs;
2221 } 2221 }
2222 2222
2223 2223
2224 void StoreStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 2224 void StoreStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
2225 const Register value = locs()->in(0).reg(); 2225 const Register value = locs()->in(0).reg();
2226 const Register temp = locs()->temp(0).reg(); 2226 const Register temp = locs()->temp(0).reg();
2227 2227
2228 __ LoadObject(temp, field()); 2228 __ LoadObject(temp, field());
2229 if (this->value()->NeedsStoreBuffer()) { 2229 if (this->value()->NeedsStoreBuffer()) {
2230 __ StoreIntoObject(temp, 2230 __ StoreIntoObject(temp,
2231 FieldAddress(temp, Field::value_offset()), value, CanValueBeSmi()); 2231 FieldAddress(temp, Field::value_offset()), value, CanValueBeSmi());
2232 } else { 2232 } else {
2233 __ StoreIntoObjectNoBarrier( 2233 __ StoreIntoObjectNoBarrier(
2234 temp, FieldAddress(temp, Field::value_offset()), value); 2234 temp, FieldAddress(temp, Field::value_offset()), value);
2235 } 2235 }
2236 } 2236 }
2237 2237
2238 2238
2239 LocationSummary* InstanceOfInstr::MakeLocationSummary(bool opt) const { 2239 LocationSummary* InstanceOfInstr::MakeLocationSummary(bool opt) const {
2240 const intptr_t kNumInputs = 3; 2240 const intptr_t kNumInputs = 3;
2241 const intptr_t kNumTemps = 0; 2241 const intptr_t kNumTemps = 0;
2242 LocationSummary* summary = 2242 LocationSummary* summary =
2243 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 2243 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kCall);
2244 summary->set_in(0, Location::RegisterLocation(R0)); 2244 summary->set_in(0, Location::RegisterLocation(R0));
2245 summary->set_in(1, Location::RegisterLocation(R2)); 2245 summary->set_in(1, Location::RegisterLocation(R2));
2246 summary->set_in(2, Location::RegisterLocation(R1)); 2246 summary->set_in(2, Location::RegisterLocation(R1));
2247 summary->set_out(0, Location::RegisterLocation(R0)); 2247 summary->set_out(0, Location::RegisterLocation(R0));
2248 return summary; 2248 return summary;
2249 } 2249 }
2250 2250
2251 2251
2252 void InstanceOfInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 2252 void InstanceOfInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
2253 ASSERT(locs()->in(0).reg() == R0); // Value. 2253 ASSERT(locs()->in(0).reg() == R0); // Value.
2254 ASSERT(locs()->in(1).reg() == R2); // Instantiator. 2254 ASSERT(locs()->in(1).reg() == R2); // Instantiator.
2255 ASSERT(locs()->in(2).reg() == R1); // Instantiator type arguments. 2255 ASSERT(locs()->in(2).reg() == R1); // Instantiator type arguments.
2256 2256
2257 compiler->GenerateInstanceOf(token_pos(), 2257 compiler->GenerateInstanceOf(token_pos(),
2258 deopt_id(), 2258 deopt_id(),
2259 type(), 2259 type(),
2260 negate_result(), 2260 negate_result(),
2261 locs()); 2261 locs());
2262 ASSERT(locs()->out(0).reg() == R0); 2262 ASSERT(locs()->out(0).reg() == R0);
2263 } 2263 }
2264 2264
2265 2265
2266 LocationSummary* CreateArrayInstr::MakeLocationSummary(bool opt) const { 2266 LocationSummary* CreateArrayInstr::MakeLocationSummary(bool opt) const {
2267 const intptr_t kNumInputs = 2; 2267 const intptr_t kNumInputs = 2;
2268 const intptr_t kNumTemps = 0; 2268 const intptr_t kNumTemps = 0;
2269 LocationSummary* locs = 2269 LocationSummary* locs =
2270 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 2270 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kCall);
2271 locs->set_in(kElementTypePos, Location::RegisterLocation(R1)); 2271 locs->set_in(kElementTypePos, Location::RegisterLocation(R1));
2272 locs->set_in(kLengthPos, Location::RegisterLocation(R2)); 2272 locs->set_in(kLengthPos, Location::RegisterLocation(R2));
2273 locs->set_out(0, Location::RegisterLocation(R0)); 2273 locs->set_out(0, Location::RegisterLocation(R0));
2274 return locs; 2274 return locs;
2275 } 2275 }
2276 2276
2277 2277
2278 // Inlines array allocation for known constant values. 2278 // Inlines array allocation for known constant values.
2279 static void InlineArrayAllocation(FlowGraphCompiler* compiler, 2279 static void InlineArrayAllocation(FlowGraphCompiler* compiler,
2280 intptr_t num_elements, 2280 intptr_t num_elements,
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
2480 2480
2481 private: 2481 private:
2482 Instruction* instruction_; 2482 Instruction* instruction_;
2483 }; 2483 };
2484 2484
2485 2485
2486 LocationSummary* LoadFieldInstr::MakeLocationSummary(bool opt) const { 2486 LocationSummary* LoadFieldInstr::MakeLocationSummary(bool opt) const {
2487 const intptr_t kNumInputs = 1; 2487 const intptr_t kNumInputs = 1;
2488 const intptr_t kNumTemps = 0; 2488 const intptr_t kNumTemps = 0;
2489 LocationSummary* locs = 2489 LocationSummary* locs =
2490 new LocationSummary( 2490 new (isolate) LocationSummary(isolate,
2491 kNumInputs, kNumTemps, 2491 kNumInputs, kNumTemps,
2492 (opt && !IsPotentialUnboxedLoad()) 2492 (opt && !IsPotentialUnboxedLoad())
2493 ? LocationSummary::kNoCall 2493 ? LocationSummary::kNoCall
2494 : LocationSummary::kCallOnSlowPath); 2494 : LocationSummary::kCallOnSlowPath);
2495 2495
2496 locs->set_in(0, Location::RequiresRegister()); 2496 locs->set_in(0, Location::RequiresRegister());
2497 2497
2498 if (IsUnboxedLoad() && opt) { 2498 if (IsUnboxedLoad() && opt) {
2499 locs->AddTemp(Location::RequiresRegister()); 2499 locs->AddTemp(Location::RequiresRegister());
2500 } else if (IsPotentialUnboxedLoad()) { 2500 } else if (IsPotentialUnboxedLoad()) {
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
2628 __ LoadFromOffset(kWord, result_reg, 2628 __ LoadFromOffset(kWord, result_reg,
2629 instance_reg, offset_in_bytes() - kHeapObjectTag); 2629 instance_reg, offset_in_bytes() - kHeapObjectTag);
2630 __ Bind(&done); 2630 __ Bind(&done);
2631 } 2631 }
2632 2632
2633 2633
2634 LocationSummary* InstantiateTypeInstr::MakeLocationSummary(bool opt) const { 2634 LocationSummary* InstantiateTypeInstr::MakeLocationSummary(bool opt) const {
2635 const intptr_t kNumInputs = 1; 2635 const intptr_t kNumInputs = 1;
2636 const intptr_t kNumTemps = 0; 2636 const intptr_t kNumTemps = 0;
2637 LocationSummary* locs = 2637 LocationSummary* locs =
2638 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 2638 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kCall);
2639 locs->set_in(0, Location::RegisterLocation(R0)); 2639 locs->set_in(0, Location::RegisterLocation(R0));
2640 locs->set_out(0, Location::RegisterLocation(R0)); 2640 locs->set_out(0, Location::RegisterLocation(R0));
2641 return locs; 2641 return locs;
2642 } 2642 }
2643 2643
2644 2644
2645 void InstantiateTypeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 2645 void InstantiateTypeInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
2646 const Register instantiator_reg = locs()->in(0).reg(); 2646 const Register instantiator_reg = locs()->in(0).reg();
2647 const Register result_reg = locs()->out(0).reg(); 2647 const Register result_reg = locs()->out(0).reg();
2648 2648
(...skipping 11 matching lines...) Expand all
2660 __ Pop(result_reg); // Pop instantiated type. 2660 __ Pop(result_reg); // Pop instantiated type.
2661 ASSERT(instantiator_reg == result_reg); 2661 ASSERT(instantiator_reg == result_reg);
2662 } 2662 }
2663 2663
2664 2664
2665 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary( 2665 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary(
2666 bool opt) const { 2666 bool opt) const {
2667 const intptr_t kNumInputs = 1; 2667 const intptr_t kNumInputs = 1;
2668 const intptr_t kNumTemps = 0; 2668 const intptr_t kNumTemps = 0;
2669 LocationSummary* locs = 2669 LocationSummary* locs =
2670 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 2670 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kCall);
2671 locs->set_in(0, Location::RegisterLocation(R0)); 2671 locs->set_in(0, Location::RegisterLocation(R0));
2672 locs->set_out(0, Location::RegisterLocation(R0)); 2672 locs->set_out(0, Location::RegisterLocation(R0));
2673 return locs; 2673 return locs;
2674 } 2674 }
2675 2675
2676 2676
2677 void InstantiateTypeArgumentsInstr::EmitNativeCode( 2677 void InstantiateTypeArgumentsInstr::EmitNativeCode(
2678 FlowGraphCompiler* compiler) { 2678 FlowGraphCompiler* compiler) {
2679 const Register instantiator_reg = locs()->in(0).reg(); 2679 const Register instantiator_reg = locs()->in(0).reg();
2680 const Register result_reg = locs()->out(0).reg(); 2680 const Register result_reg = locs()->out(0).reg();
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
2728 __ Drop(2); // Drop instantiator and uninstantiated type arguments. 2728 __ Drop(2); // Drop instantiator and uninstantiated type arguments.
2729 __ Pop(result_reg); // Pop instantiated type arguments. 2729 __ Pop(result_reg); // Pop instantiated type arguments.
2730 __ Bind(&type_arguments_instantiated); 2730 __ Bind(&type_arguments_instantiated);
2731 } 2731 }
2732 2732
2733 2733
2734 LocationSummary* AllocateContextInstr::MakeLocationSummary(bool opt) const { 2734 LocationSummary* AllocateContextInstr::MakeLocationSummary(bool opt) const {
2735 const intptr_t kNumInputs = 0; 2735 const intptr_t kNumInputs = 0;
2736 const intptr_t kNumTemps = 1; 2736 const intptr_t kNumTemps = 1;
2737 LocationSummary* locs = 2737 LocationSummary* locs =
2738 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 2738 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kCall);
2739 locs->set_temp(0, Location::RegisterLocation(R1)); 2739 locs->set_temp(0, Location::RegisterLocation(R1));
2740 locs->set_out(0, Location::RegisterLocation(R0)); 2740 locs->set_out(0, Location::RegisterLocation(R0));
2741 return locs; 2741 return locs;
2742 } 2742 }
2743 2743
2744 2744
2745 void AllocateContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 2745 void AllocateContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
2746 ASSERT(locs()->temp(0).reg() == R1); 2746 ASSERT(locs()->temp(0).reg() == R1);
2747 ASSERT(locs()->out(0).reg() == R0); 2747 ASSERT(locs()->out(0).reg() == R0);
2748 2748
2749 __ LoadImmediate(R1, num_context_variables()); 2749 __ LoadImmediate(R1, num_context_variables());
2750 const ExternalLabel label("alloc_context", 2750 const ExternalLabel label("alloc_context",
2751 StubCode::AllocateContextEntryPoint()); 2751 StubCode::AllocateContextEntryPoint());
2752 compiler->GenerateCall(token_pos(), 2752 compiler->GenerateCall(token_pos(),
2753 &label, 2753 &label,
2754 PcDescriptors::kOther, 2754 PcDescriptors::kOther,
2755 locs()); 2755 locs());
2756 } 2756 }
2757 2757
2758 2758
2759 LocationSummary* CloneContextInstr::MakeLocationSummary(bool opt) const { 2759 LocationSummary* CloneContextInstr::MakeLocationSummary(bool opt) const {
2760 const intptr_t kNumInputs = 1; 2760 const intptr_t kNumInputs = 1;
2761 const intptr_t kNumTemps = 0; 2761 const intptr_t kNumTemps = 0;
2762 LocationSummary* locs = 2762 LocationSummary* locs =
2763 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 2763 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kCall);
2764 locs->set_in(0, Location::RegisterLocation(R0)); 2764 locs->set_in(0, Location::RegisterLocation(R0));
2765 locs->set_out(0, Location::RegisterLocation(R0)); 2765 locs->set_out(0, Location::RegisterLocation(R0));
2766 return locs; 2766 return locs;
2767 } 2767 }
2768 2768
2769 2769
2770 void CloneContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 2770 void CloneContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
2771 const Register context_value = locs()->in(0).reg(); 2771 const Register context_value = locs()->in(0).reg();
2772 const Register result = locs()->out(0).reg(); 2772 const Register result = locs()->out(0).reg();
2773 2773
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
2817 FP, exception_var().index() * kWordSize); 2817 FP, exception_var().index() * kWordSize);
2818 __ StoreToOffset(kWord, kStackTraceObjectReg, 2818 __ StoreToOffset(kWord, kStackTraceObjectReg,
2819 FP, stacktrace_var().index() * kWordSize); 2819 FP, stacktrace_var().index() * kWordSize);
2820 } 2820 }
2821 2821
2822 2822
2823 LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(bool opt) const { 2823 LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(bool opt) const {
2824 const intptr_t kNumInputs = 0; 2824 const intptr_t kNumInputs = 0;
2825 const intptr_t kNumTemps = 1; 2825 const intptr_t kNumTemps = 1;
2826 LocationSummary* summary = 2826 LocationSummary* summary =
2827 new LocationSummary(kNumInputs, 2827 new (isolate) LocationSummary(isolate, kNumInputs,
2828 kNumTemps, 2828 kNumTemps,
2829 LocationSummary::kCallOnSlowPath); 2829 LocationSummary::kCallOnSlowPath);
2830 summary->set_temp(0, Location::RequiresRegister()); 2830 summary->set_temp(0, Location::RequiresRegister());
2831 return summary; 2831 return summary;
2832 } 2832 }
2833 2833
2834 2834
2835 class CheckStackOverflowSlowPath : public SlowPathCode { 2835 class CheckStackOverflowSlowPath : public SlowPathCode {
2836 public: 2836 public:
2837 explicit CheckStackOverflowSlowPath(CheckStackOverflowInstr* instruction) 2837 explicit CheckStackOverflowSlowPath(CheckStackOverflowInstr* instruction)
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
3019 // Shift for result now we know there is no overflow. 3019 // Shift for result now we know there is no overflow.
3020 __ Lsl(result, left, IP); 3020 __ Lsl(result, left, IP);
3021 } 3021 }
3022 } 3022 }
3023 3023
3024 3024
3025 LocationSummary* BinarySmiOpInstr::MakeLocationSummary(bool opt) const { 3025 LocationSummary* BinarySmiOpInstr::MakeLocationSummary(bool opt) const {
3026 const intptr_t kNumInputs = 2; 3026 const intptr_t kNumInputs = 2;
3027 const intptr_t kNumTemps = 0; 3027 const intptr_t kNumTemps = 0;
3028 LocationSummary* summary = 3028 LocationSummary* summary =
3029 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3029 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3030 if (op_kind() == Token::kTRUNCDIV) { 3030 if (op_kind() == Token::kTRUNCDIV) {
3031 summary->set_in(0, Location::RequiresRegister()); 3031 summary->set_in(0, Location::RequiresRegister());
3032 if (RightIsPowerOfTwoConstant()) { 3032 if (RightIsPowerOfTwoConstant()) {
3033 ConstantInstr* right_constant = right()->definition()->AsConstant(); 3033 ConstantInstr* right_constant = right()->definition()->AsConstant();
3034 summary->set_in(1, Location::Constant(right_constant->value())); 3034 summary->set_in(1, Location::Constant(right_constant->value()));
3035 summary->AddTemp(Location::RequiresRegister()); 3035 summary->AddTemp(Location::RequiresRegister());
3036 } else { 3036 } else {
3037 summary->set_in(1, Location::RequiresRegister()); 3037 summary->set_in(1, Location::RequiresRegister());
3038 summary->AddTemp(Location::RequiresRegister()); 3038 summary->AddTemp(Location::RequiresRegister());
3039 summary->AddTemp(Location::RequiresFpuRegister()); 3039 summary->AddTemp(Location::RequiresFpuRegister());
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after
3387 } 3387 }
3388 3388
3389 3389
3390 LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(bool opt) const { 3390 LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(bool opt) const {
3391 intptr_t left_cid = left()->Type()->ToCid(); 3391 intptr_t left_cid = left()->Type()->ToCid();
3392 intptr_t right_cid = right()->Type()->ToCid(); 3392 intptr_t right_cid = right()->Type()->ToCid();
3393 ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid)); 3393 ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid));
3394 const intptr_t kNumInputs = 2; 3394 const intptr_t kNumInputs = 2;
3395 const intptr_t kNumTemps = 0; 3395 const intptr_t kNumTemps = 0;
3396 LocationSummary* summary = 3396 LocationSummary* summary =
3397 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3397 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSummar y::kNoCall);
3398 summary->set_in(0, Location::RequiresRegister()); 3398 summary->set_in(0, Location::RequiresRegister());
3399 summary->set_in(1, Location::RequiresRegister()); 3399 summary->set_in(1, Location::RequiresRegister());
3400 return summary; 3400 return summary;
3401 } 3401 }
3402 3402
3403 3403
3404 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3404 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3405 Label* deopt = compiler->AddDeoptStub(deopt_id(), 3405 Label* deopt = compiler->AddDeoptStub(deopt_id(),
3406 ICData::kDeoptBinaryDoubleOp); 3406 ICData::kDeoptBinaryDoubleOp);
3407 intptr_t left_cid = left()->Type()->ToCid(); 3407 intptr_t left_cid = left()->Type()->ToCid();
(...skipping 11 matching lines...) Expand all
3419 __ tst(IP, ShifterOperand(kSmiTagMask)); 3419 __ tst(IP, ShifterOperand(kSmiTagMask));
3420 } 3420 }
3421 __ b(deopt, EQ); 3421 __ b(deopt, EQ);
3422 } 3422 }
3423 3423
3424 3424
3425 LocationSummary* BoxDoubleInstr::MakeLocationSummary(bool opt) const { 3425 LocationSummary* BoxDoubleInstr::MakeLocationSummary(bool opt) const {
3426 const intptr_t kNumInputs = 1; 3426 const intptr_t kNumInputs = 1;
3427 const intptr_t kNumTemps = 1; 3427 const intptr_t kNumTemps = 1;
3428 LocationSummary* summary = 3428 LocationSummary* summary =
3429 new LocationSummary(kNumInputs, 3429 new (isolate) LocationSummary(isolate, kNumInputs,
3430 kNumTemps, 3430 kNumTemps,
3431 LocationSummary::kCallOnSlowPath); 3431 LocationSummary::kCallOnSlowPath);
3432 summary->set_in(0, Location::RequiresFpuRegister()); 3432 summary->set_in(0, Location::RequiresFpuRegister());
3433 summary->set_temp(0, Location::RequiresRegister()); 3433 summary->set_temp(0, Location::RequiresRegister());
3434 summary->set_out(0, Location::RequiresRegister()); 3434 summary->set_out(0, Location::RequiresRegister());
3435 return summary; 3435 return summary;
3436 } 3436 }
3437 3437
3438 3438
3439 void BoxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3439 void BoxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
(...skipping 12 matching lines...) Expand all
3452 } 3452 }
3453 3453
3454 3454
3455 LocationSummary* UnboxDoubleInstr::MakeLocationSummary(bool opt) const { 3455 LocationSummary* UnboxDoubleInstr::MakeLocationSummary(bool opt) const {
3456 const intptr_t kNumInputs = 1; 3456 const intptr_t kNumInputs = 1;
3457 const intptr_t value_cid = value()->Type()->ToCid(); 3457 const intptr_t value_cid = value()->Type()->ToCid();
3458 const bool needs_temp = ((value_cid != kSmiCid) && (value_cid != kDoubleCid)); 3458 const bool needs_temp = ((value_cid != kSmiCid) && (value_cid != kDoubleCid));
3459 const bool needs_writable_input = (value_cid == kSmiCid); 3459 const bool needs_writable_input = (value_cid == kSmiCid);
3460 const intptr_t kNumTemps = needs_temp ? 1 : 0; 3460 const intptr_t kNumTemps = needs_temp ? 1 : 0;
3461 LocationSummary* summary = 3461 LocationSummary* summary =
3462 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3462 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3463 summary->set_in(0, needs_writable_input 3463 summary->set_in(0, needs_writable_input
3464 ? Location::WritableRegister() 3464 ? Location::WritableRegister()
3465 : Location::RequiresRegister()); 3465 : Location::RequiresRegister());
3466 if (needs_temp) summary->set_temp(0, Location::RequiresRegister()); 3466 if (needs_temp) summary->set_temp(0, Location::RequiresRegister());
3467 summary->set_out(0, Location::RequiresFpuRegister()); 3467 summary->set_out(0, Location::RequiresFpuRegister());
3468 return summary; 3468 return summary;
3469 } 3469 }
3470 3470
3471 3471
3472 void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3472 void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
3509 __ Bind(&done); 3509 __ Bind(&done);
3510 } 3510 }
3511 } 3511 }
3512 } 3512 }
3513 3513
3514 3514
3515 LocationSummary* BoxFloat32x4Instr::MakeLocationSummary(bool opt) const { 3515 LocationSummary* BoxFloat32x4Instr::MakeLocationSummary(bool opt) const {
3516 const intptr_t kNumInputs = 1; 3516 const intptr_t kNumInputs = 1;
3517 const intptr_t kNumTemps = 1; 3517 const intptr_t kNumTemps = 1;
3518 LocationSummary* summary = 3518 LocationSummary* summary =
3519 new LocationSummary(kNumInputs, 3519 new (isolate) LocationSummary(isolate, kNumInputs,
3520 kNumTemps, 3520 kNumTemps,
3521 LocationSummary::kCallOnSlowPath); 3521 LocationSummary::kCallOnSlowPath);
3522 summary->set_in(0, Location::RequiresFpuRegister()); 3522 summary->set_in(0, Location::RequiresFpuRegister());
3523 summary->set_temp(0, Location::RequiresRegister()); 3523 summary->set_temp(0, Location::RequiresRegister());
3524 summary->set_out(0, Location::RequiresRegister()); 3524 summary->set_out(0, Location::RequiresRegister());
3525 return summary; 3525 return summary;
3526 } 3526 }
3527 3527
3528 3528
3529 void BoxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { 3529 void BoxFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
(...skipping 13 matching lines...) Expand all
3543 __ StoreMultipleDToOffset(dvalue0, 2, out_reg, 3543 __ StoreMultipleDToOffset(dvalue0, 2, out_reg,
3544 Float32x4::value_offset() - kHeapObjectTag); 3544 Float32x4::value_offset() - kHeapObjectTag);
3545 } 3545 }
3546 3546
3547 3547
3548 LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary(bool opt) const { 3548 LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary(bool opt) const {
3549 const intptr_t value_cid = value()->Type()->ToCid(); 3549 const intptr_t value_cid = value()->Type()->ToCid();
3550 const intptr_t kNumInputs = 1; 3550 const intptr_t kNumInputs = 1;
3551 const intptr_t kNumTemps = value_cid == kFloat32x4Cid ? 0 : 1; 3551 const intptr_t kNumTemps = value_cid == kFloat32x4Cid ? 0 : 1;
3552 LocationSummary* summary = 3552 LocationSummary* summary =
3553 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3553 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3554 summary->set_in(0, Location::RequiresRegister()); 3554 summary->set_in(0, Location::RequiresRegister());
3555 if (kNumTemps > 0) { 3555 if (kNumTemps > 0) {
3556 ASSERT(kNumTemps == 1); 3556 ASSERT(kNumTemps == 1);
3557 summary->set_temp(0, Location::RequiresRegister()); 3557 summary->set_temp(0, Location::RequiresRegister());
3558 } 3558 }
3559 summary->set_out(0, Location::RequiresFpuRegister()); 3559 summary->set_out(0, Location::RequiresFpuRegister());
3560 return summary; 3560 return summary;
3561 } 3561 }
3562 3562
3563 3563
(...skipping 14 matching lines...) Expand all
3578 const DRegister dresult0 = EvenDRegisterOf(result); 3578 const DRegister dresult0 = EvenDRegisterOf(result);
3579 __ LoadMultipleDFromOffset(dresult0, 2, value, 3579 __ LoadMultipleDFromOffset(dresult0, 2, value,
3580 Float32x4::value_offset() - kHeapObjectTag); 3580 Float32x4::value_offset() - kHeapObjectTag);
3581 } 3581 }
3582 3582
3583 3583
3584 LocationSummary* BoxFloat64x2Instr::MakeLocationSummary(bool opt) const { 3584 LocationSummary* BoxFloat64x2Instr::MakeLocationSummary(bool opt) const {
3585 const intptr_t kNumInputs = 1; 3585 const intptr_t kNumInputs = 1;
3586 const intptr_t kNumTemps = 1; 3586 const intptr_t kNumTemps = 1;
3587 LocationSummary* summary = 3587 LocationSummary* summary =
3588 new LocationSummary(kNumInputs, 3588 new (isolate) LocationSummary(isolate, kNumInputs,
3589 kNumTemps, 3589 kNumTemps,
3590 LocationSummary::kCallOnSlowPath); 3590 LocationSummary::kCallOnSlowPath);
3591 summary->set_in(0, Location::RequiresFpuRegister()); 3591 summary->set_in(0, Location::RequiresFpuRegister());
3592 summary->set_temp(0, Location::RequiresRegister()); 3592 summary->set_temp(0, Location::RequiresRegister());
3593 summary->set_out(0, Location::RequiresRegister()); 3593 summary->set_out(0, Location::RequiresRegister());
3594 return summary; 3594 return summary;
3595 } 3595 }
3596 3596
3597 3597
3598 void BoxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) { 3598 void BoxFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
(...skipping 13 matching lines...) Expand all
3612 __ StoreMultipleDToOffset(dvalue0, 2, out_reg, 3612 __ StoreMultipleDToOffset(dvalue0, 2, out_reg,
3613 Float64x2::value_offset() - kHeapObjectTag); 3613 Float64x2::value_offset() - kHeapObjectTag);
3614 } 3614 }
3615 3615
3616 3616
3617 LocationSummary* UnboxFloat64x2Instr::MakeLocationSummary(bool opt) const { 3617 LocationSummary* UnboxFloat64x2Instr::MakeLocationSummary(bool opt) const {
3618 const intptr_t value_cid = value()->Type()->ToCid(); 3618 const intptr_t value_cid = value()->Type()->ToCid();
3619 const intptr_t kNumInputs = 1; 3619 const intptr_t kNumInputs = 1;
3620 const intptr_t kNumTemps = value_cid == kFloat64x2Cid ? 0 : 1; 3620 const intptr_t kNumTemps = value_cid == kFloat64x2Cid ? 0 : 1;
3621 LocationSummary* summary = 3621 LocationSummary* summary =
3622 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3622 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3623 summary->set_in(0, Location::RequiresRegister()); 3623 summary->set_in(0, Location::RequiresRegister());
3624 if (kNumTemps > 0) { 3624 if (kNumTemps > 0) {
3625 ASSERT(kNumTemps == 1); 3625 ASSERT(kNumTemps == 1);
3626 summary->set_temp(0, Location::RequiresRegister()); 3626 summary->set_temp(0, Location::RequiresRegister());
3627 } 3627 }
3628 summary->set_out(0, Location::RequiresFpuRegister()); 3628 summary->set_out(0, Location::RequiresFpuRegister());
3629 return summary; 3629 return summary;
3630 } 3630 }
3631 3631
3632 3632
(...skipping 14 matching lines...) Expand all
3647 const DRegister dresult0 = EvenDRegisterOf(result); 3647 const DRegister dresult0 = EvenDRegisterOf(result);
3648 __ LoadMultipleDFromOffset(dresult0, 2, value, 3648 __ LoadMultipleDFromOffset(dresult0, 2, value,
3649 Float64x2::value_offset() - kHeapObjectTag); 3649 Float64x2::value_offset() - kHeapObjectTag);
3650 } 3650 }
3651 3651
3652 3652
3653 LocationSummary* BoxInt32x4Instr::MakeLocationSummary(bool opt) const { 3653 LocationSummary* BoxInt32x4Instr::MakeLocationSummary(bool opt) const {
3654 const intptr_t kNumInputs = 1; 3654 const intptr_t kNumInputs = 1;
3655 const intptr_t kNumTemps = 1; 3655 const intptr_t kNumTemps = 1;
3656 LocationSummary* summary = 3656 LocationSummary* summary =
3657 new LocationSummary(kNumInputs, 3657 new (isolate) LocationSummary(isolate, kNumInputs,
3658 kNumTemps, 3658 kNumTemps,
3659 LocationSummary::kCallOnSlowPath); 3659 LocationSummary::kCallOnSlowPath);
3660 summary->set_in(0, Location::RequiresFpuRegister()); 3660 summary->set_in(0, Location::RequiresFpuRegister());
3661 summary->set_temp(0, Location::RequiresRegister()); 3661 summary->set_temp(0, Location::RequiresRegister());
3662 summary->set_out(0, Location::RequiresRegister()); 3662 summary->set_out(0, Location::RequiresRegister());
3663 return summary; 3663 return summary;
3664 } 3664 }
3665 3665
3666 3666
3667 class BoxInt32x4SlowPath : public SlowPathCode { 3667 class BoxInt32x4SlowPath : public SlowPathCode {
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
3712 __ StoreMultipleDToOffset(dvalue0, 2, out_reg, 3712 __ StoreMultipleDToOffset(dvalue0, 2, out_reg,
3713 Int32x4::value_offset() - kHeapObjectTag); 3713 Int32x4::value_offset() - kHeapObjectTag);
3714 } 3714 }
3715 3715
3716 3716
3717 LocationSummary* UnboxInt32x4Instr::MakeLocationSummary(bool opt) const { 3717 LocationSummary* UnboxInt32x4Instr::MakeLocationSummary(bool opt) const {
3718 const intptr_t value_cid = value()->Type()->ToCid(); 3718 const intptr_t value_cid = value()->Type()->ToCid();
3719 const intptr_t kNumInputs = 1; 3719 const intptr_t kNumInputs = 1;
3720 const intptr_t kNumTemps = value_cid == kInt32x4Cid ? 0 : 1; 3720 const intptr_t kNumTemps = value_cid == kInt32x4Cid ? 0 : 1;
3721 LocationSummary* summary = 3721 LocationSummary* summary =
3722 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3722 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3723 summary->set_in(0, Location::RequiresRegister()); 3723 summary->set_in(0, Location::RequiresRegister());
3724 if (kNumTemps > 0) { 3724 if (kNumTemps > 0) {
3725 ASSERT(kNumTemps == 1); 3725 ASSERT(kNumTemps == 1);
3726 summary->set_temp(0, Location::RequiresRegister()); 3726 summary->set_temp(0, Location::RequiresRegister());
3727 } 3727 }
3728 summary->set_out(0, Location::RequiresFpuRegister()); 3728 summary->set_out(0, Location::RequiresFpuRegister());
3729 return summary; 3729 return summary;
3730 } 3730 }
3731 3731
3732 3732
(...skipping 14 matching lines...) Expand all
3747 const DRegister dresult0 = EvenDRegisterOf(result); 3747 const DRegister dresult0 = EvenDRegisterOf(result);
3748 __ LoadMultipleDFromOffset(dresult0, 2, value, 3748 __ LoadMultipleDFromOffset(dresult0, 2, value,
3749 Int32x4::value_offset() - kHeapObjectTag); 3749 Int32x4::value_offset() - kHeapObjectTag);
3750 } 3750 }
3751 3751
3752 3752
3753 LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(bool opt) const { 3753 LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(bool opt) const {
3754 const intptr_t kNumInputs = 2; 3754 const intptr_t kNumInputs = 2;
3755 const intptr_t kNumTemps = 0; 3755 const intptr_t kNumTemps = 0;
3756 LocationSummary* summary = 3756 LocationSummary* summary =
3757 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3757 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3758 summary->set_in(0, Location::RequiresFpuRegister()); 3758 summary->set_in(0, Location::RequiresFpuRegister());
3759 summary->set_in(1, Location::RequiresFpuRegister()); 3759 summary->set_in(1, Location::RequiresFpuRegister());
3760 summary->set_out(0, Location::RequiresFpuRegister()); 3760 summary->set_out(0, Location::RequiresFpuRegister());
3761 return summary; 3761 return summary;
3762 } 3762 }
3763 3763
3764 3764
3765 void BinaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3765 void BinaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3766 const DRegister left = EvenDRegisterOf(locs()->in(0).fpu_reg()); 3766 const DRegister left = EvenDRegisterOf(locs()->in(0).fpu_reg());
3767 const DRegister right = EvenDRegisterOf(locs()->in(1).fpu_reg()); 3767 const DRegister right = EvenDRegisterOf(locs()->in(1).fpu_reg());
3768 const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg()); 3768 const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
3769 switch (op_kind()) { 3769 switch (op_kind()) {
3770 case Token::kADD: __ vaddd(result, left, right); break; 3770 case Token::kADD: __ vaddd(result, left, right); break;
3771 case Token::kSUB: __ vsubd(result, left, right); break; 3771 case Token::kSUB: __ vsubd(result, left, right); break;
3772 case Token::kMUL: __ vmuld(result, left, right); break; 3772 case Token::kMUL: __ vmuld(result, left, right); break;
3773 case Token::kDIV: __ vdivd(result, left, right); break; 3773 case Token::kDIV: __ vdivd(result, left, right); break;
3774 default: UNREACHABLE(); 3774 default: UNREACHABLE();
3775 } 3775 }
3776 } 3776 }
3777 3777
3778 3778
3779 LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(bool opt) const { 3779 LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(bool opt) const {
3780 const intptr_t kNumInputs = 2; 3780 const intptr_t kNumInputs = 2;
3781 const intptr_t kNumTemps = 0; 3781 const intptr_t kNumTemps = 0;
3782 LocationSummary* summary = 3782 LocationSummary* summary =
3783 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3783 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3784 summary->set_in(0, Location::RequiresFpuRegister()); 3784 summary->set_in(0, Location::RequiresFpuRegister());
3785 summary->set_in(1, Location::RequiresFpuRegister()); 3785 summary->set_in(1, Location::RequiresFpuRegister());
3786 summary->set_out(0, Location::RequiresFpuRegister()); 3786 summary->set_out(0, Location::RequiresFpuRegister());
3787 return summary; 3787 return summary;
3788 } 3788 }
3789 3789
3790 3790
3791 void BinaryFloat32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3791 void BinaryFloat32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3792 const QRegister left = locs()->in(0).fpu_reg(); 3792 const QRegister left = locs()->in(0).fpu_reg();
3793 const QRegister right = locs()->in(1).fpu_reg(); 3793 const QRegister right = locs()->in(1).fpu_reg();
3794 const QRegister result = locs()->out(0).fpu_reg(); 3794 const QRegister result = locs()->out(0).fpu_reg();
3795 3795
3796 switch (op_kind()) { 3796 switch (op_kind()) {
3797 case Token::kADD: __ vaddqs(result, left, right); break; 3797 case Token::kADD: __ vaddqs(result, left, right); break;
3798 case Token::kSUB: __ vsubqs(result, left, right); break; 3798 case Token::kSUB: __ vsubqs(result, left, right); break;
3799 case Token::kMUL: __ vmulqs(result, left, right); break; 3799 case Token::kMUL: __ vmulqs(result, left, right); break;
3800 case Token::kDIV: __ Vdivqs(result, left, right); break; 3800 case Token::kDIV: __ Vdivqs(result, left, right); break;
3801 default: UNREACHABLE(); 3801 default: UNREACHABLE();
3802 } 3802 }
3803 } 3803 }
3804 3804
3805 3805
3806 LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(bool opt) const { 3806 LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(bool opt) const {
3807 const intptr_t kNumInputs = 2; 3807 const intptr_t kNumInputs = 2;
3808 const intptr_t kNumTemps = 0; 3808 const intptr_t kNumTemps = 0;
3809 LocationSummary* summary = 3809 LocationSummary* summary =
3810 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3810 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3811 summary->set_in(0, Location::RequiresFpuRegister()); 3811 summary->set_in(0, Location::RequiresFpuRegister());
3812 summary->set_in(1, Location::RequiresFpuRegister()); 3812 summary->set_in(1, Location::RequiresFpuRegister());
3813 summary->set_out(0, Location::RequiresFpuRegister()); 3813 summary->set_out(0, Location::RequiresFpuRegister());
3814 return summary; 3814 return summary;
3815 } 3815 }
3816 3816
3817 3817
3818 void BinaryFloat64x2OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3818 void BinaryFloat64x2OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3819 const QRegister left = locs()->in(0).fpu_reg(); 3819 const QRegister left = locs()->in(0).fpu_reg();
3820 const QRegister right = locs()->in(1).fpu_reg(); 3820 const QRegister right = locs()->in(1).fpu_reg();
(...skipping 27 matching lines...) Expand all
3848 break; 3848 break;
3849 default: UNREACHABLE(); 3849 default: UNREACHABLE();
3850 } 3850 }
3851 } 3851 }
3852 3852
3853 3853
3854 LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(bool opt) const { 3854 LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(bool opt) const {
3855 const intptr_t kNumInputs = 1; 3855 const intptr_t kNumInputs = 1;
3856 const intptr_t kNumTemps = 0; 3856 const intptr_t kNumTemps = 0;
3857 LocationSummary* summary = 3857 LocationSummary* summary =
3858 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3858 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3859 // Low (< Q7) Q registers are needed for the vcvtds and vmovs instructions. 3859 // Low (< Q7) Q registers are needed for the vcvtds and vmovs instructions.
3860 summary->set_in(0, Location::FpuRegisterLocation(Q5)); 3860 summary->set_in(0, Location::FpuRegisterLocation(Q5));
3861 summary->set_out(0, Location::FpuRegisterLocation(Q6)); 3861 summary->set_out(0, Location::FpuRegisterLocation(Q6));
3862 return summary; 3862 return summary;
3863 } 3863 }
3864 3864
3865 3865
3866 void Simd32x4ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3866 void Simd32x4ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3867 const QRegister value = locs()->in(0).fpu_reg(); 3867 const QRegister value = locs()->in(0).fpu_reg();
3868 const QRegister result = locs()->out(0).fpu_reg(); 3868 const QRegister result = locs()->out(0).fpu_reg();
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
3928 break; 3928 break;
3929 default: UNREACHABLE(); 3929 default: UNREACHABLE();
3930 } 3930 }
3931 } 3931 }
3932 3932
3933 3933
3934 LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(bool opt) const { 3934 LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(bool opt) const {
3935 const intptr_t kNumInputs = 2; 3935 const intptr_t kNumInputs = 2;
3936 const intptr_t kNumTemps = 0; 3936 const intptr_t kNumTemps = 0;
3937 LocationSummary* summary = 3937 LocationSummary* summary =
3938 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3938 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3939 // Low (< Q7) Q registers are needed for the vcvtds and vmovs instructions. 3939 // Low (< Q7) Q registers are needed for the vcvtds and vmovs instructions.
3940 summary->set_in(0, Location::FpuRegisterLocation(Q4)); 3940 summary->set_in(0, Location::FpuRegisterLocation(Q4));
3941 summary->set_in(1, Location::FpuRegisterLocation(Q5)); 3941 summary->set_in(1, Location::FpuRegisterLocation(Q5));
3942 summary->set_out(0, Location::FpuRegisterLocation(Q6)); 3942 summary->set_out(0, Location::FpuRegisterLocation(Q6));
3943 return summary; 3943 return summary;
3944 } 3944 }
3945 3945
3946 3946
3947 void Simd32x4ShuffleMixInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 3947 void Simd32x4ShuffleMixInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
3948 const QRegister left = locs()->in(0).fpu_reg(); 3948 const QRegister left = locs()->in(0).fpu_reg();
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
3984 break; 3984 break;
3985 default: UNREACHABLE(); 3985 default: UNREACHABLE();
3986 } 3986 }
3987 } 3987 }
3988 3988
3989 3989
3990 LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(bool opt) const { 3990 LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(bool opt) const {
3991 const intptr_t kNumInputs = 1; 3991 const intptr_t kNumInputs = 1;
3992 const intptr_t kNumTemps = 1; 3992 const intptr_t kNumTemps = 1;
3993 LocationSummary* summary = 3993 LocationSummary* summary =
3994 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 3994 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
3995 summary->set_in(0, Location::FpuRegisterLocation(Q5)); 3995 summary->set_in(0, Location::FpuRegisterLocation(Q5));
3996 summary->set_temp(0, Location::RequiresRegister()); 3996 summary->set_temp(0, Location::RequiresRegister());
3997 summary->set_out(0, Location::RequiresRegister()); 3997 summary->set_out(0, Location::RequiresRegister());
3998 return summary; 3998 return summary;
3999 } 3999 }
4000 4000
4001 4001
4002 void Simd32x4GetSignMaskInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4002 void Simd32x4GetSignMaskInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4003 const QRegister value = locs()->in(0).fpu_reg(); 4003 const QRegister value = locs()->in(0).fpu_reg();
4004 const DRegister dvalue0 = EvenDRegisterOf(value); 4004 const DRegister dvalue0 = EvenDRegisterOf(value);
(...skipping 20 matching lines...) Expand all
4025 // Tag. 4025 // Tag.
4026 __ SmiTag(out); 4026 __ SmiTag(out);
4027 } 4027 }
4028 4028
4029 4029
4030 LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary( 4030 LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary(
4031 bool opt) const { 4031 bool opt) const {
4032 const intptr_t kNumInputs = 4; 4032 const intptr_t kNumInputs = 4;
4033 const intptr_t kNumTemps = 0; 4033 const intptr_t kNumTemps = 0;
4034 LocationSummary* summary = 4034 LocationSummary* summary =
4035 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4035 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4036 summary->set_in(0, Location::RequiresFpuRegister()); 4036 summary->set_in(0, Location::RequiresFpuRegister());
4037 summary->set_in(1, Location::RequiresFpuRegister()); 4037 summary->set_in(1, Location::RequiresFpuRegister());
4038 summary->set_in(2, Location::RequiresFpuRegister()); 4038 summary->set_in(2, Location::RequiresFpuRegister());
4039 summary->set_in(3, Location::RequiresFpuRegister()); 4039 summary->set_in(3, Location::RequiresFpuRegister());
4040 // Low (< 7) Q registers are needed for the vcvtsd instruction. 4040 // Low (< 7) Q registers are needed for the vcvtsd instruction.
4041 summary->set_out(0, Location::FpuRegisterLocation(Q6)); 4041 summary->set_out(0, Location::FpuRegisterLocation(Q6));
4042 return summary; 4042 return summary;
4043 } 4043 }
4044 4044
4045 4045
(...skipping 11 matching lines...) Expand all
4057 __ vcvtsd(OddSRegisterOf(dr0), EvenDRegisterOf(q1)); 4057 __ vcvtsd(OddSRegisterOf(dr0), EvenDRegisterOf(q1));
4058 __ vcvtsd(EvenSRegisterOf(dr1), EvenDRegisterOf(q2)); 4058 __ vcvtsd(EvenSRegisterOf(dr1), EvenDRegisterOf(q2));
4059 __ vcvtsd(OddSRegisterOf(dr1), EvenDRegisterOf(q3)); 4059 __ vcvtsd(OddSRegisterOf(dr1), EvenDRegisterOf(q3));
4060 } 4060 }
4061 4061
4062 4062
4063 LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(bool opt) const { 4063 LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(bool opt) const {
4064 const intptr_t kNumInputs = 0; 4064 const intptr_t kNumInputs = 0;
4065 const intptr_t kNumTemps = 0; 4065 const intptr_t kNumTemps = 0;
4066 LocationSummary* summary = 4066 LocationSummary* summary =
4067 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4067 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4068 summary->set_out(0, Location::RequiresFpuRegister()); 4068 summary->set_out(0, Location::RequiresFpuRegister());
4069 return summary; 4069 return summary;
4070 } 4070 }
4071 4071
4072 4072
4073 void Float32x4ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4073 void Float32x4ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4074 const QRegister q = locs()->out(0).fpu_reg(); 4074 const QRegister q = locs()->out(0).fpu_reg();
4075 __ veorq(q, q, q); 4075 __ veorq(q, q, q);
4076 } 4076 }
4077 4077
4078 4078
4079 LocationSummary* Float32x4SplatInstr::MakeLocationSummary(bool opt) const { 4079 LocationSummary* Float32x4SplatInstr::MakeLocationSummary(bool opt) const {
4080 const intptr_t kNumInputs = 1; 4080 const intptr_t kNumInputs = 1;
4081 const intptr_t kNumTemps = 0; 4081 const intptr_t kNumTemps = 0;
4082 LocationSummary* summary = 4082 LocationSummary* summary =
4083 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4083 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4084 summary->set_in(0, Location::RequiresFpuRegister()); 4084 summary->set_in(0, Location::RequiresFpuRegister());
4085 summary->set_out(0, Location::RequiresFpuRegister()); 4085 summary->set_out(0, Location::RequiresFpuRegister());
4086 return summary; 4086 return summary;
4087 } 4087 }
4088 4088
4089 4089
4090 void Float32x4SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4090 void Float32x4SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4091 const QRegister value = locs()->in(0).fpu_reg(); 4091 const QRegister value = locs()->in(0).fpu_reg();
4092 const QRegister result = locs()->out(0).fpu_reg(); 4092 const QRegister result = locs()->out(0).fpu_reg();
4093 4093
4094 const DRegister dvalue0 = EvenDRegisterOf(value); 4094 const DRegister dvalue0 = EvenDRegisterOf(value);
4095 4095
4096 // Convert to Float32. 4096 // Convert to Float32.
4097 __ vcvtsd(STMP, dvalue0); 4097 __ vcvtsd(STMP, dvalue0);
4098 4098
4099 // Splat across all lanes. 4099 // Splat across all lanes.
4100 __ vdup(kWord, result, DTMP, 0); 4100 __ vdup(kWord, result, DTMP, 0);
4101 } 4101 }
4102 4102
4103 4103
4104 LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(bool opt) const { 4104 LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(bool opt) const {
4105 const intptr_t kNumInputs = 2; 4105 const intptr_t kNumInputs = 2;
4106 const intptr_t kNumTemps = 0; 4106 const intptr_t kNumTemps = 0;
4107 LocationSummary* summary = 4107 LocationSummary* summary =
4108 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4108 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4109 summary->set_in(0, Location::RequiresFpuRegister()); 4109 summary->set_in(0, Location::RequiresFpuRegister());
4110 summary->set_in(1, Location::RequiresFpuRegister()); 4110 summary->set_in(1, Location::RequiresFpuRegister());
4111 summary->set_out(0, Location::RequiresFpuRegister()); 4111 summary->set_out(0, Location::RequiresFpuRegister());
4112 return summary; 4112 return summary;
4113 } 4113 }
4114 4114
4115 4115
4116 void Float32x4ComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4116 void Float32x4ComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4117 const QRegister left = locs()->in(0).fpu_reg(); 4117 const QRegister left = locs()->in(0).fpu_reg();
4118 const QRegister right = locs()->in(1).fpu_reg(); 4118 const QRegister right = locs()->in(1).fpu_reg();
(...skipping 23 matching lines...) Expand all
4142 4142
4143 default: UNREACHABLE(); 4143 default: UNREACHABLE();
4144 } 4144 }
4145 } 4145 }
4146 4146
4147 4147
4148 LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(bool opt) const { 4148 LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(bool opt) const {
4149 const intptr_t kNumInputs = 2; 4149 const intptr_t kNumInputs = 2;
4150 const intptr_t kNumTemps = 0; 4150 const intptr_t kNumTemps = 0;
4151 LocationSummary* summary = 4151 LocationSummary* summary =
4152 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4152 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4153 summary->set_in(0, Location::RequiresFpuRegister()); 4153 summary->set_in(0, Location::RequiresFpuRegister());
4154 summary->set_in(1, Location::RequiresFpuRegister()); 4154 summary->set_in(1, Location::RequiresFpuRegister());
4155 summary->set_out(0, Location::RequiresFpuRegister()); 4155 summary->set_out(0, Location::RequiresFpuRegister());
4156 return summary; 4156 return summary;
4157 } 4157 }
4158 4158
4159 4159
4160 void Float32x4MinMaxInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4160 void Float32x4MinMaxInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4161 const QRegister left = locs()->in(0).fpu_reg(); 4161 const QRegister left = locs()->in(0).fpu_reg();
4162 const QRegister right = locs()->in(1).fpu_reg(); 4162 const QRegister right = locs()->in(1).fpu_reg();
4163 const QRegister result = locs()->out(0).fpu_reg(); 4163 const QRegister result = locs()->out(0).fpu_reg();
4164 4164
4165 switch (op_kind()) { 4165 switch (op_kind()) {
4166 case MethodRecognizer::kFloat32x4Min: 4166 case MethodRecognizer::kFloat32x4Min:
4167 __ vminqs(result, left, right); 4167 __ vminqs(result, left, right);
4168 break; 4168 break;
4169 case MethodRecognizer::kFloat32x4Max: 4169 case MethodRecognizer::kFloat32x4Max:
4170 __ vmaxqs(result, left, right); 4170 __ vmaxqs(result, left, right);
4171 break; 4171 break;
4172 default: UNREACHABLE(); 4172 default: UNREACHABLE();
4173 } 4173 }
4174 } 4174 }
4175 4175
4176 4176
4177 LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(bool opt) const { 4177 LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(bool opt) const {
4178 const intptr_t kNumInputs = 1; 4178 const intptr_t kNumInputs = 1;
4179 const intptr_t kNumTemps = 1; 4179 const intptr_t kNumTemps = 1;
4180 LocationSummary* summary = 4180 LocationSummary* summary =
4181 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4181 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4182 summary->set_in(0, Location::RequiresFpuRegister()); 4182 summary->set_in(0, Location::RequiresFpuRegister());
4183 summary->set_out(0, Location::RequiresFpuRegister()); 4183 summary->set_out(0, Location::RequiresFpuRegister());
4184 summary->set_temp(0, Location::RequiresFpuRegister()); 4184 summary->set_temp(0, Location::RequiresFpuRegister());
4185 return summary; 4185 return summary;
4186 } 4186 }
4187 4187
4188 4188
4189 void Float32x4SqrtInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4189 void Float32x4SqrtInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4190 const QRegister left = locs()->in(0).fpu_reg(); 4190 const QRegister left = locs()->in(0).fpu_reg();
4191 const QRegister result = locs()->out(0).fpu_reg(); 4191 const QRegister result = locs()->out(0).fpu_reg();
(...skipping 11 matching lines...) Expand all
4203 break; 4203 break;
4204 default: UNREACHABLE(); 4204 default: UNREACHABLE();
4205 } 4205 }
4206 } 4206 }
4207 4207
4208 4208
4209 LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(bool opt) const { 4209 LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(bool opt) const {
4210 const intptr_t kNumInputs = 2; 4210 const intptr_t kNumInputs = 2;
4211 const intptr_t kNumTemps = 0; 4211 const intptr_t kNumTemps = 0;
4212 LocationSummary* summary = 4212 LocationSummary* summary =
4213 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4213 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4214 summary->set_in(0, Location::RequiresFpuRegister()); 4214 summary->set_in(0, Location::RequiresFpuRegister());
4215 summary->set_in(1, Location::RequiresFpuRegister()); 4215 summary->set_in(1, Location::RequiresFpuRegister());
4216 summary->set_out(0, Location::RequiresFpuRegister()); 4216 summary->set_out(0, Location::RequiresFpuRegister());
4217 return summary; 4217 return summary;
4218 } 4218 }
4219 4219
4220 4220
4221 void Float32x4ScaleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4221 void Float32x4ScaleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4222 const QRegister left = locs()->in(0).fpu_reg(); 4222 const QRegister left = locs()->in(0).fpu_reg();
4223 const QRegister right = locs()->in(1).fpu_reg(); 4223 const QRegister right = locs()->in(1).fpu_reg();
4224 const QRegister result = locs()->out(0).fpu_reg(); 4224 const QRegister result = locs()->out(0).fpu_reg();
4225 4225
4226 switch (op_kind()) { 4226 switch (op_kind()) {
4227 case MethodRecognizer::kFloat32x4Scale: 4227 case MethodRecognizer::kFloat32x4Scale:
4228 __ vcvtsd(STMP, EvenDRegisterOf(left)); 4228 __ vcvtsd(STMP, EvenDRegisterOf(left));
4229 __ vdup(kWord, result, DTMP, 0); 4229 __ vdup(kWord, result, DTMP, 0);
4230 __ vmulqs(result, result, right); 4230 __ vmulqs(result, result, right);
4231 break; 4231 break;
4232 default: UNREACHABLE(); 4232 default: UNREACHABLE();
4233 } 4233 }
4234 } 4234 }
4235 4235
4236 4236
4237 LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(bool opt) const { 4237 LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(bool opt) const {
4238 const intptr_t kNumInputs = 1; 4238 const intptr_t kNumInputs = 1;
4239 const intptr_t kNumTemps = 0; 4239 const intptr_t kNumTemps = 0;
4240 LocationSummary* summary = 4240 LocationSummary* summary =
4241 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4241 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4242 summary->set_in(0, Location::RequiresFpuRegister()); 4242 summary->set_in(0, Location::RequiresFpuRegister());
4243 summary->set_out(0, Location::RequiresFpuRegister()); 4243 summary->set_out(0, Location::RequiresFpuRegister());
4244 return summary; 4244 return summary;
4245 } 4245 }
4246 4246
4247 4247
4248 void Float32x4ZeroArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4248 void Float32x4ZeroArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4249 const QRegister left = locs()->in(0).fpu_reg(); 4249 const QRegister left = locs()->in(0).fpu_reg();
4250 const QRegister result = locs()->out(0).fpu_reg(); 4250 const QRegister result = locs()->out(0).fpu_reg();
4251 4251
4252 switch (op_kind()) { 4252 switch (op_kind()) {
4253 case MethodRecognizer::kFloat32x4Negate: 4253 case MethodRecognizer::kFloat32x4Negate:
4254 __ vnegqs(result, left); 4254 __ vnegqs(result, left);
4255 break; 4255 break;
4256 case MethodRecognizer::kFloat32x4Absolute: 4256 case MethodRecognizer::kFloat32x4Absolute:
4257 __ vabsqs(result, left); 4257 __ vabsqs(result, left);
4258 break; 4258 break;
4259 default: UNREACHABLE(); 4259 default: UNREACHABLE();
4260 } 4260 }
4261 } 4261 }
4262 4262
4263 4263
4264 LocationSummary* Float32x4ClampInstr::MakeLocationSummary(bool opt) const { 4264 LocationSummary* Float32x4ClampInstr::MakeLocationSummary(bool opt) const {
4265 const intptr_t kNumInputs = 3; 4265 const intptr_t kNumInputs = 3;
4266 const intptr_t kNumTemps = 0; 4266 const intptr_t kNumTemps = 0;
4267 LocationSummary* summary = 4267 LocationSummary* summary =
4268 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4268 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4269 summary->set_in(0, Location::RequiresFpuRegister()); 4269 summary->set_in(0, Location::RequiresFpuRegister());
4270 summary->set_in(1, Location::RequiresFpuRegister()); 4270 summary->set_in(1, Location::RequiresFpuRegister());
4271 summary->set_in(2, Location::RequiresFpuRegister()); 4271 summary->set_in(2, Location::RequiresFpuRegister());
4272 summary->set_out(0, Location::RequiresFpuRegister()); 4272 summary->set_out(0, Location::RequiresFpuRegister());
4273 return summary; 4273 return summary;
4274 } 4274 }
4275 4275
4276 4276
4277 void Float32x4ClampInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4277 void Float32x4ClampInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4278 const QRegister left = locs()->in(0).fpu_reg(); 4278 const QRegister left = locs()->in(0).fpu_reg();
4279 const QRegister lower = locs()->in(1).fpu_reg(); 4279 const QRegister lower = locs()->in(1).fpu_reg();
4280 const QRegister upper = locs()->in(2).fpu_reg(); 4280 const QRegister upper = locs()->in(2).fpu_reg();
4281 const QRegister result = locs()->out(0).fpu_reg(); 4281 const QRegister result = locs()->out(0).fpu_reg();
4282 __ vminqs(result, left, upper); 4282 __ vminqs(result, left, upper);
4283 __ vmaxqs(result, result, lower); 4283 __ vmaxqs(result, result, lower);
4284 } 4284 }
4285 4285
4286 4286
4287 LocationSummary* Float32x4WithInstr::MakeLocationSummary(bool opt) const { 4287 LocationSummary* Float32x4WithInstr::MakeLocationSummary(bool opt) const {
4288 const intptr_t kNumInputs = 2; 4288 const intptr_t kNumInputs = 2;
4289 const intptr_t kNumTemps = 0; 4289 const intptr_t kNumTemps = 0;
4290 LocationSummary* summary = 4290 LocationSummary* summary =
4291 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4291 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4292 summary->set_in(0, Location::RequiresFpuRegister()); 4292 summary->set_in(0, Location::RequiresFpuRegister());
4293 summary->set_in(1, Location::RequiresFpuRegister()); 4293 summary->set_in(1, Location::RequiresFpuRegister());
4294 // Low (< 7) Q registers are needed for the vmovs instruction. 4294 // Low (< 7) Q registers are needed for the vmovs instruction.
4295 summary->set_out(0, Location::FpuRegisterLocation(Q6)); 4295 summary->set_out(0, Location::FpuRegisterLocation(Q6));
4296 return summary; 4296 return summary;
4297 } 4297 }
4298 4298
4299 4299
4300 void Float32x4WithInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4300 void Float32x4WithInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4301 const QRegister replacement = locs()->in(0).fpu_reg(); 4301 const QRegister replacement = locs()->in(0).fpu_reg();
(...skipping 27 matching lines...) Expand all
4329 break; 4329 break;
4330 default: UNREACHABLE(); 4330 default: UNREACHABLE();
4331 } 4331 }
4332 } 4332 }
4333 4333
4334 4334
4335 LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(bool opt) const { 4335 LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(bool opt) const {
4336 const intptr_t kNumInputs = 1; 4336 const intptr_t kNumInputs = 1;
4337 const intptr_t kNumTemps = 0; 4337 const intptr_t kNumTemps = 0;
4338 LocationSummary* summary = 4338 LocationSummary* summary =
4339 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4339 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4340 summary->set_in(0, Location::RequiresFpuRegister()); 4340 summary->set_in(0, Location::RequiresFpuRegister());
4341 summary->set_out(0, Location::RequiresFpuRegister()); 4341 summary->set_out(0, Location::RequiresFpuRegister());
4342 return summary; 4342 return summary;
4343 } 4343 }
4344 4344
4345 4345
4346 void Float32x4ToInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { 4346 void Float32x4ToInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
4347 const QRegister value = locs()->in(0).fpu_reg(); 4347 const QRegister value = locs()->in(0).fpu_reg();
4348 const QRegister result = locs()->out(0).fpu_reg(); 4348 const QRegister result = locs()->out(0).fpu_reg();
4349 4349
4350 if (value != result) { 4350 if (value != result) {
4351 __ vmovq(result, value); 4351 __ vmovq(result, value);
4352 } 4352 }
4353 } 4353 }
4354 4354
4355 4355
4356 LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(bool opt) const { 4356 LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(bool opt) const {
4357 const intptr_t kNumInputs = 1; 4357 const intptr_t kNumInputs = 1;
4358 const intptr_t kNumTemps = 0; 4358 const intptr_t kNumTemps = 0;
4359 LocationSummary* summary = 4359 LocationSummary* summary =
4360 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4360 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4361 summary->set_in(0, Location::RequiresFpuRegister()); 4361 summary->set_in(0, Location::RequiresFpuRegister());
4362 summary->set_out(0, Location::RequiresFpuRegister()); 4362 summary->set_out(0, Location::RequiresFpuRegister());
4363 return summary; 4363 return summary;
4364 } 4364 }
4365 4365
4366 4366
4367 void Simd64x2ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4367 void Simd64x2ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4368 const QRegister value = locs()->in(0).fpu_reg(); 4368 const QRegister value = locs()->in(0).fpu_reg();
4369 4369
4370 const DRegister dvalue0 = EvenDRegisterOf(value); 4370 const DRegister dvalue0 = EvenDRegisterOf(value);
(...skipping 12 matching lines...) Expand all
4383 break; 4383 break;
4384 default: UNREACHABLE(); 4384 default: UNREACHABLE();
4385 } 4385 }
4386 } 4386 }
4387 4387
4388 4388
4389 LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(bool opt) const { 4389 LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(bool opt) const {
4390 const intptr_t kNumInputs = 0; 4390 const intptr_t kNumInputs = 0;
4391 const intptr_t kNumTemps = 0; 4391 const intptr_t kNumTemps = 0;
4392 LocationSummary* summary = 4392 LocationSummary* summary =
4393 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4393 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4394 summary->set_out(0, Location::RequiresFpuRegister()); 4394 summary->set_out(0, Location::RequiresFpuRegister());
4395 return summary; 4395 return summary;
4396 } 4396 }
4397 4397
4398 4398
4399 void Float64x2ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4399 void Float64x2ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4400 const QRegister q = locs()->out(0).fpu_reg(); 4400 const QRegister q = locs()->out(0).fpu_reg();
4401 __ veorq(q, q, q); 4401 __ veorq(q, q, q);
4402 } 4402 }
4403 4403
4404 4404
4405 LocationSummary* Float64x2SplatInstr::MakeLocationSummary(bool opt) const { 4405 LocationSummary* Float64x2SplatInstr::MakeLocationSummary(bool opt) const {
4406 const intptr_t kNumInputs = 1; 4406 const intptr_t kNumInputs = 1;
4407 const intptr_t kNumTemps = 0; 4407 const intptr_t kNumTemps = 0;
4408 LocationSummary* summary = 4408 LocationSummary* summary =
4409 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4409 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4410 summary->set_in(0, Location::RequiresFpuRegister()); 4410 summary->set_in(0, Location::RequiresFpuRegister());
4411 summary->set_out(0, Location::RequiresFpuRegister()); 4411 summary->set_out(0, Location::RequiresFpuRegister());
4412 return summary; 4412 return summary;
4413 } 4413 }
4414 4414
4415 4415
4416 void Float64x2SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4416 void Float64x2SplatInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4417 const QRegister value = locs()->in(0).fpu_reg(); 4417 const QRegister value = locs()->in(0).fpu_reg();
4418 4418
4419 const DRegister dvalue = EvenDRegisterOf(value); 4419 const DRegister dvalue = EvenDRegisterOf(value);
4420 4420
4421 const QRegister result = locs()->out(0).fpu_reg(); 4421 const QRegister result = locs()->out(0).fpu_reg();
4422 4422
4423 const DRegister dresult0 = EvenDRegisterOf(result); 4423 const DRegister dresult0 = EvenDRegisterOf(result);
4424 const DRegister dresult1 = OddDRegisterOf(result); 4424 const DRegister dresult1 = OddDRegisterOf(result);
4425 4425
4426 // Splat across all lanes. 4426 // Splat across all lanes.
4427 __ vmovd(dresult0, dvalue); 4427 __ vmovd(dresult0, dvalue);
4428 __ vmovd(dresult1, dvalue); 4428 __ vmovd(dresult1, dvalue);
4429 } 4429 }
4430 4430
4431 4431
4432 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary( 4432 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary(
4433 bool opt) const { 4433 bool opt) const {
4434 const intptr_t kNumInputs = 2; 4434 const intptr_t kNumInputs = 2;
4435 const intptr_t kNumTemps = 0; 4435 const intptr_t kNumTemps = 0;
4436 LocationSummary* summary = 4436 LocationSummary* summary =
4437 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4437 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4438 summary->set_in(0, Location::RequiresFpuRegister()); 4438 summary->set_in(0, Location::RequiresFpuRegister());
4439 summary->set_in(1, Location::RequiresFpuRegister()); 4439 summary->set_in(1, Location::RequiresFpuRegister());
4440 summary->set_out(0, Location::RequiresFpuRegister()); 4440 summary->set_out(0, Location::RequiresFpuRegister());
4441 return summary; 4441 return summary;
4442 } 4442 }
4443 4443
4444 4444
4445 void Float64x2ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4445 void Float64x2ConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4446 const QRegister q0 = locs()->in(0).fpu_reg(); 4446 const QRegister q0 = locs()->in(0).fpu_reg();
4447 const QRegister q1 = locs()->in(1).fpu_reg(); 4447 const QRegister q1 = locs()->in(1).fpu_reg();
4448 const QRegister r = locs()->out(0).fpu_reg(); 4448 const QRegister r = locs()->out(0).fpu_reg();
4449 4449
4450 const DRegister d0 = EvenDRegisterOf(q0); 4450 const DRegister d0 = EvenDRegisterOf(q0);
4451 const DRegister d1 = EvenDRegisterOf(q1); 4451 const DRegister d1 = EvenDRegisterOf(q1);
4452 4452
4453 const DRegister dr0 = EvenDRegisterOf(r); 4453 const DRegister dr0 = EvenDRegisterOf(r);
4454 const DRegister dr1 = OddDRegisterOf(r); 4454 const DRegister dr1 = OddDRegisterOf(r);
4455 4455
4456 __ vmovd(dr0, d0); 4456 __ vmovd(dr0, d0);
4457 __ vmovd(dr1, d1); 4457 __ vmovd(dr1, d1);
4458 } 4458 }
4459 4459
4460 4460
4461 LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary( 4461 LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary(
4462 bool opt) const { 4462 bool opt) const {
4463 const intptr_t kNumInputs = 1; 4463 const intptr_t kNumInputs = 1;
4464 const intptr_t kNumTemps = 0; 4464 const intptr_t kNumTemps = 0;
4465 LocationSummary* summary = 4465 LocationSummary* summary =
4466 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4466 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4467 summary->set_in(0, Location::RequiresFpuRegister()); 4467 summary->set_in(0, Location::RequiresFpuRegister());
4468 // Low (< 7) Q registers are needed for the vcvtsd instruction. 4468 // Low (< 7) Q registers are needed for the vcvtsd instruction.
4469 summary->set_out(0, Location::FpuRegisterLocation(Q6)); 4469 summary->set_out(0, Location::FpuRegisterLocation(Q6));
4470 return summary; 4470 return summary;
4471 } 4471 }
4472 4472
4473 4473
4474 void Float64x2ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { 4474 void Float64x2ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
4475 const QRegister q = locs()->in(0).fpu_reg(); 4475 const QRegister q = locs()->in(0).fpu_reg();
4476 const QRegister r = locs()->out(0).fpu_reg(); 4476 const QRegister r = locs()->out(0).fpu_reg();
(...skipping 10 matching lines...) Expand all
4487 // Set Y lane. 4487 // Set Y lane.
4488 __ vcvtsd(OddSRegisterOf(dr0), dq1); 4488 __ vcvtsd(OddSRegisterOf(dr0), dq1);
4489 } 4489 }
4490 4490
4491 4491
4492 LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary( 4492 LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary(
4493 bool opt) const { 4493 bool opt) const {
4494 const intptr_t kNumInputs = 1; 4494 const intptr_t kNumInputs = 1;
4495 const intptr_t kNumTemps = 0; 4495 const intptr_t kNumTemps = 0;
4496 LocationSummary* summary = 4496 LocationSummary* summary =
4497 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4497 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4498 summary->set_in(0, Location::RequiresFpuRegister()); 4498 summary->set_in(0, Location::RequiresFpuRegister());
4499 // Low (< 7) Q registers are needed for the vcvtsd instruction. 4499 // Low (< 7) Q registers are needed for the vcvtsd instruction.
4500 summary->set_out(0, Location::FpuRegisterLocation(Q6)); 4500 summary->set_out(0, Location::FpuRegisterLocation(Q6));
4501 return summary; 4501 return summary;
4502 } 4502 }
4503 4503
4504 4504
4505 void Float32x4ToFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) { 4505 void Float32x4ToFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
4506 const QRegister q = locs()->in(0).fpu_reg(); 4506 const QRegister q = locs()->in(0).fpu_reg();
4507 const QRegister r = locs()->out(0).fpu_reg(); 4507 const QRegister r = locs()->out(0).fpu_reg();
4508 4508
4509 const DRegister dq0 = EvenDRegisterOf(q); 4509 const DRegister dq0 = EvenDRegisterOf(q);
4510 4510
4511 const DRegister dr0 = EvenDRegisterOf(r); 4511 const DRegister dr0 = EvenDRegisterOf(r);
4512 const DRegister dr1 = OddDRegisterOf(r); 4512 const DRegister dr1 = OddDRegisterOf(r);
4513 4513
4514 // Set X. 4514 // Set X.
4515 __ vcvtds(dr0, EvenSRegisterOf(dq0)); 4515 __ vcvtds(dr0, EvenSRegisterOf(dq0));
4516 // Set Y. 4516 // Set Y.
4517 __ vcvtds(dr1, OddSRegisterOf(dq0)); 4517 __ vcvtds(dr1, OddSRegisterOf(dq0));
4518 } 4518 }
4519 4519
4520 4520
4521 LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(bool opt) const { 4521 LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(bool opt) const {
4522 const intptr_t kNumInputs = 1; 4522 const intptr_t kNumInputs = 1;
4523 const intptr_t kNumTemps = 0; 4523 const intptr_t kNumTemps = 0;
4524 LocationSummary* summary = 4524 LocationSummary* summary =
4525 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4525 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4526 4526
4527 if (representation() == kTagged) { 4527 if (representation() == kTagged) {
4528 ASSERT(op_kind() == MethodRecognizer::kFloat64x2GetSignMask); 4528 ASSERT(op_kind() == MethodRecognizer::kFloat64x2GetSignMask);
4529 // Grabbing the S components means we need a low (< 7) Q. 4529 // Grabbing the S components means we need a low (< 7) Q.
4530 summary->set_in(0, Location::FpuRegisterLocation(Q6)); 4530 summary->set_in(0, Location::FpuRegisterLocation(Q6));
4531 summary->set_out(0, Location::RequiresRegister()); 4531 summary->set_out(0, Location::RequiresRegister());
4532 summary->AddTemp(Location::RequiresRegister()); 4532 summary->AddTemp(Location::RequiresRegister());
4533 } else { 4533 } else {
4534 summary->set_in(0, Location::RequiresFpuRegister()); 4534 summary->set_in(0, Location::RequiresFpuRegister());
4535 summary->set_out(0, Location::RequiresFpuRegister()); 4535 summary->set_out(0, Location::RequiresFpuRegister());
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
4582 break; 4582 break;
4583 default: UNREACHABLE(); 4583 default: UNREACHABLE();
4584 } 4584 }
4585 } 4585 }
4586 4586
4587 4587
4588 LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(bool opt) const { 4588 LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(bool opt) const {
4589 const intptr_t kNumInputs = 2; 4589 const intptr_t kNumInputs = 2;
4590 const intptr_t kNumTemps = 0; 4590 const intptr_t kNumTemps = 0;
4591 LocationSummary* summary = 4591 LocationSummary* summary =
4592 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4592 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4593 summary->set_in(0, Location::RequiresFpuRegister()); 4593 summary->set_in(0, Location::RequiresFpuRegister());
4594 summary->set_in(1, Location::RequiresFpuRegister()); 4594 summary->set_in(1, Location::RequiresFpuRegister());
4595 summary->set_out(0, Location::SameAsFirstInput()); 4595 summary->set_out(0, Location::SameAsFirstInput());
4596 return summary; 4596 return summary;
4597 } 4597 }
4598 4598
4599 4599
4600 void Float64x2OneArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4600 void Float64x2OneArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4601 const QRegister left = locs()->in(0).fpu_reg(); 4601 const QRegister left = locs()->in(0).fpu_reg();
4602 const DRegister left0 = EvenDRegisterOf(left); 4602 const DRegister left0 = EvenDRegisterOf(left);
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
4655 default: UNREACHABLE(); 4655 default: UNREACHABLE();
4656 } 4656 }
4657 } 4657 }
4658 4658
4659 4659
4660 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary( 4660 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary(
4661 bool opt) const { 4661 bool opt) const {
4662 const intptr_t kNumInputs = 4; 4662 const intptr_t kNumInputs = 4;
4663 const intptr_t kNumTemps = 1; 4663 const intptr_t kNumTemps = 1;
4664 LocationSummary* summary = 4664 LocationSummary* summary =
4665 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4665 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4666 summary->set_in(0, Location::RequiresRegister()); 4666 summary->set_in(0, Location::RequiresRegister());
4667 summary->set_in(1, Location::RequiresRegister()); 4667 summary->set_in(1, Location::RequiresRegister());
4668 summary->set_in(2, Location::RequiresRegister()); 4668 summary->set_in(2, Location::RequiresRegister());
4669 summary->set_in(3, Location::RequiresRegister()); 4669 summary->set_in(3, Location::RequiresRegister());
4670 summary->set_temp(0, Location::RequiresRegister()); 4670 summary->set_temp(0, Location::RequiresRegister());
4671 // Low (< 7) Q register needed for the vmovsr instruction. 4671 // Low (< 7) Q register needed for the vmovsr instruction.
4672 summary->set_out(0, Location::FpuRegisterLocation(Q6)); 4672 summary->set_out(0, Location::FpuRegisterLocation(Q6));
4673 return summary; 4673 return summary;
4674 } 4674 }
4675 4675
(...skipping 26 matching lines...) Expand all
4702 4702
4703 __ CompareObject(v3, Bool::True()); 4703 __ CompareObject(v3, Bool::True());
4704 __ vmovsr(sresult3, temp, EQ); 4704 __ vmovsr(sresult3, temp, EQ);
4705 } 4705 }
4706 4706
4707 4707
4708 LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(bool opt) const { 4708 LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(bool opt) const {
4709 const intptr_t kNumInputs = 1; 4709 const intptr_t kNumInputs = 1;
4710 const intptr_t kNumTemps = 0; 4710 const intptr_t kNumTemps = 0;
4711 LocationSummary* summary = 4711 LocationSummary* summary =
4712 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4712 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4713 // Low (< 7) Q registers are needed for the vmovrs instruction. 4713 // Low (< 7) Q registers are needed for the vmovrs instruction.
4714 summary->set_in(0, Location::FpuRegisterLocation(Q6)); 4714 summary->set_in(0, Location::FpuRegisterLocation(Q6));
4715 summary->set_out(0, Location::RequiresRegister()); 4715 summary->set_out(0, Location::RequiresRegister());
4716 return summary; 4716 return summary;
4717 } 4717 }
4718 4718
4719 4719
4720 void Int32x4GetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4720 void Int32x4GetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4721 const QRegister value = locs()->in(0).fpu_reg(); 4721 const QRegister value = locs()->in(0).fpu_reg();
4722 const Register result = locs()->out(0).reg(); 4722 const Register result = locs()->out(0).reg();
(...skipping 24 matching lines...) Expand all
4747 __ tst(result, ShifterOperand(result)); 4747 __ tst(result, ShifterOperand(result));
4748 __ LoadObject(result, Bool::True(), NE); 4748 __ LoadObject(result, Bool::True(), NE);
4749 __ LoadObject(result, Bool::False(), EQ); 4749 __ LoadObject(result, Bool::False(), EQ);
4750 } 4750 }
4751 4751
4752 4752
4753 LocationSummary* Int32x4SelectInstr::MakeLocationSummary(bool opt) const { 4753 LocationSummary* Int32x4SelectInstr::MakeLocationSummary(bool opt) const {
4754 const intptr_t kNumInputs = 3; 4754 const intptr_t kNumInputs = 3;
4755 const intptr_t kNumTemps = 1; 4755 const intptr_t kNumTemps = 1;
4756 LocationSummary* summary = 4756 LocationSummary* summary =
4757 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4757 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4758 summary->set_in(0, Location::RequiresFpuRegister()); 4758 summary->set_in(0, Location::RequiresFpuRegister());
4759 summary->set_in(1, Location::RequiresFpuRegister()); 4759 summary->set_in(1, Location::RequiresFpuRegister());
4760 summary->set_in(2, Location::RequiresFpuRegister()); 4760 summary->set_in(2, Location::RequiresFpuRegister());
4761 summary->set_temp(0, Location::RequiresFpuRegister()); 4761 summary->set_temp(0, Location::RequiresFpuRegister());
4762 summary->set_out(0, Location::RequiresFpuRegister()); 4762 summary->set_out(0, Location::RequiresFpuRegister());
4763 return summary; 4763 return summary;
4764 } 4764 }
4765 4765
4766 4766
4767 void Int32x4SelectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4767 void Int32x4SelectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
(...skipping 13 matching lines...) Expand all
4781 __ vandq(temp, temp, falseValue); 4781 __ vandq(temp, temp, falseValue);
4782 // out = mask | temp. 4782 // out = mask | temp.
4783 __ vorrq(out, mask, temp); 4783 __ vorrq(out, mask, temp);
4784 } 4784 }
4785 4785
4786 4786
4787 LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(bool opt) const { 4787 LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(bool opt) const {
4788 const intptr_t kNumInputs = 2; 4788 const intptr_t kNumInputs = 2;
4789 const intptr_t kNumTemps = 0; 4789 const intptr_t kNumTemps = 0;
4790 LocationSummary* summary = 4790 LocationSummary* summary =
4791 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4791 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4792 summary->set_in(0, Location::RequiresFpuRegister()); 4792 summary->set_in(0, Location::RequiresFpuRegister());
4793 summary->set_in(1, Location::RequiresRegister()); 4793 summary->set_in(1, Location::RequiresRegister());
4794 // Low (< 7) Q register needed for the vmovsr instruction. 4794 // Low (< 7) Q register needed for the vmovsr instruction.
4795 summary->set_out(0, Location::FpuRegisterLocation(Q6)); 4795 summary->set_out(0, Location::FpuRegisterLocation(Q6));
4796 return summary; 4796 return summary;
4797 } 4797 }
4798 4798
4799 4799
4800 void Int32x4SetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4800 void Int32x4SetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4801 const QRegister mask = locs()->in(0).fpu_reg(); 4801 const QRegister mask = locs()->in(0).fpu_reg();
(...skipping 29 matching lines...) Expand all
4831 break; 4831 break;
4832 default: UNREACHABLE(); 4832 default: UNREACHABLE();
4833 } 4833 }
4834 } 4834 }
4835 4835
4836 4836
4837 LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(bool opt) const { 4837 LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(bool opt) const {
4838 const intptr_t kNumInputs = 1; 4838 const intptr_t kNumInputs = 1;
4839 const intptr_t kNumTemps = 0; 4839 const intptr_t kNumTemps = 0;
4840 LocationSummary* summary = 4840 LocationSummary* summary =
4841 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4841 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4842 summary->set_in(0, Location::RequiresFpuRegister()); 4842 summary->set_in(0, Location::RequiresFpuRegister());
4843 summary->set_out(0, Location::RequiresFpuRegister()); 4843 summary->set_out(0, Location::RequiresFpuRegister());
4844 return summary; 4844 return summary;
4845 } 4845 }
4846 4846
4847 4847
4848 void Int32x4ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) { 4848 void Int32x4ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
4849 const QRegister value = locs()->in(0).fpu_reg(); 4849 const QRegister value = locs()->in(0).fpu_reg();
4850 const QRegister result = locs()->out(0).fpu_reg(); 4850 const QRegister result = locs()->out(0).fpu_reg();
4851 4851
4852 if (value != result) { 4852 if (value != result) {
4853 __ vmovq(result, value); 4853 __ vmovq(result, value);
4854 } 4854 }
4855 } 4855 }
4856 4856
4857 4857
4858 LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(bool opt) const { 4858 LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(bool opt) const {
4859 const intptr_t kNumInputs = 2; 4859 const intptr_t kNumInputs = 2;
4860 const intptr_t kNumTemps = 0; 4860 const intptr_t kNumTemps = 0;
4861 LocationSummary* summary = 4861 LocationSummary* summary =
4862 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4862 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4863 summary->set_in(0, Location::RequiresFpuRegister()); 4863 summary->set_in(0, Location::RequiresFpuRegister());
4864 summary->set_in(1, Location::RequiresFpuRegister()); 4864 summary->set_in(1, Location::RequiresFpuRegister());
4865 summary->set_out(0, Location::RequiresFpuRegister()); 4865 summary->set_out(0, Location::RequiresFpuRegister());
4866 return summary; 4866 return summary;
4867 } 4867 }
4868 4868
4869 4869
4870 void BinaryInt32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4870 void BinaryInt32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4871 const QRegister left = locs()->in(0).fpu_reg(); 4871 const QRegister left = locs()->in(0).fpu_reg();
4872 const QRegister right = locs()->in(1).fpu_reg(); 4872 const QRegister right = locs()->in(1).fpu_reg();
(...skipping 20 matching lines...) Expand all
4893 default: UNREACHABLE(); 4893 default: UNREACHABLE();
4894 } 4894 }
4895 } 4895 }
4896 4896
4897 4897
4898 LocationSummary* MathUnaryInstr::MakeLocationSummary(bool opt) const { 4898 LocationSummary* MathUnaryInstr::MakeLocationSummary(bool opt) const {
4899 if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) { 4899 if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) {
4900 const intptr_t kNumInputs = 1; 4900 const intptr_t kNumInputs = 1;
4901 const intptr_t kNumTemps = 0; 4901 const intptr_t kNumTemps = 0;
4902 LocationSummary* summary = 4902 LocationSummary* summary =
4903 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 4903 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSu mmary::kCall);
4904 summary->set_in(0, Location::FpuRegisterLocation(Q0)); 4904 summary->set_in(0, Location::FpuRegisterLocation(Q0));
4905 summary->set_out(0, Location::FpuRegisterLocation(Q0)); 4905 summary->set_out(0, Location::FpuRegisterLocation(Q0));
4906 if (!TargetCPUFeatures::hardfp_supported()) { 4906 if (!TargetCPUFeatures::hardfp_supported()) {
4907 summary->AddTemp(Location::RegisterLocation(R0)); 4907 summary->AddTemp(Location::RegisterLocation(R0));
4908 summary->AddTemp(Location::RegisterLocation(R1)); 4908 summary->AddTemp(Location::RegisterLocation(R1));
4909 summary->AddTemp(Location::RegisterLocation(R2)); 4909 summary->AddTemp(Location::RegisterLocation(R2));
4910 summary->AddTemp(Location::RegisterLocation(R3)); 4910 summary->AddTemp(Location::RegisterLocation(R3));
4911 } 4911 }
4912 return summary; 4912 return summary;
4913 } 4913 }
4914 ASSERT((kind() == MathUnaryInstr::kSqrt) || 4914 ASSERT((kind() == MathUnaryInstr::kSqrt) ||
4915 (kind() == MathUnaryInstr::kDoubleSquare)); 4915 (kind() == MathUnaryInstr::kDoubleSquare));
4916 const intptr_t kNumInputs = 1; 4916 const intptr_t kNumInputs = 1;
4917 const intptr_t kNumTemps = 0; 4917 const intptr_t kNumTemps = 0;
4918 LocationSummary* summary = 4918 LocationSummary* summary =
4919 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4919 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4920 summary->set_in(0, Location::RequiresFpuRegister()); 4920 summary->set_in(0, Location::RequiresFpuRegister());
4921 summary->set_out(0, Location::RequiresFpuRegister()); 4921 summary->set_out(0, Location::RequiresFpuRegister());
4922 return summary; 4922 return summary;
4923 } 4923 }
4924 4924
4925 4925
4926 void MathUnaryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4926 void MathUnaryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4927 if (kind() == MathUnaryInstr::kSqrt) { 4927 if (kind() == MathUnaryInstr::kSqrt) {
4928 const DRegister val = EvenDRegisterOf(locs()->in(0).fpu_reg()); 4928 const DRegister val = EvenDRegisterOf(locs()->in(0).fpu_reg());
4929 const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg()); 4929 const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
(...skipping 19 matching lines...) Expand all
4949 } 4949 }
4950 } 4950 }
4951 } 4951 }
4952 4952
4953 4953
4954 LocationSummary* MathMinMaxInstr::MakeLocationSummary(bool opt) const { 4954 LocationSummary* MathMinMaxInstr::MakeLocationSummary(bool opt) const {
4955 if (result_cid() == kDoubleCid) { 4955 if (result_cid() == kDoubleCid) {
4956 const intptr_t kNumInputs = 2; 4956 const intptr_t kNumInputs = 2;
4957 const intptr_t kNumTemps = 1; 4957 const intptr_t kNumTemps = 1;
4958 LocationSummary* summary = 4958 LocationSummary* summary =
4959 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4959 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSu mmary::kNoCall);
4960 summary->set_in(0, Location::RequiresFpuRegister()); 4960 summary->set_in(0, Location::RequiresFpuRegister());
4961 summary->set_in(1, Location::RequiresFpuRegister()); 4961 summary->set_in(1, Location::RequiresFpuRegister());
4962 // Reuse the left register so that code can be made shorter. 4962 // Reuse the left register so that code can be made shorter.
4963 summary->set_out(0, Location::SameAsFirstInput()); 4963 summary->set_out(0, Location::SameAsFirstInput());
4964 summary->set_temp(0, Location::RequiresRegister()); 4964 summary->set_temp(0, Location::RequiresRegister());
4965 return summary; 4965 return summary;
4966 } 4966 }
4967 ASSERT(result_cid() == kSmiCid); 4967 ASSERT(result_cid() == kSmiCid);
4968 const intptr_t kNumInputs = 2; 4968 const intptr_t kNumInputs = 2;
4969 const intptr_t kNumTemps = 0; 4969 const intptr_t kNumTemps = 0;
4970 LocationSummary* summary = 4970 LocationSummary* summary =
4971 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 4971 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
4972 summary->set_in(0, Location::RequiresRegister()); 4972 summary->set_in(0, Location::RequiresRegister());
4973 summary->set_in(1, Location::RequiresRegister()); 4973 summary->set_in(1, Location::RequiresRegister());
4974 // Reuse the left register so that code can be made shorter. 4974 // Reuse the left register so that code can be made shorter.
4975 summary->set_out(0, Location::SameAsFirstInput()); 4975 summary->set_out(0, Location::SameAsFirstInput());
4976 return summary; 4976 return summary;
4977 } 4977 }
4978 4978
4979 4979
4980 void MathMinMaxInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 4980 void MathMinMaxInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4981 ASSERT((op_kind() == MethodRecognizer::kMathMin) || 4981 ASSERT((op_kind() == MethodRecognizer::kMathMin) ||
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
5033 } else { 5033 } else {
5034 __ mov(result, ShifterOperand(right), LT); 5034 __ mov(result, ShifterOperand(right), LT);
5035 } 5035 }
5036 } 5036 }
5037 5037
5038 5038
5039 LocationSummary* UnarySmiOpInstr::MakeLocationSummary(bool opt) const { 5039 LocationSummary* UnarySmiOpInstr::MakeLocationSummary(bool opt) const {
5040 const intptr_t kNumInputs = 1; 5040 const intptr_t kNumInputs = 1;
5041 const intptr_t kNumTemps = 0; 5041 const intptr_t kNumTemps = 0;
5042 LocationSummary* summary = 5042 LocationSummary* summary =
5043 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 5043 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
5044 summary->set_in(0, Location::RequiresRegister()); 5044 summary->set_in(0, Location::RequiresRegister());
5045 // We make use of 3-operand instructions by not requiring result register 5045 // We make use of 3-operand instructions by not requiring result register
5046 // to be identical to first input register as on Intel. 5046 // to be identical to first input register as on Intel.
5047 summary->set_out(0, Location::RequiresRegister()); 5047 summary->set_out(0, Location::RequiresRegister());
5048 return summary; 5048 return summary;
5049 } 5049 }
5050 5050
5051 5051
5052 void UnarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5052 void UnarySmiOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5053 const Register value = locs()->in(0).reg(); 5053 const Register value = locs()->in(0).reg();
(...skipping 13 matching lines...) Expand all
5067 default: 5067 default:
5068 UNREACHABLE(); 5068 UNREACHABLE();
5069 } 5069 }
5070 } 5070 }
5071 5071
5072 5072
5073 LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(bool opt) const { 5073 LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(bool opt) const {
5074 const intptr_t kNumInputs = 1; 5074 const intptr_t kNumInputs = 1;
5075 const intptr_t kNumTemps = 0; 5075 const intptr_t kNumTemps = 0;
5076 LocationSummary* summary = 5076 LocationSummary* summary =
5077 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 5077 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
5078 summary->set_in(0, Location::RequiresFpuRegister()); 5078 summary->set_in(0, Location::RequiresFpuRegister());
5079 summary->set_out(0, Location::RequiresFpuRegister()); 5079 summary->set_out(0, Location::RequiresFpuRegister());
5080 return summary; 5080 return summary;
5081 } 5081 }
5082 5082
5083 5083
5084 void UnaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5084 void UnaryDoubleOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5085 const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg()); 5085 const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
5086 const DRegister value = EvenDRegisterOf(locs()->in(0).fpu_reg()); 5086 const DRegister value = EvenDRegisterOf(locs()->in(0).fpu_reg());
5087 __ vnegd(result, value); 5087 __ vnegd(result, value);
5088 } 5088 }
5089 5089
5090 5090
5091 LocationSummary* SmiToDoubleInstr::MakeLocationSummary(bool opt) const { 5091 LocationSummary* SmiToDoubleInstr::MakeLocationSummary(bool opt) const {
5092 const intptr_t kNumInputs = 1; 5092 const intptr_t kNumInputs = 1;
5093 const intptr_t kNumTemps = 0; 5093 const intptr_t kNumTemps = 0;
5094 LocationSummary* result = 5094 LocationSummary* result =
5095 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 5095 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
5096 result->set_in(0, Location::WritableRegister()); 5096 result->set_in(0, Location::WritableRegister());
5097 result->set_out(0, Location::RequiresFpuRegister()); 5097 result->set_out(0, Location::RequiresFpuRegister());
5098 return result; 5098 return result;
5099 } 5099 }
5100 5100
5101 5101
5102 void SmiToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5102 void SmiToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5103 const Register value = locs()->in(0).reg(); 5103 const Register value = locs()->in(0).reg();
5104 const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg()); 5104 const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
5105 __ SmiUntag(value); 5105 __ SmiUntag(value);
5106 __ vmovsr(STMP, value); 5106 __ vmovsr(STMP, value);
5107 __ vcvtdi(result, STMP); 5107 __ vcvtdi(result, STMP);
5108 } 5108 }
5109 5109
5110 5110
5111 LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(bool opt) const { 5111 LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(bool opt) const {
5112 const intptr_t kNumInputs = 1; 5112 const intptr_t kNumInputs = 1;
5113 const intptr_t kNumTemps = 0; 5113 const intptr_t kNumTemps = 0;
5114 LocationSummary* result = 5114 LocationSummary* result =
5115 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 5115 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kCall);
5116 result->set_in(0, Location::RegisterLocation(R1)); 5116 result->set_in(0, Location::RegisterLocation(R1));
5117 result->set_out(0, Location::RegisterLocation(R0)); 5117 result->set_out(0, Location::RegisterLocation(R0));
5118 return result; 5118 return result;
5119 } 5119 }
5120 5120
5121 5121
5122 void DoubleToIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5122 void DoubleToIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5123 const Register result = locs()->out(0).reg(); 5123 const Register result = locs()->out(0).reg();
5124 const Register value_obj = locs()->in(0).reg(); 5124 const Register value_obj = locs()->in(0).reg();
5125 ASSERT(result == R0); 5125 ASSERT(result == R0);
(...skipping 30 matching lines...) Expand all
5156 kNumberOfArguments, 5156 kNumberOfArguments,
5157 Object::null_array(), // No argument names., 5157 Object::null_array(), // No argument names.,
5158 locs()); 5158 locs());
5159 __ Bind(&done); 5159 __ Bind(&done);
5160 } 5160 }
5161 5161
5162 5162
5163 LocationSummary* DoubleToSmiInstr::MakeLocationSummary(bool opt) const { 5163 LocationSummary* DoubleToSmiInstr::MakeLocationSummary(bool opt) const {
5164 const intptr_t kNumInputs = 1; 5164 const intptr_t kNumInputs = 1;
5165 const intptr_t kNumTemps = 0; 5165 const intptr_t kNumTemps = 0;
5166 LocationSummary* result = new LocationSummary( 5166 LocationSummary* result = new (isolate) LocationSummary(isolate,
5167 kNumInputs, kNumTemps, LocationSummary::kNoCall); 5167 kNumInputs, kNumTemps, LocationSummary::kNoCall);
5168 result->set_in(0, Location::RequiresFpuRegister()); 5168 result->set_in(0, Location::RequiresFpuRegister());
5169 result->set_out(0, Location::RequiresRegister()); 5169 result->set_out(0, Location::RequiresRegister());
5170 return result; 5170 return result;
5171 } 5171 }
5172 5172
5173 5173
5174 void DoubleToSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5174 void DoubleToSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5175 Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptDoubleToSmi); 5175 Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptDoubleToSmi);
5176 const Register result = locs()->out(0).reg(); 5176 const Register result = locs()->out(0).reg();
(...skipping 21 matching lines...) Expand all
5198 5198
5199 void DoubleToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5199 void DoubleToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5200 UNIMPLEMENTED(); 5200 UNIMPLEMENTED();
5201 } 5201 }
5202 5202
5203 5203
5204 LocationSummary* DoubleToFloatInstr::MakeLocationSummary(bool opt) const { 5204 LocationSummary* DoubleToFloatInstr::MakeLocationSummary(bool opt) const {
5205 const intptr_t kNumInputs = 1; 5205 const intptr_t kNumInputs = 1;
5206 const intptr_t kNumTemps = 0; 5206 const intptr_t kNumTemps = 0;
5207 LocationSummary* result = 5207 LocationSummary* result =
5208 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 5208 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
5209 // Low (<= Q7) Q registers are needed for the conversion instructions. 5209 // Low (<= Q7) Q registers are needed for the conversion instructions.
5210 result->set_in(0, Location::RequiresFpuRegister()); 5210 result->set_in(0, Location::RequiresFpuRegister());
5211 result->set_out(0, Location::FpuRegisterLocation(Q7)); 5211 result->set_out(0, Location::FpuRegisterLocation(Q7));
5212 return result; 5212 return result;
5213 } 5213 }
5214 5214
5215 5215
5216 void DoubleToFloatInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5216 void DoubleToFloatInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5217 const DRegister value = EvenDRegisterOf(locs()->in(0).fpu_reg()); 5217 const DRegister value = EvenDRegisterOf(locs()->in(0).fpu_reg());
5218 const SRegister result = 5218 const SRegister result =
5219 EvenSRegisterOf(EvenDRegisterOf(locs()->out(0).fpu_reg())); 5219 EvenSRegisterOf(EvenDRegisterOf(locs()->out(0).fpu_reg()));
5220 __ vcvtsd(result, value); 5220 __ vcvtsd(result, value);
5221 } 5221 }
5222 5222
5223 5223
5224 LocationSummary* FloatToDoubleInstr::MakeLocationSummary(bool opt) const { 5224 LocationSummary* FloatToDoubleInstr::MakeLocationSummary(bool opt) const {
5225 const intptr_t kNumInputs = 1; 5225 const intptr_t kNumInputs = 1;
5226 const intptr_t kNumTemps = 0; 5226 const intptr_t kNumTemps = 0;
5227 LocationSummary* result = 5227 LocationSummary* result =
5228 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 5228 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
5229 // Low (<= Q7) Q registers are needed for the conversion instructions. 5229 // Low (<= Q7) Q registers are needed for the conversion instructions.
5230 result->set_in(0, Location::FpuRegisterLocation(Q7)); 5230 result->set_in(0, Location::FpuRegisterLocation(Q7));
5231 result->set_out(0, Location::RequiresFpuRegister()); 5231 result->set_out(0, Location::RequiresFpuRegister());
5232 return result; 5232 return result;
5233 } 5233 }
5234 5234
5235 5235
5236 void FloatToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5236 void FloatToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5237 const SRegister value = 5237 const SRegister value =
5238 EvenSRegisterOf(EvenDRegisterOf(locs()->in(0).fpu_reg())); 5238 EvenSRegisterOf(EvenDRegisterOf(locs()->in(0).fpu_reg()));
5239 const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg()); 5239 const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
5240 __ vcvtds(result, value); 5240 __ vcvtds(result, value);
5241 } 5241 }
5242 5242
5243 5243
5244 LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(bool opt) const { 5244 LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(bool opt) const {
5245 ASSERT((InputCount() == 1) || (InputCount() == 2)); 5245 ASSERT((InputCount() == 1) || (InputCount() == 2));
5246 const intptr_t kNumTemps = 0; 5246 const intptr_t kNumTemps = 0;
5247 LocationSummary* result = 5247 LocationSummary* result =
5248 new LocationSummary(InputCount(), kNumTemps, LocationSummary::kCall); 5248 new (isolate) LocationSummary(isolate, InputCount(), kNumTemps, LocationSu mmary::kCall);
5249 result->set_in(0, Location::FpuRegisterLocation(Q0)); 5249 result->set_in(0, Location::FpuRegisterLocation(Q0));
5250 if (InputCount() == 2) { 5250 if (InputCount() == 2) {
5251 result->set_in(1, Location::FpuRegisterLocation(Q1)); 5251 result->set_in(1, Location::FpuRegisterLocation(Q1));
5252 } 5252 }
5253 if (recognized_kind() == MethodRecognizer::kMathDoublePow) { 5253 if (recognized_kind() == MethodRecognizer::kMathDoublePow) {
5254 result->AddTemp(Location::RegisterLocation(R2)); 5254 result->AddTemp(Location::RegisterLocation(R2));
5255 } 5255 }
5256 if (!TargetCPUFeatures::hardfp_supported()) { 5256 if (!TargetCPUFeatures::hardfp_supported()) {
5257 result->AddTemp(Location::RegisterLocation(R0)); 5257 result->AddTemp(Location::RegisterLocation(R0));
5258 result->AddTemp(Location::RegisterLocation(R1)); 5258 result->AddTemp(Location::RegisterLocation(R1));
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
5422 __ vmovdrr(D1, R2, R3); 5422 __ vmovdrr(D1, R2, R3);
5423 } 5423 }
5424 } 5424 }
5425 5425
5426 5426
5427 LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(bool opt) const { 5427 LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(bool opt) const {
5428 // Only use this instruction in optimized code. 5428 // Only use this instruction in optimized code.
5429 ASSERT(opt); 5429 ASSERT(opt);
5430 const intptr_t kNumInputs = 1; 5430 const intptr_t kNumInputs = 1;
5431 LocationSummary* summary = 5431 LocationSummary* summary =
5432 new LocationSummary(kNumInputs, 0, LocationSummary::kNoCall); 5432 new (isolate) LocationSummary(isolate, kNumInputs, 0, LocationSummary::kNo Call);
5433 if (representation() == kUnboxedDouble) { 5433 if (representation() == kUnboxedDouble) {
5434 if (index() == 0) { 5434 if (index() == 0) {
5435 summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(), 5435 summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(),
5436 Location::Any())); 5436 Location::Any()));
5437 } else { 5437 } else {
5438 ASSERT(index() == 1); 5438 ASSERT(index() == 1);
5439 summary->set_in(0, Location::Pair(Location::Any(), 5439 summary->set_in(0, Location::Pair(Location::Any(),
5440 Location::RequiresFpuRegister())); 5440 Location::RequiresFpuRegister()));
5441 } 5441 }
5442 summary->set_out(0, Location::RequiresFpuRegister()); 5442 summary->set_out(0, Location::RequiresFpuRegister());
(...skipping 28 matching lines...) Expand all
5471 __ mov(out, ShifterOperand(in)); 5471 __ mov(out, ShifterOperand(in));
5472 } 5472 }
5473 } 5473 }
5474 5474
5475 5475
5476 LocationSummary* MergedMathInstr::MakeLocationSummary(bool opt) const { 5476 LocationSummary* MergedMathInstr::MakeLocationSummary(bool opt) const {
5477 if (kind() == MergedMathInstr::kTruncDivMod) { 5477 if (kind() == MergedMathInstr::kTruncDivMod) {
5478 const intptr_t kNumInputs = 2; 5478 const intptr_t kNumInputs = 2;
5479 const intptr_t kNumTemps = 2; 5479 const intptr_t kNumTemps = 2;
5480 LocationSummary* summary = 5480 LocationSummary* summary =
5481 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 5481 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSu mmary::kNoCall);
5482 summary->set_in(0, Location::RequiresRegister()); 5482 summary->set_in(0, Location::RequiresRegister());
5483 summary->set_in(1, Location::RequiresRegister()); 5483 summary->set_in(1, Location::RequiresRegister());
5484 summary->set_temp(0, Location::RequiresRegister()); 5484 summary->set_temp(0, Location::RequiresRegister());
5485 summary->set_temp(1, Location::RequiresFpuRegister()); 5485 summary->set_temp(1, Location::RequiresFpuRegister());
5486 // Output is a pair of registers. 5486 // Output is a pair of registers.
5487 summary->set_out(0, Location::Pair(Location::RequiresRegister(), 5487 summary->set_out(0, Location::Pair(Location::RequiresRegister(),
5488 Location::RequiresRegister())); 5488 Location::RequiresRegister()));
5489 return summary; 5489 return summary;
5490 } 5490 }
5491 UNIMPLEMENTED(); 5491 UNIMPLEMENTED();
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
5609 5609
5610 void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5610 void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5611 comparison()->EmitBranchCode(compiler, this); 5611 comparison()->EmitBranchCode(compiler, this);
5612 } 5612 }
5613 5613
5614 5614
5615 LocationSummary* CheckClassInstr::MakeLocationSummary(bool opt) const { 5615 LocationSummary* CheckClassInstr::MakeLocationSummary(bool opt) const {
5616 const intptr_t kNumInputs = 1; 5616 const intptr_t kNumInputs = 1;
5617 const intptr_t kNumTemps = 0; 5617 const intptr_t kNumTemps = 0;
5618 LocationSummary* summary = 5618 LocationSummary* summary =
5619 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 5619 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
5620 summary->set_in(0, Location::RequiresRegister()); 5620 summary->set_in(0, Location::RequiresRegister());
5621 if (!IsNullCheck()) { 5621 if (!IsNullCheck()) {
5622 summary->AddTemp(Location::RequiresRegister()); 5622 summary->AddTemp(Location::RequiresRegister());
5623 } 5623 }
5624 return summary; 5624 return summary;
5625 } 5625 }
5626 5626
5627 5627
5628 void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5628 void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5629 const ICData::DeoptReasonId deopt_reason = licm_hoisted_ ? 5629 const ICData::DeoptReasonId deopt_reason = licm_hoisted_ ?
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
5663 } 5663 }
5664 } 5664 }
5665 __ Bind(&is_ok); 5665 __ Bind(&is_ok);
5666 } 5666 }
5667 5667
5668 5668
5669 LocationSummary* CheckSmiInstr::MakeLocationSummary(bool opt) const { 5669 LocationSummary* CheckSmiInstr::MakeLocationSummary(bool opt) const {
5670 const intptr_t kNumInputs = 1; 5670 const intptr_t kNumInputs = 1;
5671 const intptr_t kNumTemps = 0; 5671 const intptr_t kNumTemps = 0;
5672 LocationSummary* summary = 5672 LocationSummary* summary =
5673 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 5673 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
5674 summary->set_in(0, Location::RequiresRegister()); 5674 summary->set_in(0, Location::RequiresRegister());
5675 return summary; 5675 return summary;
5676 } 5676 }
5677 5677
5678 5678
5679 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5679 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5680 const Register value = locs()->in(0).reg(); 5680 const Register value = locs()->in(0).reg();
5681 Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckSmi); 5681 Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckSmi);
5682 __ tst(value, ShifterOperand(kSmiTagMask)); 5682 __ tst(value, ShifterOperand(kSmiTagMask));
5683 __ b(deopt, NE); 5683 __ b(deopt, NE);
5684 } 5684 }
5685 5685
5686 5686
5687 LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(bool opt) const { 5687 LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(bool opt) const {
5688 const intptr_t kNumInputs = 2; 5688 const intptr_t kNumInputs = 2;
5689 const intptr_t kNumTemps = 0; 5689 const intptr_t kNumTemps = 0;
5690 LocationSummary* locs = 5690 LocationSummary* locs =
5691 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 5691 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
5692 locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length())); 5692 locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length()));
5693 locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index())); 5693 locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index()));
5694 return locs; 5694 return locs;
5695 } 5695 }
5696 5696
5697 5697
5698 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5698 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5699 Label* deopt = compiler->AddDeoptStub(deopt_id(), 5699 Label* deopt = compiler->AddDeoptStub(deopt_id(),
5700 ICData::kDeoptCheckArrayBound); 5700 ICData::kDeoptCheckArrayBound);
5701 5701
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
5749 __ b(overflow, LT); 5749 __ b(overflow, LT);
5750 // Anything in the lower part would make the number bigger than the lower 5750 // Anything in the lower part would make the number bigger than the lower
5751 // bound, so we are done. 5751 // bound, so we are done.
5752 } 5752 }
5753 5753
5754 5754
5755 LocationSummary* UnboxIntegerInstr::MakeLocationSummary(bool opt) const { 5755 LocationSummary* UnboxIntegerInstr::MakeLocationSummary(bool opt) const {
5756 const intptr_t kNumInputs = 1; 5756 const intptr_t kNumInputs = 1;
5757 const intptr_t kNumTemps = 1; 5757 const intptr_t kNumTemps = 1;
5758 LocationSummary* summary = 5758 LocationSummary* summary =
5759 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 5759 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
5760 summary->set_in(0, Location::RequiresRegister()); 5760 summary->set_in(0, Location::RequiresRegister());
5761 summary->set_temp(0, Location::RequiresRegister()); 5761 summary->set_temp(0, Location::RequiresRegister());
5762 summary->set_out(0, Location::Pair(Location::RequiresRegister(), 5762 summary->set_out(0, Location::Pair(Location::RequiresRegister(),
5763 Location::RequiresRegister())); 5763 Location::RequiresRegister()));
5764 return summary; 5764 return summary;
5765 } 5765 }
5766 5766
5767 5767
5768 void UnboxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 5768 void UnboxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
5769 const intptr_t value_cid = value()->Type()->ToCid(); 5769 const intptr_t value_cid = value()->Type()->ToCid();
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
5825 __ SignFill(result_hi, result_lo); 5825 __ SignFill(result_hi, result_lo);
5826 __ Bind(&done); 5826 __ Bind(&done);
5827 } 5827 }
5828 } 5828 }
5829 5829
5830 5830
5831 LocationSummary* BoxIntegerInstr::MakeLocationSummary(bool opt) const { 5831 LocationSummary* BoxIntegerInstr::MakeLocationSummary(bool opt) const {
5832 const intptr_t kNumInputs = 1; 5832 const intptr_t kNumInputs = 1;
5833 const intptr_t kNumTemps = 1; 5833 const intptr_t kNumTemps = 1;
5834 LocationSummary* summary = 5834 LocationSummary* summary =
5835 new LocationSummary(kNumInputs, 5835 new (isolate) LocationSummary(isolate, kNumInputs,
5836 kNumTemps, 5836 kNumTemps,
5837 LocationSummary::kCallOnSlowPath); 5837 LocationSummary::kCallOnSlowPath);
5838 summary->set_in(0, Location::Pair(Location::RequiresRegister(), 5838 summary->set_in(0, Location::Pair(Location::RequiresRegister(),
5839 Location::RequiresRegister())); 5839 Location::RequiresRegister()));
5840 summary->set_temp(0, Location::RequiresRegister()); 5840 summary->set_temp(0, Location::RequiresRegister());
5841 summary->set_out(0, Location::RequiresRegister()); 5841 summary->set_out(0, Location::RequiresRegister());
5842 return summary; 5842 return summary;
5843 } 5843 }
5844 5844
5845 5845
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
5931 out_reg, 5931 out_reg,
5932 Mint::value_offset() - kHeapObjectTag + kWordSize); 5932 Mint::value_offset() - kHeapObjectTag + kWordSize);
5933 __ Bind(&done); 5933 __ Bind(&done);
5934 } 5934 }
5935 5935
5936 5936
5937 LocationSummary* BinaryMintOpInstr::MakeLocationSummary(bool opt) const { 5937 LocationSummary* BinaryMintOpInstr::MakeLocationSummary(bool opt) const {
5938 const intptr_t kNumInputs = 2; 5938 const intptr_t kNumInputs = 2;
5939 const intptr_t kNumTemps = 0; 5939 const intptr_t kNumTemps = 0;
5940 LocationSummary* summary = 5940 LocationSummary* summary =
5941 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 5941 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
5942 summary->set_in(0, Location::Pair(Location::RequiresRegister(), 5942 summary->set_in(0, Location::Pair(Location::RequiresRegister(),
5943 Location::RequiresRegister())); 5943 Location::RequiresRegister()));
5944 summary->set_in(1, Location::Pair(Location::RequiresRegister(), 5944 summary->set_in(1, Location::Pair(Location::RequiresRegister(),
5945 Location::RequiresRegister())); 5945 Location::RequiresRegister()));
5946 summary->set_out(0, Location::Pair(Location::RequiresRegister(), 5946 summary->set_out(0, Location::Pair(Location::RequiresRegister(),
5947 Location::RequiresRegister())); 5947 Location::RequiresRegister()));
5948 return summary; 5948 return summary;
5949 } 5949 }
5950 5950
5951 5951
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
6004 if (FLAG_throw_on_javascript_int_overflow) { 6004 if (FLAG_throw_on_javascript_int_overflow) {
6005 EmitJavascriptIntOverflowCheck(compiler, deopt, out_lo, out_hi); 6005 EmitJavascriptIntOverflowCheck(compiler, deopt, out_lo, out_hi);
6006 } 6006 }
6007 } 6007 }
6008 6008
6009 6009
6010 LocationSummary* ShiftMintOpInstr::MakeLocationSummary(bool opt) const { 6010 LocationSummary* ShiftMintOpInstr::MakeLocationSummary(bool opt) const {
6011 const intptr_t kNumInputs = 2; 6011 const intptr_t kNumInputs = 2;
6012 const intptr_t kNumTemps = 1; 6012 const intptr_t kNumTemps = 1;
6013 LocationSummary* summary = 6013 LocationSummary* summary =
6014 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 6014 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
6015 summary->set_in(0, Location::Pair(Location::RequiresRegister(), 6015 summary->set_in(0, Location::Pair(Location::RequiresRegister(),
6016 Location::RequiresRegister())); 6016 Location::RequiresRegister()));
6017 summary->set_in(1, Location::WritableRegister()); 6017 summary->set_in(1, Location::WritableRegister());
6018 summary->set_temp(0, Location::RequiresRegister()); 6018 summary->set_temp(0, Location::RequiresRegister());
6019 summary->set_out(0, Location::Pair(Location::RequiresRegister(), 6019 summary->set_out(0, Location::Pair(Location::RequiresRegister(),
6020 Location::RequiresRegister())); 6020 Location::RequiresRegister()));
6021 return summary; 6021 return summary;
6022 } 6022 }
6023 6023
6024 6024
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
6095 if (FLAG_throw_on_javascript_int_overflow) { 6095 if (FLAG_throw_on_javascript_int_overflow) {
6096 EmitJavascriptIntOverflowCheck(compiler, deopt, out_lo, out_hi); 6096 EmitJavascriptIntOverflowCheck(compiler, deopt, out_lo, out_hi);
6097 } 6097 }
6098 } 6098 }
6099 6099
6100 6100
6101 LocationSummary* UnaryMintOpInstr::MakeLocationSummary(bool opt) const { 6101 LocationSummary* UnaryMintOpInstr::MakeLocationSummary(bool opt) const {
6102 const intptr_t kNumInputs = 1; 6102 const intptr_t kNumInputs = 1;
6103 const intptr_t kNumTemps = 0; 6103 const intptr_t kNumTemps = 0;
6104 LocationSummary* summary = 6104 LocationSummary* summary =
6105 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 6105 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
6106 summary->set_in(0, Location::Pair(Location::RequiresRegister(), 6106 summary->set_in(0, Location::Pair(Location::RequiresRegister(),
6107 Location::RequiresRegister())); 6107 Location::RequiresRegister()));
6108 summary->set_out(0, Location::Pair(Location::RequiresRegister(), 6108 summary->set_out(0, Location::Pair(Location::RequiresRegister(),
6109 Location::RequiresRegister())); 6109 Location::RequiresRegister()));
6110 return summary; 6110 return summary;
6111 } 6111 }
6112 6112
6113 6113
6114 void UnaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 6114 void UnaryMintOpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
6115 ASSERT(op_kind() == Token::kBIT_NOT); 6115 ASSERT(op_kind() == Token::kBIT_NOT);
(...skipping 12 matching lines...) Expand all
6128 } 6128 }
6129 __ mvn(out_lo, ShifterOperand(left_lo)); 6129 __ mvn(out_lo, ShifterOperand(left_lo));
6130 __ mvn(out_hi, ShifterOperand(left_hi)); 6130 __ mvn(out_hi, ShifterOperand(left_hi));
6131 if (FLAG_throw_on_javascript_int_overflow) { 6131 if (FLAG_throw_on_javascript_int_overflow) {
6132 EmitJavascriptIntOverflowCheck(compiler, deopt, out_lo, out_hi); 6132 EmitJavascriptIntOverflowCheck(compiler, deopt, out_lo, out_hi);
6133 } 6133 }
6134 } 6134 }
6135 6135
6136 6136
6137 LocationSummary* ThrowInstr::MakeLocationSummary(bool opt) const { 6137 LocationSummary* ThrowInstr::MakeLocationSummary(bool opt) const {
6138 return new LocationSummary(0, 0, LocationSummary::kCall); 6138 return new (isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
6139 } 6139 }
6140 6140
6141 6141
6142 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 6142 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
6143 compiler->GenerateRuntimeCall(token_pos(), 6143 compiler->GenerateRuntimeCall(token_pos(),
6144 deopt_id(), 6144 deopt_id(),
6145 kThrowRuntimeEntry, 6145 kThrowRuntimeEntry,
6146 1, 6146 1,
6147 locs()); 6147 locs());
6148 __ bkpt(0); 6148 __ bkpt(0);
6149 } 6149 }
6150 6150
6151 6151
6152 LocationSummary* ReThrowInstr::MakeLocationSummary(bool opt) const { 6152 LocationSummary* ReThrowInstr::MakeLocationSummary(bool opt) const {
6153 return new LocationSummary(0, 0, LocationSummary::kCall); 6153 return new (isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
6154 } 6154 }
6155 6155
6156 6156
6157 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 6157 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
6158 compiler->SetNeedsStacktrace(catch_try_index()); 6158 compiler->SetNeedsStacktrace(catch_try_index());
6159 compiler->GenerateRuntimeCall(token_pos(), 6159 compiler->GenerateRuntimeCall(token_pos(),
6160 deopt_id(), 6160 deopt_id(),
6161 kReThrowRuntimeEntry, 6161 kReThrowRuntimeEntry,
6162 2, 6162 2,
6163 locs()); 6163 locs());
(...skipping 20 matching lines...) Expand all
6184 deopt_id_, 6184 deopt_id_,
6185 Scanner::kNoSourcePos); 6185 Scanner::kNoSourcePos);
6186 } 6186 }
6187 if (HasParallelMove()) { 6187 if (HasParallelMove()) {
6188 compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); 6188 compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
6189 } 6189 }
6190 } 6190 }
6191 6191
6192 6192
6193 LocationSummary* GotoInstr::MakeLocationSummary(bool opt) const { 6193 LocationSummary* GotoInstr::MakeLocationSummary(bool opt) const {
6194 return new LocationSummary(0, 0, LocationSummary::kNoCall); 6194 return new (isolate) LocationSummary(isolate, 0, 0, LocationSummary::kNoCall);
6195 } 6195 }
6196 6196
6197 6197
6198 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 6198 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
6199 if (!compiler->is_optimizing()) { 6199 if (!compiler->is_optimizing()) {
6200 compiler->EmitEdgeCounter(); 6200 compiler->EmitEdgeCounter();
6201 // Add a deoptimization descriptor for deoptimizing instructions that 6201 // Add a deoptimization descriptor for deoptimizing instructions that
6202 // may be inserted before this instruction. On ARM this descriptor 6202 // may be inserted before this instruction. On ARM this descriptor
6203 // points after the edge counter code so that we can reuse the same 6203 // points after the edge counter code so that we can reuse the same
6204 // pattern matching code as at call sites, which matches backwards from 6204 // pattern matching code as at call sites, which matches backwards from
(...skipping 24 matching lines...) Expand all
6229 void CurrentContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 6229 void CurrentContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
6230 __ mov(locs()->out(0).reg(), ShifterOperand(CTX)); 6230 __ mov(locs()->out(0).reg(), ShifterOperand(CTX));
6231 } 6231 }
6232 6232
6233 6233
6234 LocationSummary* StrictCompareInstr::MakeLocationSummary(bool opt) const { 6234 LocationSummary* StrictCompareInstr::MakeLocationSummary(bool opt) const {
6235 const intptr_t kNumInputs = 2; 6235 const intptr_t kNumInputs = 2;
6236 const intptr_t kNumTemps = 0; 6236 const intptr_t kNumTemps = 0;
6237 if (needs_number_check()) { 6237 if (needs_number_check()) {
6238 LocationSummary* locs = 6238 LocationSummary* locs =
6239 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 6239 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSu mmary::kCall);
6240 locs->set_in(0, Location::RegisterLocation(R0)); 6240 locs->set_in(0, Location::RegisterLocation(R0));
6241 locs->set_in(1, Location::RegisterLocation(R1)); 6241 locs->set_in(1, Location::RegisterLocation(R1));
6242 locs->set_out(0, Location::RegisterLocation(R0)); 6242 locs->set_out(0, Location::RegisterLocation(R0));
6243 return locs; 6243 return locs;
6244 } 6244 }
6245 LocationSummary* locs = 6245 LocationSummary* locs =
6246 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 6246 new (isolate) LocationSummary(isolate, kNumInputs, kNumTemps, LocationSumm ary::kNoCall);
6247 locs->set_in(0, Location::RegisterOrConstant(left())); 6247 locs->set_in(0, Location::RegisterOrConstant(left()));
6248 // Only one of the inputs can be a constant. Choose register if the first one 6248 // Only one of the inputs can be a constant. Choose register if the first one
6249 // is a constant. 6249 // is a constant.
6250 locs->set_in(1, locs->in(0).IsConstant() 6250 locs->set_in(1, locs->in(0).IsConstant()
6251 ? Location::RequiresRegister() 6251 ? Location::RequiresRegister()
6252 : Location::RegisterOrConstant(right())); 6252 : Location::RegisterOrConstant(right()));
6253 locs->set_out(0, Location::RequiresRegister()); 6253 locs->set_out(0, Location::RequiresRegister());
6254 return locs; 6254 return locs;
6255 } 6255 }
6256 6256
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
6332 compiler->GenerateCall(token_pos(), 6332 compiler->GenerateCall(token_pos(),
6333 &label, 6333 &label,
6334 PcDescriptors::kOther, 6334 PcDescriptors::kOther,
6335 locs()); 6335 locs());
6336 __ Drop(ArgumentCount()); // Discard arguments. 6336 __ Drop(ArgumentCount()); // Discard arguments.
6337 } 6337 }
6338 6338
6339 } // namespace dart 6339 } // namespace dart
6340 6340
6341 #endif // defined TARGET_ARCH_ARM 6341 #endif // defined TARGET_ARCH_ARM
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698