aboutsummaryrefslogtreecommitdiff
path: root/libgcc
diff options
context:
space:
mode:
authorStafford Horne <shorne@gmail.com>2019-07-21 20:59:50 +0000
committerStafford Horne <shorne@gcc.gnu.org>2019-07-21 20:59:50 +0000
commit9c0dba7c451ddd232dc3ba8a5ebc797762c74736 (patch)
treea80591c411c95cdd66538f67f0999f535bd3c782 /libgcc
parent2e92185a033ec94d3dbaf22577110883db1474a1 (diff)
downloadgcc-9c0dba7c451ddd232dc3ba8a5ebc797762c74736.zip
gcc-9c0dba7c451ddd232dc3ba8a5ebc797762c74736.tar.gz
gcc-9c0dba7c451ddd232dc3ba8a5ebc797762c74736.tar.bz2
or1k: Fix issues with msoft-div
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
Diffstat (limited to 'libgcc')
-rw-r--r--libgcc/ChangeLog8
-rw-r--r--libgcc/config/or1k/lib1funcs.S6
2 files changed, 11 insertions, 3 deletions
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
index d5fb54b..0a449a7 100644
--- a/libgcc/ChangeLog
+++ b/libgcc/ChangeLog
@@ -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.
diff --git a/libgcc/config/or1k/lib1funcs.S b/libgcc/config/or1k/lib1funcs.S
index d210392..6d05897 100644
--- a/libgcc/config/or1k/lib1funcs.S
+++ b/libgcc/config/or1k/lib1funcs.S
@@ -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.bf 1b
l.add r6, r6, r6 /* mask <<= 1 */
/* Shift Y back to the right again, subtracting from X. */