/* 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 |