Revision: 4483
Author: [email protected]
Date: Fri Apr 23 03:08:24 2010
Log: 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
http://code.google.com/p/v8/source/detail?r=4483
Modified:
/branches/bleeding_edge/src/arm/codegen-arm.cc
=======================================
--- /branches/bleeding_edge/src/arm/codegen-arm.cc Fri Apr 23 00:42:45 2010
+++ /branches/bleeding_edge/src/arm/codegen-arm.cc Fri Apr 23 03:08:24 2010
@@ -6467,12 +6467,23 @@
__ Call(stub3.GetCode(), RelocInfo::CODE_TARGET);
__ 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) {
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev