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 740 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
751 intptr_t deopt_id, | 751 intptr_t deopt_id, |
752 intptr_t token_pos, | 752 intptr_t token_pos, |
753 intptr_t argument_count, | 753 intptr_t argument_count, |
754 const Array& argument_names, | 754 const Array& argument_names, |
755 LocationSummary* locs, | 755 LocationSummary* locs, |
756 const ICData& ic_data) { | 756 const ICData& ic_data) { |
757 ASSERT(!ic_data.IsNull()); | 757 ASSERT(!ic_data.IsNull()); |
758 ASSERT(FLAG_propagate_ic_data || (ic_data.NumberOfChecks() == 0)); | 758 ASSERT(FLAG_propagate_ic_data || (ic_data.NumberOfChecks() == 0)); |
759 uword label_address = 0; | 759 uword label_address = 0; |
760 if (is_optimizing() && (ic_data.NumberOfChecks() == 0)) { | 760 if (is_optimizing() && (ic_data.NumberOfChecks() == 0)) { |
761 if (ic_data.is_closure_call()) { | 761 if (ic_data.IsClosureCall()) { |
762 // This IC call may be closure call only. | 762 // This IC call may be closure call only. |
763 label_address = StubCode::ClosureCallInlineCacheEntryPoint(); | 763 label_address = StubCode::ClosureCallInlineCacheEntryPoint(); |
764 ExternalLabel target_label("InlineCache", label_address); | 764 ExternalLabel target_label("InlineCache", label_address); |
765 EmitInstanceCall(&target_label, | 765 EmitInstanceCall(&target_label, |
766 ICData::ZoneHandle(ic_data.AsUnaryClassChecks()), | 766 ICData::ZoneHandle(ic_data.AsUnaryClassChecks()), |
767 argument_count, deopt_id, token_pos, locs); | 767 argument_count, deopt_id, token_pos, locs); |
768 return; | 768 return; |
769 } | 769 } |
770 // Emit IC call that will count and thus may need reoptimization at | 770 // Emit IC call that will count and thus may need reoptimization at |
771 // function entry. | 771 // function entry. |
772 ASSERT(!is_optimizing() | 772 ASSERT(!is_optimizing() |
773 || may_reoptimize() | 773 || may_reoptimize() |
774 || flow_graph().IsCompiledForOsr()); | 774 || flow_graph().IsCompiledForOsr()); |
775 switch (ic_data.num_args_tested()) { | 775 switch (ic_data.NumArgsTested()) { |
776 case 1: | 776 case 1: |
777 label_address = StubCode::OneArgOptimizedCheckInlineCacheEntryPoint(); | 777 label_address = StubCode::OneArgOptimizedCheckInlineCacheEntryPoint(); |
778 break; | 778 break; |
779 case 2: | 779 case 2: |
780 label_address = StubCode::TwoArgsOptimizedCheckInlineCacheEntryPoint(); | 780 label_address = StubCode::TwoArgsOptimizedCheckInlineCacheEntryPoint(); |
781 break; | 781 break; |
782 case 3: | 782 case 3: |
783 label_address = | 783 label_address = |
784 StubCode::ThreeArgsOptimizedCheckInlineCacheEntryPoint(); | 784 StubCode::ThreeArgsOptimizedCheckInlineCacheEntryPoint(); |
785 break; | 785 break; |
786 default: | 786 default: |
787 UNIMPLEMENTED(); | 787 UNIMPLEMENTED(); |
788 } | 788 } |
789 ExternalLabel target_label("InlineCache", label_address); | 789 ExternalLabel target_label("InlineCache", label_address); |
790 EmitOptimizedInstanceCall(&target_label, ic_data, | 790 EmitOptimizedInstanceCall(&target_label, ic_data, |
791 argument_count, deopt_id, token_pos, locs); | 791 argument_count, deopt_id, token_pos, locs); |
792 return; | 792 return; |
793 } | 793 } |
794 | 794 |
795 if (is_optimizing()) { | 795 if (is_optimizing()) { |
796 EmitMegamorphicInstanceCall(ic_data, argument_count, | 796 EmitMegamorphicInstanceCall(ic_data, argument_count, |
797 deopt_id, token_pos, locs); | 797 deopt_id, token_pos, locs); |
798 return; | 798 return; |
799 } | 799 } |
800 | 800 |
801 switch (ic_data.num_args_tested()) { | 801 switch (ic_data.NumArgsTested()) { |
802 case 1: | 802 case 1: |
803 label_address = StubCode::OneArgCheckInlineCacheEntryPoint(); | 803 label_address = StubCode::OneArgCheckInlineCacheEntryPoint(); |
804 break; | 804 break; |
805 case 2: | 805 case 2: |
806 label_address = StubCode::TwoArgsCheckInlineCacheEntryPoint(); | 806 label_address = StubCode::TwoArgsCheckInlineCacheEntryPoint(); |
807 break; | 807 break; |
808 case 3: | 808 case 3: |
809 label_address = StubCode::ThreeArgsCheckInlineCacheEntryPoint(); | 809 label_address = StubCode::ThreeArgsCheckInlineCacheEntryPoint(); |
810 break; | 810 break; |
811 default: | 811 default: |
(...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1268 static int HighestCountFirst(const CidTarget* a, const CidTarget* b) { | 1268 static int HighestCountFirst(const CidTarget* a, const CidTarget* b) { |
1269 // Negative if 'a' should sort before 'b'. | 1269 // Negative if 'a' should sort before 'b'. |
1270 return b->count - a->count; | 1270 return b->count - a->count; |
1271 } | 1271 } |
1272 | 1272 |
1273 | 1273 |
1274 // Returns 'sorted' array in decreasing count order. | 1274 // Returns 'sorted' array in decreasing count order. |
1275 // The expected number of elements to sort is less than 10. | 1275 // The expected number of elements to sort is less than 10. |
1276 void FlowGraphCompiler::SortICDataByCount(const ICData& ic_data, | 1276 void FlowGraphCompiler::SortICDataByCount(const ICData& ic_data, |
1277 GrowableArray<CidTarget>* sorted) { | 1277 GrowableArray<CidTarget>* sorted) { |
1278 ASSERT(ic_data.num_args_tested() == 1); | 1278 ASSERT(ic_data.NumArgsTested() == 1); |
1279 const intptr_t len = ic_data.NumberOfChecks(); | 1279 const intptr_t len = ic_data.NumberOfChecks(); |
1280 sorted->Clear(); | 1280 sorted->Clear(); |
1281 | 1281 |
1282 for (int i = 0; i < len; i++) { | 1282 for (int i = 0; i < len; i++) { |
1283 sorted->Add(CidTarget(ic_data.GetReceiverClassIdAt(i), | 1283 sorted->Add(CidTarget(ic_data.GetReceiverClassIdAt(i), |
1284 &Function::ZoneHandle(ic_data.GetTargetAt(i)), | 1284 &Function::ZoneHandle(ic_data.GetTargetAt(i)), |
1285 ic_data.GetCountAt(i))); | 1285 ic_data.GetCountAt(i))); |
1286 } | 1286 } |
1287 sorted->Sort(HighestCountFirst); | 1287 sorted->Sort(HighestCountFirst); |
1288 } | 1288 } |
1289 | 1289 |
1290 } // namespace dart | 1290 } // namespace dart |
OLD | NEW |