Index: src/arm/lithium-codegen-arm.cc |
=================================================================== |
--- src/arm/lithium-codegen-arm.cc (revision 12656) |
+++ src/arm/lithium-codegen-arm.cc (working copy) |
@@ -3499,27 +3499,22 @@ |
void LCodeGen::DoMathFloor(LUnaryMathOperation* instr) { |
DoubleRegister input = ToDoubleRegister(instr->value()); |
Register result = ToRegister(instr->result()); |
- SwVfpRegister single_scratch = double_scratch0().low(); |
- Register scratch1 = scratch0(); |
- Register scratch2 = ToRegister(instr->temp()); |
+ Register scratch = scratch0(); |
__ EmitVFPTruncate(kRoundToMinusInf, |
- single_scratch, |
+ result, |
input, |
- scratch1, |
- scratch2); |
+ scratch, |
+ double_scratch0()); |
DeoptimizeIf(ne, instr->environment()); |
- // Move the result back to general purpose register r0. |
- __ vmov(result, single_scratch); |
- |
if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) { |
// Test for -0. |
Label done; |
__ cmp(result, Operand(0)); |
__ b(ne, &done); |
- __ vmov(scratch1, input.high()); |
- __ tst(scratch1, Operand(HeapNumber::kSignMask)); |
+ __ vmov(scratch, input.high()); |
+ __ tst(scratch, Operand(HeapNumber::kSignMask)); |
DeoptimizeIf(ne, instr->environment()); |
__ bind(&done); |
} |
@@ -3529,6 +3524,7 @@ |
void LCodeGen::DoMathRound(LUnaryMathOperation* instr) { |
DoubleRegister input = ToDoubleRegister(instr->value()); |
Register result = ToRegister(instr->result()); |
+ DwVfpRegister double_scratch1 = ToDoubleRegister(instr->temp()); |
Register scratch = scratch0(); |
Label done, check_sign_on_zero; |
@@ -3571,12 +3567,11 @@ |
} |
__ EmitVFPTruncate(kRoundToMinusInf, |
- double_scratch0().low(), |
- double_scratch0(), |
result, |
- scratch); |
+ double_scratch0(), |
+ scratch, |
+ double_scratch1); |
DeoptimizeIf(ne, instr->environment()); |
- __ vmov(result, double_scratch0().low()); |
if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) { |
// Test for -0. |
@@ -4602,7 +4597,7 @@ |
Register scratch1 = scratch0(); |
Register scratch2 = ToRegister(instr->temp()); |
DwVfpRegister double_scratch = double_scratch0(); |
- SwVfpRegister single_scratch = double_scratch.low(); |
+ DwVfpRegister double_scratch2 = ToDoubleRegister(instr->temp3()); |
ASSERT(!scratch1.is(input_reg) && !scratch1.is(scratch2)); |
ASSERT(!scratch2.is(input_reg) && !scratch2.is(scratch1)); |
@@ -4622,7 +4617,7 @@ |
if (instr->truncating()) { |
Register scratch3 = ToRegister(instr->temp2()); |
- DwVfpRegister double_scratch2 = ToDoubleRegister(instr->temp3()); |
+ SwVfpRegister single_scratch = double_scratch.low(); |
ASSERT(!scratch3.is(input_reg) && |
!scratch3.is(scratch1) && |
!scratch3.is(scratch2)); |
@@ -4657,14 +4652,12 @@ |
__ sub(ip, input_reg, Operand(kHeapObjectTag)); |
__ vldr(double_scratch, ip, HeapNumber::kValueOffset); |
__ EmitVFPTruncate(kRoundToZero, |
- single_scratch, |
+ input_reg, |
double_scratch, |
scratch1, |
- scratch2, |
+ double_scratch2, |
kCheckForInexactConversion); |
DeoptimizeIf(ne, instr->environment()); |
- // Load the result. |
- __ vmov(input_reg, single_scratch); |
if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) { |
__ cmp(input_reg, Operand(0)); |
@@ -4728,12 +4721,12 @@ |
Register scratch1 = scratch0(); |
Register scratch2 = ToRegister(instr->temp()); |
DwVfpRegister double_input = ToDoubleRegister(instr->value()); |
- SwVfpRegister single_scratch = double_scratch0().low(); |
Label done; |
if (instr->truncating()) { |
Register scratch3 = ToRegister(instr->temp2()); |
+ SwVfpRegister single_scratch = double_scratch0().low(); |
__ EmitECMATruncate(result_reg, |
double_input, |
single_scratch, |
@@ -4741,18 +4734,17 @@ |
scratch2, |
scratch3); |
} else { |
- VFPRoundingMode rounding_mode = kRoundToMinusInf; |
- __ EmitVFPTruncate(rounding_mode, |
- single_scratch, |
+ DwVfpRegister double_scratch = double_scratch0(); |
+ __ EmitVFPTruncate(kRoundToMinusInf, |
+ result_reg, |
double_input, |
scratch1, |
- scratch2, |
+ double_scratch, |
kCheckForInexactConversion); |
+ |
// Deoptimize if we had a vfp invalid exception, |
// including inexact operation. |
DeoptimizeIf(ne, instr->environment()); |
- // Retrieve the result. |
- __ vmov(result_reg, single_scratch); |
} |
__ bind(&done); |
} |