| 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();
|
|
|