1#include <linux/types.h> 2 3void * memcpy(void * to, const void * from, size_t n) 4{ 5 void *xto = to; 6 size_t temp, temp1; 7 8 if (!n) 9 return xto; 10 if ((long) to & 1) 11 { 12 char *cto = to; 13 const char *cfrom = from; 14 *cto++ = *cfrom++; 15 to = cto; 16 from = cfrom; 17 n--; 18 } 19 if (n > 2 && (long) to & 2) 20 { 21 short *sto = to; 22 const short *sfrom = from; 23 *sto++ = *sfrom++; 24 to = sto; 25 from = sfrom; 26 n -= 2; 27 } 28 temp = n >> 2; 29 if (temp) 30 { 31 long *lto = to; 32 const long *lfrom = from; 33 34 __asm__ __volatile__("movel %2,%3\n\t" 35 "andw #7,%3\n\t" 36 "lsrl #3,%2\n\t" 37 "negw %3\n\t" 38 "jmp %%pc@(1f,%3:w:2)\n\t" 39 "4:\t" 40 "movel %0@+,%1@+\n\t" 41 "movel %0@+,%1@+\n\t" 42 "movel %0@+,%1@+\n\t" 43 "movel %0@+,%1@+\n\t" 44 "movel %0@+,%1@+\n\t" 45 "movel %0@+,%1@+\n\t" 46 "movel %0@+,%1@+\n\t" 47 "movel %0@+,%1@+\n\t" 48 "1:\t" 49 "dbra %2,4b\n\t" 50 "clrw %2\n\t" 51 "subql #1,%2\n\t" 52 "jpl 4b\n\t" 53 : "=a" (lfrom), "=a" (lto), "=d" (temp), 54 "=&d" (temp1) 55 : "0" (lfrom), "1" (lto), "2" (temp) 56 ); 57 to = lto; 58 from = lfrom; 59 } 60 if (n & 2) 61 { 62 short *sto = to; 63 const short *sfrom = from; 64 *sto++ = *sfrom++; 65 to = sto; 66 from = sfrom; 67 } 68 if (n & 1) 69 { 70 char *cto = to; 71 const char *cfrom = from; 72 *cto = *cfrom; 73 } 74 return xto; 75} 76