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

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

Issue 10559035: Implement a simple register allocator that tries to keep instruction results in registers. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 6 months 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) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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/flow_graph_builder.h" 8 #include "vm/flow_graph_builder.h"
9 #include "vm/flow_graph_compiler.h" 9 #include "vm/flow_graph_compiler.h"
10 #include "vm/locations.h" 10 #include "vm/locations.h"
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 intptr_t AllocateObjectWithBoundsCheckComp::InputCount() const { 124 intptr_t AllocateObjectWithBoundsCheckComp::InputCount() const {
125 return arguments().length(); 125 return arguments().length();
126 } 126 }
127 127
128 128
129 intptr_t CreateArrayComp::InputCount() const { 129 intptr_t CreateArrayComp::InputCount() const {
130 return ElementCount() + 1; 130 return ElementCount() + 1;
131 } 131 }
132 132
133 133
134 Value* CreateArrayComp::InputAt(intptr_t i) const {
135 if (i == 0) {
136 return element_type();
137 } else {
138 return ElementAt(i - 1);
139 }
140 }
141
142
134 intptr_t BranchInstr::InputCount() const { 143 intptr_t BranchInstr::InputCount() const {
135 return 1; 144 return 1;
136 } 145 }
137 146
138 147
139 Value* BranchInstr::InputAt(intptr_t i) const { 148 Value* BranchInstr::InputAt(intptr_t i) const {
140 if (i == 0) return value(); 149 if (i == 0) return value();
141 UNREACHABLE(); 150 UNREACHABLE();
142 return NULL; 151 return NULL;
143 } 152 }
(...skipping 689 matching lines...) Expand 10 before | Expand all | Expand 10 after
833 compiler->EmitClassChecksNoSmi(*class_ids(), instance, temp, deopt); 842 compiler->EmitClassChecksNoSmi(*class_ids(), instance, temp, deopt);
834 } 843 }
835 __ StoreIntoObject(instance, FieldAddress(instance, field().Offset()), 844 __ StoreIntoObject(instance, FieldAddress(instance, field().Offset()),
836 value); 845 value);
837 } 846 }
838 847
839 848
840 LocationSummary* ThrowInstr::MakeLocationSummary() const { 849 LocationSummary* ThrowInstr::MakeLocationSummary() const {
841 const int kNumInputs = 0; 850 const int kNumInputs = 0;
842 const int kNumTemps = 0; 851 const int kNumTemps = 0;
843 return new LocationSummary(kNumInputs, kNumTemps); 852 return new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
844 } 853 }
845 854
846 855
847 856
848 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 857 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
849 ASSERT(exception()->IsUse()); 858 ASSERT(exception()->IsUse());
850 compiler->GenerateCallRuntime(cid(), 859 compiler->GenerateCallRuntime(cid(),
851 token_index(), 860 token_index(),
852 try_index(), 861 try_index(),
853 kThrowRuntimeEntry); 862 kThrowRuntimeEntry);
854 __ int3(); 863 __ int3();
855 } 864 }
856 865
857 866
858 LocationSummary* ReThrowInstr::MakeLocationSummary() const { 867 LocationSummary* ReThrowInstr::MakeLocationSummary() const {
859 const int kNumInputs = 0; 868 const int kNumInputs = 0;
860 const int kNumTemps = 0; 869 const int kNumTemps = 0;
861 return new LocationSummary(kNumInputs, kNumTemps); 870 return new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
862 } 871 }
863 872
864 873
865 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 874 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
866 ASSERT(exception()->IsUse()); 875 ASSERT(exception()->IsUse());
867 ASSERT(stack_trace()->IsUse()); 876 ASSERT(stack_trace()->IsUse());
868 compiler->GenerateCallRuntime(cid(), 877 compiler->GenerateCallRuntime(cid(),
869 token_index(), 878 token_index(),
870 try_index(), 879 try_index(),
871 kReThrowRuntimeEntry); 880 kReThrowRuntimeEntry);
872 __ int3(); 881 __ int3();
873 } 882 }
874 883
875 884
876 LocationSummary* BranchInstr::MakeLocationSummary() const { 885 LocationSummary* BranchInstr::MakeLocationSummary() const {
877 if (is_fused_with_comparison()) { 886 if (is_fused_with_comparison()) {
878 return LocationSummary::Make(0, Location::NoLocation()); 887 return LocationSummary::Make(0,
888 Location::NoLocation(),
889 LocationSummary::kNoCall,
890 LocationSummary::kBranch);
879 } else { 891 } else {
880 const int kNumInputs = 1; 892 const int kNumInputs = 1;
881 const int kNumTemps = 0; 893 const int kNumTemps = 0;
882 LocationSummary* locs = new LocationSummary(kNumInputs, kNumTemps); 894 LocationSummary* locs = new LocationSummary(kNumInputs,
895 kNumTemps,
896 LocationSummary::kNoCall,
897 LocationSummary::kBranch);
883 locs->set_in(0, Location::RequiresRegister()); 898 locs->set_in(0, Location::RequiresRegister());
884 return locs; 899 return locs;
885 } 900 }
886 } 901 }
887 902
888 903
889 void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 904 void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
890 // If branch was fused with a comparision then no code needs to be emitted. 905 // If branch was fused with a comparision then no code needs to be emitted.
891 if (!is_fused_with_comparison()) { 906 if (!is_fused_with_comparison()) {
892 Register value = locs()->in(0).reg(); 907 Register value = locs()->in(0).reg();
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
1070 compiler->GenerateAssertAssignable(cid(), 1085 compiler->GenerateAssertAssignable(cid(),
1071 token_index(), 1086 token_index(),
1072 try_index(), 1087 try_index(),
1073 dst_type(), 1088 dst_type(),
1074 dst_name()); 1089 dst_name());
1075 ASSERT(locs()->in(0).reg() == locs()->out().reg()); 1090 ASSERT(locs()->in(0).reg() == locs()->out().reg());
1076 } 1091 }
1077 1092
1078 1093
1079 LocationSummary* AssertBooleanComp::MakeLocationSummary() const { 1094 LocationSummary* AssertBooleanComp::MakeLocationSummary() const {
1080 return LocationSummary::Make(1, Location::SameAsFirstInput()); 1095 return LocationSummary::Make(1,
1096 Location::SameAsFirstInput(),
1097 LocationSummary::kCall);
1081 } 1098 }
1082 1099
1083 1100
1084 LocationSummary* StoreStaticFieldComp::MakeLocationSummary() const { 1101 LocationSummary* StoreStaticFieldComp::MakeLocationSummary() const {
1085 LocationSummary* locs = new LocationSummary(1, 1); 1102 LocationSummary* locs = new LocationSummary(1, 1);
1086 locs->set_in(0, Location::RequiresRegister()); 1103 locs->set_in(0, Location::RequiresRegister());
1087 locs->set_temp(0, Location::RequiresRegister()); 1104 locs->set_temp(0, Location::RequiresRegister());
1088 locs->set_out(Location::SameAsFirstInput()); 1105 locs->set_out(Location::SameAsFirstInput());
1089 return locs; 1106 return locs;
1090 } 1107 }
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1179 const ExternalLabel label(closure_function.ToCString(), stub.EntryPoint()); 1196 const ExternalLabel label(closure_function.ToCString(), stub.EntryPoint());
1180 compiler->GenerateCall(token_index(), try_index(), &label, 1197 compiler->GenerateCall(token_index(), try_index(), &label,
1181 PcDescriptors::kOther); 1198 PcDescriptors::kOther);
1182 __ Drop(2); // Discard type arguments and receiver. 1199 __ Drop(2); // Discard type arguments and receiver.
1183 } 1200 }
1184 1201
1185 1202
1186 #undef __ 1203 #undef __
1187 1204
1188 } // namespace dart 1205 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698