http://www.usr.com/support/gpl/USR9107_release1.1.tar.gz
[bcm963xx.git] / kernel / linux / 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         swap.b  r5,r0           !   V0
33         or      r0,r5           !   VV
34         swap.w  r5,r0           ! VV00
35         or      r0,r5           ! VVVV
36         !
37         mov     r6,r0
38         shlr2   r0
39         shlr    r0              ! r0 = r6 >> 3
40 3:
41         dt      r0
42         mov.l   r5,@-r4         ! set 8-byte at once
43         bf/s    3b
44          mov.l  r5,@-r4
45         !
46         mov     #7,r0
47         and     r0,r6
48         tst     r6,r6
49         bt      5f
50         ! fill bytes
51 4:
52         dt      r6
53         bf/s    4b
54          mov.b  r5,@-r4
55 5:
56         rts
57          mov    r4,r0