Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 31 May 2015 14:04:11 +0000 (UTC)
From:      Andrew Turner <andrew@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r283831 - head/lib/libc/arm/string
Message-ID:  <201505311404.t4VE4BAF065678@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: andrew
Date: Sun May 31 14:04:11 2015
New Revision: 283831
URL: https://svnweb.freebsd.org/changeset/base/283831

Log:
  Add the needed if-then instructions to build as Thumb-2.

Modified:
  head/lib/libc/arm/string/ffs.S
  head/lib/libc/arm/string/memmove.S
  head/lib/libc/arm/string/memset.S
  head/lib/libc/arm/string/strcmp.S
  head/lib/libc/arm/string/strlen.S
  head/lib/libc/arm/string/strncmp.S

Modified: head/lib/libc/arm/string/ffs.S
==============================================================================
--- head/lib/libc/arm/string/ffs.S	Sun May 31 13:07:22 2015	(r283830)
+++ head/lib/libc/arm/string/ffs.S	Sun May 31 14:04:11 2015	(r283831)
@@ -78,6 +78,7 @@ ENTRY(ffs)
 	.byte	31,  0,  0,  0,  0, 24,  0, 20  /* 48-55 */
 	.byte   30,  0, 23, 19, 29, 18, 17,  0  /* 56-63 */
 #else
+	itt	ne
 	clzne	r0, r0
 	rsbne	r0, r0, #32
 	RET

Modified: head/lib/libc/arm/string/memmove.S
==============================================================================
--- head/lib/libc/arm/string/memmove.S	Sun May 31 13:07:22 2015	(r283830)
+++ head/lib/libc/arm/string/memmove.S	Sun May 31 14:04:11 2015	(r283831)
@@ -48,7 +48,9 @@ ENTRY(bcopy)
 #endif
 	/* Do the buffers overlap? */
 	cmp	r0, r1
+	it	eq
 	RETeq		/* Bail now if src/dst are the same */
+	ite	cc
 	subcc	r3, r0, r1	/* if (dst > src) r3 = dst - src */
 	subcs	r3, r1, r0	/* if (src > dsr) r3 = src - dst */
 	cmp	r3, r2		/* if (r3 < len) we have an overlap */
@@ -56,8 +58,10 @@ ENTRY(bcopy)
 
 	/* Determine copy direction */
 	cmp	r1, r0
+	it	cc
 	bcc	.Lmemmove_backwards
 
+	itt	eq
 	moveq	r0, #0			/* Quick abort for len=0 */
 	RETeq
 
@@ -88,6 +92,7 @@ ENTRY(bcopy)
 	bge	.Lmemmove_floop32
 
 	cmn	r2, #0x10
+	ittt	ge
 	ldmiage	r1!, {r3, r4, r12, lr}	/* blat a remaining 16 bytes */
 	stmiage	r0!, {r3, r4, r12, lr}
 	subge	r2, r2, #0x10         
@@ -98,6 +103,7 @@ ENTRY(bcopy)
 
 	/* blat 12 bytes at a time */
 .Lmemmove_floop12:
+	ittt	ge
 	ldmiage	r1!, {r3, r12, lr}
 	stmiage	r0!, {r3, r12, lr}
 	subsge	r2, r2, #0x0c         
@@ -108,8 +114,10 @@ ENTRY(bcopy)
 	blt	.Lmemmove_fl4
 
 	subs	r2, r2, #4
+	itt	lt
 	ldrlt	r3, [r1], #4
 	strlt	r3, [r0], #4
+	ittt	ge
 	ldmiage	r1!, {r3, r12}
 	stmiage	r0!, {r3, r12}
 	subge	r2, r2, #4
@@ -117,14 +125,17 @@ ENTRY(bcopy)
 .Lmemmove_fl4:
 	/* less than 4 bytes to go */
 	adds	r2, r2, #4
+	it	eq
 	ldmiaeq	sp!, {r0, pc}		/* done */
 
 	/* copy the crud byte at a time */
 	cmp	r2, #2
 	ldrb	r3, [r1], #1
 	strb	r3, [r0], #1
+	itt	ge
 	ldrbge	r3, [r1], #1
 	strbge	r3, [r0], #1
+	itt	gt
 	ldrbgt	r3, [r1], #1
 	strbgt	r3, [r0], #1
 	ldmia	sp!, {r0, pc}
@@ -137,8 +148,10 @@ ENTRY(bcopy)
 	/* align destination with byte copies */
 	ldrb	r3, [r1], #1
 	strb	r3, [r0], #1
+	itt	ge
 	ldrbge	r3, [r1], #1
 	strbge	r3, [r0], #1
+	itt	gt
 	ldrbgt	r3, [r1], #1
 	strbgt	r3, [r0], #1
 	subs	r2, r2, r12
@@ -355,10 +368,12 @@ ENTRY(bcopy)
 
 .Lmemmove_bl32:
 	cmn	r2, #0x10            
+	ittt	ge
 	ldmdbge	r1!, {r3, r4, r12, lr}	/* blat a remaining 16 bytes */
 	stmdbge	r0!, {r3, r4, r12, lr}
 	subge	r2, r2, #0x10         
 	adds	r2, r2, #0x14         
+	ittt	ge
 	ldmdbge	r1!, {r3, r12, lr}	/* blat a remaining 12 bytes */
 	stmdbge	r0!, {r3, r12, lr}
 	subge	r2, r2, #0x0c         
@@ -368,8 +383,10 @@ ENTRY(bcopy)
 	adds	r2, r2, #8
 	blt	.Lmemmove_bl4
 	subs	r2, r2, #4
+	itt	lt
 	ldrlt	r3, [r1, #-4]!
 	strlt	r3, [r0, #-4]!
+	ittt	ge
 	ldmdbge	r1!, {r3, r12}
 	stmdbge	r0!, {r3, r12}
 	subge	r2, r2, #4
@@ -377,14 +394,17 @@ ENTRY(bcopy)
 .Lmemmove_bl4:
 	/* less than 4 bytes to go */
 	adds	r2, r2, #4
+	it	eq
 	RETeq			/* done */
 
 	/* copy the crud byte at a time */
 	cmp	r2, #2
 	ldrb	r3, [r1, #-1]!
 	strb	r3, [r0, #-1]!
+	itt	ge
 	ldrbge	r3, [r1, #-1]!
 	strbge	r3, [r0, #-1]!
+	itt	gt
 	ldrbgt	r3, [r1, #-1]!
 	strbgt	r3, [r0, #-1]!
 	RET
@@ -396,8 +416,10 @@ ENTRY(bcopy)
 	/* align destination with byte copies */
 	ldrb	r3, [r1, #-1]!
 	strb	r3, [r0, #-1]!
+	itt	ge
 	ldrbge	r3, [r1, #-1]!
 	strbge	r3, [r0, #-1]!
+	itt	gt
 	ldrbgt	r3, [r1, #-1]!
 	strbgt	r3, [r0, #-1]!
 	subs	r2, r2, r12

Modified: head/lib/libc/arm/string/memset.S
==============================================================================
--- head/lib/libc/arm/string/memset.S	Sun May 31 13:07:22 2015	(r283830)
+++ head/lib/libc/arm/string/memset.S	Sun May 31 14:04:11 2015	(r283831)
@@ -114,6 +114,7 @@ ENTRY(memset)
 	orr	r3, r3, r3, lsl #16	/* Extend value to 32-bits */
 #endif
 #ifdef _ARM_ARCH_5E
+	itt	ne
 	subne	r1, r1, #0x04		/* Quad-align if necessary */
 	strne	r3, [ip], #0x04
 	cmp	r1, #0x10
@@ -127,18 +128,22 @@ ENTRY(memset)
 .Lmemset_loop128:
 	subs	r1, r1, #0x80
 #ifdef _ARM_ARCH_5E
+	itttt	ge
 	strdge	r2, [ip], #0x08
 	strdge	r2, [ip], #0x08
 	strdge	r2, [ip], #0x08
 	strdge	r2, [ip], #0x08
+	itttt	ge
 	strdge	r2, [ip], #0x08
 	strdge	r2, [ip], #0x08
 	strdge	r2, [ip], #0x08
 	strdge	r2, [ip], #0x08
+	itttt	ge
 	strdge	r2, [ip], #0x08
 	strdge	r2, [ip], #0x08
 	strdge	r2, [ip], #0x08
 	strdge	r2, [ip], #0x08
+	itttt	ge
 	strdge	r2, [ip], #0x08
 	strdge	r2, [ip], #0x08
 	strdge	r2, [ip], #0x08
@@ -162,6 +167,7 @@ ENTRY(memset)
 	stmiage	ip!, {r2-r3}
 #endif
 	bgt	.Lmemset_loop128
+	it	eq
 	RETeq			/* Zero length so just exit */
 
 	add	r1, r1, #0x80		/* Adjust for extra sub */
@@ -169,6 +175,7 @@ ENTRY(memset)
 	/* Do 32 bytes at a time */
 .Lmemset_loop32:
 	subs	r1, r1, #0x20
+	itttt	ge
 #ifdef _ARM_ARCH_5E
 	strdge	r2, [ip], #0x08
 	strdge	r2, [ip], #0x08
@@ -181,11 +188,13 @@ ENTRY(memset)
 	stmiage	ip!, {r2-r3}
 #endif
 	bgt	.Lmemset_loop32
+	it	eq
 	RETeq			/* Zero length so just exit */
 
 	adds	r1, r1, #0x10		/* Partially adjust for extra sub */
 
 	/* Deal with 16 bytes or more */
+	itt	ge
 #ifdef _ARM_ARCH_5E
 	strdge	r2, [ip], #0x08
 	strdge	r2, [ip], #0x08
@@ -193,20 +202,25 @@ ENTRY(memset)
 	stmiage	ip!, {r2-r3}
 	stmiage	ip!, {r2-r3}
 #endif
+	it	eq
 	RETeq			/* Zero length so just exit */
 
+	it	lt
 	addlt	r1, r1, #0x10		/* Possibly adjust for extra sub */
 
 	/* We have at least 4 bytes so copy as words */
 .Lmemset_loop4:
 	subs	r1, r1, #0x04
+	it	ge
 	strge	r3, [ip], #0x04
 	bgt	.Lmemset_loop4
+	it	eq
 	RETeq			/* Zero length so just exit */
 
 #ifdef _ARM_ARCH_5E
 	/* Compensate for 64-bit alignment check */
 	adds	r1, r1, #0x04
+	it	eq
 	RETeq
 	cmp	r1, #2
 #else
@@ -214,7 +228,9 @@ ENTRY(memset)
 #endif
 
 	strb	r3, [ip], #0x01		/* Set 1 byte */
+	it	ge
 	strbge	r3, [ip], #0x01		/* Set another byte */
+	it	gt
 	strbgt	r3, [ip]		/* and a third */
 	RET			/* Exit */
 
@@ -222,18 +238,24 @@ ENTRY(memset)
 	rsb	r2, r2, #0x004
 	strb	r3, [ip], #0x01		/* Set 1 byte */
 	cmp	r2, #0x02
+	it	ge
 	strbge	r3, [ip], #0x01		/* Set another byte */
 	sub	r1, r1, r2
+	it	gt
 	strbgt	r3, [ip], #0x01		/* and a third */
 	cmp	r1, #0x04		/* More than 4 bytes left? */
+	it	ge
 	bge	.Lmemset_wordaligned	/* Yup */
 
 .Lmemset_lessthanfour:
 	cmp	r1, #0x00
+	it	eq
 	RETeq			/* Zero length so exit */
 	strb	r3, [ip], #0x01		/* Set 1 byte */
 	cmp	r1, #0x02
+	it	ge
 	strbge	r3, [ip], #0x01		/* Set another byte */
+	it	gt
 	strbgt	r3, [ip]		/* and a third */
 	RET			/* Exit */
 #ifdef _BZERO

Modified: head/lib/libc/arm/string/strcmp.S
==============================================================================
--- head/lib/libc/arm/string/strcmp.S	Sun May 31 13:07:22 2015	(r283830)
+++ head/lib/libc/arm/string/strcmp.S	Sun May 31 14:04:11 2015	(r283831)
@@ -37,6 +37,7 @@ ENTRY(strcmp)
 	ldrb	r2, [r0], #1
 	ldrb	r3, [r1], #1
 	cmp	r2, #1
+	it	cs
 	cmpcs	r2, r3
 	beq	1b
 	sub	r0, r2, r3

Modified: head/lib/libc/arm/string/strlen.S
==============================================================================
--- head/lib/libc/arm/string/strlen.S	Sun May 31 13:07:22 2015	(r283830)
+++ head/lib/libc/arm/string/strlen.S	Sun May 31 14:04:11 2015	(r283831)
@@ -52,8 +52,10 @@ ENTRY(strlen)
 #else
 	ands	r3, r2, #0xff000000
 #endif
+	it	ne
 	addne	r1, r1, #1
 .Ldo_3:
+	itt	ne
 #ifndef __ARMEB__
 	andsne    r3, r2, #0x0000ff00
 #else
@@ -61,6 +63,7 @@ ENTRY(strlen)
 #endif  
 	addne     r1, r1, #1
 .Ldo_2:
+	itt	ne
 #ifndef __ARMEB__
 	andsne    r3, r2, #0x00ff0000
 #else
@@ -68,6 +71,7 @@ ENTRY(strlen)
 #endif  
 	addne	r1, r1, #1
 .Ldo_1:
+	ittt	ne
 #ifndef __ARMEB__
 	andsne	r3, r2, #0xff000000
 #else

Modified: head/lib/libc/arm/string/strncmp.S
==============================================================================
--- head/lib/libc/arm/string/strncmp.S	Sun May 31 13:07:22 2015	(r283830)
+++ head/lib/libc/arm/string/strncmp.S	Sun May 31 14:04:11 2015	(r283831)
@@ -35,18 +35,21 @@ __FBSDID("$FreeBSD$");
 ENTRY(strncmp)
 /* if (len == 0) return 0 */
 	cmp	r2, #0
+	itt	eq
 	moveq	r0, #0
 	moveq	pc, lr
 
 /* ip == last src address to compare */
 	adds	ip, r0, r2
 /* Use last possible address on overflow. */
+	it	cs
 	movcs	ip, #0
 	sub	ip, ip, #1
 1:
 	ldrb	r2, [r0], #1
 	ldrb	r3, [r1], #1
 	cmp	ip, r0
+	itt	cs
 	cmpcs	r2, #1
 	cmpcs	r2, r3
 	beq	1b



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201505311404.t4VE4BAF065678>