Chromium Code Reviews| Index: src/arm/code-stubs-arm.cc |
| =================================================================== |
| --- src/arm/code-stubs-arm.cc (revision 7379) |
| +++ src/arm/code-stubs-arm.cc (working copy) |
| @@ -2884,6 +2884,9 @@ |
| case TRBinaryOpIC::HEAP_NUMBER: |
| GenerateHeapNumberStub(masm); |
| break; |
| + case TRBinaryOpIC::ODDBALL: |
| + GenerateOddballStub(masm); |
| + break; |
| case TRBinaryOpIC::STRING: |
| GenerateStringStub(masm); |
| break; |
| @@ -3606,6 +3609,39 @@ |
| } |
| +void TypeRecordingBinaryOpStub::GenerateOddballStub(MacroAssembler* masm) { |
| + Label call_runtime; |
| + |
| + if (op_ == Token::ADD) { |
| + // Handle string addition here, because it is the only operation |
| + // that does not do a ToNumber conversion on the operands. |
| + GenerateAddStrings(masm); |
| + } |
| + |
| + // Convert odd ball arguments to numbers. |
|
Erik Corry
2011/03/28 15:15:24
odd ball -> oddball
fschneider
2011/03/28 16:28:59
Done.
|
| + Label check, done; |
| + __ cmp(r1, Operand(FACTORY->undefined_value())); |
|
Erik Corry
2011/03/28 15:15:24
You should use CompareRoot here.
fschneider
2011/03/28 16:28:59
Done.
|
| + __ b(ne, &check); |
| + if (Token::IsBitOp(op_)) { |
| + __ mov(r1, Operand(Smi::FromInt(0))); |
| + } else { |
| + __ Move(r1, FACTORY->nan_value()); |
|
Erik Corry
2011/03/28 15:15:24
LoadRoot.
fschneider
2011/03/28 16:28:59
Done.
|
| + } |
| + __ jmp(&done); |
| + __ bind(&check); |
| + __ cmp(r0, Operand(FACTORY->undefined_value())); |
| + __ b(ne, &done); |
| + if (Token::IsBitOp(op_)) { |
| + __ mov(r0, Operand(Smi::FromInt(0))); |
| + } else { |
| + __ Move(r0, FACTORY->nan_value()); |
|
Erik Corry
2011/03/28 15:15:24
LoadRoot
fschneider
2011/03/28 16:28:59
Done.
|
| + } |
| + __ bind(&done); |
| + |
| + GenerateHeapNumberStub(masm); |
| +} |
| + |
| + |
| void TypeRecordingBinaryOpStub::GenerateHeapNumberStub(MacroAssembler* masm) { |
| Label call_runtime; |
| ASSERT(operands_type_ == TRBinaryOpIC::HEAP_NUMBER); |