Revision: 12380
Author:   [email protected]
Date:     Mon Aug 27 00:29:36 2012
Log:      MIPS: Fix rounding in Uint8ClampedArray setter.

Port r12364 (31e40def)

Original commit message:
According to Web IDL spec, we should round to
the nearest integer, choosing the even integer
if it lies halfway between two.

BUG=
TEST=

Review URL: https://chromiumcodereview.appspot.com/10870049
Patch from Akos Palfi <[email protected]>.
http://code.google.com/p/v8/source/detail?r=12380

Modified:
 /branches/bleeding_edge/src/mips/macro-assembler-mips.cc
 /branches/bleeding_edge/src/mips/simulator-mips.cc

=======================================
--- /branches/bleeding_edge/src/mips/macro-assembler-mips.cc Mon Aug 20 04:35:50 2012 +++ /branches/bleeding_edge/src/mips/macro-assembler-mips.cc Mon Aug 27 00:29:36 2012
@@ -5398,7 +5398,7 @@

   // In 0-255 range, round and truncate.
   bind(&in_bounds);
-  round_w_d(temp_double_reg, input_reg);
+  cvt_w_d(temp_double_reg, input_reg);
   mfc1(result_reg, temp_double_reg);
   bind(&done);
 }
=======================================
--- /branches/bleeding_edge/src/mips/simulator-mips.cc Mon Jun 4 06:56:10 2012 +++ /branches/bleeding_edge/src/mips/simulator-mips.cc Mon Aug 27 00:29:36 2012
@@ -2068,10 +2068,15 @@
               // Rounding modes are not yet supported.
               ASSERT((FCSR_ & 3) == 0);
               // In rounding mode 0 it should behave like ROUND.
-            case ROUND_W_D:  // Round double to word.
+            case ROUND_W_D:  // Round double to word (round half to even).
               {
-                double rounded = fs > 0 ? floor(fs + 0.5) : ceil(fs - 0.5);
+                double rounded = floor(fs + 0.5);
                 int32_t result = static_cast<int32_t>(rounded);
+                if ((result & 1) != 0 && result - fs == 0.5) {
+                  // If the number is halfway between two integers,
+                  // round to the even one.
+                  result--;
+                }
                 set_fpu_register(fd_reg, result);
                 if (set_fcsr_round_error(fs, rounded)) {
                   set_fpu_register(fd_reg, kFPUInvalidResult);

--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to