[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#130394: [ARM] gcc misunhandle % with unsigned long operands



reassign 130394 gcc-2.95
severity 130394 important
forwarded 130394 gcc-gnats@gcc.gnu.org
tags 130394 + patch
tags 130394 + upstream
tags 130394 + fixed
retitle 130394 [PR 5700] [ARM; fixed in 3.0] bug in __umodsi3
thanks

The reason this one didn't show up with a cross-compiler is that the bug
is in the division support routine itself, rather than the compiler
proper.

I haven't tested it yet, but I suspect this patch may fix the problem.

2000-08-22  Nick Clifton  <nickc@redhat.com>

	* config/arm/lib1funcs.asm (__umodsi3): Before performing any
	restorative additions, test for bottom bits of IP being set,
	rather than relying upon the RORs not matching.
	(__modsi3): Ditto.

Index: lib1funcs.asm
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/arm/lib1funcs.asm,v
retrieving revision 1.7
diff -u -r1.7 lib1funcs.asm
--- lib1funcs.asm	1999/04/07 13:53:02	1.7
+++ lib1funcs.asm	2002/02/15 14:17:36
@@ -215,6 +215,13 @@
 	@ then none of the below will match, since the bit in ip will not be
 	@ in the bottom nibble.
 	ands	overdone, overdone, #0xe0000000
+	@ If we terminated early, because dividend became zero, then the 
+	@ bit in ip will not be in the bottom nibble, and we should not
+	@ perform the additions below.  We must test for this though
+	@ (rather relying upon the TSTs to prevent the additions) since
+	@ the bit in ip could be in the top two bits which might then match
+	@ with one of the smaller RORs.
+	tstne	ip, #0x7
 	RETc(eq)	pc, lr				@ No fixups needed
 	tst	overdone, ip, ror #3
 	addne	dividend, dividend, divisor, lsr #3
@@ -397,6 +404,13 @@
 	@ then none of the below will match, since the bit in ip will not be
 	@ in the bottom nibble.
 	ands	overdone, overdone, #0xe0000000
+	@ If we terminated early, because dividend became zero, then the 
+	@ bit in ip will not be in the bottom nibble, and we should not
+	@ perform the additions below.  We must test for this though
+	@ (rather relying upon the TSTs to prevent the additions) since
+	@ the bit in ip could be in the top two bits which might then match
+	@ with one of the smaller RORs.
+	tstne	ip, #0x7
 	beq	Lgot_result
 	tst	overdone, ip, ror #3
 	addne	dividend, dividend, divisor, lsr #3




Reply to: