Chromium Code Reviews| Index: runtime/vm/intermediate_language.cc |
| =================================================================== |
| --- runtime/vm/intermediate_language.cc (revision 12870) |
| +++ runtime/vm/intermediate_language.cc (working copy) |
| @@ -1560,19 +1560,36 @@ |
| LocationSummary* StrictCompareInstr::MakeLocationSummary() const { |
| - return LocationSummary::Make(2, |
| - Location::SameAsFirstInput(), |
| - LocationSummary::kNoCall); |
| + const intptr_t kNumInputs = 2; |
| + const intptr_t kNumTemps = 0; |
| + LocationSummary* locs = |
| + new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| + locs->set_in(0, Location::RegisterOrConstant(left())); |
| + locs->set_in(1, Location::RegisterOrConstant(right())); |
| + locs->set_out(Location::RequiresRegister()); |
| + return locs; |
| } |
| void StrictCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| - Register left = locs()->in(0).reg(); |
| - Register right = locs()->in(1).reg(); |
| - |
| ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT); |
| Condition true_condition = (kind() == Token::kEQ_STRICT) ? EQUAL : NOT_EQUAL; |
| - __ CompareRegisters(left, right); |
| + Location left = locs()->in(0); |
| + Location right = locs()->in(1); |
| + if (left.IsConstant() && right.IsConstant()) { |
| + // TODO(vegorov): should be eliminated earlier by constant propagation. |
| + const bool result = left.constant().raw() == right.constant().raw(); |
| + __ LoadObject(locs()->out().reg(), result ? compiler->bool_true() : |
|
regis
2012/09/25 20:21:04
extra space before result.
srdjan
2012/09/25 20:26:04
Done.
|
| + compiler->bool_false()); |
| + return; |
| + } |
| + if (left.IsConstant()) { |
| + __ CompareObject(right.reg(), left.constant()); |
| + } else if (right.IsConstant()) { |
| + __ CompareObject(left.reg(), right.constant()); |
| + } else { |
| + __ CompareRegisters(left.reg(), right.reg()); |
| + } |
| Register result = locs()->out().reg(); |
| Label load_true, done; |
| @@ -1586,12 +1603,25 @@ |
| void StrictCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
| - BranchInstr* branch) { |
| - Register left = locs()->in(0).reg(); |
| - Register right = locs()->in(1).reg(); |
| + BranchInstr* branch) { |
| ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT); |
| Condition true_condition = (kind() == Token::kEQ_STRICT) ? EQUAL : NOT_EQUAL; |
| - __ CompareRegisters(left, right); |
| + Location left = locs()->in(0); |
| + Location right = locs()->in(1); |
| + if (left.IsConstant() && right.IsConstant()) { |
| + // TODO(vegorov): should be eliminated earlier by constant propagation. |
| + const bool result = left.constant().raw() == right.constant().raw(); |
| + branch->EmitBranchOnValue(compiler, result); |
| + return; |
| + } |
| + if (left.IsConstant()) { |
| + __ CompareObject(right.reg(), left.constant()); |
| + } else if (right.IsConstant()) { |
| + __ CompareObject(left.reg(), right.constant()); |
| + } else { |
| + __ CompareRegisters(left.reg(), right.reg()); |
| + } |
| + |
| branch->EmitBranchOnCondition(compiler, true_condition); |
| } |