mirror of
git://sourceware.org/git/newlib-cygwin.git
synced 2025-01-15 11:00:04 +08:00
9a6831be86
* libc/machine/h8300/Makefile.am (lib_a_SOURCES): Add h8sx_strcpy.S. * libc/machine/h8300/defines.h (LEN): New macro. * libc/machine/h8300/memcpy.S: Add h8sx version. * libc/machine/h8300/memset.S: Likewise. * libc/machine/h8300/strcmp.S: Likewise. * libc/machine/h8300/setjmp.S: Use h8sx move instructions. * libc/machine/h8300/h8sx_strcpy.S: New file. 2003-06-30 Richard Sandiford <rsandifo@redhat.com> * libc/include/machine/ieeefp.h: Extend __H8300S__ handling to __H8300SX__. * libc/include/machine/setjmp.h: Likewise. * libc/include/sys/config.h: Likewise. * libc/machine/h8300/defines.h: Likewise. * libc/machine/h8300/setjmp.S: Likewise. * libc/machine/h8300/strcmp.S: Likewise. * libc/sys/h8300hms/close.S: Likewise. * libc/sys/h8300hms/fstat.S: Likewise. * libc/sys/h8300hms/lseek.S: Likewise. * libc/sys/h8300hms/read.S: Likewise. * libc/sys/h8300hms/write.S: Likewise. * libc/sys/h8300hms/crt0.S: Likewise. * libc/machine/h8300/setarch.h: Use .h8300sx or .h8300sxn if __H8300SX__ is defined. * libc/sys/h8300hms/setarch.h: Likewise.
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
|