Chromium Code Reviews| Index: src/ia32/code-stubs-ia32.cc |
| =================================================================== |
| --- src/ia32/code-stubs-ia32.cc (revision 7361) |
| +++ src/ia32/code-stubs-ia32.cc (working copy) |
| @@ -1354,6 +1354,9 @@ |
| case TRBinaryOpIC::HEAP_NUMBER: |
| GenerateHeapNumberStub(masm); |
| break; |
| + case TRBinaryOpIC::ODDBALL: |
| + GenerateOddballStub(masm); |
| + break; |
| case TRBinaryOpIC::STRING: |
| GenerateStringStub(masm); |
| break; |
| @@ -2019,9 +2022,39 @@ |
| } |
| +void TypeRecordingBinaryOpStub::GenerateOddballStub(MacroAssembler* masm) { |
| + Label call_runtime; |
| + |
| + if (op_ == Token::ADD) { |
| + GenerateAddStrings(masm); |
|
Erik Corry
2011/03/25 14:21:18
Please add comment that we need this because add i
fschneider
2011/03/28 08:00:54
Done.
|
| + } |
| + |
| + // Convert odd ball arguments to numbers. |
| + NearLabel check, done; |
| + __ cmp(edx, FACTORY->undefined_value()); |
| + __ j(not_equal, &check); |
| + if (Token::IsBitOp(op_)) { |
| + __ xor_(edx, Operand(edx)); |
| + } else { |
| + __ mov(edx, Immediate(FACTORY->nan_value())); |
| + } |
| + __ jmp(&done); |
| + __ bind(&check); |
| + __ cmp(eax, FACTORY->undefined_value()); |
| + __ j(not_equal, &done); |
| + if (Token::IsBitOp(op_)) { |
| + __ xor_(eax, Operand(eax)); |
| + } else { |
| + __ mov(eax, Immediate(FACTORY->nan_value())); |
| + } |
| + __ bind(&done); |
| + |
| + GenerateHeapNumberStub(masm); |
| +} |
| + |
| + |
| void TypeRecordingBinaryOpStub::GenerateHeapNumberStub(MacroAssembler* masm) { |
| Label call_runtime; |
| - ASSERT(operands_type_ == TRBinaryOpIC::HEAP_NUMBER); |
| // Floating point case. |
| switch (op_) { |