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

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

Issue 10831261: Build and use stack maps in the SSA compiler. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 4 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/dart_entry.h" 8 #include "vm/dart_entry.h"
9 #include "vm/flow_graph_allocator.h" 9 #include "vm/flow_graph_allocator.h"
10 #include "vm/flow_graph_builder.h" 10 #include "vm/flow_graph_builder.h"
(...skipping 834 matching lines...) Expand 10 before | Expand all | Expand 10 after
845 LocationSummary* ThrowInstr::MakeLocationSummary() const { 845 LocationSummary* ThrowInstr::MakeLocationSummary() const {
846 return new LocationSummary(0, 0, LocationSummary::kCall); 846 return new LocationSummary(0, 0, LocationSummary::kCall);
847 } 847 }
848 848
849 849
850 850
851 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 851 void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
852 compiler->GenerateCallRuntime(deopt_id(), 852 compiler->GenerateCallRuntime(deopt_id(),
853 token_pos(), 853 token_pos(),
854 try_index(), 854 try_index(),
855 kThrowRuntimeEntry); 855 kThrowRuntimeEntry,
856 locs()->stack_bitmap());
856 __ int3(); 857 __ int3();
857 } 858 }
858 859
859 860
860 LocationSummary* ReThrowInstr::MakeLocationSummary() const { 861 LocationSummary* ReThrowInstr::MakeLocationSummary() const {
861 return new LocationSummary(0, 0, LocationSummary::kCall); 862 return new LocationSummary(0, 0, LocationSummary::kCall);
862 } 863 }
863 864
864 865
865 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 866 void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
866 compiler->GenerateCallRuntime(deopt_id(), 867 compiler->GenerateCallRuntime(deopt_id(),
867 token_pos(), 868 token_pos(),
868 try_index(), 869 try_index(),
869 kReThrowRuntimeEntry); 870 kReThrowRuntimeEntry,
871 locs()->stack_bitmap());
870 __ int3(); 872 __ int3();
871 } 873 }
872 874
873 875
874 LocationSummary* GotoInstr::MakeLocationSummary() const { 876 LocationSummary* GotoInstr::MakeLocationSummary() const {
875 return new LocationSummary(0, 0, LocationSummary::kNoCall); 877 return new LocationSummary(0, 0, LocationSummary::kNoCall);
876 } 878 }
877 879
878 880
879 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 881 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
985 Register temp_reg = locs()->temp(0).reg(); 987 Register temp_reg = locs()->temp(0).reg();
986 int argument_count = ArgumentCount(); 988 int argument_count = ArgumentCount();
987 const Array& arguments_descriptor = 989 const Array& arguments_descriptor =
988 DartEntry::ArgumentsDescriptor(argument_count - 1, 990 DartEntry::ArgumentsDescriptor(argument_count - 1,
989 argument_names()); 991 argument_names());
990 __ LoadObject(temp_reg, arguments_descriptor); 992 __ LoadObject(temp_reg, arguments_descriptor);
991 993
992 compiler->GenerateCall(token_pos(), 994 compiler->GenerateCall(token_pos(),
993 try_index(), 995 try_index(),
994 &StubCode::CallClosureFunctionLabel(), 996 &StubCode::CallClosureFunctionLabel(),
995 PcDescriptors::kOther); 997 PcDescriptors::kOther,
998 locs()->stack_bitmap());
996 __ Drop(argument_count); 999 __ Drop(argument_count);
997 } 1000 }
998 1001
999 1002
1000 LocationSummary* InstanceCallComp::MakeLocationSummary() const { 1003 LocationSummary* InstanceCallComp::MakeLocationSummary() const {
1001 return MakeCallSummary(); 1004 return MakeCallSummary();
1002 } 1005 }
1003 1006
1004 1007
1005 void InstanceCallComp::EmitNativeCode(FlowGraphCompiler* compiler) { 1008 void InstanceCallComp::EmitNativeCode(FlowGraphCompiler* compiler) {
1006 compiler->AddCurrentDescriptor(PcDescriptors::kDeopt, 1009 compiler->AddCurrentDescriptor(PcDescriptors::kDeopt,
1007 deopt_id(), 1010 deopt_id(),
1008 token_pos(), 1011 token_pos(),
1009 try_index()); 1012 try_index());
1010 compiler->GenerateInstanceCall(deopt_id(), 1013 compiler->GenerateInstanceCall(deopt_id(),
1011 token_pos(), 1014 token_pos(),
1012 try_index(), 1015 try_index(),
1013 function_name(), 1016 function_name(),
1014 ArgumentCount(), 1017 ArgumentCount(),
1015 argument_names(), 1018 argument_names(),
1016 checked_argument_count()); 1019 checked_argument_count(),
1020 locs()->stack_bitmap());
1017 } 1021 }
1018 1022
1019 1023
1020 LocationSummary* StaticCallComp::MakeLocationSummary() const { 1024 LocationSummary* StaticCallComp::MakeLocationSummary() const {
1021 return MakeCallSummary(); 1025 return MakeCallSummary();
1022 } 1026 }
1023 1027
1024 1028
1025 void StaticCallComp::EmitNativeCode(FlowGraphCompiler* compiler) { 1029 void StaticCallComp::EmitNativeCode(FlowGraphCompiler* compiler) {
1026 Label done; 1030 Label done;
1027 if (recognized() == MethodRecognizer::kMathSqrt) { 1031 if (recognized() == MethodRecognizer::kMathSqrt) {
1028 compiler->GenerateInlinedMathSqrt(&done); 1032 compiler->GenerateInlinedMathSqrt(&done);
1029 // Falls through to static call when operand type is not double or smi. 1033 // Falls through to static call when operand type is not double or smi.
1030 } 1034 }
1031 compiler->GenerateStaticCall(deopt_id(), 1035 compiler->GenerateStaticCall(deopt_id(),
1032 token_pos(), 1036 token_pos(),
1033 try_index(), 1037 try_index(),
1034 function(), 1038 function(),
1035 ArgumentCount(), 1039 ArgumentCount(),
1036 argument_names()); 1040 argument_names(),
1041 locs()->stack_bitmap());
1037 __ Bind(&done); 1042 __ Bind(&done);
1038 } 1043 }
1039 1044
1040 1045
1041 LocationSummary* UseVal::MakeLocationSummary() const { 1046 LocationSummary* UseVal::MakeLocationSummary() const {
1042 return NULL; 1047 return NULL;
1043 } 1048 }
1044 1049
1045 1050
1046 void UseVal::EmitNativeCode(FlowGraphCompiler* compiler) { 1051 void UseVal::EmitNativeCode(FlowGraphCompiler* compiler) {
1047 UNIMPLEMENTED(); 1052 UNIMPLEMENTED();
1048 } 1053 }
1049 1054
1050 1055
1051 void AssertAssignableComp::EmitNativeCode(FlowGraphCompiler* compiler) { 1056 void AssertAssignableComp::EmitNativeCode(FlowGraphCompiler* compiler) {
1052 if (!IsEliminated()) { 1057 if (!IsEliminated()) {
1053 compiler->GenerateAssertAssignable(deopt_id(), 1058 compiler->GenerateAssertAssignable(deopt_id(),
1054 token_pos(), 1059 token_pos(),
1055 try_index(), 1060 try_index(),
1056 dst_type(), 1061 dst_type(),
1057 dst_name()); 1062 dst_name(),
1063 locs()->stack_bitmap());
1058 } 1064 }
1059 ASSERT(locs()->in(0).reg() == locs()->out().reg()); 1065 ASSERT(locs()->in(0).reg() == locs()->out().reg());
1060 } 1066 }
1061 1067
1062 1068
1063 LocationSummary* StoreStaticFieldComp::MakeLocationSummary() const { 1069 LocationSummary* StoreStaticFieldComp::MakeLocationSummary() const {
1064 LocationSummary* locs = new LocationSummary(1, 1, LocationSummary::kNoCall); 1070 LocationSummary* locs = new LocationSummary(1, 1, LocationSummary::kNoCall);
1065 locs->set_in(0, Location::RequiresRegister()); 1071 locs->set_in(0, Location::RequiresRegister());
1066 locs->set_temp(0, Location::RequiresRegister()); 1072 locs->set_temp(0, Location::RequiresRegister());
1067 locs->set_out(Location::SameAsFirstInput()); 1073 locs->set_out(Location::SameAsFirstInput());
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
1140 } 1146 }
1141 1147
1142 1148
1143 void AllocateObjectComp::EmitNativeCode(FlowGraphCompiler* compiler) { 1149 void AllocateObjectComp::EmitNativeCode(FlowGraphCompiler* compiler) {
1144 const Class& cls = Class::ZoneHandle(constructor().owner()); 1150 const Class& cls = Class::ZoneHandle(constructor().owner());
1145 const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls)); 1151 const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls));
1146 const ExternalLabel label(cls.ToCString(), stub.EntryPoint()); 1152 const ExternalLabel label(cls.ToCString(), stub.EntryPoint());
1147 compiler->GenerateCall(token_pos(), 1153 compiler->GenerateCall(token_pos(),
1148 try_index(), 1154 try_index(),
1149 &label, 1155 &label,
1150 PcDescriptors::kOther); 1156 PcDescriptors::kOther,
1157 locs()->stack_bitmap());
1151 __ Drop(ArgumentCount()); // Discard arguments. 1158 __ Drop(ArgumentCount()); // Discard arguments.
1152 } 1159 }
1153 1160
1154 1161
1155 LocationSummary* CreateClosureComp::MakeLocationSummary() const { 1162 LocationSummary* CreateClosureComp::MakeLocationSummary() const {
1156 return MakeCallSummary(); 1163 return MakeCallSummary();
1157 } 1164 }
1158 1165
1159 1166
1160 void CreateClosureComp::EmitNativeCode(FlowGraphCompiler* compiler) { 1167 void CreateClosureComp::EmitNativeCode(FlowGraphCompiler* compiler) {
1161 const Function& closure_function = function(); 1168 const Function& closure_function = function();
1162 const Code& stub = Code::Handle( 1169 const Code& stub = Code::Handle(
1163 StubCode::GetAllocationStubForClosure(closure_function)); 1170 StubCode::GetAllocationStubForClosure(closure_function));
1164 const ExternalLabel label(closure_function.ToCString(), stub.EntryPoint()); 1171 const ExternalLabel label(closure_function.ToCString(), stub.EntryPoint());
1165 compiler->GenerateCall(token_pos(), try_index(), &label, 1172 compiler->GenerateCall(token_pos(), try_index(), &label,
1166 PcDescriptors::kOther); 1173 PcDescriptors::kOther,
1174 locs()->stack_bitmap());
1167 __ Drop(2); // Discard type arguments and receiver. 1175 __ Drop(2); // Discard type arguments and receiver.
1168 } 1176 }
1169 1177
1170 1178
1171 LocationSummary* PushArgumentInstr::MakeLocationSummary() const { 1179 LocationSummary* PushArgumentInstr::MakeLocationSummary() const {
1172 const intptr_t kNumInputs = 1; 1180 const intptr_t kNumInputs = 1;
1173 const intptr_t kNumTemps= 0; 1181 const intptr_t kNumTemps= 0;
1174 LocationSummary* locs = 1182 LocationSummary* locs =
1175 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); 1183 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
1176 // TODO(fschneider): Use Any() once it is supported by all code generators. 1184 // TODO(fschneider): Use Any() once it is supported by all code generators.
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1220 locations_[i] = Location::NoLocation(); 1228 locations_[i] = Location::NoLocation();
1221 } 1229 }
1222 } 1230 }
1223 } 1231 }
1224 } 1232 }
1225 1233
1226 1234
1227 #undef __ 1235 #undef __
1228 1236
1229 } // namespace dart 1237 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698