18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/* memset.S */
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci#include <asm/linkage.h>
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#if defined(CONFIG_CPU_H8300H)
78c2ecf20Sopenharmony_ci	.h8300h
88c2ecf20Sopenharmony_ci#endif
98c2ecf20Sopenharmony_ci#if defined(CONFIG_CPU_H8S)
108c2ecf20Sopenharmony_ci	.h8300s
118c2ecf20Sopenharmony_ci#endif
128c2ecf20Sopenharmony_ci	.text
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci.global	memset
158c2ecf20Sopenharmony_ci.global	clear_user
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci;;void *memset(*ptr, int c, size_t count)
188c2ecf20Sopenharmony_ci;; ptr = er0
198c2ecf20Sopenharmony_ci;; c   = er1(r1l)
208c2ecf20Sopenharmony_ci;; count = er2
218c2ecf20Sopenharmony_cimemset:
228c2ecf20Sopenharmony_ci	btst	#0,r0l
238c2ecf20Sopenharmony_ci	beq	2f
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci	;; odd address
268c2ecf20Sopenharmony_ci1:
278c2ecf20Sopenharmony_ci	mov.b	r1l,@er0
288c2ecf20Sopenharmony_ci	adds	#1,er0
298c2ecf20Sopenharmony_ci	dec.l	#1,er2
308c2ecf20Sopenharmony_ci	beq	6f
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci	;; even address
338c2ecf20Sopenharmony_ci2:
348c2ecf20Sopenharmony_ci	mov.l	er2,er3
358c2ecf20Sopenharmony_ci	cmp.l	#4,er2
368c2ecf20Sopenharmony_ci	blo	4f
378c2ecf20Sopenharmony_ci	;; count>=4 -> count/4
388c2ecf20Sopenharmony_ci#if defined(CONFIG_CPU_H8300H)
398c2ecf20Sopenharmony_ci	shlr.l	er2
408c2ecf20Sopenharmony_ci	shlr.l	er2
418c2ecf20Sopenharmony_ci#endif
428c2ecf20Sopenharmony_ci#if defined(CONFIG_CPU_H8S)
438c2ecf20Sopenharmony_ci	shlr.l	#2,er2
448c2ecf20Sopenharmony_ci#endif
458c2ecf20Sopenharmony_ci	;; byte -> long
468c2ecf20Sopenharmony_ci	mov.b	r1l,r1h
478c2ecf20Sopenharmony_ci	mov.w	r1,e1
488c2ecf20Sopenharmony_ci3:
498c2ecf20Sopenharmony_ci	mov.l	er1,@er0
508c2ecf20Sopenharmony_ci	adds	#4,er0
518c2ecf20Sopenharmony_ci	dec.l	#1,er2
528c2ecf20Sopenharmony_ci	bne	3b
538c2ecf20Sopenharmony_ci4:
548c2ecf20Sopenharmony_ci	;; count % 4
558c2ecf20Sopenharmony_ci	and.b	#3,r3l
568c2ecf20Sopenharmony_ci	beq	6f
578c2ecf20Sopenharmony_ci5:
588c2ecf20Sopenharmony_ci	mov.b	r1l,@er0
598c2ecf20Sopenharmony_ci	adds	#1,er0
608c2ecf20Sopenharmony_ci	dec.b	r3l
618c2ecf20Sopenharmony_ci	bne	5b
628c2ecf20Sopenharmony_ci6:
638c2ecf20Sopenharmony_ci	rts
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_ciclear_user:
668c2ecf20Sopenharmony_ci	mov.l	er1, er2
678c2ecf20Sopenharmony_ci	sub.l	er1, er1
688c2ecf20Sopenharmony_ci	bra	memset
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ci	.end
71