| Index: runtime/vm/intermediate_language_ia32.cc
|
| ===================================================================
|
| --- runtime/vm/intermediate_language_ia32.cc (revision 23246)
|
| +++ runtime/vm/intermediate_language_ia32.cc (working copy)
|
| @@ -2312,7 +2312,12 @@
|
| LocationSummary* summary =
|
| new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
|
| summary->set_in(0, Location::RequiresRegister());
|
| - summary->set_in(1, Location::RegisterOrSmiConstant(right()));
|
| + ConstantInstr* constant = right()->definition()->AsConstant();
|
| + if (constant != NULL) {
|
| + summary->set_in(1, Location::RegisterOrSmiConstant(right()));
|
| + } else {
|
| + summary->set_in(1, Location::PrefersRegister());
|
| + }
|
| summary->set_out(Location::SameAsFirstInput());
|
| return summary;
|
| }
|
| @@ -2433,8 +2438,49 @@
|
| break;
|
| }
|
| return;
|
| - }
|
| + } // if locs()->in(1).IsConstant()
|
|
|
| + if (locs()->in(1).IsStackSlot()) {
|
| + const Address& right = locs()->in(1).ToStackSlotAddress();
|
| + switch (op_kind()) {
|
| + case Token::kADD: {
|
| + __ addl(left, right);
|
| + if (deopt != NULL) __ j(OVERFLOW, deopt);
|
| + break;
|
| + }
|
| + case Token::kSUB: {
|
| + __ subl(left, right);
|
| + if (deopt != NULL) __ j(OVERFLOW, deopt);
|
| + break;
|
| + }
|
| + case Token::kMUL: {
|
| + __ SmiUntag(left);
|
| + __ imull(left, right);
|
| + if (deopt != NULL) __ j(OVERFLOW, deopt);
|
| + break;
|
| + }
|
| + case Token::kBIT_AND: {
|
| + // No overflow check.
|
| + __ andl(left, right);
|
| + break;
|
| + }
|
| + case Token::kBIT_OR: {
|
| + // No overflow check.
|
| + __ orl(left, right);
|
| + break;
|
| + }
|
| + case Token::kBIT_XOR: {
|
| + // No overflow check.
|
| + __ xorl(left, right);
|
| + break;
|
| + }
|
| + default:
|
| + UNREACHABLE();
|
| + }
|
| + return;
|
| + } // if locs()->in(1).IsStackSlot.
|
| +
|
| + // if locs()->in(1).IsRegister.
|
| Register right = locs()->in(1).reg();
|
| switch (op_kind()) {
|
| case Token::kADD: {
|
|
|