Module Name:    src
Committed By:   matt
Date:           Thu Jun 20 07:16:23 UTC 2013

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

Log Message:
Add support for __ARM_ARCH_EXT_IDIV__ which is set for those cores
with hardware divide instructions.  Note that gcc 4.5.x doesn't support
this so this is just latent.  gcc 4.7.x does.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/common/lib/libc/arch/arm/gen/divide.S \
    src/common/lib/libc/arch/arm/gen/modsi3.S \
    src/common/lib/libc/arch/arm/gen/umodsi3.S
cvs rdiff -u -r1.5 -r1.6 src/common/lib/libc/arch/arm/gen/divsi3.S
cvs rdiff -u -r1.1 -r1.2 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/divide.S
diff -u src/common/lib/libc/arch/arm/gen/divide.S:1.2 src/common/lib/libc/arch/arm/gen/divide.S:1.3
--- src/common/lib/libc/arch/arm/gen/divide.S:1.2	Wed May  8 05:13:56 2013
+++ src/common/lib/libc/arch/arm/gen/divide.S	Thu Jun 20 07:16:23 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: divide.S,v 1.2 2013/05/08 05:13:56 matt Exp $	*/
+/*	$NetBSD: divide.S,v 1.3 2013/06/20 07:16:23 matt Exp $	*/
 
 /*
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
@@ -14,6 +14,8 @@
  * SUCH DAMAGE.
  */
 
+#ifndef __ARM_ARCH_EXT_IDIV__
+
 #include <machine/asm.h>
 
 /* 
@@ -374,3 +376,5 @@ __divide:				/* r0 = r0 / r1; r1 = r0 % 
 	addhs	r3, r3, r2
 	mov	r0, r3
 	RET
+
+#endif /* __ARM_ARCH_EXT_IDIV__ */
Index: src/common/lib/libc/arch/arm/gen/modsi3.S
diff -u src/common/lib/libc/arch/arm/gen/modsi3.S:1.2 src/common/lib/libc/arch/arm/gen/modsi3.S:1.3
--- src/common/lib/libc/arch/arm/gen/modsi3.S:1.2	Wed Nov 28 01:35:05 2012
+++ src/common/lib/libc/arch/arm/gen/modsi3.S	Thu Jun 20 07:16:23 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: modsi3.S,v 1.2 2012/11/28 01:35:05 matt Exp $	*/
+/*	$NetBSD: modsi3.S,v 1.3 2013/06/20 07:16:23 matt Exp $	*/
 
 /*
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
@@ -22,9 +22,14 @@
  */
 
 ENTRY(__modsi3)
+#ifdef __ARM_ARCH_EXT_IDIV__
+	sdiv	r3, r0, r1
+	mls	r0, r3, r1, r0
+#else
 	str	lr, [sp, #-8]!	/* push lr */
 	bl	PIC_SYM(__divsi3, PLT)
 	mov	r0, r1
 	ldr	lr, [sp], #8	/* pop lr */
+#endif
 	RET
 END(__modsi3)
Index: src/common/lib/libc/arch/arm/gen/umodsi3.S
diff -u src/common/lib/libc/arch/arm/gen/umodsi3.S:1.2 src/common/lib/libc/arch/arm/gen/umodsi3.S:1.3
--- src/common/lib/libc/arch/arm/gen/umodsi3.S:1.2	Wed Nov 28 01:35:05 2012
+++ src/common/lib/libc/arch/arm/gen/umodsi3.S	Thu Jun 20 07:16:23 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: umodsi3.S,v 1.2 2012/11/28 01:35:05 matt Exp $	*/
+/*	$NetBSD: umodsi3.S,v 1.3 2013/06/20 07:16:23 matt Exp $	*/
 
 /*
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
@@ -22,8 +22,13 @@
  */
 
 ENTRY(__umodsi3)
+#ifdef __ARM_ARCH_EXT_IDIV__
+	udiv	r3, r0, r1
+	mls	r0, r3, r1, r0
+#else
 	str	lr, [sp, #-8]!	/* push lr */
 	bl	PIC_SYM(__udivsi3, PLT)
 	mov	r0, r1
 	ldr	lr, [sp], #8	/* pop lr */
+#endif
 	RET

Index: src/common/lib/libc/arch/arm/gen/divsi3.S
diff -u src/common/lib/libc/arch/arm/gen/divsi3.S:1.5 src/common/lib/libc/arch/arm/gen/divsi3.S:1.6
--- src/common/lib/libc/arch/arm/gen/divsi3.S:1.5	Wed May  8 05:13:56 2013
+++ src/common/lib/libc/arch/arm/gen/divsi3.S	Thu Jun 20 07:16:23 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: divsi3.S,v 1.5 2013/05/08 05:13:56 matt Exp $	*/
+/*	$NetBSD: divsi3.S,v 1.6 2013/06/20 07:16:23 matt Exp $	*/
 
 /*
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
@@ -23,4 +23,15 @@ ENTRY_NP(__aeabi_idiv)
 	.symver	__aeabi_idivmod,__aeabi_idivmod@@GCC_3.5
 #endif
 ENTRY(__divsi3)
+#if defined(__ARM_ARCH_EXT_IDIV__)
+# if defined(__ARM_EABI__)
+	mov	r3, r0		@ save for mls
+# endif
+	sdiv	r0, r0, r1
+# if defined(__ARM_EABI__)
+	mls	r1, r0, r1, r3	@ return modulus in r1
+# endif
+	RET
+#else
 	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.1 src/common/lib/libc/arch/arm/gen/udivsi3.S:1.2
--- src/common/lib/libc/arch/arm/gen/udivsi3.S:1.1	Tue Oct 30 12:42:13 2012
+++ src/common/lib/libc/arch/arm/gen/udivsi3.S	Thu Jun 20 07:16:23 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: udivsi3.S,v 1.1 2012/10/30 12:42:13 christos Exp $	*/
+/*	$NetBSD: udivsi3.S,v 1.2 2013/06/20 07:16:23 matt Exp $	*/
 
 /*
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
@@ -20,4 +20,15 @@
 ENTRY_NP(__aeabi_uidivmod)
 ENTRY_NP(__aeabi_uidiv)
 ENTRY(__udivsi3)
+#if defined(__ARM_ARCH_EXT_IDIV__)
+# if defined(__ARM_EABI__)
+	mov	r3, r0		@ save for mls
+# endif
+	udiv	r0, r0, r1
+# if defined(__ARM_EABI__)
+	mls	r1, r0, r1, r3	@ return modulus in r1
+# endif
+	RET
+#else
 	b	__udivide
+#endif

Reply via email to