newlib-cygwin/newlib/libc/machine/h8300/memset.S

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