| Index: src/arm/codegen-arm.h | 
| =================================================================== | 
| --- src/arm/codegen-arm.h	(revision 4368) | 
| +++ src/arm/codegen-arm.h	(working copy) | 
| @@ -476,9 +476,13 @@ | 
| public: | 
| GenericBinaryOpStub(Token::Value op, | 
| OverwriteMode mode, | 
| +                      Register lhs, | 
| +                      Register rhs, | 
| int constant_rhs = CodeGenerator::kUnknownIntValue) | 
| : op_(op), | 
| mode_(mode), | 
| +        lhs_(lhs), | 
| +        rhs_(rhs), | 
| constant_rhs_(constant_rhs), | 
| specialized_on_rhs_(RhsIsOneWeWantToOptimizeFor(op, constant_rhs)), | 
| runtime_operands_type_(BinaryOpIC::DEFAULT), | 
| @@ -487,6 +491,8 @@ | 
| GenericBinaryOpStub(int key, BinaryOpIC::TypeInfo type_info) | 
| : op_(OpBits::decode(key)), | 
| mode_(ModeBits::decode(key)), | 
| +        lhs_(LhsRegister(RegisterBits::decode(key))), | 
| +        rhs_(RhsRegister(RegisterBits::decode(key))), | 
| constant_rhs_(KnownBitsForMinorKey(KnownIntBits::decode(key))), | 
| specialized_on_rhs_(RhsIsOneWeWantToOptimizeFor(op_, constant_rhs_)), | 
| runtime_operands_type_(type_info), | 
| @@ -495,32 +501,41 @@ | 
| private: | 
| Token::Value op_; | 
| OverwriteMode mode_; | 
| +  Register lhs_; | 
| +  Register rhs_; | 
| int constant_rhs_; | 
| bool specialized_on_rhs_; | 
| BinaryOpIC::TypeInfo runtime_operands_type_; | 
| char* name_; | 
|  | 
| static const int kMaxKnownRhs = 0x40000000; | 
| +  static const int kKnownRhsKeyBits = 6; | 
|  | 
| -  // Minor key encoding in 18 bits. | 
| +  // Minor key encoding in 17 bits. | 
| class ModeBits: public BitField<OverwriteMode, 0, 2> {}; | 
| class OpBits: public BitField<Token::Value, 2, 6> {}; | 
| -  class KnownIntBits: public BitField<int, 8, 8> {}; | 
| -  class TypeInfoBits: public BitField<int, 16, 2> {}; | 
| +  class TypeInfoBits: public BitField<int, 8, 2> {}; | 
| +  class RegisterBits: public BitField<bool, 10, 1> {}; | 
| +  class KnownIntBits: public BitField<int, 11, kKnownRhsKeyBits> {}; | 
|  | 
| Major MajorKey() { return GenericBinaryOp; } | 
| int MinorKey() { | 
| +    ASSERT((lhs_.is(r0) && rhs_.is(r1)) || | 
| +           (lhs_.is(r1) && rhs_.is(r0))); | 
| // Encode the parameters in a unique 18 bit value. | 
| return OpBits::encode(op_) | 
| | ModeBits::encode(mode_) | 
| | KnownIntBits::encode(MinorKeyForKnownInt()) | 
| -           | TypeInfoBits::encode(runtime_operands_type_); | 
| +           | TypeInfoBits::encode(runtime_operands_type_) | 
| +           | RegisterBits::encode(lhs_.is(r0)); | 
| } | 
|  | 
| void Generate(MacroAssembler* masm); | 
| -  void HandleNonSmiBitwiseOp(MacroAssembler* masm); | 
| +  void HandleNonSmiBitwiseOp(MacroAssembler* masm, Register lhs, Register rhs); | 
| void HandleBinaryOpSlowCases(MacroAssembler* masm, | 
| Label* not_smi, | 
| +                               Register lhs, | 
| +                               Register rhs, | 
| const Builtins::JavaScript& builtin); | 
| void GenerateTypeTransition(MacroAssembler* masm); | 
|  | 
| @@ -546,6 +561,7 @@ | 
| key++; | 
| d >>= 1; | 
| } | 
| +    ASSERT(key >= 0 && key < (1 << kKnownRhsKeyBits)); | 
| return key; | 
| } | 
|  | 
| @@ -560,6 +576,14 @@ | 
| return d; | 
| } | 
|  | 
| +  Register LhsRegister(bool lhs_is_r0) { | 
| +    return lhs_is_r0 ? r0 : r1; | 
| +  } | 
| + | 
| +  Register RhsRegister(bool lhs_is_r0) { | 
| +    return lhs_is_r0 ? r1 : r0; | 
| +  } | 
| + | 
| bool ShouldGenerateSmiCode() { | 
| return ((op_ != Token::DIV && op_ != Token::MOD) || specialized_on_rhs_) && | 
| runtime_operands_type_ != BinaryOpIC::HEAP_NUMBERS && | 
|  |