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.
This commit is contained in:
parent
8232f2e050
commit
d8ae996c41
|
@ -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>
|
2004-12-13 Jeff Johnston <jjohnstn@redhat.com>
|
||||||
|
|
||||||
* libc/stdio/fread.c (fread): For unbuffered I/O, attempt
|
* libc/stdio/fread.c (fread): For unbuffered I/O, attempt
|
||||||
|
|
|
@ -6,7 +6,7 @@ INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
|
||||||
|
|
||||||
noinst_LIBRARIES = lib.a
|
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 ../../..
|
ACLOCAL_AMFLAGS = -I ../../..
|
||||||
CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host
|
CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host
|
||||||
|
|
|
@ -89,7 +89,7 @@ INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
|
||||||
|
|
||||||
noinst_LIBRARIES = lib.a
|
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 ../../..
|
ACLOCAL_AMFLAGS = -I ../../..
|
||||||
CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host
|
CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host
|
||||||
|
@ -103,7 +103,7 @@ DEFS = @DEFS@ -I. -I$(srcdir)
|
||||||
CPPFLAGS = @CPPFLAGS@
|
CPPFLAGS = @CPPFLAGS@
|
||||||
LIBS = @LIBS@
|
LIBS = @LIBS@
|
||||||
lib_a_LIBADD =
|
lib_a_LIBADD =
|
||||||
lib_a_OBJECTS = setjmp.o
|
lib_a_OBJECTS = setjmp.o memset.o memcpy.o memmove.o memcmp.o
|
||||||
CFLAGS = @CFLAGS@
|
CFLAGS = @CFLAGS@
|
||||||
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
||||||
CCLD = $(CC)
|
CCLD = $(CC)
|
||||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -1,10 +1,9 @@
|
||||||
|
.global _setjmp
|
||||||
|
.global _longjmp
|
||||||
|
|
||||||
#ifdef __Z8001__
|
#ifdef __Z8001__
|
||||||
segm
|
segm
|
||||||
|
|
||||||
.global _setjmp
|
|
||||||
.globl _longjmp
|
|
||||||
|
|
||||||
#ifdef __STD_CALL__
|
#ifdef __STD_CALL__
|
||||||
|
|
||||||
_setjmp:
|
_setjmp:
|
||||||
|
@ -56,10 +55,31 @@ _longjmp:
|
||||||
unseg
|
unseg
|
||||||
|
|
||||||
#ifdef __STD_CALL__
|
#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:
|
_setjmp:
|
||||||
ld r2,@r15 ! fetch pc
|
ld r2,@r15 ! fetch pc
|
||||||
ld @r7,r2 ! save it
|
ld @r7,r2 ! save it
|
||||||
|
@ -69,14 +89,14 @@ _setjmp:
|
||||||
ldk r2,#0
|
ldk r2,#0
|
||||||
ret t
|
ret t
|
||||||
|
|
||||||
.globl _longjmp
|
|
||||||
|
|
||||||
_longjmp:
|
_longjmp:
|
||||||
ld r2,r6 ! get return value
|
ld r2,r6 ! get return value
|
||||||
ld r4,@r7
|
ld r4,@r7
|
||||||
ldl rr10,rr7(4)
|
ldl rr10,r7(4)
|
||||||
ldl rr12,rr7(8)
|
ldl rr12,r7(8)
|
||||||
ldl rr14,rr7(12)
|
ldl rr14,r7(12)
|
||||||
jp @rr4
|
inc r15,#2
|
||||||
|
jp @r4
|
||||||
|
|
||||||
|
#endif /* not __STD_CALL__ */
|
||||||
#endif /* Z8002 version */
|
#endif /* Z8002 version */
|
||||||
|
|
Loading…
Reference in New Issue