diff options
Diffstat (limited to 'newlib/libc/machine/h8300/memset.S')
-rw-r--r-- | newlib/libc/machine/h8300/memset.S | 58 |
1 files changed, 58 insertions, 0 deletions
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 |