or1k: Fix issues with msoft-div
authorStafford Horne <shorne@gmail.com>
Sun, 21 Jul 2019 20:59:50 +0000 (20:59 +0000)
committerStafford Horne <shorne@gcc.gnu.org>
Sun, 21 Jul 2019 20:59:50 +0000 (20:59 +0000)
Fixes bad assembly logic with software divide as reported by Richard Selvaggi.
Also, add a basic test to verify the soft math works when enabled.

gcc/testsuite/ChangeLog:

PR target/90362
* gcc.target/or1k/div-mul-3.c: New test.

libgcc/ChangeLog:

PR target/90362
* config/or1k/lib1funcs.S (__udivsi3): Change l.sfeqi
to l.sfeq and l.sfltsi to l.sflts equivalents as the immediate
instructions are not available on every processor.  Change a
l.bnf to l.bf to fix logic issue.

From-SVN: r273648

gcc/testsuite/ChangeLog
libgcc/ChangeLog
libgcc/config/or1k/lib1funcs.S

index 95e73d9fa482fb8d25cbe1d050e24046a7a709bf..846d201674001af493f70fce65251b839747f1bc 100644 (file)
@@ -1,3 +1,8 @@
+2019-07-22  Stafford Horne  <shorne@gmail.com>
+
+       PR target/90362
+       * gcc.target/or1k/div-mul-3.c: New test.
+
 2019-07-22  Stafford Horne  <shorne@gmail.com>
 
        PR target/90363
index d5fb54b7c3e0d58180822877b211e0c948041b40..0a449a7dd0c399e260ea3a72946d494dd1283d36 100644 (file)
@@ -1,3 +1,11 @@
+2019-07-22  Stafford Horne  <shorne@gmail.com>
+
+       PR target/90362
+       * config/or1k/lib1funcs.S (__udivsi3): Change l.sfeqi
+       to l.sfeq and l.sfltsi to l.sflts equivalents as the immediate
+       instructions are not available on every processor.  Change a
+       l.bnf to l.bf to fix logic issue.
+
 2019-07-04  Iain Sandoe  <iain@sandoe.co.uk>
 
        * config.host: Remove reference to t-darwin8.
index d2103923486830629aeec3050ce13bb83d902dfc..6d0589772292f3c129b59158add7fce998e6ca46 100644 (file)
@@ -68,18 +68,18 @@ __udivmodsi3_internal:
           is not clobbered by this routine, and use that as to
           save a return address without creating a stack frame.  */
 
-       l.sfeqi         r4, 0           /* division by zero; return 0.  */
+       l.sfeq          r4, r0          /* division by zero; return 0.  */
        l.ori           r11, r0, 0      /* initial quotient */
        l.bf            9f
         l.ori          r12, r3, 0      /* initial remainder */
 
        /* Given X/Y, shift Y left until Y >= X.  */
        l.ori           r6, r0, 1       /* mask = 1 */
-1:     l.sfltsi        r4, 0           /* y has msb set */
+1:     l.sflts         r4, r0          /* y has msb set */
        l.bf            2f
         l.sfltu        r4, r12         /* y < x */
        l.add           r4, r4, r4      /* y <<= 1 */
-       l.bnf           1b
+       l.b           1b
         l.add          r6, r6, r6      /* mask <<= 1 */
 
        /* Shift Y back to the right again, subtracting from X.  */