summaryrefslogtreecommitdiff
path: root/gcc/config/xtensa/lib1funcs.asm
diff options
context:
space:
mode:
authorbwilson <bwilson@138bc75d-0d04-0410-961f-82ee72b054a4>2005-05-10 15:56:54 +0000
committerbwilson <bwilson@138bc75d-0d04-0410-961f-82ee72b054a4>2005-05-10 15:56:54 +0000
commit324c3b05da99cf3c15014f16caea6f882d7f488c (patch)
tree4715ee966d698dfff465a73c768442861f0c32b7 /gcc/config/xtensa/lib1funcs.asm
parent95b8d1bcbb4add3edbf7f6e54ecf9a9b2a0955e4 (diff)
downloadgcc-324c3b05da99cf3c15014f16caea6f882d7f488c.tar.gz
* config/xtensa/lib1funcs.asm (__udivsi3, __divsi3): Rearrange special
case code to avoid one move instruction. (__umodsi3, __modsi3): Merge duplicated code sequences. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@99520 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/xtensa/lib1funcs.asm')
-rw-r--r--gcc/config/xtensa/lib1funcs.asm53
1 files changed, 22 insertions, 31 deletions
diff --git a/gcc/config/xtensa/lib1funcs.asm b/gcc/config/xtensa/lib1funcs.asm
index 1b11dafdca4..bc3c45218f0 100644
--- a/gcc/config/xtensa/lib1funcs.asm
+++ b/gcc/config/xtensa/lib1funcs.asm
@@ -299,19 +299,21 @@ __udivsi3:
.Lreturn:
abi_return
+.Lle_one:
+ beqz a3, .Lerror # if divisor == 1, return the dividend
+ abi_return
+
.Lspecial:
# return dividend >= divisor
- movi a2, 0
- bltu a6, a3, .Lreturn2
+ bltu a6, a3, .Lreturn0
movi a2, 1
-.Lreturn2:
abi_return
-.Lle_one:
- beqz a3, .Lerror # if divisor == 1, return the dividend
- abi_return
.Lerror:
- movi a2, 0 # just return 0; could throw an exception
+ # just return 0; could throw an exception
+
+.Lreturn0:
+ movi a2, 0
abi_return
.size __udivsi3,.-__udivsi3
@@ -361,22 +363,24 @@ __divsi3:
movltz a2, a5, a7 # return (sign < 0) ? -quotient : quotient
abi_return
+.Lle_one:
+ beqz a3, .Lerror
+ neg a2, a6 # if udivisor == 1, then return...
+ movgez a2, a6, a7 # (sign < 0) ? -udividend : udividend
+ abi_return
+
.Lspecial:
- movi a2, 0
- bltu a6, a3, .Lreturn2 # if dividend < divisor, return 0
+ bltu a6, a3, .Lreturn0 # if dividend < divisor, return 0
movi a2, 1
movi a4, -1
movltz a2, a4, a7 # else return (sign < 0) ? -1 : 1
-.Lreturn2:
abi_return
-.Lle_one:
- beqz a3, .Lerror
- neg a2, a6 # if udivisor == 1, then return...
- movgez a2, a6, a7 # (sign < 0) ? -udividend : udividend
- abi_return
.Lerror:
- movi a2, 0 # just return 0; could throw an exception
+ # just return 0; could throw an exception
+
+.Lreturn0:
+ movi a2, 0
abi_return
.size __divsi3,.-__divsi3
@@ -414,17 +418,12 @@ __umodsi3:
#endif /* !XCHAL_HAVE_LOOPS */
.Lloopend:
+.Lspecial:
bltu a2, a3, .Lreturn
sub a2, a2, a3 # subtract once more if dividend >= divisor
.Lreturn:
abi_return
-.Lspecial:
- bltu a2, a3, .Lreturn2
- sub a2, a2, a3 # subtract once if dividend >= divisor
-.Lreturn2:
- abi_return
-
.Lle_one:
# the divisor is either 0 or 1, so just return 0.
# someday we may want to throw an exception if the divisor is 0.
@@ -468,6 +467,7 @@ __modsi3:
#endif /* !XCHAL_HAVE_LOOPS */
.Lloopend:
+.Lspecial:
bltu a2, a3, .Lreturn
sub a2, a2, a3 # subtract once more if udividend >= udivisor
.Lreturn:
@@ -476,15 +476,6 @@ __modsi3:
.Lpositive:
abi_return
-.Lspecial:
- bltu a2, a3, .Lreturn2
- sub a2, a2, a3 # subtract once if dividend >= divisor
-.Lreturn2:
- bgez a7, .Lpositive2
- neg a2, a2 # if (dividend < 0), return -udividend
-.Lpositive2:
- abi_return
-
.Lle_one:
# udivisor is either 0 or 1, so just return 0.
# someday we may want to throw an exception if udivisor is 0.