Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(32)

Unified Diff: src/arm/macro-assembler-arm.cc

Issue 233013005: Revert "ARM: Do not set FPSCR when converting to clamped uint8" (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/objects.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/arm/macro-assembler-arm.cc
diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc
index 6911ccf3f32552e6cb710eefe40402112440843a..1633adc1331e203edbacf85a6419a81b02e13653 100644
--- a/src/arm/macro-assembler-arm.cc
+++ b/src/arm/macro-assembler-arm.cc
@@ -796,10 +796,6 @@ 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));
@@ -3804,19 +3800,36 @@ 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);
- // Handle inputs >= 255 (including +infinity).
+ // Double value is >= 255, return 255.
+ bind(&above_zero);
Vmov(double_scratch, 255.0, result_reg);
- mov(result_reg, Operand(255));
VFPCompareAndSetFlags(input_reg, double_scratch);
- b(ge, &done);
-
- // For inputs < 255 (including negative) vcvt_u32_f64 with round-to-nearest
- // rounding mode will provide the correct result.
- vcvt_u32_f64(double_scratch.low(), input_reg, kFPSCRRounding);
+ 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);
vmov(result_reg, double_scratch.low());
-
+ // Restore FPSCR.
+ vmsr(ip);
bind(&done);
}
« no previous file with comments | « no previous file | src/objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698