[sim] changed divide-by-0 semantics
authorAndrew Waterman <waterman@s141.Millennium.Berkeley.EDU>
Thu, 27 Jan 2011 02:05:11 +0000 (18:05 -0800)
committerAndrew Waterman <waterman@s141.Millennium.Berkeley.EDU>
Thu, 27 Jan 2011 02:05:11 +0000 (18:05 -0800)
now it always gives -1, no matter the signedness.

riscv/insns/div.h
riscv/insns/divw.h

index aa671342ec5101732a516b0284687c16a366768c..96d9e10ecacbff95bd4e6ae06d35bf0179b44a15 100644 (file)
@@ -1,9 +1,6 @@
-if(RS2 == 0 || (sreg_t(RS1) == INT64_MIN && sreg_t(RS2) == -1))
-{
-  if(xpr64)
-    RD = sreg_t(RS1) < 0 ? INT64_MIN : INT64_MAX;
-  else
-    RD = sreg_t(RS1) < 0 ? sext32(INT32_MIN) : INT32_MAX;
-}
+if(RS2 == 0)
+  RD = UINT64_MAX;
+else if(sreg_t(RS1) == INT64_MIN && sreg_t(RS2) == -1)
+  RD = RS1;
 else
   RD = sext_xprlen(sreg_t(RS1) / sreg_t(RS2));
index 9c732b51247106d9903e1815f0a879f63f80d486..ee940da860aabb55eb40120a776d7a195dbcfcde 100644 (file)
@@ -1,7 +1,9 @@
 require_xpr64;
+if(RS2 == 0)
+  RD = UINT64_MAX;
 // INT64_MIN/-1 corner case shouldn't occur in correct code, since
 // INT64_MIN is not a proper 32-bit signed value
-if(RS2 == 0 || (sreg_t(RS1) == INT64_MIN && sreg_t(RS2) == -1))
-  RD = sext32(sreg_t(RS1) < 0 ? INT32_MIN : INT32_MAX);
+else if(sreg_t(RS1) == INT64_MIN && sreg_t(RS2) == -1)
+  RD = RS1;
 else
   RD = sext32(sreg_t(RS1) / sreg_t(RS2));