Module Name:    src
Committed By:   matt
Date:           Mon Aug 19 03:27:34 UTC 2013

Modified Files:
        src/common/lib/libc/arch/arm/quad: __aeabi_ldivmod.S

Log Message:
Add cfi ops.
Thumbify


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 \
    src/common/lib/libc/arch/arm/quad/__aeabi_ldivmod.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/quad/__aeabi_ldivmod.S
diff -u src/common/lib/libc/arch/arm/quad/__aeabi_ldivmod.S:1.11 src/common/lib/libc/arch/arm/quad/__aeabi_ldivmod.S:1.12
--- src/common/lib/libc/arch/arm/quad/__aeabi_ldivmod.S:1.11	Tue Aug 13 15:52:00 2013
+++ src/common/lib/libc/arch/arm/quad/__aeabi_ldivmod.S	Mon Aug 19 03:27:34 2013
@@ -29,17 +29,7 @@
 
 #include <machine/asm.h>
 
-RCSID("$NetBSD: __aeabi_ldivmod.S,v 1.11 2013/08/13 15:52:00 matt Exp $")
-
-ENTRY(__aeabi_ldivmod)
-#if !defined(_KERNEL) && !defined(_STANDALONE)
-	orrs	ip, r2, r3
-	beq	.Ldivbyzero
-#endif
-
-	push	{r4-r5, sl, lr}
-#define	NEG	r5
-	mov	NEG, #0
+RCSID("$NetBSD: __aeabi_ldivmod.S,v 1.12 2013/08/19 03:27:34 matt Exp $")
 
 #ifdef __ARMEB__
 #define	ALO	r1	/* incoming numerator, outgoing quotient */
@@ -53,54 +43,135 @@ ENTRY(__aeabi_ldivmod)
 #define	BHI	r3	/* incoming denominator, outgoing remainder */
 #endif
 
+ENTRY(__aeabi_ldivmod)
+#ifdef __ARM_EABI__
+	.fnstart
+	.cfi_startproc
+#endif
+#if !defined(_KERNEL) && !defined(_STANDALONE)
+#if !defined(__thumb__)
+	orrs	ip, BLO, BHI
+	beq	.Ldivbyzero
+#elif defined(_ARM_ARCH_T2)
+	cbnz	BLO, 1f
+	cbz	BHI, .Ldivbyzero
+#else
+	cmp	BLO, #0
+	bne	1f
+	cmp	BHI, #0
+	beq	.Ldivbyzero
+#endif
+1:
+#endif
+
+	push	{r4-r6, lr}
+#ifdef __ARM_EABI__
+	.cfi_def_cfa_offset 16
+	.cfi_offset 14, -4
+	.cfi_offset 6, -8
+	.cfi_offset 5, -12
+	.cfi_offset 4, -16
+#endif
+#define	NEG	r5
+	movs	NEG, #0
+
 	cmp	BHI, #0
 	bge	2f
-	eor	NEG, NEG, #1	/* flip quotient sign */
+	movs	NEG, #1		/* flip quotient sign */
 	bl	.Lnegate_b
 	bcs	.Lmaxdenom
 
 2:
 	cmp	AHI, #0
-	/* bge	3f */
+#ifdef __thumb__
+	bge	3f
+	movs	r4, #3
+	eors	NEG, NEG, r4	/* flip quotient sign, flip remainder sign */
+	bl	.Lnegate_a
+3:
+#else
 	eorlt	NEG, NEG, #3	/* flip quotient sign, flip remainder sign */
 	bllt	.Lnegate_a
-3:
+#endif
+
 	/*
 	 * Arguments are setup, allocate some stack for the remainder
 	 * and call __qdivrem for the heavy lifting.
 	 */
+#ifdef __ARM_EABI__
+	.cfi_def_cfa_offset 32
+#endif
 	sub	sp, sp, #16
-	add	ip, sp, #8
-	str	ip, [sp]
+#if !defined(__thumb__) || defined(_ARM_ARCH_T2)
+	adds	r4, sp, #8
+#else
+	mov	r4, sp
+	adds	r4, r4, #8
+#endif
+	str	r4, [sp]
 	bl	PLT_SYM(__qdivrem)
 	add	sp, sp, #8
+#ifdef __ARM_EABI__
+	.cfi_def_cfa_offset 24
+	.cfi_offset 3, -20
+	.cfi_offset 2, -24
+#endif
 
-	teq	NEG, #0		/* any signs to flip? */
 	/*
 	 * The quotient is already in the right place and neither value
 	 * needs its sign flipped.
 	 */
-	popeq	{r2-r5, sl, lr}
-	RETc(eq)
+#if defined(__thumb__) && defined(_ARM_ARCH_T2)
+	cbz	NEG, .Lnegate_neither
+#else
+	cmp	NEG, #0		/* any signs to flip? */
+	beq	.Lnegate_neither
+#endif
 
-	pop	{r2, r3}
-	tst	NEG, #2		/* does remainder need to be negative? */
-	blne	.Lnegate_b
-	tst	NEG, #1		/* does quotient need to be negative? */
-	blne	.Lnegate_a
-	pop	{r4-r5, sl, lr}
-	RET
+	cmp	NEG, #2		/* does remainder need to be negative? */
+	beq	.Lnegate_b_only	/* 2 means b only */
+	bgt	.Lnegate_both	/* 3 means both */
+.Lnegate_a_only:
+	bl	.Lnegate_a	/* 1 means a only */
+.Lnegate_neither:
+	pop	{r2-r6, pc}	/* grab b from stack */
+.Lnegate_both:
+	bl	.Lnegate_a
+.Lnegate_b_only:
+	pop	{r2-r3}		/* get remainder */
+#ifdef __ARM_EABI__
+	.cfi_def_cfa_offset 16
+#endif
+	bl	.Lnegate_b	/* negate it */
+	pop	{r4-r6, pc}
 
+	.align	0
 .Lnegate_a:
-        rsbs	ALO, ALO, #0
-        rsc	AHI, AHI, #0
+#ifdef __thumb__
+	movs	r4, AHI
+	movs	AHI, #0
+	negs	ALO, ALO
+	sbcs	AHI, AHI, r4
+#else
+	negs	ALO, ALO
+	rsc	AHI, AHI, #0
+#endif
 	RET
 
+	.align	0
 .Lnegate_b:
-        rsbs	BLO, BLO, #0
-        rsc	BHI, BHI, #0
+#ifdef __thumb__
+	movs	r4, BHI
+	movs	BHI, #0
+	negs	BLO, BLO
+	sbcs	BHI, BHI, r4
+#else
+	negs	BLO, BLO
+	rsc	BHI, BHI, #0
+#endif
 	RET
 
+	.align	0
 .Lmaxdenom:
 	/*
 	 * We had a carry so the denominator must have INT64_MIN
@@ -108,40 +179,71 @@ ENTRY(__aeabi_ldivmod)
 	 * them to see if the numerator has the same value.  We
 	 * don't have to worry about sign.
 	 */
-	teq	BHI, AHI
-	teqeq	BLO, ALO
+	cmp	BHI, AHI
+#ifdef __thumb__
+	bne	1f
+	cmp	BLO, ALO
+#else
+	cmpeq	BLO, ALO
+#endif
 	bne	1f
 
 	/*
 	 * They were equal, so we return a quotient of 1 and remainder of 0.
 	 */
-	mov	ALO, #1
-	mov	AHI, #0
-	mov	BLO, #0
-	mov	BHI, #0
-	pop	{r4-r5, sl, lr}
-	RET
+	movs	ALO, #1
+	movs	AHI, #0
+	movs	BLO, #0
+	movs	BHI, #0
+	pop	{r4-r6, pc}
 
 	/*
 	 * Our remainder must be the numerator and our quotient is 0.
 	 */
-1:	mov	BLO, ALO
-	mov	BHI, AHI
-	mov	ALO, #0
-	mov	AHI, #0
-	pop	{r4-r5, sl, lr}
-	RET
+	.align	0
+1:	movs	BLO, ALO
+	movs	BHI, AHI
+	movs	ALO, #0
+	movs	AHI, #0
+	pop	{r4-r6, pc}
 
 #if !defined(_KERNEL) && !defined(_STANDALONE)
+	.align	0
 .Ldivbyzero:
-	push	{r0-r1, ip, lr}
+	push	{r0-r1,r4,lr}	
+#ifdef __ARM_EABI__
+	.save	{r0-r1,r4,lr}	
+	.cfi_def_cfa_offset 16
+	.cfi_offset 14, -4
+	.cfi_offset  4, -8
+#endif
 	cmp	AHI, #0
+#if !defined(__thumb__) || defined(_ARM_ARCH_T2)
+#ifdef __thumb__
+	ittee	ge
+#endif
 	mvnge	ALO, #0
-	mvnlt	AHI, #0x80000000
+	mvnge	AHI, #0x80000000
 	movlt	ALO, #0
 	movlt	AHI, #0x80000000
+#else
+	blt	1f
+	movs	ALO, #0
+	mvns	ALO, ALO
+	mov	AHI, ALO
+	lsrs	AHI, AHI, #1
+	b	2f
+1:
+	movs	ALO, #0
+	movs	AHI, #1
+	lsls	AHI, AHI, #31
+2:
+#endif /* __thumb__ && !_ARM_ARCH_T2 */
 	bl	PLT_SYM(__aeabi_ldiv0)
-	pop	{r2-r3, ip, lr}
-	RET
+	pop	{r2-r4, pc}
+#endif	/* !_KERNEL && !_STANDALONE */
+#ifdef __ARM_EABI__
+	.cfi_endproc
+	.fnend
 #endif
 END(__aeabi_ldivmod)

Reply via email to