memcpy.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:1k
- #include <linux/types.h>
- void * memcpy(void * to, const void * from, size_t n)
- {
- void *xto = to;
- size_t temp, temp1;
- if (!n)
- return xto;
- if ((long) to & 1)
- {
- char *cto = to;
- const char *cfrom = from;
- *cto++ = *cfrom++;
- to = cto;
- from = cfrom;
- n--;
- }
- if (n > 2 && (long) to & 2)
- {
- short *sto = to;
- const short *sfrom = from;
- *sto++ = *sfrom++;
- to = sto;
- from = sfrom;
- n -= 2;
- }
- temp = n >> 2;
- if (temp)
- {
- long *lto = to;
- const long *lfrom = from;
- __asm__ __volatile__("movel %2,%3nt"
- "andw #7,%3nt"
- "lsrl #3,%2nt"
- "negw %3nt"
- "jmp %%pc@(1f,%3:w:2)nt"
- "4:t"
- "movel %0@+,%1@+nt"
- "movel %0@+,%1@+nt"
- "movel %0@+,%1@+nt"
- "movel %0@+,%1@+nt"
- "movel %0@+,%1@+nt"
- "movel %0@+,%1@+nt"
- "movel %0@+,%1@+nt"
- "movel %0@+,%1@+nt"
- "1:t"
- "dbra %2,4bnt"
- "clrw %2nt"
- "subql #1,%2nt"
- "jpl 4bnt"
- : "=a" (lfrom), "=a" (lto), "=d" (temp),
- "=&d" (temp1)
- : "0" (lfrom), "1" (lto), "2" (temp)
- );
- to = lto;
- from = lfrom;
- }
- if (n & 2)
- {
- short *sto = to;
- const short *sfrom = from;
- *sto++ = *sfrom++;
- to = sto;
- from = sfrom;
- }
- if (n & 1)
- {
- char *cto = to;
- const char *cfrom = from;
- *cto = *cfrom;
- }
- return xto;
- }