62 lines
718 B
ArmAsm
62 lines
718 B
ArmAsm
/* memset.S */
|
|
|
|
#include <asm/linkage.h>
|
|
|
|
#if defined(__H8300H__)
|
|
.h8300h
|
|
#endif
|
|
#if defined(__H8300S__)
|
|
.h8300s
|
|
#endif
|
|
.text
|
|
|
|
.global _memset
|
|
|
|
;;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(__H8300H__)
|
|
shlr.l er2
|
|
shlr.l er2
|
|
#endif
|
|
#if defined(__H8300S__)
|
|
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
|