Index: src/arm/code-stubs-arm.cc |
diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc |
index 2671d8fc6aa9806c900ad9ba2b9f7d7631f8fdee..88632d03a98889b825dbbf52f9a22795a7a6e061 100644 |
--- a/src/arm/code-stubs-arm.cc |
+++ b/src/arm/code-stubs-arm.cc |
@@ -697,10 +697,10 @@ void StoreBufferOverflowStub::Generate(MacroAssembler* masm) { |
void MathPowStub::Generate(MacroAssembler* masm) { |
const Register exponent = MathPowTaggedDescriptor::exponent(); |
DCHECK(exponent.is(r2)); |
- const DwVfpRegister double_base = d0; |
- const DwVfpRegister double_exponent = d1; |
- const DwVfpRegister double_result = d2; |
- const DwVfpRegister double_scratch = d3; |
+ const LowDwVfpRegister double_base = d0; |
+ const LowDwVfpRegister double_exponent = d1; |
+ const LowDwVfpRegister double_result = d2; |
+ const LowDwVfpRegister double_scratch = d3; |
const SwVfpRegister single_scratch = s6; |
const Register scratch = r9; |
const Register scratch2 = r4; |
@@ -715,14 +715,9 @@ 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); |
- __ b(eq, &int_exponent_convert); |
+ __ TryDoubleToInt32Exact(scratch, double_exponent, double_scratch); |
+ __ b(eq, &int_exponent); |
__ push(lr); |
{ |
@@ -734,11 +729,7 @@ void MathPowStub::Generate(MacroAssembler* masm) { |
} |
__ pop(lr); |
__ MovFromFloatResult(double_result); |
- __ jmp(&done); |
- |
- __ bind(&int_exponent_convert); |
- __ vcvt_u32_f64(single_scratch, double_exponent); |
- __ vmov(scratch, single_scratch); |
+ __ b(&done); |
} |
// Calculate power with integer exponent. |
@@ -756,12 +747,11 @@ void MathPowStub::Generate(MacroAssembler* masm) { |
// Get absolute value of exponent. |
__ cmp(scratch, Operand::Zero()); |
- __ mov(scratch2, Operand::Zero(), LeaveCC, mi); |
- __ sub(scratch, scratch2, scratch, LeaveCC, mi); |
+ __ rsb(scratch, scratch, Operand::Zero(), LeaveCC, mi); |
Label while_true; |
__ bind(&while_true); |
- __ mov(scratch, Operand(scratch, ASR, 1), SetCC); |
+ __ mov(scratch, Operand(scratch, LSR, 1), SetCC); |
__ vmul(double_result, double_result, double_scratch, cs); |
__ vmul(double_scratch, double_scratch, double_scratch, ne); |
__ b(ne, &while_true); |