Linux 2.6.31-rc6
[linux-2.6] / arch / sh / lib / memset.S
1 /* $Id: memset.S,v 1.1 2000/04/14 16:49:01 mjd Exp $
2  *
3  * "memset" implementation of SuperH
4  *
5  * Copyright (C) 1999  Niibe Yutaka
6  *
7  */
8
9 /*
10  *            void *memset(void *s, int c, size_t n);
11  */
12
13 #include <linux/linkage.h>
14
15 ENTRY(memset)
16         tst     r6,r6
17         bt/s    5f              ! if n=0, do nothing
18          add    r6,r4
19         mov     #12,r0
20         cmp/gt  r6,r0
21         bt/s    4f              ! if it's too small, set a byte at once
22          mov    r4,r0
23         and     #3,r0
24         cmp/eq  #0,r0
25         bt/s    2f              ! It's aligned
26          sub    r0,r6
27 1:
28         dt      r0
29         bf/s    1b
30          mov.b  r5,@-r4
31 2:                              ! make VVVV
32         extu.b  r5,r5
33         swap.b  r5,r0           !   V0
34         or      r0,r5           !   VV
35         swap.w  r5,r0           ! VV00
36         or      r0,r5           ! VVVV
37         !
38         mov     r6,r0
39         shlr2   r0
40         shlr    r0              ! r0 = r6 >> 3
41 3:
42         dt      r0
43         mov.l   r5,@-r4         ! set 8-byte at once
44         bf/s    3b
45          mov.l  r5,@-r4
46         !
47         mov     #7,r0
48         and     r0,r6
49         tst     r6,r6
50         bt      5f
51         ! fill bytes
52 4:
53         dt      r6
54         bf/s    4b
55          mov.b  r5,@-r4
56 5:
57         rts
58          mov    r4,r0