| Index: src/arm/code-stubs-arm.cc | 
| =================================================================== | 
| --- src/arm/code-stubs-arm.cc	(revision 7395) | 
| +++ 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 oddball arguments to numbers. | 
| +  Label check, done; | 
| +  __ CompareRoot(r1, Heap::kUndefinedValueRootIndex); | 
| +  __ b(ne, &check); | 
| +  if (Token::IsBitOp(op_)) { | 
| +    __ mov(r1, Operand(Smi::FromInt(0))); | 
| +  } else { | 
| +    __ LoadRoot(r1, Heap::kNanValueRootIndex); | 
| +  } | 
| +  __ jmp(&done); | 
| +  __ bind(&check); | 
| +  __ CompareRoot(r0, Heap::kUndefinedValueRootIndex); | 
| +  __ b(ne, &done); | 
| +  if (Token::IsBitOp(op_)) { | 
| +    __ mov(r0, Operand(Smi::FromInt(0))); | 
| +  } else { | 
| +    __ LoadRoot(r0, Heap::kNanValueRootIndex); | 
| +  } | 
| +  __ bind(&done); | 
| + | 
| +  GenerateHeapNumberStub(masm); | 
| +} | 
| + | 
| + | 
| void TypeRecordingBinaryOpStub::GenerateHeapNumberStub(MacroAssembler* masm) { | 
| Label call_runtime; | 
| ASSERT(operands_type_ == TRBinaryOpIC::HEAP_NUMBER); | 
|  |