| 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 &&
|
|
|