Chromium Code Reviews| Index: src/arm/macro-assembler-arm.cc |
| diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc |
| index 1633adc1331e203edbacf85a6419a81b02e13653..f8599c6b5637d7faa99bd699aea40811c87171b4 100644 |
| --- a/src/arm/macro-assembler-arm.cc |
| +++ b/src/arm/macro-assembler-arm.cc |
| @@ -796,6 +796,10 @@ void MacroAssembler::VFPEnsureFPSCRState(Register scratch) { |
| // If needed, restore wanted bits of FPSCR. |
| Label fpscr_done; |
| vmrs(scratch); |
| + if (emit_debug_code()) { |
| + tst(scratch, Operand(kVFPRoundingModeMask)); |
| + Assert(eq, kDefaultRoundingModeNotSet); |
| + } |
| tst(scratch, Operand(kVFPDefaultNaNModeControlBit)); |
| b(ne, &fpscr_done); |
| orr(scratch, scratch, Operand(kVFPDefaultNaNModeControlBit)); |
| @@ -3800,36 +3804,24 @@ void MacroAssembler::ClampUint8(Register output_reg, Register input_reg) { |
| void MacroAssembler::ClampDoubleToUint8(Register result_reg, |
| DwVfpRegister input_reg, |
| LowDwVfpRegister double_scratch) { |
| - Label above_zero; |
| Label done; |
| - Label in_bounds; |
| - |
| - VFPCompareAndSetFlags(input_reg, 0.0); |
| - b(gt, &above_zero); |
| - // Double value is less than zero, NaN or Inf, return 0. |
| - mov(result_reg, Operand::Zero()); |
| - b(al, &done); |
| - |
| - // Double value is >= 255, return 255. |
| - bind(&above_zero); |
| + // Handle inputs >= 255 (including +infinity). |
| Vmov(double_scratch, 255.0, result_reg); |
| - VFPCompareAndSetFlags(input_reg, double_scratch); |
| - b(le, &in_bounds); |
| mov(result_reg, Operand(255)); |
| - b(al, &done); |
| - |
| - // In 0-255 range, round and truncate. |
| - bind(&in_bounds); |
| - // Save FPSCR. |
| - vmrs(ip); |
| - // Set rounding mode to round to the nearest integer by clearing bits[23:22]. |
| - bic(result_reg, ip, Operand(kVFPRoundingModeMask)); |
| - vmsr(result_reg); |
| - vcvt_s32_f64(double_scratch.low(), input_reg, kFPSCRRounding); |
| + VFPCompareAndSetFlags(input_reg, double_scratch); |
| + b(ge, &done); |
| + |
| + if (emit_debug_code()) { |
|
jbramley
2014/04/09 14:18:26
I'd be tempted to omit this, since everything else
oetuaho-nv
2014/04/09 14:24:32
Yes, I thought about leaving this out too, but thi
rmcilroy
2014/04/09 15:53:30
This may be the only place vcvt uses the fpscr's r
|
| + vmrs(result_reg); |
| + tst(result_reg, Operand(kVFPRoundingModeMask)); |
| + Assert(eq, kDefaultRoundingModeNotSet); |
| + } |
| + // vcvt_u32_f64 agrees with what ClampDoubleToUint8 should do as long as |
| + // value in input_reg < 255. |
|
rmcilroy
2014/04/09 15:53:30
nit - "For inputs < 255 (including negative) vcvt_
|
| + vcvt_u32_f64(double_scratch.low(), input_reg, kFPSCRRounding); |
| vmov(result_reg, double_scratch.low()); |
| - // Restore FPSCR. |
| - vmsr(ip); |
| + |
| bind(&done); |
| } |