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

Side by Side Diff: runtime/vm/intermediate_language.cc

Issue 678763004: Make CTX allocatable by the register allocator. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: incorporated latest comments Created 6 years, 1 month 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/intermediate_language.h" 5 #include "vm/intermediate_language.h"
6 6
7 #include "vm/bit_vector.h" 7 #include "vm/bit_vector.h"
8 #include "vm/cpu.h" 8 #include "vm/cpu.h"
9 #include "vm/dart_entry.h" 9 #include "vm/dart_entry.h"
10 #include "vm/flow_graph_allocator.h" 10 #include "vm/flow_graph_allocator.h"
(...skipping 1037 matching lines...) Expand 10 before | Expand all | Expand 10 after
1048 } 1048 }
1049 UnuseAllInputs(); 1049 UnuseAllInputs();
1050 for (ForwardInstructionIterator it(this); 1050 for (ForwardInstructionIterator it(this);
1051 !it.Done(); 1051 !it.Done();
1052 it.Advance()) { 1052 it.Advance()) {
1053 it.Current()->UnuseAllInputs(); 1053 it.Current()->UnuseAllInputs();
1054 } 1054 }
1055 } 1055 }
1056 1056
1057 1057
1058 void JoinEntryInstr::InsertPhi(intptr_t var_index, intptr_t var_count) { 1058 PhiInstr* JoinEntryInstr::InsertPhi(intptr_t var_index, intptr_t var_count) {
1059 // Lazily initialize the array of phis. 1059 // Lazily initialize the array of phis.
1060 // Currently, phis are stored in a sparse array that holds the phi 1060 // Currently, phis are stored in a sparse array that holds the phi
1061 // for variable with index i at position i. 1061 // for variable with index i at position i.
1062 // TODO(fschneider): Store phis in a more compact way. 1062 // TODO(fschneider): Store phis in a more compact way.
1063 if (phis_ == NULL) { 1063 if (phis_ == NULL) {
1064 phis_ = new ZoneGrowableArray<PhiInstr*>(var_count); 1064 phis_ = new ZoneGrowableArray<PhiInstr*>(var_count);
1065 for (intptr_t i = 0; i < var_count; i++) { 1065 for (intptr_t i = 0; i < var_count; i++) {
1066 phis_->Add(NULL); 1066 phis_->Add(NULL);
1067 } 1067 }
1068 } 1068 }
1069 ASSERT((*phis_)[var_index] == NULL); 1069 ASSERT((*phis_)[var_index] == NULL);
1070 (*phis_)[var_index] = new PhiInstr(this, PredecessorCount()); 1070 return (*phis_)[var_index] = new PhiInstr(this, PredecessorCount());
1071 } 1071 }
1072 1072
1073 1073
1074 void JoinEntryInstr::InsertPhi(PhiInstr* phi) { 1074 void JoinEntryInstr::InsertPhi(PhiInstr* phi) {
1075 // Lazily initialize the array of phis. 1075 // Lazily initialize the array of phis.
1076 if (phis_ == NULL) { 1076 if (phis_ == NULL) {
1077 phis_ = new ZoneGrowableArray<PhiInstr*>(1); 1077 phis_ = new ZoneGrowableArray<PhiInstr*>(1);
1078 } 1078 }
1079 phis_->Add(phi); 1079 phis_->Add(phi);
1080 } 1080 }
(...skipping 1557 matching lines...) Expand 10 before | Expand all | Expand 10 after
2638 InputAt(i)->definition()->IsMaterializeObject()) { 2638 InputAt(i)->definition()->IsMaterializeObject()) {
2639 InputAt(i)->definition()->AsMaterializeObject()->RemapRegisters( 2639 InputAt(i)->definition()->AsMaterializeObject()->RemapRegisters(
2640 fpu_reg_slots, cpu_reg_slots); 2640 fpu_reg_slots, cpu_reg_slots);
2641 } 2641 }
2642 } 2642 }
2643 } 2643 }
2644 2644
2645 2645
2646 LocationSummary* CurrentContextInstr::MakeLocationSummary(Isolate* isolate, 2646 LocationSummary* CurrentContextInstr::MakeLocationSummary(Isolate* isolate,
2647 bool opt) const { 2647 bool opt) const {
2648 return LocationSummary::Make(isolate, 2648 // Only appears in initial definitions, never in normal code.
2649 0, 2649 UNREACHABLE();
2650 Location::RegisterLocation(CTX), 2650 return NULL;
2651 LocationSummary::kNoCall);
2652 } 2651 }
2653 2652
2654 2653
2655 void CurrentContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 2654 void CurrentContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
2656 // No code to emit. Just assert the correct result register. 2655 // Only appears in initial definitions, never in normal code.
2657 ASSERT(locs()->out(0).reg() == CTX); 2656 UNREACHABLE();
2658 }
2659
2660
2661 LocationSummary* StoreContextInstr::MakeLocationSummary(Isolate* isolate,
2662 bool optimizing) const {
2663 const intptr_t kNumInputs = 1;
2664 const intptr_t kNumTemps = 0;
2665 LocationSummary* summary = new(isolate) LocationSummary(
2666 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
2667 summary->set_in(0, Location::RegisterLocation(CTX));
2668 return summary;
2669 }
2670
2671
2672 void StoreContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
2673 // Nothing to do. Context register was loaded by the register allocator.
2674 ASSERT(locs()->in(0).reg() == CTX);
2675 } 2657 }
2676 2658
2677 2659
2678 LocationSummary* PushTempInstr::MakeLocationSummary(Isolate* isolate, 2660 LocationSummary* PushTempInstr::MakeLocationSummary(Isolate* isolate,
2679 bool optimizing) const { 2661 bool optimizing) const {
2680 return LocationSummary::Make(isolate, 2662 return LocationSummary::Make(isolate,
2681 1, 2663 1,
2682 Location::NoLocation(), 2664 Location::NoLocation(),
2683 LocationSummary::kNoCall); 2665 LocationSummary::kNoCall);
2684 } 2666 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
2722 left, 2704 left,
2723 right, 2705 right,
2724 Isolate::Current()->GetNextDeoptId()), 2706 Isolate::Current()->GetNextDeoptId()),
2725 needs_number_check_(needs_number_check) { 2707 needs_number_check_(needs_number_check) {
2726 ASSERT((kind == Token::kEQ_STRICT) || (kind == Token::kNE_STRICT)); 2708 ASSERT((kind == Token::kEQ_STRICT) || (kind == Token::kNE_STRICT));
2727 } 2709 }
2728 2710
2729 2711
2730 LocationSummary* InstanceCallInstr::MakeLocationSummary(Isolate* isolate, 2712 LocationSummary* InstanceCallInstr::MakeLocationSummary(Isolate* isolate,
2731 bool optimizing) const { 2713 bool optimizing) const {
2732 return MakeCallSummary(); 2714 return MakeCallSummary(isolate);
2733 } 2715 }
2734 2716
2735 2717
2736 static uword TwoArgsSmiOpInlineCacheEntry(Token::Kind kind) { 2718 static uword TwoArgsSmiOpInlineCacheEntry(Token::Kind kind) {
2737 if (!FLAG_two_args_smi_icd) { 2719 if (!FLAG_two_args_smi_icd) {
2738 return 0; 2720 return 0;
2739 } 2721 }
2740 StubCode* stub_code = Isolate::Current()->stub_code(); 2722 StubCode* stub_code = Isolate::Current()->stub_code();
2741 switch (kind) { 2723 switch (kind) {
2742 case Token::kADD: return stub_code->SmiAddInlineCacheEntryPoint(); 2724 case Token::kADD: return stub_code->SmiAddInlineCacheEntryPoint();
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
2840 !target.IsInvokeFieldDispatcher()) { 2822 !target.IsInvokeFieldDispatcher()) {
2841 return false; 2823 return false;
2842 } 2824 }
2843 } 2825 }
2844 return true; 2826 return true;
2845 } 2827 }
2846 2828
2847 2829
2848 LocationSummary* StaticCallInstr::MakeLocationSummary(Isolate* isolate, 2830 LocationSummary* StaticCallInstr::MakeLocationSummary(Isolate* isolate,
2849 bool optimizing) const { 2831 bool optimizing) const {
2850 return MakeCallSummary(); 2832 return MakeCallSummary(isolate);
2851 } 2833 }
2852 2834
2853 2835
2854 void StaticCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 2836 void StaticCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
2855 const ICData* call_ic_data = NULL; 2837 const ICData* call_ic_data = NULL;
2856 if (!FLAG_propagate_ic_data || !compiler->is_optimizing()) { 2838 if (!FLAG_propagate_ic_data || !compiler->is_optimizing()) {
2857 const Array& arguments_descriptor = 2839 const Array& arguments_descriptor =
2858 Array::Handle(ArgumentsDescriptor::New(ArgumentCount(), 2840 Array::Handle(ArgumentsDescriptor::New(ArgumentCount(),
2859 argument_names())); 2841 argument_names()));
2860 MethodRecognizer::Kind recognized_kind = 2842 MethodRecognizer::Kind recognized_kind =
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after
3358 case Token::kTRUNCDIV: return 0; 3340 case Token::kTRUNCDIV: return 0;
3359 case Token::kMOD: return 1; 3341 case Token::kMOD: return 1;
3360 default: UNIMPLEMENTED(); return -1; 3342 default: UNIMPLEMENTED(); return -1;
3361 } 3343 }
3362 } 3344 }
3363 3345
3364 3346
3365 #undef __ 3347 #undef __
3366 3348
3367 } // namespace dart 3349 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698