103 lines
1.6 KiB
ArmAsm
103 lines
1.6 KiB
ArmAsm
#include "setarch.h"
|
|
|
|
#include "defines.h"
|
|
|
|
#if defined (__H8300SX__)
|
|
|
|
.global _memset
|
|
_memset:
|
|
; Use er3 is a temporary since er0 must remain unchanged on exit.
|
|
mov.l er0,er3
|
|
|
|
; Fill er1 with the byte to copy.
|
|
mov.b r1l,r1h
|
|
mov.w r1,e1
|
|
|
|
; Account for any excess bytes and words that will be copied after
|
|
; the main loop. r2 >= 0 if there is a longword to copy.
|
|
sub #4,LEN(r2)
|
|
blo longs_done
|
|
|
|
; Copy one byte if doing so will make er3 word-aligned.
|
|
; This isn't needed for correctness but it makes the main loop
|
|
; slightly faster.
|
|
bld #0,r3l
|
|
bcc word_aligned
|
|
mov.b r1l,@er3+
|
|
sub #1,LEN(r2)
|
|
blo longs_done
|
|
|
|
word_aligned:
|
|
; Likewise one word for longword alignment.
|
|
bld #1,r3l
|
|
bcc long_copy
|
|
mov.w r1,@er3+
|
|
sub #2,LEN(r2)
|
|
blo longs_done
|
|
|
|
long_copy:
|
|
; Copy longwords.
|
|
mov.l er1,@er3+
|
|
sub #4,LEN(r2)
|
|
bhs long_copy
|
|
|
|
longs_done:
|
|
; At this point, we need to copy r2 & 3 bytes. Copy a word
|
|
; if necessary.
|
|
bld #1,r2l
|
|
bcc words_done
|
|
mov.w r1,@er3+
|
|
|
|
words_done:
|
|
; Copy a byte.
|
|
bld #0,r2l
|
|
bcc bytes_done
|
|
mov.b r1l,@er3+
|
|
|
|
bytes_done:
|
|
rts
|
|
|
|
#else
|
|
|
|
; A0P pointer to cursor
|
|
; A1P thing to copy
|
|
.global _memset
|
|
|
|
_memset:
|
|
|
|
; MOVP @(2/4,r7),A2P ; dst
|
|
; MOVP @(4/8,r7),A1 ; src thing
|
|
; MOVP @(6/12,r7),A3P ; len
|
|
|
|
MOVP A2P,A2P
|
|
beq quit
|
|
|
|
; A3 points to the end of the area
|
|
MOVP A0P,A3P
|
|
ADDP A2P,A3P
|
|
|
|
; see if we can do it in words
|
|
; by oring in the start of the buffer to the end address
|
|
|
|
or A0L,A2L
|
|
btst #0,A2L
|
|
bne byteloop
|
|
|
|
; we can do it a word at a time
|
|
|
|
mov.b A1L,A1H
|
|
|
|
wordloop:
|
|
mov.w A1,@-A3P
|
|
CMPP A3P,A0P
|
|
bne wordloop
|
|
quit: rts
|
|
|
|
byteloop:
|
|
mov.b A1L,@-A3P
|
|
CMPP A3P,A0P
|
|
bne byteloop
|
|
rts
|
|
|
|
#endif
|