| Index: src/arm/macro-assembler-arm.cc
 | 
| ===================================================================
 | 
| --- src/arm/macro-assembler-arm.cc	(revision 12656)
 | 
| +++ src/arm/macro-assembler-arm.cc	(working copy)
 | 
| @@ -2437,16 +2437,27 @@
 | 
|  
 | 
|  
 | 
|  void MacroAssembler::EmitVFPTruncate(VFPRoundingMode rounding_mode,
 | 
| -                                     SwVfpRegister result,
 | 
| +                                     Register result,
 | 
|                                       DwVfpRegister double_input,
 | 
| -                                     Register scratch1,
 | 
| -                                     Register scratch2,
 | 
| +                                     Register scratch,
 | 
| +                                     DwVfpRegister double_scratch,
 | 
|                                       CheckForInexactConversion check_inexact) {
 | 
| +  ASSERT(!result.is(scratch));
 | 
| +  ASSERT(!double_input.is(double_scratch));
 | 
| +
 | 
|    ASSERT(CpuFeatures::IsSupported(VFP2));
 | 
|    CpuFeatures::Scope scope(VFP2);
 | 
| -  Register prev_fpscr = scratch1;
 | 
| -  Register scratch = scratch2;
 | 
| +  Register prev_fpscr = result;
 | 
| +  Label done;
 | 
|  
 | 
| +  // Test for values that can be exactly represented as a signed 32-bit integer.
 | 
| +  vcvt_s32_f64(double_scratch.low(), double_input);
 | 
| +  vmov(result, double_scratch.low());
 | 
| +  vcvt_f64_s32(double_scratch, double_scratch.low());
 | 
| +  VFPCompareAndSetFlags(double_input, double_scratch);
 | 
| +  b(eq, &done);
 | 
| +
 | 
| +  // Convert to integer, respecting rounding mode.
 | 
|    int32_t check_inexact_conversion =
 | 
|      (check_inexact == kCheckForInexactConversion) ? kVFPInexactExceptionBit : 0;
 | 
|  
 | 
| @@ -2468,7 +2479,7 @@
 | 
|    vmsr(scratch);
 | 
|  
 | 
|    // Convert the argument to an integer.
 | 
| -  vcvt_s32_f64(result,
 | 
| +  vcvt_s32_f64(double_scratch.low(),
 | 
|                 double_input,
 | 
|                 (rounding_mode == kRoundToZero) ? kDefaultRoundToZero
 | 
|                                                 : kFPSCRRounding);
 | 
| @@ -2477,8 +2488,12 @@
 | 
|    vmrs(scratch);
 | 
|    // Restore FPSCR.
 | 
|    vmsr(prev_fpscr);
 | 
| +  // Move the converted value into the result register.
 | 
| +  vmov(result, double_scratch.low());
 | 
|    // Check for vfp exceptions.
 | 
|    tst(scratch, Operand(kVFPExceptionMask | check_inexact_conversion));
 | 
| +
 | 
| +  bind(&done);
 | 
|  }
 | 
|  
 | 
|  
 | 
| 
 |