Index: src/mips/simulator-mips.cc |
diff --git a/src/mips/simulator-mips.cc b/src/mips/simulator-mips.cc |
index ea8b65948afe4732a4867024ac93c075d8220cff..5a96efe9c1d529338f10b6a0e657804d74e59ce8 100644 |
--- a/src/mips/simulator-mips.cc |
+++ b/src/mips/simulator-mips.cc |
@@ -2274,9 +2274,13 @@ void Simulator::DecodeTypeRegister(Instruction* instr) { |
break; |
case DIV: |
// Divide by zero and overflow was not checked in the configuration |
- // step - div and divu do not raise exceptions. On division by 0 and |
- // on overflow (INT_MIN/-1), the result will be UNPREDICTABLE. |
- if (rt != 0 && !(rs == INT_MIN && rt == -1)) { |
+ // step - div and divu do not raise exceptions. On division by 0 |
+ // the result will be UNPREDICTABLE. On overflow (INT_MIN/-1), |
+ // return INT_MIN which is what the hardware does. |
+ if (rs == INT_MIN && rt == -1) { |
+ set_register(LO, INT_MIN); |
+ set_register(HI, 0); |
+ } else if (rt != 0) { |
set_register(LO, rs / rt); |
set_register(HI, rs % rt); |
} |