summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2010-10-29 02:20:47 -0700
committerGabe Black <gblack@eecs.umich.edu>2010-10-29 02:20:47 -0700
commit373154a25afb1bed946e5a2a7cfd411e4bd7fad6 (patch)
tree6846c48532c04192f22645030ad2dc7c09ceae89
parent7378424b149a16cbc22a5b0260372beb8c8a0ac7 (diff)
downloadgem5-373154a25afb1bed946e5a2a7cfd411e4bd7fad6.tar.xz
X86: Fault on divide by zero instead of panicing.
-rw-r--r--src/arch/x86/isa/microops/regop.isa21
1 files changed, 13 insertions, 8 deletions
diff --git a/src/arch/x86/isa/microops/regop.isa b/src/arch/x86/isa/microops/regop.isa
index 4b0080d40..9ccea82dd 100644
--- a/src/arch/x86/isa/microops/regop.isa
+++ b/src/arch/x86/isa/microops/regop.isa
@@ -178,8 +178,7 @@ output decoder {{
uint64_t &quotient, uint64_t &remainder)
{
//Check for divide by zero.
- if (divisor == 0)
- panic("Divide by zero!\\n");
+ assert(divisor != 0);
//If the divisor is bigger than the dividend, don't do anything.
if (divisor <= dividend) {
//Shift the divisor so it's msb lines up with the dividend.
@@ -518,11 +517,15 @@ let {{
//This is a temporary just for consistency and clarity.
uint64_t dividend = remainder;
//Do the division.
- divide(dividend, divisor, quotient, remainder);
- //Record the final results.
- Remainder = remainder;
- Quotient = quotient;
- Divisor = divisor;
+ if (divisor == 0) {
+ fault = new DivideByZero;
+ } else {
+ divide(dividend, divisor, quotient, remainder);
+ //Record the final results.
+ Remainder = remainder;
+ Quotient = quotient;
+ Divisor = divisor;
+ }
'''
# Step divide
@@ -535,7 +538,9 @@ let {{
int remaining = op2;
//If we overshot, do nothing. This lets us unrool division loops a
//little.
- if (remaining) {
+ if (divisor == 0) {
+ fault = new DivideByZero;
+ } else if (remaining) {
if (divisor & (ULL(1) << 63)) {
while (remaining && !(dividend & (ULL(1) << 63))) {
dividend = (dividend << 1) |