aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/sh/memset.S
diff options
context:
space:
mode:
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)