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
60