[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