Index: runtime/vm/intermediate_language_dbc.cc |
diff --git a/runtime/vm/intermediate_language_dbc.cc b/runtime/vm/intermediate_language_dbc.cc |
index d28bbb2c30aff544c47e1e37ad46739edb5d8879..3b3d44018743cab8bf9e096dbf1ef43a77f33ba8 100644 |
--- a/runtime/vm/intermediate_language_dbc.cc |
+++ b/runtime/vm/intermediate_language_dbc.cc |
@@ -105,7 +105,6 @@ DECLARE_FLAG(int, optimization_counter_threshold); |
M(UnboxInteger32) \ |
M(CheckedSmiOp) \ |
M(CheckArrayBound) \ |
- M(CheckClass) \ |
M(TestSmi) \ |
M(RelationalOp) \ |
M(EqualityCompare) \ |
@@ -945,6 +944,34 @@ EMIT_NATIVE_CODE(CheckClassId, 1) { |
} |
+EMIT_NATIVE_CODE(CheckClass, 1) { |
+ const Register value = locs()->in(0).reg(); |
+ if (IsNullCheck()) { |
+ ASSERT(DeoptIfNull() || DeoptIfNotNull()); |
+ __ CheckNull(value, DeoptIfNull() ? 1 : 0); |
+ compiler->EmitDeopt(deopt_id(), |
+ ICData::kDeoptCheckClass, |
+ licm_hoisted_ ? ICData::kHoisted : 0); |
+ return; |
+ } |
+ |
+ ASSERT((unary_checks().GetReceiverClassIdAt(0) != kSmiCid) || |
+ (unary_checks().NumberOfChecks() > 1)); |
+ const intptr_t ic_data = __ AddConstant(unary_checks()); |
+ if (IsDenseSwitch()) { |
+ ASSERT(cids_[0] < cids_[cids_.length() - 1]); |
+ __ PushConstant(Smi::Handle(Smi::New(cids_[0]))); |
+ __ PushConstant(Smi::Handle(Smi::New(ComputeCidMask()))); |
+ __ CheckDenseSwitchTOS(value, ic_data); |
+ } else { |
+ __ CheckForCid(value, ic_data); |
+ } |
+ compiler->EmitDeopt(deopt_id(), |
+ ICData::kDeoptCheckClass, |
+ licm_hoisted_ ? ICData::kHoisted : 0); |
+} |
+ |
+ |
EMIT_NATIVE_CODE(BinarySmiOp, 2, Location::RequiresRegister()) { |
const Register left = locs()->in(0).reg(); |
const Register right = locs()->in(1).reg(); |