From 9a6831be867ffae990ecd111abafbffae6ff135c Mon Sep 17 00:00:00 2001 From: Alexandre Oliva Date: Tue, 22 Jun 2004 21:54:52 +0000 Subject: 2003-07-02 Richard Sandiford * 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 * 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. --- newlib/libc/machine/h8300/memset.S | 58 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) (limited to 'newlib/libc/machine/h8300/memset.S') diff --git a/newlib/libc/machine/h8300/memset.S b/newlib/libc/machine/h8300/memset.S index ccd3fb766..c92169c69 100644 --- a/newlib/libc/machine/h8300/memset.S +++ b/newlib/libc/machine/h8300/memset.S @@ -2,6 +2,63 @@ #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 @@ -42,3 +99,4 @@ byteloop: bne byteloop rts +#endif -- cgit v1.2.3