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); |