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