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