| Index: src/mips/simulator-mips.cc
|
| diff --git a/src/mips/simulator-mips.cc b/src/mips/simulator-mips.cc
|
| index 66d0da71fa4260e086b77b99f8f3773466db5d44..cf87f93602e51d55d27873e6843b7e63c5a1d6cb 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<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);
|
|
|