diff options
author | Stafford Horne <shorne@gmail.com> | 2019-07-21 20:59:50 +0000 |
---|---|---|
committer | Stafford Horne <shorne@gcc.gnu.org> | 2019-07-21 20:59:50 +0000 |
commit | 9c0dba7c451ddd232dc3ba8a5ebc797762c74736 (patch) | |
tree | a80591c411c95cdd66538f67f0999f535bd3c782 /libgcc | |
parent | 2e92185a033ec94d3dbaf22577110883db1474a1 (diff) | |
download | gcc-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/ChangeLog | 8 | ||||
-rw-r--r-- | libgcc/config/or1k/lib1funcs.S | 6 |
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. */ |