Module Name:    src
Committed By:   matt
Date:           Sun Sep  8 13:24:16 UTC 2013

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

Log Message:
Support using hwdiv instructions if those are available.
But only for EABI.


To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/common/lib/libc/arch/arm/gen/divsi3.S
cvs rdiff -u -r1.5 -r1.6 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.9 src/common/lib/libc/arch/arm/gen/divsi3.S:1.10
--- src/common/lib/libc/arch/arm/gen/divsi3.S:1.9	Thu Sep  5 05:16:08 2013
+++ src/common/lib/libc/arch/arm/gen/divsi3.S	Sun Sep  8 13:24:16 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: divsi3.S,v 1.9 2013/09/05 05:16:08 matt Exp $	*/
+/*	$NetBSD: divsi3.S,v 1.10 2013/09/08 13:24:16 matt Exp $	*/
 
 /*
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
@@ -16,7 +16,11 @@
 
 #include <machine/asm.h>
 
+#if defined(__thumb__) && !defined(_ARM_ARCH_T2)
+ARM_ENTRY(__divsi3)
+#else
 ENTRY(__divsi3)
+#endif
 #if defined(__ARM_ARCH_EXT_IDIV__)
 # if defined(__ARM_EABI__)
 	mov	r3, r0		@ save for mls
@@ -26,25 +30,38 @@ ENTRY(__divsi3)
 	mls	r1, r0, r1, r3	@ return modulus in r1
 # endif
 	RET
-#elif !defined(__thumb__) || defined(_ARM_ARCH_T2)
-	b	__divide
+#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
-#if defined(__ARM_EABI__) && defined(__UNWIND_TABLES__)
-	.fnstart
-	.cfi_startproc
-#endif
-	push	{r4, lr}
-#if defined(__ARM_EABI__) && defined(__UNWIND_TABLES__)
-	.cfi_def_cfa_offset 8
-	.cfi_offset 14, -4
-	.cfi_offset 4, -8
-#endif
-	bl	__divide
-	pop	{r4, pc}
-#if defined(__ARM_EABI__) && defined(__UNWIND_TABLES__)
-	.cfi_endproc
-	.fnend
+	ldr	r2, .Lhwdiv_present
 #endif
+# ifdef PIC
+	add	r2, r2, pc
+# endif
+	ldr	r2, [r2]
+.LPIC0:	cmp	r2, #0
+	beq	__divide
+	mov	r3, r0
+#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)
+	.inst.w	0xfb90f0f1
+	.inst.w	0xfb003111
+#else
+	.inst	0xe710f110
+	.inst	0xe0613190
+#endif
+	RET
+#ifndef _ARM_ARCH_7
+	.align	0
+.Lhwdiv_present:
+	.word	REL_SYM(__libc_arm_hwdiv_present, .LPIC0)
+#endif
+#else /* !__ARM_EABI__ */
+	b	__divide
 #endif
 END(__divsi3)
 

Index: src/common/lib/libc/arch/arm/gen/udivsi3.S
diff -u src/common/lib/libc/arch/arm/gen/udivsi3.S:1.5 src/common/lib/libc/arch/arm/gen/udivsi3.S:1.6
--- src/common/lib/libc/arch/arm/gen/udivsi3.S:1.5	Thu Sep  5 05:16:08 2013
+++ src/common/lib/libc/arch/arm/gen/udivsi3.S	Sun Sep  8 13:24:16 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: udivsi3.S,v 1.5 2013/09/05 05:16:08 matt Exp $	*/
+/*	$NetBSD: udivsi3.S,v 1.6 2013/09/08 13:24:16 matt Exp $	*/
 
 /*
  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
@@ -16,7 +16,11 @@
 
 #include <machine/asm.h>
 
+#if defined(__ARM_EABI__) && defined(__thumb__) && !defined(_ARM_ARCH_T2)
+ARM_ENTRY(__udivsi3)
+#else
 ENTRY(__udivsi3)
+#endif
 #if defined(__ARM_ARCH_EXT_IDIV__)
 # if defined(__ARM_EABI__)
 	mov	r3, r0		@ save for mls
@@ -26,26 +30,38 @@ ENTRY(__udivsi3)
 	mls	r1, r0, r1, r3	@ return modulus in r1
 # endif
 	RET
-#elif !defined(__thumb__) || defined(_ARM_ARCH_T2)
-	b	__udivide
+#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
+	ldr	r2, .Lhwdiv_present
+#endif
+#ifdef PIC
+	add	r2, r2, pc
+#endif
+	ldr	r2, [r2]
+.LPIC0:	cmp	r2, #0
+	beq	__udivide
+	mov	r3, r0
+#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)
+	.inst.w 0xfbb0f0f1
+	.inst.w	0xfb003111
 #else
-#if defined(__ARM_EABI__) && defined(__UNWIND_TABLES__)
-	.fnstart
-	.cfi_startproc
-#endif
-	push	{r4, lr}
-#if defined(__ARM_EABI__) && defined(__UNWIND_TABLES__)
-	.save	{r4, lr}
-	.cfi_def_cfa_offset 8
-	.cfi_offset 14, -4
-	.cfi_offset 4, -8
-#endif
-	bl	__udivide
-	pop	{r4, pc}
-#if defined(__ARM_EABI__) && defined(__UNWIND_TABLES__)
-	.cfi_endproc
-	.fnend
+	.inst	0xe730f110
+	.inst	0xe0613190
+#endif
+	RET
+#ifndef _ARM_ARCH_7
+	.align 0
+.Lhwdiv_present:
+	.word	REL_SYM(__libc_arm_hwdiv_present, .LPIC0)
 #endif
+#else
+	b	__udivide
 #endif
 END(__udivsi3)
 

Reply via email to