From: ulan@chromium.org Date: Mon, 27 Aug 2012 07:29:36 +0000 (+0000) Subject: MIPS: Fix rounding in Uint8ClampedArray setter. X-Git-Tag: upstream/4.7.83~16103 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2aad64d902b71d01be7a70bd8bb4b6d12d3da850;p=platform%2Fupstream%2Fv8.git 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 . git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@12380 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/mips/macro-assembler-mips.cc b/src/mips/macro-assembler-mips.cc index 5156855..d99fbdc 100644 --- a/src/mips/macro-assembler-mips.cc +++ b/src/mips/macro-assembler-mips.cc @@ -5398,7 +5398,7 @@ void MacroAssembler::ClampDoubleToUint8(Register result_reg, // 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); } diff --git a/src/mips/simulator-mips.cc b/src/mips/simulator-mips.cc index 66d0da7..cf87f93 100644 --- a/src/mips/simulator-mips.cc +++ b/src/mips/simulator-mips.cc @@ -2068,10 +2068,15 @@ void Simulator::DecodeTypeRegister(Instruction* instr) { // 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(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);