提交 d10ed2f5 编写于 作者: G Greg Ungerer

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: NGreg Ungerer <gerg@uclinux.org>
Acked-by: NGeert Uytterhoeven <geert@linux-m68k.org>
上级 80160de8
...@@ -36,7 +36,6 @@ EXPORT_SYMBOL(csum_partial_copy_nocheck); ...@@ -36,7 +36,6 @@ EXPORT_SYMBOL(csum_partial_copy_nocheck);
their interface isn't gonna change any time soon now, so their interface isn't gonna change any time soon now, so
it's OK to leave it out of version control. */ it's OK to leave it out of version control. */
EXPORT_SYMBOL(memcpy); EXPORT_SYMBOL(memcpy);
EXPORT_SYMBOL(memset);
/* /*
* libgcc functions - functions that are used internally by the * libgcc functions - functions that are used internally by the
......
...@@ -3,12 +3,13 @@ ...@@ -3,12 +3,13 @@
# Makefile for m68k-specific library files.. # 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 ifdef CONFIG_MMU
lib-y += string.o uaccess.o lib-y += string.o uaccess.o
else else
lib-y += mulsi3.o divsi3.o udivsi3.o modsi3.o umodsi3.o \ lib-y += mulsi3.o divsi3.o udivsi3.o modsi3.o umodsi3.o \
memcpy.o memset.o delay.o memcpy.o delay.o
endif endif
#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; void *xs = s;
size_t temp; size_t temp;
if (!count) if (!count)
return xs; return xs;
c &= 0xff; c &= 0xff;
c |= c << 8; c |= c << 8;
c |= c << 16; c |= c << 16;
if ((long) s & 1) if ((long)s & 1) {
{ char *cs = s;
char *cs = s; *cs++ = c;
*cs++ = c; s = cs;
s = cs; count--;
count--; }
} if (count > 2 && (long)s & 2) {
if (count > 2 && (long) s & 2) short *ss = s;
{ *ss++ = c;
short *ss = s; s = ss;
*ss++ = c; count -= 2;
s = ss; }
count -= 2; temp = count >> 2;
} if (temp) {
temp = count >> 2; long *ls = s;
if (temp) #if defined(__mc68020__) || defined(__mc68030__) || \
{ defined(__mc68040__) || defined(__mc68060__) || defined(__mcpu32__)
long *ls = s; size_t temp1;
for (; temp; temp--) asm volatile (
*ls++ = c; " movel %1,%2\n"
s = ls; " andw #7,%2\n"
} " lsrl #3,%1\n"
if (count & 2) " negw %2\n"
{ " jmp %%pc@(2f,%2:w:2)\n"
short *ss = s; "1: movel %3,%0@+\n"
*ss++ = c; " movel %3,%0@+\n"
s = ss; " movel %3,%0@+\n"
} " movel %3,%0@+\n"
if (count & 1) " movel %3,%0@+\n"
{ " movel %3,%0@+\n"
char *cs = s; " movel %3,%0@+\n"
*cs = c; " movel %3,%0@+\n"
} "2: dbra %1,1b\n"
return xs; " 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);
...@@ -21,67 +21,6 @@ char *strcat(char *dest, const char *src) ...@@ -21,67 +21,6 @@ char *strcat(char *dest, const char *src)
} }
EXPORT_SYMBOL(strcat); 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 *memcpy(void *to, const void *from, size_t n)
{ {
void *xto = to; void *xto = to;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册