memcpy.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:1k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

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