Chromium Code Reviews| Index: runtime/vm/intermediate_language.cc |
| =================================================================== |
| --- runtime/vm/intermediate_language.cc (revision 15270) |
| +++ runtime/vm/intermediate_language.cc (working copy) |
| @@ -20,6 +20,8 @@ |
| namespace dart { |
| +DEFINE_FLAG(bool, new_identity_spec, true, |
| + "Use new identity check rules for numbers."); |
| DEFINE_FLAG(bool, propagate_ic_data, true, |
| "Propagate IC data from unoptimized to optimized IC calls."); |
| DECLARE_FLAG(bool, enable_type_checks); |
| @@ -1784,9 +1786,18 @@ |
| } |
| +StrictCompareInstr::StrictCompareInstr(Token::Kind kind, |
| + Value* left, |
| + Value* right) |
| + : ComparisonInstr(kind, left, right), |
| + needs_number_check_(FLAG_new_identity_spec) { |
| + ASSERT((kind == Token::kEQ_STRICT) || (kind == Token::kNE_STRICT)); |
| +} |
| + |
| + |
| LocationSummary* StrictCompareInstr::MakeLocationSummary() const { |
| const intptr_t kNumInputs = 2; |
| - const intptr_t kNumTemps = 0; |
| + const intptr_t kNumTemps = 00; |
|
Florian Schneider
2012/11/23 10:33:40
s/00/0/
srdjan
2012/11/23 19:45:39
Done.
|
| LocationSummary* locs = |
| new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| locs->set_in(0, Location::RegisterOrConstant(left())); |
| @@ -1796,6 +1807,7 @@ |
| } |
| +// Special code for doubles (compare values instead of references.) |
|
Florian Schneider
2012/11/23 10:33:40
s/doubles/numbers/
srdjan
2012/11/23 19:45:39
Done.
|
| void StrictCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT); |
| Location left = locs()->in(0); |
| @@ -1810,11 +1822,17 @@ |
| return; |
| } |
| if (left.IsConstant()) { |
| - compiler->EmitEqualityRegConstCompare(right.reg(), left.constant()); |
| + compiler->EmitEqualityRegConstCompare(right.reg(), |
| + left.constant(), |
| + needs_number_check()); |
| } else if (right.IsConstant()) { |
| - compiler->EmitEqualityRegConstCompare(left.reg(), right.constant()); |
| + compiler->EmitEqualityRegConstCompare(left.reg(), |
| + right.constant(), |
| + needs_number_check()); |
| } else { |
| - __ CompareRegisters(left.reg(), right.reg()); |
| + compiler->EmitEqualityRegRegCompare(left.reg(), |
| + right.reg(), |
| + needs_number_check()); |
| } |
| Register result = locs()->out().reg(); |
| @@ -1843,11 +1861,17 @@ |
| return; |
| } |
| if (left.IsConstant()) { |
| - compiler->EmitEqualityRegConstCompare(right.reg(), left.constant()); |
| + compiler->EmitEqualityRegConstCompare(right.reg(), |
| + left.constant(), |
| + needs_number_check()); |
| } else if (right.IsConstant()) { |
| - compiler->EmitEqualityRegConstCompare(left.reg(), right.constant()); |
| + compiler->EmitEqualityRegConstCompare(left.reg(), |
| + right.constant(), |
| + needs_number_check()); |
| } else { |
| - __ CompareRegisters(left.reg(), right.reg()); |
| + compiler->EmitEqualityRegRegCompare(left.reg(), |
| + right.reg(), |
| + needs_number_check()); |
| } |
| Condition true_condition = (kind() == Token::kEQ_STRICT) ? EQUAL : NOT_EQUAL; |