Commit 2aad64d9 authored by ulan@chromium.org's avatar ulan@chromium.org

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 <palfia@homejinni.com>.

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@12380 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 89cd0677
......@@ -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);
}
......
......@@ -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<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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment