Reviewers: Jakob,

Message:
PTAL.


http://codereview.chromium.org/8889047/diff/1/src/arm/code-stubs-arm.cc
File src/arm/code-stubs-arm.cc (left):

http://codereview.chromium.org/8889047/diff/1/src/arm/code-stubs-arm.cc#oldcode3524
src/arm/code-stubs-arm.cc:3524: __ vmov(exponent, single_scratch, eq);
We try to detect integer values saved in the double register
double_exponent by converting it to integer and back to double, then
comparing. Unlike on intel architectures, single_scratch saving the
intermediate integer is clobbered during the second conversion.

http://codereview.chromium.org/8889047/diff/1/src/arm/code-stubs-arm.cc
File src/arm/code-stubs-arm.cc (right):

http://codereview.chromium.org/8889047/diff/1/src/arm/code-stubs-arm.cc#newcode3636
src/arm/code-stubs-arm.cc:3636: __ Ret(2);
On ARM we don't multiply with kPointerSize.

Description:
Fixing bug introduced in r10210 that crashes v8 raytrace benchmark.

BUG=
TEST=


Please review this at http://codereview.chromium.org/8889047/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files:
  M src/arm/code-stubs-arm.cc
  M test/mjsunit/math-pow.js


Index: src/arm/code-stubs-arm.cc
diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc
index a9d9676b3f4e741e913f71598e8eb4f57d1203f8..282df1565471a031b02ee8afe01397aa8253a053 100644
--- a/src/arm/code-stubs-arm.cc
+++ b/src/arm/code-stubs-arm.cc
@@ -3515,14 +3515,14 @@ void MathPowStub::Generate(MacroAssembler* masm) {
   }

   if (exponent_type_ != INTEGER) {
+    Label int_exponent_convert;
     // Detect integer exponents stored as double.
     __ vcvt_u32_f64(single_scratch, double_exponent);
// We do not check for NaN or Infinity here because comparing numbers on
     // ARM correctly distinguishes NaNs.  We end up calling the built-in.
     __ vcvt_f64_u32(double_scratch, single_scratch);
     __ VFPCompareAndSetFlags(double_scratch, double_exponent);
-    __ vmov(exponent, single_scratch, eq);
-    __ b(eq, &int_exponent);
+    __ b(eq, &int_exponent_convert);

     if (exponent_type_ == ON_STACK) {
       // Detect square root case.  Crankshaft detects constant +/-0.5 at
@@ -3579,6 +3579,10 @@ void MathPowStub::Generate(MacroAssembler* masm) {
     __ pop(lr);
     __ GetCFunctionDoubleResult(double_result);
     __ jmp(&done);
+
+    __ bind(&int_exponent_convert);
+    __ vcvt_u32_f64(single_scratch, double_exponent);
+    __ vmov(exponent, single_scratch);
   }

   // Calculate power with integer exponent.
@@ -3629,7 +3633,7 @@ void MathPowStub::Generate(MacroAssembler* masm) {
             FieldMemOperand(heapnumber, HeapNumber::kValueOffset));
     ASSERT(heapnumber.is(r0));
     __ IncrementCounter(counters->math_pow(), 1, scratch, scratch2);
-    __ Ret(2 * kPointerSize);
+    __ Ret(2);
   } else {
     __ push(lr);
     {
Index: test/mjsunit/math-pow.js
diff --git a/test/mjsunit/math-pow.js b/test/mjsunit/math-pow.js
index 535588dbd1f3d5c5cad090576c304bde42243e79..174065a70c560dc1bb50898667a5657038517049 100644
--- a/test/mjsunit/math-pow.js
+++ b/test/mjsunit/math-pow.js
@@ -140,6 +140,9 @@ function test() {
   assertEquals(NaN, Math.pow(-16, 0.5));
   assertEquals(0.25, Math.pow(16, -0.5));
   assertEquals(NaN, Math.pow(-16, -0.5));
+
+  // Test detecting and converting integer value as double.
+  assertEquals(8, Math.pow(2, Math.sqrt(9)));

   // Tests from Mozilla 15.8.2.13.
   assertEquals(2, Math.pow.length);


--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to