xref: /OK3568_Linux_fs/kernel/arch/h8300/lib/memset.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun/* memset.S */
3*4882a593Smuzhiyun
4*4882a593Smuzhiyun#include <asm/linkage.h>
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun#if defined(CONFIG_CPU_H8300H)
7*4882a593Smuzhiyun	.h8300h
8*4882a593Smuzhiyun#endif
9*4882a593Smuzhiyun#if defined(CONFIG_CPU_H8S)
10*4882a593Smuzhiyun	.h8300s
11*4882a593Smuzhiyun#endif
12*4882a593Smuzhiyun	.text
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun.global	memset
15*4882a593Smuzhiyun.global	clear_user
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun;;void *memset(*ptr, int c, size_t count)
18*4882a593Smuzhiyun;; ptr = er0
19*4882a593Smuzhiyun;; c   = er1(r1l)
20*4882a593Smuzhiyun;; count = er2
21*4882a593Smuzhiyunmemset:
22*4882a593Smuzhiyun	btst	#0,r0l
23*4882a593Smuzhiyun	beq	2f
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun	;; odd address
26*4882a593Smuzhiyun1:
27*4882a593Smuzhiyun	mov.b	r1l,@er0
28*4882a593Smuzhiyun	adds	#1,er0
29*4882a593Smuzhiyun	dec.l	#1,er2
30*4882a593Smuzhiyun	beq	6f
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun	;; even address
33*4882a593Smuzhiyun2:
34*4882a593Smuzhiyun	mov.l	er2,er3
35*4882a593Smuzhiyun	cmp.l	#4,er2
36*4882a593Smuzhiyun	blo	4f
37*4882a593Smuzhiyun	;; count>=4 -> count/4
38*4882a593Smuzhiyun#if defined(CONFIG_CPU_H8300H)
39*4882a593Smuzhiyun	shlr.l	er2
40*4882a593Smuzhiyun	shlr.l	er2
41*4882a593Smuzhiyun#endif
42*4882a593Smuzhiyun#if defined(CONFIG_CPU_H8S)
43*4882a593Smuzhiyun	shlr.l	#2,er2
44*4882a593Smuzhiyun#endif
45*4882a593Smuzhiyun	;; byte -> long
46*4882a593Smuzhiyun	mov.b	r1l,r1h
47*4882a593Smuzhiyun	mov.w	r1,e1
48*4882a593Smuzhiyun3:
49*4882a593Smuzhiyun	mov.l	er1,@er0
50*4882a593Smuzhiyun	adds	#4,er0
51*4882a593Smuzhiyun	dec.l	#1,er2
52*4882a593Smuzhiyun	bne	3b
53*4882a593Smuzhiyun4:
54*4882a593Smuzhiyun	;; count % 4
55*4882a593Smuzhiyun	and.b	#3,r3l
56*4882a593Smuzhiyun	beq	6f
57*4882a593Smuzhiyun5:
58*4882a593Smuzhiyun	mov.b	r1l,@er0
59*4882a593Smuzhiyun	adds	#1,er0
60*4882a593Smuzhiyun	dec.b	r3l
61*4882a593Smuzhiyun	bne	5b
62*4882a593Smuzhiyun6:
63*4882a593Smuzhiyun	rts
64*4882a593Smuzhiyun
65*4882a593Smuzhiyunclear_user:
66*4882a593Smuzhiyun	mov.l	er1, er2
67*4882a593Smuzhiyun	sub.l	er1, er1
68*4882a593Smuzhiyun	bra	memset
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun	.end
71