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