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

Side by Side Diff: vm/intermediate_language.cc

Issue 10632009: Make the parser agnostic to the TokenStream implementation. This is the first step towards compacti… (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/runtime/
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
« no previous file with comments | « vm/intermediate_language.h ('k') | vm/intermediate_language_ia32.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 911 matching lines...) Expand 10 before | Expand all | Expand 10 after
922 922
923 923
924 void StoreInstanceFieldComp::EmitNativeCode(FlowGraphCompiler* compiler) { 924 void StoreInstanceFieldComp::EmitNativeCode(FlowGraphCompiler* compiler) {
925 ASSERT(VerifyValues(instance(), value())); 925 ASSERT(VerifyValues(instance(), value()));
926 Register instance_reg = locs()->in(0).reg(); 926 Register instance_reg = locs()->in(0).reg();
927 Register value_reg = locs()->in(1).reg(); 927 Register value_reg = locs()->in(1).reg();
928 928
929 if (HasICData()) { 929 if (HasICData()) {
930 ASSERT(original() != NULL); 930 ASSERT(original() != NULL);
931 Label* deopt = compiler->AddDeoptStub(original()->cid(), 931 Label* deopt = compiler->AddDeoptStub(original()->cid(),
932 original()->token_index(), 932 original()->token_pos(),
933 original()->try_index(), 933 original()->try_index(),
934 kDeoptInstanceGetterSameTarget, 934 kDeoptInstanceGetterSameTarget,
935 instance_reg, 935 instance_reg,
936 value_reg); 936 value_reg);
937 // Smis do not have instance fields (Smi class is always first). 937 // Smis do not have instance fields (Smi class is always first).
938 Register temp_reg = locs()->temp(0).reg(); 938 Register temp_reg = locs()->temp(0).reg();
939 ASSERT(temp_reg != instance_reg); 939 ASSERT(temp_reg != instance_reg);
940 ASSERT(temp_reg != value_reg); 940 ASSERT(temp_reg != value_reg);
941 ASSERT(ic_data() != NULL); 941 ASSERT(ic_data() != NULL);
942 compiler->EmitClassChecksNoSmi(*ic_data(), instance_reg, temp_reg, deopt); 942 compiler->EmitClassChecksNoSmi(*ic_data(), instance_reg, temp_reg, deopt);
943 } 943 }
944 __ StoreIntoObject(instance_reg, FieldAddress(instance_reg, field().Offset()), 944 __ StoreIntoObject(instance_reg, FieldAddress(instance_reg, field().Offset()),
945 value_reg); 945 value_reg);
946 } 946 }
947 947
948 948
949 LocationSummary* ThrowInstr::MakeLocationSummary() const { 949 LocationSummary* ThrowInstr::MakeLocationSummary() const {
950 const int kNumInputs = 0; 950 const int kNumInputs = 0;
951 const int kNumTemps = 0; 951 const int kNumTemps = 0;
952 return new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 952 return new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
953 } 953 }
954 954
955 955
956 956
957 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 957 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
958 ASSERT(exception()->IsUse()); 958 ASSERT(exception()->IsUse());
959 compiler->GenerateCallRuntime(cid(), 959 compiler->GenerateCallRuntime(cid(),
960 token_index(), 960 token_pos(),
961 try_index(), 961 try_index(),
962 kThrowRuntimeEntry); 962 kThrowRuntimeEntry);
963 __ int3(); 963 __ int3();
964 } 964 }
965 965
966 966
967 LocationSummary* ReThrowInstr::MakeLocationSummary() const { 967 LocationSummary* ReThrowInstr::MakeLocationSummary() const {
968 const int kNumInputs = 0; 968 const int kNumInputs = 0;
969 const int kNumTemps = 0; 969 const int kNumTemps = 0;
970 return new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); 970 return new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
971 } 971 }
972 972
973 973
974 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 974 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
975 ASSERT(exception()->IsUse()); 975 ASSERT(exception()->IsUse());
976 ASSERT(stack_trace()->IsUse()); 976 ASSERT(stack_trace()->IsUse());
977 compiler->GenerateCallRuntime(cid(), 977 compiler->GenerateCallRuntime(cid(),
978 token_index(), 978 token_pos(),
979 try_index(), 979 try_index(),
980 kReThrowRuntimeEntry); 980 kReThrowRuntimeEntry);
981 __ int3(); 981 __ int3();
982 } 982 }
983 983
984 984
985 LocationSummary* BranchInstr::MakeLocationSummary() const { 985 LocationSummary* BranchInstr::MakeLocationSummary() const {
986 if (is_fused_with_comparison()) { 986 if (is_fused_with_comparison()) {
987 return LocationSummary::Make(0, 987 return LocationSummary::Make(0,
988 Location::NoLocation(), 988 Location::NoLocation(),
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
1119 // The arguments to the stub include the closure. The arguments 1119 // The arguments to the stub include the closure. The arguments
1120 // descriptor describes the closure's arguments (and so does not include 1120 // descriptor describes the closure's arguments (and so does not include
1121 // the closure). 1121 // the closure).
1122 Register temp_reg = locs()->temp(0).reg(); 1122 Register temp_reg = locs()->temp(0).reg();
1123 int argument_count = ArgumentCount(); 1123 int argument_count = ArgumentCount();
1124 const Array& arguments_descriptor = 1124 const Array& arguments_descriptor =
1125 CodeGenerator::ArgumentsDescriptor(argument_count - 1, 1125 CodeGenerator::ArgumentsDescriptor(argument_count - 1,
1126 argument_names()); 1126 argument_names());
1127 __ LoadObject(temp_reg, arguments_descriptor); 1127 __ LoadObject(temp_reg, arguments_descriptor);
1128 1128
1129 compiler->GenerateCall(token_index(), 1129 compiler->GenerateCall(token_pos(),
1130 try_index(), 1130 try_index(),
1131 &StubCode::CallClosureFunctionLabel(), 1131 &StubCode::CallClosureFunctionLabel(),
1132 PcDescriptors::kOther); 1132 PcDescriptors::kOther);
1133 __ Drop(argument_count); 1133 __ Drop(argument_count);
1134 } 1134 }
1135 1135
1136 1136
1137 LocationSummary* InstanceCallComp::MakeLocationSummary() const { 1137 LocationSummary* InstanceCallComp::MakeLocationSummary() const {
1138 return MakeCallSummary(); 1138 return MakeCallSummary();
1139 } 1139 }
1140 1140
1141 1141
1142 void InstanceCallComp::EmitNativeCode(FlowGraphCompiler* compiler) { 1142 void InstanceCallComp::EmitNativeCode(FlowGraphCompiler* compiler) {
1143 ASSERT(VerifyCallComputation(this)); 1143 ASSERT(VerifyCallComputation(this));
1144 compiler->AddCurrentDescriptor(PcDescriptors::kDeopt, 1144 compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
1145 cid(), 1145 cid(),
1146 token_index(), 1146 token_pos(),
1147 try_index()); 1147 try_index());
1148 compiler->GenerateInstanceCall(cid(), 1148 compiler->GenerateInstanceCall(cid(),
1149 token_index(), 1149 token_pos(),
1150 try_index(), 1150 try_index(),
1151 function_name(), 1151 function_name(),
1152 ArgumentCount(), 1152 ArgumentCount(),
1153 argument_names(), 1153 argument_names(),
1154 checked_argument_count()); 1154 checked_argument_count());
1155 } 1155 }
1156 1156
1157 1157
1158 bool InstanceCallComp::VerifyComputation() { 1158 bool InstanceCallComp::VerifyComputation() {
1159 return VerifyCallComputation(this); 1159 return VerifyCallComputation(this);
1160 } 1160 }
1161 1161
1162 1162
1163 LocationSummary* StaticCallComp::MakeLocationSummary() const { 1163 LocationSummary* StaticCallComp::MakeLocationSummary() const {
1164 return MakeCallSummary(); 1164 return MakeCallSummary();
1165 } 1165 }
1166 1166
1167 1167
1168 void StaticCallComp::EmitNativeCode(FlowGraphCompiler* compiler) { 1168 void StaticCallComp::EmitNativeCode(FlowGraphCompiler* compiler) {
1169 ASSERT(VerifyCallComputation(this)); 1169 ASSERT(VerifyCallComputation(this));
1170 Label done; 1170 Label done;
1171 if (recognized() == MethodRecognizer::kMathSqrt) { 1171 if (recognized() == MethodRecognizer::kMathSqrt) {
1172 compiler->GenerateInlinedMathSqrt(&done); 1172 compiler->GenerateInlinedMathSqrt(&done);
1173 // Falls through to static call when operand type is not double or smi. 1173 // Falls through to static call when operand type is not double or smi.
1174 } 1174 }
1175 compiler->GenerateStaticCall(cid(), 1175 compiler->GenerateStaticCall(cid(),
1176 token_index(), 1176 token_pos(),
1177 try_index(), 1177 try_index(),
1178 function(), 1178 function(),
1179 ArgumentCount(), 1179 ArgumentCount(),
1180 argument_names()); 1180 argument_names());
1181 __ Bind(&done); 1181 __ Bind(&done);
1182 } 1182 }
1183 1183
1184 1184
1185 LocationSummary* UseVal::MakeLocationSummary() const { 1185 LocationSummary* UseVal::MakeLocationSummary() const {
1186 return NULL; 1186 return NULL;
1187 } 1187 }
1188 1188
1189 1189
1190 void UseVal::EmitNativeCode(FlowGraphCompiler* compiler) { 1190 void UseVal::EmitNativeCode(FlowGraphCompiler* compiler) {
1191 UNIMPLEMENTED(); 1191 UNIMPLEMENTED();
1192 } 1192 }
1193 1193
1194 1194
1195 void AssertAssignableComp::EmitNativeCode(FlowGraphCompiler* compiler) { 1195 void AssertAssignableComp::EmitNativeCode(FlowGraphCompiler* compiler) {
1196 compiler->GenerateAssertAssignable(cid(), 1196 compiler->GenerateAssertAssignable(cid(),
1197 token_index(), 1197 token_pos(),
1198 try_index(), 1198 try_index(),
1199 dst_type(), 1199 dst_type(),
1200 dst_name()); 1200 dst_name());
1201 ASSERT(locs()->in(0).reg() == locs()->out().reg()); 1201 ASSERT(locs()->in(0).reg() == locs()->out().reg());
1202 } 1202 }
1203 1203
1204 1204
1205 LocationSummary* AssertBooleanComp::MakeLocationSummary() const { 1205 LocationSummary* AssertBooleanComp::MakeLocationSummary() const {
1206 return LocationSummary::Make(1, 1206 return LocationSummary::Make(1,
1207 Location::SameAsFirstInput(), 1207 Location::SameAsFirstInput(),
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
1280 1280
1281 LocationSummary* AllocateObjectComp::MakeLocationSummary() const { 1281 LocationSummary* AllocateObjectComp::MakeLocationSummary() const {
1282 return MakeCallSummary(); 1282 return MakeCallSummary();
1283 } 1283 }
1284 1284
1285 1285
1286 void AllocateObjectComp::EmitNativeCode(FlowGraphCompiler* compiler) { 1286 void AllocateObjectComp::EmitNativeCode(FlowGraphCompiler* compiler) {
1287 const Class& cls = Class::ZoneHandle(constructor().owner()); 1287 const Class& cls = Class::ZoneHandle(constructor().owner());
1288 const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls)); 1288 const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls));
1289 const ExternalLabel label(cls.ToCString(), stub.EntryPoint()); 1289 const ExternalLabel label(cls.ToCString(), stub.EntryPoint());
1290 compiler->GenerateCall(token_index(), 1290 compiler->GenerateCall(token_pos(),
1291 try_index(), 1291 try_index(),
1292 &label, 1292 &label,
1293 PcDescriptors::kOther); 1293 PcDescriptors::kOther);
1294 __ Drop(arguments().length()); // Discard arguments. 1294 __ Drop(arguments().length()); // Discard arguments.
1295 } 1295 }
1296 1296
1297 1297
1298 LocationSummary* CreateClosureComp::MakeLocationSummary() const { 1298 LocationSummary* CreateClosureComp::MakeLocationSummary() const {
1299 return MakeCallSummary(); 1299 return MakeCallSummary();
1300 } 1300 }
1301 1301
1302 1302
1303 void CreateClosureComp::EmitNativeCode(FlowGraphCompiler* compiler) { 1303 void CreateClosureComp::EmitNativeCode(FlowGraphCompiler* compiler) {
1304 const Function& closure_function = function(); 1304 const Function& closure_function = function();
1305 const Code& stub = Code::Handle( 1305 const Code& stub = Code::Handle(
1306 StubCode::GetAllocationStubForClosure(closure_function)); 1306 StubCode::GetAllocationStubForClosure(closure_function));
1307 const ExternalLabel label(closure_function.ToCString(), stub.EntryPoint()); 1307 const ExternalLabel label(closure_function.ToCString(), stub.EntryPoint());
1308 compiler->GenerateCall(token_index(), try_index(), &label, 1308 compiler->GenerateCall(token_pos(), try_index(), &label,
1309 PcDescriptors::kOther); 1309 PcDescriptors::kOther);
1310 __ Drop(2); // Discard type arguments and receiver. 1310 __ Drop(2); // Discard type arguments and receiver.
1311 } 1311 }
1312 1312
1313 1313
1314 #undef __ 1314 #undef __
1315 1315
1316 } // namespace dart 1316 } // namespace dart
OLDNEW
« no previous file with comments | « vm/intermediate_language.h ('k') | vm/intermediate_language_ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698