ldiv: Handle a == LONG_MIN.
authorDanny Milosavljevic <dannym@scratchpost.org>
Mon, 1 Jul 2019 20:14:11 +0000 (22:14 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Mon, 9 Sep 2019 14:04:13 +0000 (16:04 +0200)
* lib/mes/div.c (ldiv): Handle a == LONG_MIN.

lib/mes/div.c

index 5884f0769ce24c514128f1125834c730134a9dd4..3f9637545e4a711d5356abc2a80e6e8d424ba963 100644 (file)
@@ -64,15 +64,42 @@ unsigned long __mesabi_uldiv(unsigned long a, unsigned long b, unsigned long* re
 ldiv_t ldiv(long a, long b)
 {
   ldiv_t result;
-  int negative_result = (a < 0) ^ (b < 0);
-  assert(a != LONG_MIN && b != LONG_MIN);
-
-  if (a < 0)
-    a = -a;
-  if (b < 0)
-    b = -b;
-  result.quot = __mesabi_uldiv(a, b, &result.rem);
-  if (negative_result)
-    result.quot = -result.quot;
-  return result;
+  int negate_result = (a < 0) ^ (b < 0);
+  assert(b != LONG_MIN);
+  if (a != LONG_MIN)
+    {
+      if (a < 0)
+        a = -a;
+      if (b < 0)
+        b = -b;
+      result.quot = __mesabi_uldiv(a, b, &result.rem);
+      if (negate_result)
+        result.quot = -result.quot;
+      return result;
+    }
+  else
+    {
+      result.rem = 0;
+      if (b < 0)
+        b = -b;
+      if (b == 1)
+        {
+          result.quot = a;
+          /* Since result.quot is already negative, don't negate it again. */
+          negate_result = !negate_result;
+        }
+      else if (b == 0)
+        __mesabi_div0();
+      else
+        {
+          long x;
+          for (x = 0; a <= -b; a += b)
+            ++x;
+          result.rem = -a;
+          result.quot = x;
+        }
+      if (negate_result)
+        result.quot = -result.quot;
+      return result;
+    }
 }