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); |
Yang
2011/12/09 12:04:37
We try to detect integer values saved in the doubl
|
- __ 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); |
Yang
2011/12/09 12:04:37
On ARM we don't multiply with kPointerSize.
|
} else { |
__ push(lr); |
{ |