Fix BinaryOpIC implementation on ARM.
On a pair of smis HEAP_NUMBERS stub is significantly slower than GENERIC. This slows down some tests dramatically (crypto-aes from SunSpider). With this change HEAP_NUMBERS stub switches to GENERIC stub the first time it sees 2 smis as its operands. Review URL: http://codereview.chromium.org/1687005 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@4483 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
6f34ff44e3
commit
3ca99e722b
@ -6468,11 +6468,22 @@ void GenericBinaryOpStub::HandleBinaryOpSlowCases(
|
||||
__ pop(lr);
|
||||
}
|
||||
|
||||
// HEAP_NUMBERS stub is slower than GENERIC on a pair of smis.
|
||||
// r0 is known to be a smi. If r1 is also a smi then switch to GENERIC.
|
||||
Label r1_is_not_smi;
|
||||
if (runtime_operands_type_ == BinaryOpIC::HEAP_NUMBERS) {
|
||||
__ tst(r1, Operand(kSmiTagMask));
|
||||
__ b(ne, &r1_is_not_smi);
|
||||
GenerateTypeTransition(masm);
|
||||
__ jmp(&r1_is_smi);
|
||||
}
|
||||
|
||||
__ bind(&finished_loading_r0);
|
||||
|
||||
// Move r1 to a double in r0-r1.
|
||||
__ tst(r1, Operand(kSmiTagMask));
|
||||
__ b(eq, &r1_is_smi); // It's a Smi so don't check it's a heap number.
|
||||
__ bind(&r1_is_not_smi);
|
||||
__ CompareObjectType(r1, r4, r4, HEAP_NUMBER_TYPE);
|
||||
__ b(ne, &slow);
|
||||
if (mode_ == OVERWRITE_LEFT) {
|
||||
|
Loading…
Reference in New Issue
Block a user