| Index: runtime/vm/flow_graph_compiler_arm.cc
|
| ===================================================================
|
| --- runtime/vm/flow_graph_compiler_arm.cc (revision 23447)
|
| +++ runtime/vm/flow_graph_compiler_arm.cc (working copy)
|
| @@ -1408,9 +1408,28 @@
|
| }
|
|
|
|
|
| +// Implement equality spec: if any of the arguments is null do identity check.
|
| +// Fallthrough calls super equality.
|
| void FlowGraphCompiler::EmitSuperEqualityCallPrologue(Register result,
|
| Label* skip_call) {
|
| - UNIMPLEMENTED();
|
| + Label check_identity, fall_through;
|
| + __ LoadImmediate(IP, reinterpret_cast<intptr_t>(Object::null()));
|
| + __ ldr(result, Address(SP, 0 * kWordSize)); // Load right operand.
|
| + __ cmp(result, ShifterOperand(IP)); // Is right null?
|
| + __ ldr(result, Address(SP, 1 * kWordSize)); // Load left operand.
|
| + __ b(&check_identity, EQ); // Branch if right (IP) is null; left in result.
|
| + __ cmp(result, ShifterOperand(IP)); // Right is non-null; is left null?
|
| + __ b(&fall_through, NE);
|
| + // Right is non-null, left is null. We could return false, but we save code
|
| + // by falling through with an IP different than null.
|
| + __ mov(IP, ShifterOperand(0));
|
| + __ Bind(&check_identity);
|
| + __ cmp(result, ShifterOperand(IP));
|
| + __ LoadObject(result, Bool::True(), EQ);
|
| + __ LoadObject(result, Bool::False(), NE);
|
| + __ Drop(2);
|
| + __ b(skip_call);
|
| + __ Bind(&fall_through);
|
| }
|
|
|
|
|
| @@ -1519,7 +1538,13 @@
|
| FpuRegister left,
|
| FpuRegister right,
|
| BranchInstr* branch) {
|
| - UNIMPLEMENTED();
|
| + ASSERT(branch != NULL);
|
| + assembler()->vcmpd(left, right);
|
| + assembler()->vmstat();
|
| + BlockEntryInstr* nan_result = (true_condition == NE) ?
|
| + branch->true_successor() : branch->false_successor();
|
| + assembler()->b(GetJumpLabel(nan_result), VS);
|
| + branch->EmitBranchOnCondition(this, true_condition);
|
| }
|
|
|
|
|
| @@ -1527,7 +1552,13 @@
|
| FpuRegister left,
|
| FpuRegister right,
|
| Register result) {
|
| - UNIMPLEMENTED();
|
| + assembler()->vcmpd(left, right);
|
| + assembler()->vmstat();
|
| + assembler()->LoadObject(result, Bool::False());
|
| + Label done;
|
| + assembler()->b(&done, VS); // NaN -> false.
|
| + assembler()->LoadObject(result, Bool::True(), true_condition);
|
| + assembler()->Bind(&done);
|
| }
|
|
|
|
|
|
|