From 373154a25afb1bed946e5a2a7cfd411e4bd7fad6 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Fri, 29 Oct 2010 02:20:47 -0700 Subject: [PATCH] X86: Fault on divide by zero instead of panicing. --- src/arch/x86/isa/microops/regop.isa | 21 +++++++++++++-------- 1 file 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 "ient, 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) | -- 2.30.2