[patch] Fix and reenable memcpy/memset for m68k
Joel Sherrill
joel.sherrill@oarcorp.com
Mon Apr 30 20:58:00 GMT 2007
Kazu,
Just to finish this one completely off. I want to let you know that I
pinged Eric Norum
to review this because he was responsible for the m68k specific memcpy
RTEMS uses.
Where possible we prefer to use newlib code instead of overriding it
with our own
version. We are inclined to switch to your implementation but I would
appreciate you reviewing to the attached memcpy.c to see if Eric had any
optimization ideas that aren't also in yours.
FYI parts of the RTEMS build structure can distinguish CPU models at a
finer
granularity than multilib allows. The attached memcpy.c has some
optimizations
to account for the CPU32+.
Thanks.
--joel
Kazu Hirata wrote:
> Hi,
>
> Attached is a patch to fix and reenable memcpy/memset as suggested by
> Eric. (Thanks Eric for pointing our the bug!)
>
> Tested on fido-elf. OK to apply?
>
> Kazu Hirata
>
> 2007-04-30 Kazu Hirata <kazu@codesourcery.com>
>
> * libc/machine/m68k/Makefile.am (lib_a_SOURCES): Add memcpy.S
> and memset.S.
> * libc/machine/m68k/Makefile.in: Regenerate.
> * libc/machine/m68k/memcpy.S: Use sub.l followed by dbra.
> * libc/machine/m68k/memset.S: Likewise.
>
> Index: newlib/libc/machine/m68k/Makefile.am
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/machine/m68k/Makefile.am,v
> retrieving revision 1.5
> diff -u -d -p -r1.5 Makefile.am
> --- newlib/libc/machine/m68k/Makefile.am 27 Apr 2007 22:10:47 -0000 1.5
> +++ newlib/libc/machine/m68k/Makefile.am 30 Apr 2007 19:59:36 -0000
> @@ -8,7 +8,7 @@ AM_CCASFLAGS = $(INCLUDES)
>
> noinst_LIBRARIES = lib.a
>
> -lib_a_SOURCES = setjmp.S strcpy.c strlen.c
> +lib_a_SOURCES = setjmp.S strcpy.c strlen.c memcpy.S memset.S
> lib_a_CCASFLAGS=$(AM_CCASFLAGS)
> lib_a_CFLAGS=$(AM_CFLAGS)
>
> Index: newlib/libc/machine/m68k/Makefile.in
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/machine/m68k/Makefile.in,v
> retrieving revision 1.13
> diff -u -d -p -r1.13 Makefile.in
> --- newlib/libc/machine/m68k/Makefile.in 27 Apr 2007 22:10:47 -0000 1.13
> +++ newlib/libc/machine/m68k/Makefile.in 30 Apr 2007 19:59:36 -0000
> @@ -56,7 +56,8 @@ ARFLAGS = cru
> lib_a_AR = $(AR) $(ARFLAGS)
> lib_a_LIBADD =
> am_lib_a_OBJECTS = lib_a-setjmp.$(OBJEXT) lib_a-strcpy.$(OBJEXT) \
> - lib_a-strlen.$(OBJEXT)
> + lib_a-strlen.$(OBJEXT) lib_a-memcpy.$(OBJEXT) \
> + lib_a-memset.$(OBJEXT)
> lib_a_OBJECTS = $(am_lib_a_OBJECTS)
> DEFAULT_INCLUDES = -I. -I$(srcdir)
> depcomp =
> @@ -181,7 +182,7 @@ AUTOMAKE_OPTIONS = cygnus
> INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS) $(TARGET_CFLAGS)
> AM_CCASFLAGS = $(INCLUDES)
> noinst_LIBRARIES = lib.a
> -lib_a_SOURCES = setjmp.S strcpy.c strlen.c
> +lib_a_SOURCES = setjmp.S strcpy.c strlen.c memcpy.S memset.S
> lib_a_CCASFLAGS = $(AM_CCASFLAGS)
> lib_a_CFLAGS = $(AM_CFLAGS)
> ACLOCAL_AMFLAGS = -I ../../..
> @@ -249,6 +250,18 @@ lib_a-setjmp.o: setjmp.S
> lib_a-setjmp.obj: setjmp.S
> $(CCAS) $(lib_a_CCASFLAGS) $(CCASFLAGS) -c -o lib_a-setjmp.obj `if test -f 'setjmp.S'; then $(CYGPATH_W) 'setjmp.S'; else $(CYGPATH_W) '$(srcdir)/setjmp.S'; fi`
>
> +lib_a-memcpy.o: memcpy.S
> + $(CCAS) $(lib_a_CCASFLAGS) $(CCASFLAGS) -c -o lib_a-memcpy.o `test -f 'memcpy.S' || echo '$(srcdir)/'`memcpy.S
> +
> +lib_a-memcpy.obj: memcpy.S
> + $(CCAS) $(lib_a_CCASFLAGS) $(CCASFLAGS) -c -o lib_a-memcpy.obj `if test -f 'memcpy.S'; then $(CYGPATH_W) 'memcpy.S'; else $(CYGPATH_W) '$(srcdir)/memcpy.S'; fi`
> +
> +lib_a-memset.o: memset.S
> + $(CCAS) $(lib_a_CCASFLAGS) $(CCASFLAGS) -c -o lib_a-memset.o `test -f 'memset.S' || echo '$(srcdir)/'`memset.S
> +
> +lib_a-memset.obj: memset.S
> + $(CCAS) $(lib_a_CCASFLAGS) $(CCASFLAGS) -c -o lib_a-memset.obj `if test -f 'memset.S'; then $(CYGPATH_W) 'memset.S'; else $(CYGPATH_W) '$(srcdir)/memset.S'; fi`
> +
> .c.o:
> $(COMPILE) -c $<
>
> Index: newlib/libc/machine/m68k/memcpy.S
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/machine/m68k/memcpy.S,v
> retrieving revision 1.1
> diff -u -d -p -r1.1 memcpy.S
> --- newlib/libc/machine/m68k/memcpy.S 27 Apr 2007 16:05:35 -0000 1.1
> +++ newlib/libc/machine/m68k/memcpy.S 30 Apr 2007 19:59:36 -0000
> @@ -73,10 +73,11 @@ memcpy:
> .Lcopy:
> #if !defined (__mcoldfire__)
> dbra %d0,1b
> + sub.l #0x10000,%d0
> #else
> subq.l #1,%d0
> - bpl 1b
> #endif
> + bpl 1b
> bra .Lresidue
>
> 1:
> Index: newlib/libc/machine/m68k/memset.S
> ===================================================================
> RCS file: /cvs/src/src/newlib/libc/machine/m68k/memset.S,v
> retrieving revision 1.1
> diff -u -d -p -r1.1 memset.S
> --- newlib/libc/machine/m68k/memset.S 27 Apr 2007 16:05:35 -0000 1.1
> +++ newlib/libc/machine/m68k/memset.S 30 Apr 2007 19:59:36 -0000
> @@ -76,10 +76,11 @@ memset:
> .Llset:
> #if !defined (__mcoldfire__)
> dbra %d2,1b | loop until done
> + sub.l #0x10000,%d2
> #else
> subq.l #1,%d2
> - bpl 1b
> #endif
> + bpl 1b
> and.l #3,%d1 | residue byte transfers, fixed
> move.l (%sp)+,%d2 | restore d2
> bra .Lbset
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: memcpy.c
Type: text/x-csrc
Size: 2028 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/newlib/attachments/20070430/4d73a46e/attachment.bin>
More information about the Newlib
mailing list