| Index: runtime/vm/flow_graph_compiler_x64.cc
|
| ===================================================================
|
| --- runtime/vm/flow_graph_compiler_x64.cc (revision 15292)
|
| +++ runtime/vm/flow_graph_compiler_x64.cc (working copy)
|
| @@ -1110,11 +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);
|
| + return;
|
| + }
|
| +
|
| + if (needs_number_check) {
|
| + __ pushq(reg);
|
| + __ PushObject(obj);
|
| + __ call(&StubCode::IdenticalWithNumberCheckLabel());
|
| + __ popq(reg); // Discard constant.
|
| + __ popq(reg); // Restore 'reg'.
|
| + return;
|
| + }
|
| +
|
| + __ 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());
|
| + // Stub returns result in flags (result of a cmpl, we need ZF computed).
|
| + __ popq(right);
|
| + __ popq(left);
|
| } else {
|
| - __ CompareObject(reg, obj);
|
| + __ cmpl(left, right);
|
| }
|
| }
|
|
|
|
|