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
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.
-rw-r--r--newlib/ChangeLog11
-rw-r--r--newlib/libc/machine/z8k/Makefile.am2
-rw-r--r--newlib/libc/machine/z8k/Makefile.in4
-rw-r--r--newlib/libc/machine/z8k/memcmp.S185
-rw-r--r--newlib/libc/machine/z8k/memcpy.S145
-rw-r--r--newlib/libc/machine/z8k/memmove.S180
-rw-r--r--newlib/libc/machine/z8k/memset.S135
-rw-r--r--newlib/libc/machine/z8k/setjmp.S44
8 files changed, 691 insertions, 15 deletions
diff --git a/newlib/ChangeLog b/newlib/ChangeLog
index 172836786..4c129e947 100644
--- a/newlib/ChangeLog
+++ b/newlib/ChangeLog
@@ -1,3 +1,14 @@
+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.
+
2004-12-13 Jeff Johnston <jjohnstn@redhat.com>
* libc/stdio/fread.c (fread): For unbuffered I/O, attempt
diff --git a/newlib/libc/machine/z8k/Makefile.am b/newlib/libc/machine/z8k/Makefile.am
index 1c65b9ffe..eac616a8c 100644
--- a/newlib/libc/machine/z8k/Makefile.am
+++ b/newlib/libc/machine/z8k/Makefile.am
@@ -6,7 +6,7 @@ INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
noinst_LIBRARIES = lib.a
-lib_a_SOURCES = setjmp.S
+lib_a_SOURCES = setjmp.S memset.S memcpy.S memmove.S memcmp.S
ACLOCAL_AMFLAGS = -I ../../..
CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host
diff --git a/newlib/libc/machine/z8k/Makefile.in b/newlib/libc/machine/z8k/Makefile.in
index 9736912dc..2dced6476 100644
--- a/newlib/libc/machine/z8k/Makefile.in
+++ b/newlib/libc/machine/z8k/Makefile.in
@@ -89,7 +89,7 @@ INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
noinst_LIBRARIES = lib.a
-lib_a_SOURCES = setjmp.S
+lib_a_SOURCES = setjmp.S memset.S memcpy.S memmove.S memcmp.S
ACLOCAL_AMFLAGS = -I ../../..
CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host
@@ -103,7 +103,7 @@ DEFS = @DEFS@ -I. -I$(srcdir)
CPPFLAGS = @CPPFLAGS@
LIBS = @LIBS@
lib_a_LIBADD =
-lib_a_OBJECTS = setjmp.o
+lib_a_OBJECTS = setjmp.o memset.o memcpy.o memmove.o memcmp.o
CFLAGS = @CFLAGS@
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
diff --git a/newlib/libc/machine/z8k/memcmp.S b/newlib/libc/machine/z8k/memcmp.S
new file mode 100644
index 000000000..ae41e63be
--- /dev/null
+++ b/newlib/libc/machine/z8k/memcmp.S
@@ -0,0 +1,185 @@
+/*
+ * memcmp 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.
+ */
+
+/* int memcmp(const void *b1, const void *b2, size_t length);
+ */
+
+ name "memcmp.S"
+
+ .text
+ even
+global _memcmp
+
+_memcmp:
+
+#ifdef __Z8001__
+ segm
+
+#ifdef __STD_CALL__
+ ldl rr6,rr14(#4)
+ ldl rr4,rr14(#8)
+ ldl rr2,rr14(#12)
+#endif
+
+/* rr2 - length (high word ignored)
+ * rr4 - b2
+ * rr6 - b1
+ */
+
+ clr r1 /* initialize return value */
+ testl rr2
+ jr z,finish
+
+ bitb rl7,#0 /* odd b1? */
+ jr nz,testb2
+ bitb rl5,#0 /* odd b2? */
+ jr nz,odd_cmp /* b1 even, b2 odd */
+ jr t,even_cmp
+
+testb2:
+ bitb rl5,#0
+ jr z,odd_cmp /* b2 even, b1 odd */
+
+ cpsib @rr6,@rr4,r3,eq
+ jr z,beq /* bytes are the same */
+ jr t,byte_diff
+
+beq: jr ov,finish /* jump if r3 is zero now */
+
+/* compare words */
+even_cmp:
+ ld r2,r3 /* remember length */
+ srl r3,#1
+ jr z,no_words
+
+ cpsir @rr6,@rr4,r3,ne
+ jr nz,no_words
+
+ dec r7,#2
+ dec r5,#2 /* point to different bytes */
+ ldk r3,#2
+ jr t,odd_cmp
+
+no_words:
+ bitb rl2,#0 /* odd length? */
+ jr z,finish
+
+ cpsib @rr6,@rr4,r3,eq
+ jr z,finish /* last bytes are the same */
+ jr t,byte_diff
+
+/* compare bytes */
+odd_cmp:
+ cpsirb @rr6,@rr4,r3,ne
+ jr nz,finish
+
+byte_diff:
+ dec r7,#1
+ dec r5,#1 /* point to different bytes */
+
+ ldb rl1,@rr6
+ clr r0
+ ldb rl0,@rr4
+ sub r1,r0
+
+finish: /* set return value */
+#ifdef __STD_CALL__
+ ld r7,r1
+#else
+ ld r2,r1
+#endif
+
+
+#else /* above Z8001, below Z8002 */
+
+
+ unsegm
+
+#ifdef __STD_CALL__
+ ld r7,r15(#2)
+ ld r6,r15(#4)
+ ld r5,r15(#6)
+#endif
+
+/* r5 - length
+ * r6 - b2
+ * r7 - b1
+ */
+
+ clr r1 /* initialize return value */
+ test r5
+ jr z,finish
+
+ bitb rl7,#0 /* odd destination address? */
+ jr nz,testb2
+ bitb rl6,#0 /* odd source address? */
+ jr nz,odd_cmp /* b1 even, b2 odd */
+ jr t,even_cmp
+
+testb2:
+ bitb rl6,#0
+ jr z,odd_cmp /* b2 even, b1 odd */
+
+ cpsib @r7,@r6,r5,eq
+ jr z,beq /* bytes are the same */
+ jr t,byte_diff
+
+beq: jr ov,finish /* jump if r3 is zero now */
+
+/* compare words */
+even_cmp:
+ ld r4,r5 /* remember length */
+ srl r5,#1
+ jr z,no_words
+
+ cpsir @r7,@r6,r5,ne
+ jr nz,no_words
+
+ dec r7,#2
+ dec r6,#2 /* point to different bytes */
+ ldk r5,#2
+ jr t,odd_cmp
+
+no_words:
+ bitb rl4,#0 /* odd length? */
+ jr z,finish
+
+ cpsib @r7,@r6,r4,eq
+ jr z,finish /* last bytes are the same */
+ jr t,byte_diff
+
+/* compare bytes */
+odd_cmp:
+ cpsirb @r7,@r6,r5,ne
+ jr nz,finish
+
+byte_diff:
+ dec r7,#1
+ dec r6,#1 /* point to different bytes */
+
+ ldb rl1,@r7
+ clr r0
+ ldb rl0,@r6
+ sub r1,r0
+
+finish:
+#ifdef __STD_CALL__
+ ld r7,r1
+#else
+ ld r2,r1
+#endif
+
+#endif /* Z8002 */
+
+ ret
+ .end
diff --git a/newlib/libc/machine/z8k/memcpy.S b/newlib/libc/machine/z8k/memcpy.S
new file mode 100644
index 000000000..ede603787
--- /dev/null
+++ b/newlib/libc/machine/z8k/memcpy.S
@@ -0,0 +1,145 @@
+/*
+ * memcpy 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 *memcpy(void *dest, const void *src, size_t length);
+ */
+
+ name "memcpy.S"
+
+ .text
+ even
+global _memcpy
+global memmove_entry
+
+_memcpy:
+
+#ifdef __Z8001__
+ segm
+
+#ifdef __STD_CALL__
+ ldl rr6,rr14(#4)
+ ldl rr4,rr14(#8)
+ ldl rr2,rr14(#12)
+#else
+ pushl @rr14,rr6
+#endif
+
+/* rr2 - length (high word ignored)
+ * rr4 - src
+ * rr6 - dest
+ */
+
+ testl rr2
+ jr z,finish
+
+memmove_entry: /* external entry point from memmove */
+
+ bitb rl7,#0 /* odd destination address? */
+ jr nz,testsrc
+ bitb rl5,#0 /* odd source address? */
+ jr nz,odd_copy
+ jr t,even_copy /* dest even, src odd */
+
+testsrc:
+ bitb rl5,#0
+ jr z,odd_copy /* src even, dest odd */
+ ldib @rr6,@rr4,r3
+ jr ov,finish /* jump if r3 is zero now */
+
+/* copy words */
+even_copy:
+ ld r2,r3 /* remember length */
+ srl r3,#1
+ jr z,no_words
+
+ ldir @rr6,@rr4,r3
+
+no_words:
+ bitb rl2,#0 /* odd length? */
+ jr z,finish
+ ldib @rr6,@rr4,r2 /* yes, copy last byte */
+ jr finish
+
+/* copy bytes */
+odd_copy:
+ ldirb @rr6,@rr4,r3
+
+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 - src
+ * r7 - dest
+ */
+ test r5
+ jr z,finish
+
+memmove_entry: /* external entry point from memmove */
+
+ bitb rl7,#0 /* odd destination address? */
+ jr nz,testsrc
+ bitb rl6,#0 /* odd source address? */
+ jr nz,odd_copy
+ jr t,even_copy /* dest even, src odd */
+
+testsrc:
+ bitb rl6,#0
+ jr z,odd_copy /* src even, dest odd */
+ ldib @r7,@r6,r5
+ jr ov,finish /* jump if r5 is zero now */
+
+/* copy words */
+even_copy:
+ ld r4,r5 /* remember length */
+ srl r5,#1
+ jr z,no_words
+
+ ldir @r7,@r6,r5
+
+no_words:
+ bitb rl4,#0 /* odd length? */
+ jr z,finish
+ ldib @r7,@r6,r4 /* yes, copy last byte */
+ jr finish
+
+/* copy bytes */
+odd_copy:
+ ldirb @r7,@r6,r5
+
+finish:
+#ifdef __STD_CALL__
+ ld r7,r15(#2)
+#endif
+
+#endif /* Z8002 */
+
+ ret
+ .end
diff --git a/newlib/libc/machine/z8k/memmove.S b/newlib/libc/machine/z8k/memmove.S
new file mode 100644
index 000000000..c4d0c73f8
--- /dev/null
+++ b/newlib/libc/machine/z8k/memmove.S
@@ -0,0 +1,180 @@
+/*
+ * memmove 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 *memmove(void *dest, const void *src, size_t length);
+ */
+
+ name "memmove.S"
+
+ .text
+ even
+global _memmove
+
+_memmove:
+
+#ifdef __Z8001__
+ segm
+
+#ifdef __STD_CALL__
+ ldl rr6,rr14(#4)
+ ldl rr4,rr14(#8)
+ ldl rr2,rr14(#12)
+#else
+ pushl @rr14,rr6
+#endif
+
+/* rr2 - length (high word ignored)
+ * rr4 - src
+ * rr6 - dest
+ */
+
+ testl rr2
+ jr z,finish
+
+/* check for destructive overlap (src < dest && dest < src + length) */
+
+ cpl rr6,rr4
+ jp ule,memmove_entry /* non-destructive, let memcpy do the work */
+ ldl rr0,rr2
+ addl rr0,rr4 /* rr0 = src + length */
+ cpl rr0,rr6
+ jp ult,memmove_entry /* non-destructive, let memcpy do the work */
+
+/* set-up pointers to copy backwards, add (length - 1) */
+ addl rr4,rr2 /* src + length */
+ addl rr6,rr2 /* dest + length */
+ subl rr4,#1
+ subl rr6,#1
+
+/* check alignment */
+ bitb rl7,#0 /* odd destination address? */
+ jr z,testsrc
+ bitb rl5,#0 /* odd source address? */
+ jr z,odd_copy
+ jr even_copy
+
+testsrc:
+ bitb rl5,#0
+ jr nz,odd_copy /* src even, dest odd */
+ lddb @rr6,@rr4,r3
+ jr ov,finish /* jump if r5 is zero now */
+
+/* copy words */
+even_copy:
+ ld r2,r3 /* remember length */
+ srl r3,#1
+/* jr z,no_words it cannot be zero here */
+
+ dec r5,#1
+ dec r7,#1
+ lddr @rr6,@rr4,r3
+
+no_words:
+ bitb rl2,#0 /* odd length? */
+ jr z,finish
+ inc r5,#1
+ inc r7,#1
+ lddb @rr6,@rr4,r2 /* yes, copy last byte */
+ jr finish
+
+/* copy bytes */
+odd_copy:
+ lddrb @rr6,@rr4,r3
+
+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 - src
+ * r7 - dest
+ */
+ test r5
+ jr z,finish
+
+/* check for destructive overlap (src < dest && dest < src + length) */
+
+ cp r7,r6
+ jp ule,memmove_entry /* non-destructive, let memcpy do the work */
+ ld r0,r5
+ add r0,r6 /* r0 = src + length */
+ cp r0,r7
+ jp ult,memmove_entry /* non-destructive, let memcpy do the work */
+
+/* set-up pointers to copy backwards, add (length - 1) */
+ add r6,r5 /* src + length */
+ add r7,r5 /* dest + length */
+ dec r6,#1
+ dec r7,#1
+
+/* check alignment */
+ bitb rl7,#0 /* odd destination address? */
+ jr z,testsrc
+ bitb rl6,#0 /* odd source address? */
+ jr z,odd_copy
+ jr even_copy
+
+testsrc:
+ bitb rl6,#0
+ jr nz,odd_copy /* src even, dest odd */
+ lddb @r7,@r6,r5
+ jr ov,finish /* jump if r5 is zero now */
+
+/* copy words */
+even_copy:
+ ld r4,r5 /* remember length */
+ srl r5,#1
+/* jr z,no_words it cannot be zero here */
+
+ dec r6,#1
+ dec r7,#1
+ lddr @r7,@r6,r5
+
+no_words:
+ bitb rl4,#0 /* odd length? */
+ jr z,finish
+ inc r6,#1
+ inc r7,#1
+ lddb @r7,@r6,r4 /* yes, copy last byte */
+ jr finish
+
+/* copy bytes */
+odd_copy:
+ lddrb @r7,@r6,r5
+
+finish:
+#ifdef __STD_CALL__
+ ld r7,r15(#2)
+#endif
+
+#endif /* Z8002 */
+
+ ret
+ .end
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
diff --git a/newlib/libc/machine/z8k/setjmp.S b/newlib/libc/machine/z8k/setjmp.S
index e58d0d1f4..30240e1e8 100644
--- a/newlib/libc/machine/z8k/setjmp.S
+++ b/newlib/libc/machine/z8k/setjmp.S
@@ -1,10 +1,9 @@
+ .global _setjmp
+ .global _longjmp
#ifdef __Z8001__
segm
- .global _setjmp
- .globl _longjmp
-
#ifdef __STD_CALL__
_setjmp:
@@ -56,10 +55,31 @@ _longjmp:
unseg
#ifdef __STD_CALL__
-#warning Z8002 std call not implemented!
-#endif
- .global _setjmp
+_setjmp:
+ ld r7,r15(#2) ! get argument
+ ld r2,@r15 ! fetch pc
+ ld @r7,r2 ! save it
+ ldl r7(#14),rr8
+ ldl r7(#2),rr10
+ ldl r7(#6),rr12 ! remember frame pointer
+ ldl r7(#10),rr14 ! remember stack pointer
+ ldk r7,#0
+ ret t
+
+_longjmp:
+ ld r4,r15(#2) ! get first argument (jmp_buf)
+ ld r7,r15(#4) ! get return value
+ ldl rr8,r4(#14)
+ ldl rr10,r4(#2)
+ ldl rr12,r4(#6) ! restore old frame pointer
+ ldl rr14,r4(#10) ! restore old stack pointer
+ ld r4,@r4 ! return address
+ inc r15,#2
+ jp @r4
+
+#else /* above __STD_CALL_, below not */
+
_setjmp:
ld r2,@r15 ! fetch pc
ld @r7,r2 ! save it
@@ -69,14 +89,14 @@ _setjmp:
ldk r2,#0
ret t
- .globl _longjmp
-
_longjmp:
ld r2,r6 ! get return value
ld r4,@r7
- ldl rr10,rr7(4)
- ldl rr12,rr7(8)
- ldl rr14,rr7(12)
- jp @rr4
+ ldl rr10,r7(4)
+ ldl rr12,r7(8)
+ ldl rr14,r7(12)
+ inc r15,#2
+ jp @r4
+#endif /* not __STD_CALL__ */
#endif /* Z8002 version */