Module Name:    src
Committed By:   matt
Date:           Wed May  8 05:13:56 UTC 2013

Modified Files:
        src/common/lib/libc/arch/arm/gen: __aeabi_idiv0.c __aeabi_ldiv0.c
            divide.S divsi3.S
        src/common/lib/libc/arch/arm/quad: __aeabi_ldivmod.S __aeabi_uldivmod.S

Log Message:
When using EABI, call __aeabi_{i,l}div0 when diving by 0.


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/common/lib/libc/arch/arm/gen/__aeabi_idiv0.c \
    src/common/lib/libc/arch/arm/gen/__aeabi_ldiv0.c \
    src/common/lib/libc/arch/arm/gen/divide.S
cvs rdiff -u -r1.4 -r1.5 src/common/lib/libc/arch/arm/gen/divsi3.S
cvs rdiff -u -r1.4 -r1.5 src/common/lib/libc/arch/arm/quad/__aeabi_ldivmod.S \
    src/common/lib/libc/arch/arm/quad/__aeabi_uldivmod.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/__aeabi_idiv0.c
diff -u src/common/lib/libc/arch/arm/gen/__aeabi_idiv0.c:1.1 src/common/lib/libc/arch/arm/gen/__aeabi_idiv0.c:1.2
--- src/common/lib/libc/arch/arm/gen/__aeabi_idiv0.c:1.1	Wed Jan 23 07:38:19 2013
+++ src/common/lib/libc/arch/arm/gen/__aeabi_idiv0.c	Wed May  8 05:13:56 2013
@@ -29,9 +29,9 @@
 
 #include <sys/cdefs.h>
 
-__RCSID("$NetBSD: __aeabi_idiv0.c,v 1.1 2013/01/23 07:38:19 matt Exp $");
+__RCSID("$NetBSD: __aeabi_idiv0.c,v 1.2 2013/05/08 05:13:56 matt Exp $");
 
-#if !defined(_KERNEL)
+#if !defined(_KERNEL) && !defined(_STANDALONE)
 #include <string.h>
 #include <unistd.h>
 #include <sys/types.h>
@@ -44,8 +44,7 @@ __RCSID("$NetBSD: __aeabi_idiv0.c,v 1.1 
 int
 __aeabi_idiv0(int result)
 {
-#ifdef _KERNEL
-#else
+#if !defined(_KERNEL) || !defined(_STANDALONE)
 	siginfo_t info;
 	
 	memset(&info, 0, sizeof info);
Index: src/common/lib/libc/arch/arm/gen/__aeabi_ldiv0.c
diff -u src/common/lib/libc/arch/arm/gen/__aeabi_ldiv0.c:1.1 src/common/lib/libc/arch/arm/gen/__aeabi_ldiv0.c:1.2
--- src/common/lib/libc/arch/arm/gen/__aeabi_ldiv0.c:1.1	Wed Jan 23 07:38:19 2013
+++ src/common/lib/libc/arch/arm/gen/__aeabi_ldiv0.c	Wed May  8 05:13:56 2013
@@ -29,9 +29,9 @@
 
 #include <sys/cdefs.h>
 
-__RCSID("$NetBSD: __aeabi_ldiv0.c,v 1.1 2013/01/23 07:38:19 matt Exp $");
+__RCSID("$NetBSD: __aeabi_ldiv0.c,v 1.2 2013/05/08 05:13:56 matt Exp $");
 
-#if !defined(_KERNEL)
+#if !defined(_KERNEL) && !defined(_STANDALONE)
 #include <string.h>
 #include <unistd.h>
 #include <sys/types.h>
@@ -44,8 +44,7 @@ __RCSID("$NetBSD: __aeabi_ldiv0.c,v 1.1 
 long long
 __aeabi_ldiv0(long long result)
 {
-#ifdef _KERNEL
-#else
+#if !defined(_KERNEL) && !defined(_STANDALONE)
 	siginfo_t info;
 	
 	memset(&info, 0, sizeof info);
Index: src/common/lib/libc/arch/arm/gen/divide.S
diff -u src/common/lib/libc/arch/arm/gen/divide.S:1.1 src/common/lib/libc/arch/arm/gen/divide.S:1.2
--- src/common/lib/libc/arch/arm/gen/divide.S:1.1	Tue Oct 30 12:42:13 2012
+++ src/common/lib/libc/arch/arm/gen/divide.S	Wed May  8 05:13:56 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: divide.S,v 1.1 2012/10/30 12:42:13 christos Exp $	*/
+/*	$NetBSD: divide.S,v 1.2 2013/05/08 05:13:56 matt Exp $	*/
 
 /*
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
@@ -23,14 +23,20 @@
 
 .L_overflow:
 #if !defined(_KERNEL) && !defined(_STANDALONE)
+#ifdef __ARM_EABI__
+	mov	r0, r1				/* return quotient */
+	b	PLT_SYM(__aeabi_idiv0)
+#else
 	mov	r0, #8			/* SIGFPE */
-	bl	PIC_SYM(_C_LABEL(raise), PLT)	/* raise it */
+	bl	PLT_SYM(_C_LABEL(raise))	/* raise it */
 	mov	r0, #0
+	RET
+#endif
 #else
 	/* XXX should cause a fatal error */
 	mvn	r0, #0
-#endif
 	RET
+#endif
 
 	.globl	__udivide
 __udivide:				/* r0 = r0 / r1; r1 = r0 % r1 */

Index: src/common/lib/libc/arch/arm/gen/divsi3.S
diff -u src/common/lib/libc/arch/arm/gen/divsi3.S:1.4 src/common/lib/libc/arch/arm/gen/divsi3.S:1.5
--- src/common/lib/libc/arch/arm/gen/divsi3.S:1.4	Tue Oct 30 12:42:13 2012
+++ src/common/lib/libc/arch/arm/gen/divsi3.S	Wed May  8 05:13:56 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: divsi3.S,v 1.4 2012/10/30 12:42:13 christos Exp $	*/
+/*	$NetBSD: divsi3.S,v 1.5 2013/05/08 05:13:56 matt Exp $	*/
 
 /*
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
@@ -18,5 +18,9 @@
 
 ENTRY_NP(__aeabi_idivmod)
 ENTRY_NP(__aeabi_idiv)
+#if defined(__ARM_EABI__) && defined(PIC_SYMVER)
+	.symver	__aeabi_idiv,__aeabi_idiv@@GCC_3.5
+	.symver	__aeabi_idivmod,__aeabi_idivmod@@GCC_3.5
+#endif
 ENTRY(__divsi3)
 	b	__divide

Index: src/common/lib/libc/arch/arm/quad/__aeabi_ldivmod.S
diff -u src/common/lib/libc/arch/arm/quad/__aeabi_ldivmod.S:1.4 src/common/lib/libc/arch/arm/quad/__aeabi_ldivmod.S:1.5
--- src/common/lib/libc/arch/arm/quad/__aeabi_ldivmod.S:1.4	Sun May  5 19:02:22 2013
+++ src/common/lib/libc/arch/arm/quad/__aeabi_ldivmod.S	Wed May  8 05:13:56 2013
@@ -29,9 +29,12 @@
 
 #include <machine/asm.h>
 
-RCSID("$NetBSD: __aeabi_ldivmod.S,v 1.4 2013/05/05 19:02:22 skrll Exp $")
+RCSID("$NetBSD: __aeabi_ldivmod.S,v 1.5 2013/05/08 05:13:56 matt Exp $")
 
 ENTRY(__aeabi_ldivmod)
+	orrs	ip, r2, r3
+	beq	.Ldivbyzero
+
 	push	{r4-r5, sl, lr}
 #define	NEG	r5
 	mov	NEG, #0
@@ -126,4 +129,15 @@ ENTRY(__aeabi_ldivmod)
 	mov	AHI, #0
 	pop	{r4-r5, sl, lr}
 	RET
+
+.Ldivbyzero:
+	push	{r0-r1, ip, lr}
+	cmps	AHI, #0
+	mvnge	ALO, #0
+	movge	AHI, ALO, lsr #1
+	movlt	ALO, #0
+	andlt	AHI, AHI, #0x800000000
+	bl	PLT_SYM(__aeabi_ldiv0)
+	pop	{r2-r3, ip, lr}
+	RET
 END(__aeabi_ldivmod)
Index: src/common/lib/libc/arch/arm/quad/__aeabi_uldivmod.S
diff -u src/common/lib/libc/arch/arm/quad/__aeabi_uldivmod.S:1.4 src/common/lib/libc/arch/arm/quad/__aeabi_uldivmod.S:1.5
--- src/common/lib/libc/arch/arm/quad/__aeabi_uldivmod.S:1.4	Sun Apr 14 17:05:11 2013
+++ src/common/lib/libc/arch/arm/quad/__aeabi_uldivmod.S	Wed May  8 05:13:56 2013
@@ -29,7 +29,7 @@
 
 #include <machine/asm.h>
 
-RCSID("$NetBSD: __aeabi_uldivmod.S,v 1.4 2013/04/14 17:05:11 skrll Exp $")
+RCSID("$NetBSD: __aeabi_uldivmod.S,v 1.5 2013/05/08 05:13:56 matt Exp $")
 
 /*
  * typedef struct { unsigned long long quo, rem } ulldiv_t;
@@ -38,6 +38,9 @@ RCSID("$NetBSD: __aeabi_uldivmod.S,v 1.4
  */
 
 ENTRY(__aeabi_uldivmod)
+	orrs	ip, r2, r3
+	beq	.Ldivbyzero
+
 	push	{r4,lr}
 	sub	sp, sp, #16
 	add	ip, sp, #8
@@ -50,4 +53,12 @@ ENTRY(__aeabi_uldivmod)
 	 */
 	pop	{r2-r4,lr}
 	RET
+
+.Ldivbyzero:
+	push	{r0-r1,ip,lr}
+	mvn	r0, #0
+	mvn	r1, #0
+	bl	PLT_SYM(__aeabi_ldiv0)
+	pop	{r2-r3,ip,lr}
+	RET
 END(__aeabi_uldivmod)

Reply via email to