This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
minor improvements to Xtensa libgcc functions
- From: Bob Wilson <bwilson at tensilica dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Tue, 10 May 2005 08:57:18 -0700
- Subject: minor improvements to Xtensa libgcc functions
I've committed this patch on the mainline, after verifying that it causes no
regressions in the testsuite for an xtensa-elf target. The patch reduces the
critical path length through the divide function by one instruction in some
special cases. It also reduces the code size slightly, especially for the mod
functions where there was some duplicated code.
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.
Index: config/xtensa/lib1funcs.asm
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/xtensa/lib1funcs.asm,v
retrieving revision 1.8
diff -u -p -r1.8 lib1funcs.asm
--- config/xtensa/lib1funcs.asm 28 Apr 2005 05:38:50 -0000 1.8
+++ config/xtensa/lib1funcs.asm 10 May 2005 00:00:41 -0000
@@ -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.