memset.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:1k
- #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,%2nt"
- "andw #7,%2nt"
- "lsrl #3,%1nt"
- "negw %2nt"
- "jmp %%pc@(2f,%2:w:2)nt"
- "1:t"
- "movel %3,%0@+nt"
- "movel %3,%0@+nt"
- "movel %3,%0@+nt"
- "movel %3,%0@+nt"
- "movel %3,%0@+nt"
- "movel %3,%0@+nt"
- "movel %3,%0@+nt"
- "movel %3,%0@+nt"
- "2:t"
- "dbra %1,1bnt"
- "clrw %1nt"
- "subql #1,%1nt"
- "jpl 1bnt"
- : "=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;
- }