Chromium Code Reviews| 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)); |
| + __ cmp(result, ShifterOperand(IP)); |
| + __ mov(IP, ShifterOperand(result), EQ); |
| + __ ldr(result, Address(SP, 1 * kWordSize)); |
| + __ b(&check_identity, EQ); |
| + __ cmp(result, ShifterOperand(IP)); |
| + __ b(&fall_through, NE); |
|
zra
2013/05/30 23:17:35
The code is a bit dense up to here. A comment or t
regis
2013/05/31 00:37:04
:-)
Done and simplified a bit.
It will be easier f
|
| + |
| + __ ldr(IP, Address(SP, 0 * kWordSize)); |
| + __ 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) ? |
|
zra
2013/05/30 23:17:35
I'm not familiar with the spec here, but I thought
regis
2013/05/31 00:37:04
In your example, the negation is outside of this i
|
| + 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); |
| } |