about summary refs log tree commit diff
path: root/sysdeps/sh/memset.S
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-01-03 09:57:28 +0000
committerUlrich Drepper <drepper@redhat.com>2003-01-03 09:57:28 +0000
commit8439150e8a3fe76e936e8b258d853633ceb2c3e2 (patch)
tree71d4a0f8f1048c34bac89b71424fb78f16478f9a /sysdeps/sh/memset.S
parent842d28175225c0e964a723603bd11736ee29334f (diff)
downloadglibc-8439150e8a3fe76e936e8b258d853633ceb2c3e2.tar.gz
glibc-8439150e8a3fe76e936e8b258d853633ceb2c3e2.tar.xz
glibc-8439150e8a3fe76e936e8b258d853633ceb2c3e2.zip
Update.
2002-07-05  Kaz Kojima  <kkojima@rr.iij4u.or.jp>

	* sysdeps/sh/memcpy.S: Optimize.  Based on a patch by Toshiyasu
	Morita <toshiyasu.morita@hsa.hitachi.com>.
	* sysdeps/sh/memcpy.S: Likewise.
Diffstat (limited to 'sysdeps/sh/memset.S')
-rw-r--r--sysdeps/sh/memset.S118
1 files changed, 63 insertions, 55 deletions
diff --git a/sysdeps/sh/memset.S b/sysdeps/sh/memset.S
index f2120a8515..12199106f2 100644
--- a/sysdeps/sh/memset.S
+++ b/sysdeps/sh/memset.S
@@ -1,6 +1,7 @@
-/* Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Kazumoto Kojima <kkojima@rr.iij4u.or.jp>
+   Optimized by Toshiyasu Morita <toshiyasu.morita@hsa.hitachi.com>
 
    The GNU C Library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
@@ -19,61 +20,68 @@
 
 #include <sysdep.h>
 
-/* void *memset (t, c, len)  */
+/* void *memset (t, c, len);  */
 
 ENTRY(memset)
-	tst	r6, r6
-	bt/s	end
-	mov	r4, r3
-	mov	#3, r0
-	cmp/hs	r6, r0
-	bt/s	2f
-	and	r4, r0
-	tst	r0, r0
-	bt/s	1f
-	add	r0, r6
-	add	#-1, r0
-	shll2	r0
-	braf	r0
-	add	#-4, r6
-
-	mov.b	r5, @r4
-	add	#1, r4
-	mov.b	r5, @r4
-	add	#1, r4
-	mov.b	r5, @r4
-	add	#1, r4
-1:
-	extu.b	r5, r0
-	shll8	r5
-	or	r5, r0
-	extu.w	r0, r0
-	mov	r0, r5
-	swap.w	r5, r5
-	or	r0, r5
-	
-2:
-	add	#-4, r6
-	cmp/pz	r6
-	bf	afew
-	mov.l	r5, @r4
-	bra	2b
-	add	#4, r4
-
-afew:
-	mov	#-1, r0
-	sub	r6, r0
-	shll2	r0
-	braf	r0
-	nop
-
-	mov.b	r5, @r4
-	add	#1, r4
-	mov.b	r5, @r4
-	add	#1, r4
-	mov.b	r5, @r4
-	add	#1, r4
-end:
+	mov	#12,r0
+	cmp/gt	r6,r0
+	bt.s	L_byte_loop_init
+	mov	r4,r7
+
+	swap.b	r5,r1
+	or	r1,r5
+	swap.w	r5,r1
+	or	r1,r5
+
+	mov	r4,r0
+	tst	#1,r0
+	bt	L_wordalign
+
+	mov.b	r5,@r4
+	add	#-1,r6	
+	add	#1,r4
+	mov	r4,r0
+
+	.balignw 4,0x0009
+L_wordalign:
+	tst	#2,r0
+	bt	L_word_loop_init
+
+	mov.w	r5,@r4
+	add	#-2,r6
+	add	#2,r4
+	mov	r4,r0
+
+	.balignw 4,0x0009
+L_word_loop_init:
+	mov	r6,r3
+	shlr2	r3
+	mov	#7,r0
+	shlr	r3
+	and	r0,r6
+
+	.balignw 4,0x0009
+L_2word_loop:
+	mov.l	r5,@r4
+	dt	r3
+	mov.l	r5,@(4,r4)
+	bf.s	L_2word_loop
+	add	#8,r4
+
+	.balignw 4,0x0009
+L_byte_loop_init:
+	tst	r6,r6
+	bt	L_byte_exit
+
+	.balignw 4,0x0009
+L_byte_loop:
+	mov.b	r5,@r4
+	dt	r6
+	bf.s	L_byte_loop
+	add	#1,r4
+
+	.balignw 4,0x0009
+L_byte_exit:
 	rts
-	mov	r3, r0
+	mov	r7,r0
 END(memset)