This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]