From fc449cfc7cf6905f319c99ebfbbb699cd5f4a301 Mon Sep 17 00:00:00 2001
From: Haavard Skinnemoen <hskinnemoen@atmel.com>
Date: Mon, 7 Aug 2006 10:18:10 +0200
Subject: [PATCH] Kill insert/extract instructions from string operations

insert.{b,h}/extract.{b,h} are leftovers from an older instruction set
specification. They have been replaced with bfins, bfextu and bfexts.
---
 libc/string/avr32/memchr.S  |   10 +++++-----
 libc/string/avr32/memset.S  |    4 ++--
 libc/string/avr32/strcat.S  |   15 +++++++--------
 libc/string/avr32/strcmp.S  |   16 ++++++++--------
 libc/string/avr32/strcpy.S  |    9 ++++-----
 libc/string/avr32/strlen.S  |    6 +++---
 libc/string/avr32/strncpy.S |    9 ++++-----
 7 files changed, 33 insertions(+), 36 deletions(-)

diff --git a/libc/string/avr32/memchr.S b/libc/string/avr32/memchr.S
index 1f6f621..096d185 100644
--- a/libc/string/avr32/memchr.S
+++ b/libc/string/avr32/memchr.S
@@ -10,8 +10,8 @@ #define len r10
 	.global memchr
 	.type	memchr, @function
 memchr:
-	insert.b chr:l, chr
-	insert.h chr:t, chr
+	or	chr, chr, chr << 8
+	or	chr, chr, chr << 16
 
 	mov	r9, str
 	andl	r9, 3, COH
@@ -25,15 +25,15 @@ memchr:
 	brne	1b
 
 	sub	str, 4
-	extract.b r9, r8:t
+	bfextu	r9, r8, 24, 8
 	cp.b	r9, r11
 	reteq	str
 	sub	str, -1
-	extract.b r9, r8:u
+	bfextu	r9, r8, 16, 8
 	cp.b	r9, r11
 	reteq	str
 	sub	str, -1
-	extract.b r9, r8:l
+	bfextu	r9, r8, 8, 8
 	cp.b	r9, r11
 	reteq	str
 	sub	str, -1
diff --git a/libc/string/avr32/memset.S b/libc/string/avr32/memset.S
index b9cd794..9ccfb06 100644
--- a/libc/string/avr32/memset.S
+++ b/libc/string/avr32/memset.S
@@ -26,9 +26,9 @@ memset:
 .Llarge_memset:
 	mov	r8, r11
 	mov	r11, 3
-	insert.b r8:l, r8
+	or	r8, r8, r8 << 8
+	or	r8, r8, r8 << 16
 	tst	s, r11
-	insert.h r8:t, r8
 	breq	2f
 
 1:	st.b	s++, r8
diff --git a/libc/string/avr32/strcat.S b/libc/string/avr32/strcat.S
index 152203d..c12812a 100644
--- a/libc/string/avr32/strcat.S
+++ b/libc/string/avr32/strcat.S
@@ -36,15 +36,15 @@ strcat:
 
 	sub	s1, 4
 
-	extract.b r10, r8:t
+	bfextu	r10, r8, 24, 8
 	cp.w	r10, 0
 	breq	1f
 	sub	s1, -1
-	extract.b r10, r8:u
+	bfextu	r10, r8, 16, 8
 	cp.w	r10, 0
 	breq	2f
 	sub	s1, -1
-	extract.b r10, r8:l
+	bfextu	r10, r8, 8, 8
 	cp.w	r10, 0
 	breq	3f
 	sub	s1, -1
@@ -78,19 +78,18 @@ strcat:
 	brne	1b
 
 	/* Copy the remaining bytes */
-	extract.b r10, r8:t
+	bfextu	r10, r8, 24, 8
 	st.b	s1++, r10
 	cp.w	r10, 0
 	reteq	r12
-	extract.b r10, r8:u
+	bfextu	r10, r8, 16, 8
 	st.b	s1++, r10
 	cp.w	r10, 0
 	reteq	r12
-	extract.b r10, r8:l
+	bfextu	r10, r8, 8, 8
 	st.b	s1++, r10
 	cp.w	r10, 0
 	reteq	r12
-	extract.b r10, r8:b
-	st.b	s1++, r10
+	st.b	s1++, r8
 	retal	r12
 	.size	strcat, . - strcat
diff --git a/libc/string/avr32/strcmp.S b/libc/string/avr32/strcmp.S
index cc6e29e..2b729c6 100644
--- a/libc/string/avr32/strcmp.S
+++ b/libc/string/avr32/strcmp.S
@@ -25,26 +25,26 @@ strcmp:
 	brne	1b
 	retal	0
 
-2:	extract.b r12, r8:t
-	extract.b r11, r9:t
+2:	bfextu	r12, r8, 24, 8
+	bfextu	r11, r9, 24, 8
 	sub	r12, r11
 	retne	r12
 	cp.w	r11, 0
 	reteq	0
-	extract.b r12, r8:u
-	extract.b r11, r9:u
+	bfextu	r12, r8, 16, 8
+	bfextu	r11, r9, 16, 8
 	sub	r12, r11
 	retne	r12
 	cp.w	r11, 0
 	reteq	0
-	extract.b r12, r8:l
-	extract.b r11, r9:l
+	bfextu	r12, r8, 8, 8
+	bfextu	r11, r9, 8, 8
 	sub	r12, r11
 	retne	r12
 	cp.w	r11, 0
 	reteq	0
-	extract.b r12, r8:b
-	extract.b r11, r9:b
+	bfextu	r12, r8, 0, 8
+	bfextu	r11, r9, 0, 8
 	sub	r12, r11
 	retal	r12
 
diff --git a/libc/string/avr32/strcpy.S b/libc/string/avr32/strcpy.S
index 2549712..0e157c7 100644
--- a/libc/string/avr32/strcpy.S
+++ b/libc/string/avr32/strcpy.S
@@ -34,20 +34,19 @@ strcpy:
 	 * Ok, r8 now contains the terminating '\0'. Copy the
 	 * remaining bytes individually.
 	 */
-	extract.b r10, r8:t
+	bfextu	r10, r8, 24, 8
 	st.b	dst++, r10
 	cp.w	r10, 0
 	reteq	r12
-	extract.b r10, r8:u
+	bfextu	r10, r8, 16, 8
 	st.b	dst++, r10
 	cp.w	r10, 0
 	reteq	r12
-	extract.b r10, r8:l
+	bfextu	r10, r8, 8, 8
 	st.b	dst++, r10
 	cp.w	r10, 0
 	reteq	r12
-	extract.b r10, r8:b
-	st.b	dst++, r10
+	st.b	dst++, r8
 	retal	r12
 
 .Lunaligned_src:
diff --git a/libc/string/avr32/strlen.S b/libc/string/avr32/strlen.S
index 375c72e..1d09444 100644
--- a/libc/string/avr32/strlen.S
+++ b/libc/string/avr32/strlen.S
@@ -19,15 +19,15 @@ strlen:
 	brne	1b
 
 	sub	r12, r11
-	extract.b r9, r8:t
+	bfextu	r9, r8, 24, 8
 	cp.w	r9, 0
 	subeq	r12, 4
 	reteq	r12
-	extract.b r9, r8:u
+	bfextu	r9, r8, 16, 8
 	cp.w	r9, 0
 	subeq	r12, 3
 	reteq	r12
-	extract.b r9, r8:l
+	bfextu	r9, r8, 8, 8
 	cp.w	r9, 0
 	subeq	r12, 2
 	reteq	r12
diff --git a/libc/string/avr32/strncpy.S b/libc/string/avr32/strncpy.S
index fce60c8..95aed0d 100644
--- a/libc/string/avr32/strncpy.S
+++ b/libc/string/avr32/strncpy.S
@@ -42,26 +42,25 @@ strncpy:
 	 * Ok, r8 now contains the terminating '\0'. Copy the
 	 * remaining bytes individually.
 	 */
-	extract.b r11, r8:t
+	bfextu	r11, r8, 24, 8
 	st.b	dst++, r11
 	cp.w	r11, 0
 	reteq	r12
 	sub	r10, 1
 	reteq	r12
-	extract.b r11, r8:u
+	bfextu	r11, r8, 16, 8
 	st.b	dst++, r11
 	cp.w	r11, 0
 	reteq	r12
 	sub	r10, 1
 	reteq	r12
-	extract.b r11, r8:l
+	bfextu	r11, r8, 8, 8
 	st.b	dst++, r11
 	cp.w	r11, 0
 	reteq	r12
 	sub	r10, 1
 	reteq	r12
-	extract.b r10, r8:b
-	st.b	dst++, r10
+	st.b	dst++, r8
 	retal	r12
 
 .Lunaligned_src:
-- 
1.4.0

