Chromium Code Reviews| Index: runtime/vm/flow_graph_compiler_ia32.cc |
| =================================================================== |
| --- runtime/vm/flow_graph_compiler_ia32.cc (revision 15270) |
| +++ runtime/vm/flow_graph_compiler_ia32.cc (working copy) |
| @@ -1106,15 +1106,45 @@ |
| void FlowGraphCompiler::EmitEqualityRegConstCompare(Register reg, |
| - const Object& obj) { |
| + const Object& obj, |
| + bool needs_number_check) { |
| + if (needs_number_check) { |
| + if (!obj.IsMint() && !obj.IsDouble() && !obj.IsBigint()) { |
| + needs_number_check = false; |
| + } |
| + } |
| if (obj.IsSmi() && (Smi::Cast(obj).Value() == 0)) { |
| + ASSERT(!needs_number_check); |
| __ testl(reg, reg); |
| } else { |
|
Florian Schneider
2012/11/23 10:33:40
Maybe reduce the nesting level by using
} else if
srdjan
2012/11/23 19:45:39
changed to use returns instead of else.
|
| - __ CompareObject(reg, obj); |
| + if (needs_number_check) { |
| + __ pushl(reg); |
| + __ PushObject(obj); |
| + __ call(&StubCode::IdenticalWithNumberCheckLabel()); |
|
Florian Schneider
2012/11/23 10:33:40
Maybe add comment that the stub return result in t
srdjan
2012/11/23 19:45:39
Done.
|
| + __ popl(reg); // Discard constant. |
| + __ popl(reg); // Restore 'reg'. |
| + } else { |
| + __ CompareObject(reg, obj); |
| + } |
| } |
| } |
| +void FlowGraphCompiler::EmitEqualityRegRegCompare(Register left, |
| + Register right, |
| + bool needs_number_check) { |
| + if (needs_number_check) { |
| + __ pushl(left); |
| + __ pushl(right); |
| + __ call(&StubCode::IdenticalWithNumberCheckLabel()); |
| + __ popl(right); |
| + __ popl(left); |
| + } else { |
| + __ cmpl(left, right); |
| + } |
| +} |
| + |
| + |
| // Implement equality spec: if any of the arguments is null do identity check. |
| // Fallthrough calls super equality. |
| void FlowGraphCompiler::EmitSuperEqualityCallPrologue(Register result, |