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

Reply via email to