Chromium Code Reviews| Index: runtime/vm/flow_graph_compiler_x64.cc |
| =================================================================== |
| --- runtime/vm/flow_graph_compiler_x64.cc (revision 15270) |
| +++ runtime/vm/flow_graph_compiler_x64.cc (working copy) |
| @@ -1110,15 +1110,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); |
| __ testq(reg, reg); |
| } else { |
|
Florian Schneider
2012/11/23 10:33:40
} else if ...
srdjan
2012/11/23 19:45:39
Done.
|
| - __ CompareObject(reg, obj); |
| + if (needs_number_check) { |
| + __ pushq(reg); |
| + __ PushObject(obj); |
| + __ call(&StubCode::IdenticalWithNumberCheckLabel()); |
|
Florian Schneider
2012/11/23 10:33:40
Please add comment that result is in flags.
srdjan
2012/11/23 19:45:39
Done.
|
| + __ popq(reg); // Discard constant. |
| + __ popq(reg); // Restore 'reg'. |
| + } else { |
| + __ CompareObject(reg, obj); |
| + } |
| } |
| } |
| +void FlowGraphCompiler::EmitEqualityRegRegCompare(Register left, |
| + Register right, |
| + bool needs_number_check) { |
| + if (needs_number_check) { |
| + __ pushq(left); |
| + __ pushq(right); |
| + __ call(&StubCode::IdenticalWithNumberCheckLabel()); |
| + __ popq(right); |
| + __ popq(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, |