Module Name:    src
Committed By:   matt
Date:           Mon Sep  9 07:33:54 UTC 2013

Modified Files:
        src/common/lib/libc/arch/arm/gen: divsi3.S udivsi3.S

Log Message:
Remove movw/movt due to linker problems.
Check for 0 divisor and __aeabi_idiv0 if needed (EABI && _LIBC only).


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/common/lib/libc/arch/arm/gen/divsi3.S
cvs rdiff -u -r1.7 -r1.8 src/common/lib/libc/arch/arm/gen/udivsi3.S

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/common/lib/libc/arch/arm/gen/divsi3.S
diff -u src/common/lib/libc/arch/arm/gen/divsi3.S:1.11 src/common/lib/libc/arch/arm/gen/divsi3.S:1.12
--- src/common/lib/libc/arch/arm/gen/divsi3.S:1.11	Mon Sep  9 00:34:10 2013
+++ src/common/lib/libc/arch/arm/gen/divsi3.S	Mon Sep  9 07:33:54 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: divsi3.S,v 1.11 2013/09/09 00:34:10 matt Exp $	*/
+/*	$NetBSD: divsi3.S,v 1.12 2013/09/09 07:33:54 matt Exp $	*/
 
 /*
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
@@ -31,35 +31,39 @@ ENTRY(__divsi3)
 # endif
 	RET
 #elif defined(__ARM_EABI__) && defined(_LIBC)
-#ifdef _ARM_ARCH_7
-	movw	r2, #:lower16:REL_SYM(_libc_arm_hwdiv_present, .LPIC0)
-	movt	r2, #:upper16:REL_SYM(_libc_arm_hwdiv_present, .LPIC0)
-#else
+	cmp	r1, #0		@ dividing by 0?
+	beq	.Ldiv0		@ call __aeabi_idiv0
 	ldr	r2, .Lhwdiv_present
-#endif
 # ifdef PIC
-	add	r2, r2, pc
+	add	r2, r2, pc	@ pc = &.LPIC0
 # endif
 	ldr	r2, [r2]
 .LPIC0:	cmp	r2, #0
 	beq	__divide
 	mov	r3, r0
-#if defined(__ARM_ARCH_EXT_IDIV__)
+# if defined(__ARM_ARCH_EXT_IDIV__)
 	sdiv	r0, r0, r1
-	mls	r1, r0, r1, r3	/* return modulus in r1 */
-#elif defined(__thumb__) && defined(_ARM_ARCH_T2)
+	mls	r1, r0, r1, r3	@ return modulus in r1
+# elif defined(__thumb__) && defined(_ARM_ARCH_T2)
 	.inst.w	0xfb90f0f1
 	.inst.w	0xfb003111
-#else
+# else
 	.inst	0xe710f110
 	.inst	0xe0613190
-#endif
+# endif
 	RET
-#ifndef _ARM_ARCH_7
+
 	.align	0
 .Lhwdiv_present:
 	.word	REL_SYM(_libc_arm_hwdiv_present, .LPIC0)
-#endif
+
+	.align	0
+.Ldiv0:	push	{r0, lr}	/* save r0 */
+	cmp	r0, #0
+	mvnge	r0, #0x80000000	/* INT_MAX = 0x7fffffff */
+	movlt	r0, #0x80000000	/* INT_MIN = 0x80000000 */
+	bl	_C_LABEL(__aeabi_idiv0)
+	pop	{r1, pc}	/* restore r0 as r1 */
 #else /* !__ARM_EABI__ */
 	b	__divide
 #endif

Index: src/common/lib/libc/arch/arm/gen/udivsi3.S
diff -u src/common/lib/libc/arch/arm/gen/udivsi3.S:1.7 src/common/lib/libc/arch/arm/gen/udivsi3.S:1.8
--- src/common/lib/libc/arch/arm/gen/udivsi3.S:1.7	Mon Sep  9 00:34:10 2013
+++ src/common/lib/libc/arch/arm/gen/udivsi3.S	Mon Sep  9 07:33:54 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: udivsi3.S,v 1.7 2013/09/09 00:34:10 matt Exp $	*/
+/*	$NetBSD: udivsi3.S,v 1.8 2013/09/09 07:33:54 matt Exp $	*/
 
 /*
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
@@ -31,35 +31,38 @@ ENTRY(__udivsi3)
 # endif
 	RET
 #elif defined(__ARM_EABI__) && defined(_LIBC)
-#ifdef _ARM_ARCH_7
-	movw	r2, #:lower16:REL_SYM(_libc_arm_hwdiv_present, .LPIC0)
-	movt	r2, #:upper16:REL_SYM(_libc_arm_hwdiv_present, .LPIC0)
-#else
+	cmp	r1, #0
+	beq	.Ldiv0
 	ldr	r2, .Lhwdiv_present
-#endif
-#ifdef PIC
-	add	r2, r2, pc
-#endif
+# ifdef PIC
+	add	r2, r2, pc	/* pc = &.LPIC0 */
+# endif
 	ldr	r2, [r2]
 .LPIC0:	cmp	r2, #0
 	beq	__udivide
 	mov	r3, r0
-#if defined(__ARM_ARCH_EXT_IDIV__)
+# if defined(__ARM_ARCH_EXT_IDIV__)
 	udiv	r0, r0, r1
 	mls	r1, r0, r1, r3	/* return modulus in r1 */
-#elif defined(__thumb__) && defined(_ARM_ARCH_T2)
+# elif defined(__thumb__) && defined(_ARM_ARCH_T2)
 	.inst.w 0xfbb0f0f1
 	.inst.w	0xfb003111
-#else
+# else
 	.inst	0xe730f110
 	.inst	0xe0613190
-#endif
+# endif
 	RET
-#ifndef _ARM_ARCH_7
+
 	.align 0
 .Lhwdiv_present:
 	.word	REL_SYM(_libc_arm_hwdiv_present, .LPIC0)
-#endif
+
+	/* Handle divide by zero */
+	.align	0
+.Ldiv0:	push	{r0, lr}	/* save r0 */
+	mvns	r0, #0		/* thumb2 */
+	bl	_C_LABEL(__aeabi_idiv0)
+	pop	{r1, pc}	/* restore r0 as r1 */
 #else
 	b	__udivide
 #endif

Reply via email to