62 строки
747 B
ArmAsm
62 строки
747 B
ArmAsm
|
/* memset.S */
|
||
|
|
||
|
#include <asm/linkage.h>
|
||
|
|
||
|
#if defined(__H8300H__)
|
||
|
.h8300h
|
||
|
#endif
|
||
|
#if defined(__H8300S__)
|
||
|
.h8300s
|
||
|
#endif
|
||
|
.text
|
||
|
|
||
|
.global SYMBOL_NAME(memset)
|
||
|
|
||
|
;;void *memset(*ptr, int c, size_t count)
|
||
|
;; ptr = er0
|
||
|
;; c = er1(r1l)
|
||
|
;; count = er2
|
||
|
SYMBOL_NAME_LABEL(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
|