summaryrefslogtreecommitdiff
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.S51
1 files changed, 51 insertions, 0 deletions
diff --git a/newlib/libc/machine/h8300/memset.S b/newlib/libc/machine/h8300/memset.S
new file mode 100644
index 00000000000..c12f17b4e39
--- /dev/null
+++ b/newlib/libc/machine/h8300/memset.S
@@ -0,0 +1,51 @@
+#include "defines.h"
+
+#ifdef __H8300H__
+ .h8300h
+#endif
+
+#ifdef __H8300S__
+ .h8300s
+#endif
+
+
+; 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
+