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

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

Issue 2111803003: DBC: Remove special case from CheckClassInstr. Cleanup. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 5 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
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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_DBC. 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_DBC.
6 #if defined(TARGET_ARCH_DBC) 6 #if defined(TARGET_ARCH_DBC)
7 7
8 #include "vm/intermediate_language.h" 8 #include "vm/intermediate_language.h"
9 9
10 #include "vm/cpu.h" 10 #include "vm/cpu.h"
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 } 221 }
222 222
223 223
224 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary( 224 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(
225 Zone* zone, bool optimizing) const { 225 Zone* zone, bool optimizing) const {
226 return MakeCallSummary(zone); 226 return MakeCallSummary(zone);
227 } 227 }
228 228
229 229
230 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 230 void PolymorphicInstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
231 #if defined(PRODUCT) 231 Unsupported(compiler);
232 compiler->Bailout("PolymorphicInstanceCallInstr::EmitNativeCode"); 232 UNREACHABLE();
233 #else // defined(PRODUCT)
234 compiler->Bailout(ToCString());
235 #endif // defined(PRODUCT)
236 } 233 }
237 234
238 235
239 EMIT_NATIVE_CODE(Stop, 0) { 236 EMIT_NATIVE_CODE(Stop, 0) {
240 __ Stop(message()); 237 __ Stop(message());
241 } 238 }
242 239
243 240
244 EMIT_NATIVE_CODE(CheckStackOverflow, 241 EMIT_NATIVE_CODE(CheckStackOverflow,
245 0, Location::NoLocation(), 242 0, Location::NoLocation(),
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
558 compiler->RecordSafepoint(locs()); 555 compiler->RecordSafepoint(locs());
559 if (compiler->is_optimizing()) { 556 if (compiler->is_optimizing()) {
560 __ PopLocal(locs()->out(0).reg()); 557 __ PopLocal(locs()->out(0).reg());
561 } 558 }
562 } 559 }
563 560
564 561
565 EMIT_NATIVE_CODE(StoreIndexed, 3) { 562 EMIT_NATIVE_CODE(StoreIndexed, 3) {
566 if (compiler->is_optimizing()) { 563 if (compiler->is_optimizing()) {
567 if (class_id() != kArrayCid) { 564 if (class_id() != kArrayCid) {
568 #if defined(PRODUCT) 565 Unsupported(compiler);
569 compiler->Bailout("StoreIndexed"); 566 UNREACHABLE();
570 #else // defined(PRODUCT)
571 compiler->Bailout(ToCString());
572 #endif // defined(PRODUCT)
573 } 567 }
574
575 __ StoreIndexed(locs()->in(kArrayPos).reg(), 568 __ StoreIndexed(locs()->in(kArrayPos).reg(),
576 locs()->in(kIndexPos).reg(), 569 locs()->in(kIndexPos).reg(),
577 locs()->in(kValuePos).reg()); 570 locs()->in(kValuePos).reg());
578 } else { 571 } else {
579 ASSERT(class_id() == kArrayCid); 572 ASSERT(class_id() == kArrayCid);
580 __ StoreIndexedTOS(); 573 __ StoreIndexedTOS();
581 } 574 }
582 } 575 }
583 576
584 577
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after
1008 compiler->EmitDeopt(deopt_id(), ICData::kDeoptBinaryDoubleOp, 1001 compiler->EmitDeopt(deopt_id(), ICData::kDeoptBinaryDoubleOp,
1009 licm_hoisted_ ? ICData::kHoisted : 0); 1002 licm_hoisted_ ? ICData::kHoisted : 0);
1010 __ CheckSmi(right); 1003 __ CheckSmi(right);
1011 } 1004 }
1012 compiler->EmitDeopt(deopt_id(), ICData::kDeoptBinaryDoubleOp, 1005 compiler->EmitDeopt(deopt_id(), ICData::kDeoptBinaryDoubleOp,
1013 licm_hoisted_ ? ICData::kHoisted : 0); 1006 licm_hoisted_ ? ICData::kHoisted : 0);
1014 } 1007 }
1015 1008
1016 1009
1017 EMIT_NATIVE_CODE(CheckClassId, 1) { 1010 EMIT_NATIVE_CODE(CheckClassId, 1) {
1018 if (!Utils::IsUint(16, cid_)) { 1011 __ CheckClassId(locs()->in(0).reg(),
1019 #if defined(PRODUCT) 1012 compiler->ToEmbeddableCid(cid_, this));
1020 compiler->Bailout("CheckClassInstr::EmitNativeCode");
1021 #else // defined(PRODUCT)
1022 compiler->Bailout(ToCString());
1023 #endif // defined(PRODUCT)
1024 }
1025 __ CheckClassId(locs()->in(0).reg(), cid_);
1026 compiler->EmitDeopt(deopt_id(), ICData::kDeoptCheckClass); 1013 compiler->EmitDeopt(deopt_id(), ICData::kDeoptCheckClass);
1027 } 1014 }
1028 1015
1029 1016
1030 EMIT_NATIVE_CODE(CheckClass, 1) { 1017 EMIT_NATIVE_CODE(CheckClass, 1) {
1031 #if defined(PRODUCT)
1032 const char* bailout_msg = "CheckClassInstr::EmitNativeCode";
1033 #else // defined(PRODUCT)
1034 const char* bailout_msg = ToCString();
1035 #endif // defined(PRODUCT)
1036 const Register value = locs()->in(0).reg(); 1018 const Register value = locs()->in(0).reg();
1037 if (IsNullCheck()) { 1019 if (IsNullCheck()) {
1038 ASSERT(DeoptIfNull() || DeoptIfNotNull()); 1020 ASSERT(DeoptIfNull() || DeoptIfNotNull());
1039 if (DeoptIfNull()) { 1021 if (DeoptIfNull()) {
1040 __ IfEqNull(value); 1022 __ IfEqNull(value);
1041 } else { 1023 } else {
1042 __ IfNeNull(value); 1024 __ IfNeNull(value);
1043 } 1025 }
1044 } else { 1026 } else {
1045 ASSERT((unary_checks().GetReceiverClassIdAt(0) != kSmiCid) || 1027 ASSERT((unary_checks().GetReceiverClassIdAt(0) != kSmiCid) ||
1046 (unary_checks().NumberOfChecks() > 1)); 1028 (unary_checks().NumberOfChecks() > 1));
1047 const intptr_t may_be_smi = 1029 const intptr_t may_be_smi =
1048 (unary_checks().GetReceiverClassIdAt(0) == kSmiCid) ? 1 : 0; 1030 (unary_checks().GetReceiverClassIdAt(0) == kSmiCid) ? 1 : 0;
1049 if (IsDenseSwitch()) { 1031 if (IsDenseSwitch()) {
1050 ASSERT(cids_[0] < cids_[cids_.length() - 1]); 1032 ASSERT(cids_[0] < cids_[cids_.length() - 1]);
1051 const intptr_t low_cid = cids_[0]; 1033 const intptr_t low_cid = cids_[0];
1052 if (!Utils::IsUint(16, low_cid)) {
1053 compiler->Bailout(bailout_msg);
1054 }
1055 const intptr_t cid_mask = ComputeCidMask(); 1034 const intptr_t cid_mask = ComputeCidMask();
1056 __ CheckDenseSwitch(value, may_be_smi); 1035 __ CheckDenseSwitch(value, may_be_smi);
1057 __ Nop(low_cid); 1036 __ Nop(compiler->ToEmbeddableCid(low_cid, this));
1058 __ Nop(__ AddConstant(Smi::Handle(Smi::New(cid_mask)))); 1037 __ Nop(__ AddConstant(Smi::Handle(Smi::New(cid_mask))));
1059 } else { 1038 } else {
1060 GrowableArray<CidTarget> sorted_ic_data; 1039 GrowableArray<CidTarget> sorted_ic_data;
1061 FlowGraphCompiler::SortICDataByCount(unary_checks(), 1040 FlowGraphCompiler::SortICDataByCount(unary_checks(),
1062 &sorted_ic_data, 1041 &sorted_ic_data,
1063 /* drop_smi = */ true); 1042 /* drop_smi = */ true);
1064 const intptr_t sorted_length = sorted_ic_data.length(); 1043 const intptr_t sorted_length = sorted_ic_data.length();
1065 ASSERT(sorted_length >= 1); 1044 if (!Utils::IsUint(8, sorted_length)) {
1066 if (sorted_length == 1) { 1045 Unsupported(compiler);
1067 const intptr_t cid = sorted_ic_data[0].cid; 1046 UNREACHABLE();
1068 if (!Utils::IsUint(16, cid)) { 1047 }
1069 compiler->Bailout(bailout_msg); 1048 __ CheckCids(value, may_be_smi, sorted_length);
1070 } 1049 for (intptr_t i = 0; i < sorted_length; i++) {
1071 __ CheckClassId(value, cid); 1050 __ Nop(compiler->ToEmbeddableCid(sorted_ic_data[i].cid, this));
1072 } else {
1073 if (!Utils::IsUint(8, sorted_length)) {
1074 compiler->Bailout(bailout_msg);
1075 }
1076 __ CheckCids(value, may_be_smi, sorted_length);
1077 for (intptr_t i = 0; i < sorted_length; i++) {
1078 const intptr_t cid = sorted_ic_data[i].cid;
1079 if (!Utils::IsUint(16, cid)) {
1080 compiler->Bailout(bailout_msg);
1081 }
1082 __ Nop(cid);
1083 }
1084 } 1051 }
1085 } 1052 }
1086 } 1053 }
1087 compiler->EmitDeopt(deopt_id(), 1054 compiler->EmitDeopt(deopt_id(),
1088 ICData::kDeoptCheckClass, 1055 ICData::kDeoptCheckClass,
1089 licm_hoisted_ ? ICData::kHoisted : 0); 1056 licm_hoisted_ ? ICData::kHoisted : 0);
1090 } 1057 }
1091 1058
1092 1059
1093 EMIT_NATIVE_CODE(BinarySmiOp, 2, Location::RequiresRegister()) { 1060 EMIT_NATIVE_CODE(BinarySmiOp, 2, Location::RequiresRegister()) {
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1159 __ BitNot(locs()->out(0).reg(), locs()->in(0).reg()); 1126 __ BitNot(locs()->out(0).reg(), locs()->in(0).reg());
1160 break; 1127 break;
1161 default: 1128 default:
1162 UNREACHABLE(); 1129 UNREACHABLE();
1163 } 1130 }
1164 } 1131 }
1165 1132
1166 } // namespace dart 1133 } // namespace dart
1167 1134
1168 #endif // defined TARGET_ARCH_DBC 1135 #endif // defined TARGET_ARCH_DBC
OLDNEW
« runtime/vm/flow_graph_compiler.h ('K') | « runtime/vm/intermediate_language.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698