OLD | NEW |
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_XXX. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_XXX. |
6 | 6 |
7 #include "vm/flow_graph_compiler.h" | 7 #include "vm/flow_graph_compiler.h" |
8 | 8 |
9 #include "vm/cha.h" | 9 #include "vm/cha.h" |
10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" |
(...skipping 528 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
539 | 539 |
540 void FlowGraphCompiler::GenerateInstanceCall( | 540 void FlowGraphCompiler::GenerateInstanceCall( |
541 intptr_t deopt_id, | 541 intptr_t deopt_id, |
542 intptr_t token_pos, | 542 intptr_t token_pos, |
543 intptr_t argument_count, | 543 intptr_t argument_count, |
544 const Array& argument_names, | 544 const Array& argument_names, |
545 LocationSummary* locs, | 545 LocationSummary* locs, |
546 const ICData& ic_data) { | 546 const ICData& ic_data) { |
547 ASSERT(!ic_data.IsNull()); | 547 ASSERT(!ic_data.IsNull()); |
548 ASSERT(FLAG_propagate_ic_data || (ic_data.NumberOfChecks() == 0)); | 548 ASSERT(FLAG_propagate_ic_data || (ic_data.NumberOfChecks() == 0)); |
549 const Array& arguments_descriptor = | |
550 Array::ZoneHandle(ArgumentsDescriptor::New(argument_count, | |
551 argument_names)); | |
552 uword label_address = 0; | 549 uword label_address = 0; |
553 if (is_optimizing() && (ic_data.NumberOfChecks() == 0)) { | 550 if (is_optimizing() && (ic_data.NumberOfChecks() == 0)) { |
554 if (ic_data.is_closure_call()) { | 551 if (ic_data.is_closure_call()) { |
555 // This IC call may be closure call only. | 552 // This IC call may be closure call only. |
556 label_address = StubCode::ClosureCallInlineCacheEntryPoint(); | 553 label_address = StubCode::ClosureCallInlineCacheEntryPoint(); |
557 ExternalLabel target_label("InlineCache", label_address); | 554 ExternalLabel target_label("InlineCache", label_address); |
558 EmitInstanceCall(&target_label, | 555 EmitInstanceCall(&target_label, |
559 ICData::ZoneHandle(ic_data.AsUnaryClassChecks()), | 556 ICData::ZoneHandle(ic_data.AsUnaryClassChecks()), |
560 arguments_descriptor, argument_count, | 557 argument_count, deopt_id, token_pos, locs); |
561 deopt_id, token_pos, locs); | |
562 return; | 558 return; |
563 } | 559 } |
564 // Emit IC call that will count and thus may need reoptimization at | 560 // Emit IC call that will count and thus may need reoptimization at |
565 // function entry. | 561 // function entry. |
566 ASSERT(!is_optimizing() | 562 ASSERT(!is_optimizing() |
567 || may_reoptimize() | 563 || may_reoptimize() |
568 || flow_graph().IsCompiledForOsr()); | 564 || flow_graph().IsCompiledForOsr()); |
569 switch (ic_data.num_args_tested()) { | 565 switch (ic_data.num_args_tested()) { |
570 case 1: | 566 case 1: |
571 label_address = StubCode::OneArgOptimizedCheckInlineCacheEntryPoint(); | 567 label_address = StubCode::OneArgOptimizedCheckInlineCacheEntryPoint(); |
572 break; | 568 break; |
573 case 2: | 569 case 2: |
574 label_address = StubCode::TwoArgsOptimizedCheckInlineCacheEntryPoint(); | 570 label_address = StubCode::TwoArgsOptimizedCheckInlineCacheEntryPoint(); |
575 break; | 571 break; |
576 case 3: | 572 case 3: |
577 label_address = | 573 label_address = |
578 StubCode::ThreeArgsOptimizedCheckInlineCacheEntryPoint(); | 574 StubCode::ThreeArgsOptimizedCheckInlineCacheEntryPoint(); |
579 break; | 575 break; |
580 default: | 576 default: |
581 UNIMPLEMENTED(); | 577 UNIMPLEMENTED(); |
582 } | 578 } |
583 ExternalLabel target_label("InlineCache", label_address); | 579 ExternalLabel target_label("InlineCache", label_address); |
584 EmitOptimizedInstanceCall(&target_label, ic_data, arguments_descriptor, | 580 EmitOptimizedInstanceCall(&target_label, ic_data, |
585 argument_count, deopt_id, token_pos, locs); | 581 argument_count, deopt_id, token_pos, locs); |
586 return; | 582 return; |
587 } | 583 } |
588 | 584 |
589 if (is_optimizing()) { | 585 if (is_optimizing()) { |
590 EmitMegamorphicInstanceCall(ic_data, arguments_descriptor, argument_count, | 586 EmitMegamorphicInstanceCall(ic_data, argument_count, |
591 deopt_id, token_pos, locs); | 587 deopt_id, token_pos, locs); |
592 return; | 588 return; |
593 } | 589 } |
594 | 590 |
595 switch (ic_data.num_args_tested()) { | 591 switch (ic_data.num_args_tested()) { |
596 case 1: | 592 case 1: |
597 label_address = StubCode::OneArgCheckInlineCacheEntryPoint(); | 593 label_address = StubCode::OneArgCheckInlineCacheEntryPoint(); |
598 break; | 594 break; |
599 case 2: | 595 case 2: |
600 label_address = StubCode::TwoArgsCheckInlineCacheEntryPoint(); | 596 label_address = StubCode::TwoArgsCheckInlineCacheEntryPoint(); |
601 break; | 597 break; |
602 case 3: | 598 case 3: |
603 label_address = StubCode::ThreeArgsCheckInlineCacheEntryPoint(); | 599 label_address = StubCode::ThreeArgsCheckInlineCacheEntryPoint(); |
604 break; | 600 break; |
605 default: | 601 default: |
606 UNIMPLEMENTED(); | 602 UNIMPLEMENTED(); |
607 } | 603 } |
608 ExternalLabel target_label("InlineCache", label_address); | 604 ExternalLabel target_label("InlineCache", label_address); |
609 EmitInstanceCall(&target_label, ic_data, arguments_descriptor, argument_count, | 605 EmitInstanceCall(&target_label, ic_data, argument_count, |
610 deopt_id, token_pos, locs); | 606 deopt_id, token_pos, locs); |
611 } | 607 } |
612 | 608 |
613 | 609 |
614 void FlowGraphCompiler::GenerateStaticCall(intptr_t deopt_id, | 610 void FlowGraphCompiler::GenerateStaticCall(intptr_t deopt_id, |
615 intptr_t token_pos, | 611 intptr_t token_pos, |
616 const Function& function, | 612 const Function& function, |
617 intptr_t argument_count, | 613 intptr_t argument_count, |
618 const Array& argument_names, | 614 const Array& argument_names, |
619 LocationSummary* locs) { | 615 LocationSummary* locs) { |
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1092 | 1088 |
1093 for (int i = 0; i < len; i++) { | 1089 for (int i = 0; i < len; i++) { |
1094 sorted->Add(CidTarget(ic_data.GetReceiverClassIdAt(i), | 1090 sorted->Add(CidTarget(ic_data.GetReceiverClassIdAt(i), |
1095 &Function::ZoneHandle(ic_data.GetTargetAt(i)), | 1091 &Function::ZoneHandle(ic_data.GetTargetAt(i)), |
1096 ic_data.GetCountAt(i))); | 1092 ic_data.GetCountAt(i))); |
1097 } | 1093 } |
1098 sorted->Sort(HighestCountFirst); | 1094 sorted->Sort(HighestCountFirst); |
1099 } | 1095 } |
1100 | 1096 |
1101 } // namespace dart | 1097 } // namespace dart |
OLD | NEW |