diff options
| author | Greg Ungerer <gerg@uclinux.org> | 2011-03-28 16:48:00 +1000 | 
|---|---|---|
| committer | Greg Ungerer <gerg@uclinux.org> | 2011-05-24 10:03:49 +1000 | 
| commit | d10ed2f5383cc6e6b7649f03540b8cb1838d5f67 (patch) | |
| tree | b2ee2537f23e452df1d98a88877ae28f7e3264fa /arch/m68k/lib | |
| parent | 80160de89d0a7c9a93dfe91eef2b448cbc380cd0 (diff) | |
m68k: remove duplicate memset() implementation
Merging the mmu and non-mmu directories we ended up with duplicate
implementations of memset(). One is a little more optimized for the
>= 68020 case, but that can easily be inserted into a single
implementation of memset(). Clean up the exporting of this symbol
too, otherwise we end up exporting it twice on a no-mmu build.
Signed-off-by: Greg Ungerer <gerg@uclinux.org>
Acked-by: Geert Uytterhoeven <geert@linux-m68k.org>
Diffstat (limited to 'arch/m68k/lib')
| -rw-r--r-- | arch/m68k/lib/Makefile | 5 | ||||
| -rw-r--r-- | arch/m68k/lib/memset.c | 114 | ||||
| -rw-r--r-- | arch/m68k/lib/string.c | 61 | 
3 files changed, 74 insertions, 106 deletions
| diff --git a/arch/m68k/lib/Makefile b/arch/m68k/lib/Makefile index ec479a9b9d7b..ac275d5e9e3c 100644 --- a/arch/m68k/lib/Makefile +++ b/arch/m68k/lib/Makefile @@ -3,12 +3,13 @@  # Makefile for m68k-specific library files..  # -lib-y	:= ashldi3.o ashrdi3.o lshrdi3.o muldi3.o memmove.o checksum.o +lib-y	:= ashldi3.o ashrdi3.o lshrdi3.o muldi3.o \ +	   memset.o memmove.o checksum.o  ifdef CONFIG_MMU  lib-y	+= string.o uaccess.o  else  lib-y	+= mulsi3.o divsi3.o udivsi3.o modsi3.o umodsi3.o \ -	   memcpy.o memset.o delay.o +	   memcpy.o delay.o  endif diff --git a/arch/m68k/lib/memset.c b/arch/m68k/lib/memset.c index 1389bf455633..f649e6a2e644 100644 --- a/arch/m68k/lib/memset.c +++ b/arch/m68k/lib/memset.c @@ -1,47 +1,75 @@ -#include <linux/types.h> +/* + * This file is subject to the terms and conditions of the GNU General Public + * License.  See the file COPYING in the main directory of this archive + * for more details. + */ -void * memset(void * s, int c, size_t count) +#include <linux/module.h> +#include <linux/string.h> + +void *memset(void *s, int c, size_t count)  { -  void *xs = s; -  size_t temp; +	void *xs = s; +	size_t temp; -  if (!count) -    return xs; -  c &= 0xff; -  c |= c << 8; -  c |= c << 16; -  if ((long) s & 1) -    { -      char *cs = s; -      *cs++ = c; -      s = cs; -      count--; -    } -  if (count > 2 && (long) s & 2) -    { -      short *ss = s; -      *ss++ = c; -      s = ss; -      count -= 2; -    } -  temp = count >> 2; -  if (temp) -    { -      long *ls = s; -      for (; temp; temp--) -	*ls++ = c; -      s = ls; -    } -  if (count & 2) -    { -      short *ss = s; -      *ss++ = c; -      s = ss; -    } -  if (count & 1) -    { -      char *cs = s; -      *cs = c; -    } -  return xs; +	if (!count) +		return xs; +	c &= 0xff; +	c |= c << 8; +	c |= c << 16; +	if ((long)s & 1) { +		char *cs = s; +		*cs++ = c; +		s = cs; +		count--; +	} +	if (count > 2 && (long)s & 2) { +		short *ss = s; +		*ss++ = c; +		s = ss; +		count -= 2; +	} +	temp = count >> 2; +	if (temp) { +		long *ls = s; +#if defined(__mc68020__) || defined(__mc68030__) || \ +    defined(__mc68040__) || defined(__mc68060__) || defined(__mcpu32__) +		size_t temp1; +		asm volatile ( +			"	movel %1,%2\n" +			"	andw  #7,%2\n" +			"	lsrl  #3,%1\n" +			"	negw  %2\n" +			"	jmp   %%pc@(2f,%2:w:2)\n" +			"1:	movel %3,%0@+\n" +			"	movel %3,%0@+\n" +			"	movel %3,%0@+\n" +			"	movel %3,%0@+\n" +			"	movel %3,%0@+\n" +			"	movel %3,%0@+\n" +			"	movel %3,%0@+\n" +			"	movel %3,%0@+\n" +			"2:	dbra  %1,1b\n" +			"	clrw  %1\n" +			"	subql #1,%1\n" +			"	jpl   1b" +			: "=a" (ls), "=d" (temp), "=&d" (temp1) +			: "d" (c), "0" (ls), "1" (temp)); +#else +		for (; temp; temp--) +			*ls++ = c; +#endif +		s = ls; +	} +	if (count & 2) { +		short *ss = s; +		*ss++ = c; +		s = ss; +	} +	if (count & 1) { +		char *cs = s; +		*cs = c; +	} +	return xs;  } +EXPORT_SYMBOL(memset); diff --git a/arch/m68k/lib/string.c b/arch/m68k/lib/string.c index 711fa743e6be..6d2461237a16 100644 --- a/arch/m68k/lib/string.c +++ b/arch/m68k/lib/string.c @@ -21,67 +21,6 @@ char *strcat(char *dest, const char *src)  }  EXPORT_SYMBOL(strcat); -void *memset(void *s, int c, size_t count) -{ -	void *xs = s; -	size_t temp, temp1; - -	if (!count) -		return xs; -	c &= 0xff; -	c |= c << 8; -	c |= c << 16; -	if ((long)s & 1) { -		char *cs = s; -		*cs++ = c; -		s = cs; -		count--; -	} -	if (count > 2 && (long)s & 2) { -		short *ss = s; -		*ss++ = c; -		s = ss; -		count -= 2; -	} -	temp = count >> 2; -	if (temp) { -		long *ls = s; - -		asm volatile ( -			"	movel %1,%2\n" -			"	andw  #7,%2\n" -			"	lsrl  #3,%1\n" -			"	negw  %2\n" -			"	jmp   %%pc@(2f,%2:w:2)\n" -			"1:	movel %3,%0@+\n" -			"	movel %3,%0@+\n" -			"	movel %3,%0@+\n" -			"	movel %3,%0@+\n" -			"	movel %3,%0@+\n" -			"	movel %3,%0@+\n" -			"	movel %3,%0@+\n" -			"	movel %3,%0@+\n" -			"2:	dbra  %1,1b\n" -			"	clrw  %1\n" -			"	subql #1,%1\n" -			"	jpl   1b" -			: "=a" (ls), "=d" (temp), "=&d" (temp1) -			: "d" (c), "0" (ls), "1" (temp)); -		s = ls; -	} -	if (count & 2) { -		short *ss = s; -		*ss++ = c; -		s = ss; -	} -	if (count & 1) { -		char *cs = s; -		*cs = c; -	} -	return xs; -} -EXPORT_SYMBOL(memset); -  void *memcpy(void *to, const void *from, size_t n)  {  	void *xto = to; | 
