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