| 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 |