Index: src/mips/simulator-mips.cc |
diff --git a/src/mips/simulator-mips.cc b/src/mips/simulator-mips.cc |
index 66d0da71fa4260e086b77b99f8f3773466db5d44..77d64f0782a3c832faa3be86a505b3633d7a1386 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); |
ulan
2012/08/24 07:21:07
Why not just do floor(fs + 0.5) for both positive
palfia
2012/08/24 23:57:29
Done.
|
int32_t result = static_cast<int32_t>(rounded); |
+ if ((result & 1) != 0 && result - fs == 0.5) { |
ulan
2012/08/24 07:21:07
This doesn't handle the case when fs is negative,
palfia
2012/08/24 23:57:29
Using floor(fs + 0.5) above for negative numbers t
ulan
2012/08/27 07:23:26
Yep, thanks for fixing it. :)
|
+ // 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); |