ARM: Special case for modulus of two smis in the generic binary opration stub
When lhs and rhs are positive smis and rhs is a power of two perform modulus by masking. Review URL: http://codereview.chromium.org/2873001 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@4884 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
e6ea484e1f
commit
50a2e15bbd
@ -8164,6 +8164,28 @@ void GenericBinaryOpStub::Generate(MacroAssembler* masm) {
|
||||
}
|
||||
__ Ret();
|
||||
__ bind(&smi_is_unsuitable);
|
||||
} else if (op_ == Token::MOD &&
|
||||
runtime_operands_type_ != BinaryOpIC::HEAP_NUMBERS &&
|
||||
runtime_operands_type_ != BinaryOpIC::STRINGS) {
|
||||
// Do generate a bit of smi code for modulus even though the default for
|
||||
// modulus is not to do it, but as the ARM processor has no coprocessor
|
||||
// support for modulus checking for smis makes sense.
|
||||
Label slow;
|
||||
ASSERT(!ShouldGenerateSmiCode());
|
||||
ASSERT(kSmiTag == 0); // Adjust code below.
|
||||
// Check for two positive smis.
|
||||
__ orr(smi_test_reg, lhs, Operand(rhs));
|
||||
__ tst(smi_test_reg, Operand(0x80000000u | kSmiTagMask));
|
||||
__ b(ne, &slow);
|
||||
// Check that rhs is a power of two and not zero.
|
||||
__ sub(scratch, rhs, Operand(1), SetCC);
|
||||
__ b(mi, &slow);
|
||||
__ tst(rhs, scratch);
|
||||
__ b(ne, &slow);
|
||||
// Calculate power of two modulus.
|
||||
__ and_(result, lhs, Operand(scratch));
|
||||
__ Ret();
|
||||
__ bind(&slow);
|
||||
}
|
||||
HandleBinaryOpSlowCases(
|
||||
masm,
|
||||
|
Loading…
Reference in New Issue
Block a user