Chromium Code Reviews| Index: runtime/vm/intermediate_language_ia32.cc |
| =================================================================== |
| --- runtime/vm/intermediate_language_ia32.cc (revision 23244) |
| +++ 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::Any()); |
|
Florian Schneider
2013/05/28 10:09:37
We also have Location::PrefersRegister() as an alt
srdjan
2013/05/28 10:39:01
Changed to PrefersRegister, no significant differe
|
| + } |
| 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: { |