71 lines
858 B
ArmAsm
71 lines
858 B
ArmAsm
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/* memset.S */
|
|
|
|
#include <asm/linkage.h>
|
|
|
|
#if defined(CONFIG_CPU_H8300H)
|
|
.h8300h
|
|
#endif
|
|
#if defined(CONFIG_CPU_H8S)
|
|
.h8300s
|
|
#endif
|
|
.text
|
|
|
|
.global memset
|
|
.global clear_user
|
|
|
|
;;void *memset(*ptr, int c, size_t count)
|
|
;; ptr = er0
|
|
;; c = er1(r1l)
|
|
;; count = er2
|
|
memset:
|
|
btst #0,r0l
|
|
beq 2f
|
|
|
|
;; odd address
|
|
1:
|
|
mov.b r1l,@er0
|
|
adds #1,er0
|
|
dec.l #1,er2
|
|
beq 6f
|
|
|
|
;; even address
|
|
2:
|
|
mov.l er2,er3
|
|
cmp.l #4,er2
|
|
blo 4f
|
|
;; count>=4 -> count/4
|
|
#if defined(CONFIG_CPU_H8300H)
|
|
shlr.l er2
|
|
shlr.l er2
|
|
#endif
|
|
#if defined(CONFIG_CPU_H8S)
|
|
shlr.l #2,er2
|
|
#endif
|
|
;; byte -> long
|
|
mov.b r1l,r1h
|
|
mov.w r1,e1
|
|
3:
|
|
mov.l er1,@er0
|
|
adds #4,er0
|
|
dec.l #1,er2
|
|
bne 3b
|
|
4:
|
|
;; count % 4
|
|
and.b #3,r3l
|
|
beq 6f
|
|
5:
|
|
mov.b r1l,@er0
|
|
adds #1,er0
|
|
dec.b r3l
|
|
bne 5b
|
|
6:
|
|
rts
|
|
|
|
clear_user:
|
|
mov.l er1, er2
|
|
sub.l er1, er1
|
|
bra memset
|
|
|
|
.end
|