Loading...
#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; } |