ARM: Return both the quotient and the remainder.
authorDanny Milosavljevic <dannym@scratchpost.org>
Mon, 11 Mar 2019 18:33:53 +0000 (19:33 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Mon, 9 Sep 2019 16:34:02 +0000 (18:34 +0200)
* lib/mes/div.c (__aeabi_idivmod): Use ldiv.  Return both quotient and
remainder.
(__aeabi_uidivmod): Use __mesabi_uldiv.  Return both quotient and remainder.

lib/mes/div.c

index 154ffb4587e440731e1bc99302cceaa45bfe6284..0712ac9b2ece55b80816abc3c545d5042d2af5c5 100644 (file)
@@ -119,11 +119,14 @@ ldiv_t ldiv(long a, long b)
 // /gnu/store/7sfr3vhxq7l4mai8m0fr1cd8w9xcj9dh-binutils-2.31.1/bin/ld: gcc-lib/libc.a(ntoab.o): in function `ntoab':
 // ntoab.c:(.text+0x54): undefined reference to `__aeabi_uidivmod'
 // /gnu/store/7sfr3vhxq7l4mai8m0fr1cd8w9xcj9dh-binutils-2.31.1/bin/ld: ntoab.c:(.text+0x62): undefined reference to `__aeabi_uidiv'
+/* Result: r0: quotient; r1: remainder */
 long
 __aeabi_idivmod (long a, long b)
 {
   ldiv_t result = ldiv(a, b);
-  return result.rem;
+  register long rem_result asm("r1");
+  rem_result = result.rem;
+  return result.quot;
 }
 
 long
@@ -133,12 +136,22 @@ __aeabi_idiv (long a, long b)
   return result.quot;
 }
 
+typedef struct
+{
+  unsigned long quot;
+  unsigned long rem;
+} uidiv_t;
+
+/* Result: r0: quotient; r1: remainder */
 unsigned long
 __aeabi_uidivmod (unsigned long a, unsigned long b)
 {
-  unsigned long remainder;
-  __mesabi_uldiv (a, b, &remainder);
-  return remainder;
+  unsigned long quot;
+  unsigned long rem;
+  register unsigned long rem_result asm("r1");
+  quot = __mesabi_uldiv (a, b, &rem);
+  rem_result = rem;
+  return quot;
 }
 
 unsigned long