summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/xtensa/lib1funcs.asm53
2 files changed, 28 insertions, 31 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7e817dd2514..8b9235fa4e8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2005-05-10 Bob Wilson <bob.wilson@acm.org>
+
+ * config/xtensa/lib1funcs.asm (__udivsi3, __divsi3): Rearrange special
+ case code to avoid one move instruction.
+ (__umodsi3, __modsi3): Merge duplicated code sequences.
+
2005-05-10 Kazu Hirata <kazu@cs.umass.edu>
* config/mips/24k.md, config/sh/divtab.c, config/sh/sh.c,
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.