OSDN Git Service

2004-12-17 Christian Groessler <chris@groessler.org>
authorjjohnstn <jjohnstn>
Fri, 17 Dec 2004 20:17:12 +0000 (20:17 +0000)
committerjjohnstn <jjohnstn>
Fri, 17 Dec 2004 20:17:12 +0000 (20:17 +0000)
        * 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.

newlib/ChangeLog
newlib/libc/machine/z8k/Makefile.am
newlib/libc/machine/z8k/Makefile.in
newlib/libc/machine/z8k/memcmp.S [new file with mode: 0644]
newlib/libc/machine/z8k/memcpy.S [new file with mode: 0644]
newlib/libc/machine/z8k/memmove.S [new file with mode: 0644]
newlib/libc/machine/z8k/memset.S [new file with mode: 0644]
newlib/libc/machine/z8k/setjmp.S

index 1728367..4c129e9 100644 (file)
@@ -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
index 1c65b9f..eac616a 100644 (file)
@@ -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
index 9736912..2dced64 100644 (file)
@@ -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 (file)
index 0000000..ae41e63
--- /dev/null
@@ -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 (file)
index 0000000..ede6037
--- /dev/null
@@ -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 (file)
index 0000000..c4d0c73
--- /dev/null
@@ -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 (file)
index 0000000..43184c7
--- /dev/null
@@ -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
index e58d0d1..30240e1 100644 (file)
@@ -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 */