69 lines
1.2 KiB
C
69 lines
1.2 KiB
C
#include <linux/types.h>
|
|
|
|
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\t"
|
|
"andw #7,%2\n\t"
|
|
"lsrl #3,%1\n\t"
|
|
"negw %2\n\t"
|
|
"jmp %%pc@(2f,%2:w:2)\n\t"
|
|
"1:\t"
|
|
"movel %3,%0@+\n\t"
|
|
"movel %3,%0@+\n\t"
|
|
"movel %3,%0@+\n\t"
|
|
"movel %3,%0@+\n\t"
|
|
"movel %3,%0@+\n\t"
|
|
"movel %3,%0@+\n\t"
|
|
"movel %3,%0@+\n\t"
|
|
"movel %3,%0@+\n\t"
|
|
"2:\t"
|
|
"dbra %1,1b\n\t"
|
|
"clrw %1\n\t"
|
|
"subql #1,%1\n\t"
|
|
"jpl 1b\n\t"
|
|
: "=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;
|
|
}
|