Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Johnston <jjohnstn@redhat.com>2004-12-17 23:17:13 +0300
committerJeff Johnston <jjohnstn@redhat.com>2004-12-17 23:17:13 +0300
commitd8ae996c41cf0148f5bffa393bc35ed9b0e5d5d5 (patch)
treeb3086194f8dc3f1cedd595cde4be79a65d640685 /newlib/libc/machine/z8k/memset.S
parent8232f2e050785e61113a926aa922e4004dd9c118 (diff)
2004-12-17 Christian Groessler <chris@groessler.org>
* libc/machine/z8k/memcmp.S: New file. * libc/machine/z8k/memcpy.S: Ditto. * libc/machine/z8k/memmove.S: Ditto. * libc/machine/z8k/memset.S: Ditto. * libc/machine/z8k/Makefile.am: Add new files. * libc/machine/z8k/Makefile.in: Regenerated. * libc/machine/z8k/setjmp.S: Fix indirect register usage in Z8002 part. Implement Z8002 stdcall version.
Diffstat (limited to 'newlib/libc/machine/z8k/memset.S')
-rw-r--r--newlib/libc/machine/z8k/memset.S135
1 files changed, 135 insertions, 0 deletions
diff --git a/newlib/libc/machine/z8k/memset.S b/newlib/libc/machine/z8k/memset.S
new file mode 100644
index 000000000..43184c709
--- /dev/null
+++ b/newlib/libc/machine/z8k/memset.S
@@ -0,0 +1,135 @@
+/*
+ * memset routine for Z8000
+ * Copyright (C) 2004 Christian Groessler <chris@groessler.org>
+ *
+ * Permission to use, copy, modify, and distribute this file
+ * for any purpose is hereby granted without fee, provided that
+ * the above copyright notice and this notice appears in all
+ * copies.
+ *
+ * This file is distributed WITHOUT ANY WARRANTY; without even the implied
+ * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+/* void *memset(void *buffer, int value, size_t length);
+ */
+
+ name "memset.S"
+
+ .text
+ even
+global _memset
+
+_memset:
+
+#ifdef __Z8001__
+ segm
+
+#ifdef __STD_CALL__
+ ldl rr6,rr14(#4)
+ ld r5,rr14(#8)
+ ldl rr2,rr14(#10)
+#else
+ pushl @rr14,rr6
+#endif
+
+/* rr2 - length
+ * rl5 - value
+ * rr6 - buffer
+ */
+ testl rr2
+ jr z,finish
+
+ ldb rh5,rl5
+ ld r1,r5 /* r1 contains value */
+ bit r7,#0
+ jr z,not_odd
+
+ ldb @rr6,rl1
+ inc r7,#1
+ subl rr2,#1
+ jr z,finish
+
+not_odd:ld r0,r3 /* remember length */
+ srl r3,#1
+ jr z,no_words
+
+ ldl rr4,rr6
+ ld @rr6,r1
+ inc r7,#2
+ dec r3,#1
+ jr z,no_words
+
+ ldir @rr6,@rr4,r3 /* fill words */
+
+no_words:
+ bit r0,#0 /* one byte remaining? */
+ jr z,finish
+
+ ldb @rr6,rl1
+
+finish:
+#ifdef __STD_CALL__
+ ldl rr6,rr14(#4)
+#else
+ popl rr2,@rr14
+#endif
+
+
+#else /* above Z8001, below Z8002 */
+
+
+ unsegm
+
+#ifdef __STD_CALL__
+ ld r7,r15(#2)
+ ld r6,r15(#4)
+ ld r5,r15(#6)
+#else
+ ld r2,r7 /* buffer pointer return value */
+#endif
+
+/* r5 - length
+ * r6 - value
+ * r7 - buffer
+ */
+ test r5
+ jr z,finish
+
+ ldb rh6,rl6
+ ld r1,r6 /* r1 contains value */
+ bit r7,#0
+ jr z,not_odd
+
+ ldb @r7,rl1
+ inc r7,#1
+ dec r5,#1
+ jr z,finish
+
+not_odd:ld r0,r5 /* remember length */
+ srl r5,#1
+ jr z,no_words
+
+ ld r4,r7
+ ld @r7,r1
+ inc r7,#2
+ dec r5,#1
+ jr z,no_words
+
+ ldir @r7,@r4,r5 /* fill words */
+
+no_words:
+ bit r0,#0 /* one byte remaining? */
+ jr z,finish
+
+ ldb @r7,rl1
+
+finish:
+#ifdef __STD_CALL__
+ ld r7,r15(#2)
+#endif
+
+#endif /* Z8002 */
+
+ ret
+ .end