summaryrefslogtreecommitdiffstats
path: root/newlib/libc/machine/h8300/memset.S
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/machine/h8300/memset.S')
-rw-r--r--newlib/libc/machine/h8300/memset.S58
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