memset.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:1k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. #include <linux/types.h>
  2. void * memset(void * s, int c, size_t count)
  3. {
  4.   void *xs = s;
  5.   size_t temp, temp1;
  6.   if (!count)
  7.     return xs;
  8.   c &= 0xff;
  9.   c |= c << 8;
  10.   c |= c << 16;
  11.   if ((long) s & 1)
  12.     {
  13.       char *cs = s;
  14.       *cs++ = c;
  15.       s = cs;
  16.       count--;
  17.     }
  18.   if (count > 2 && (long) s & 2)
  19.     {
  20.       short *ss = s;
  21.       *ss++ = c;
  22.       s = ss;
  23.       count -= 2;
  24.     }
  25.   temp = count >> 2;
  26.   if (temp)
  27.     {
  28.       long *ls = s;
  29.       __asm__ __volatile__("movel %1,%2nt"
  30.    "andw  #7,%2nt"
  31.    "lsrl  #3,%1nt"
  32.    "negw  %2nt"
  33.    "jmp   %%pc@(2f,%2:w:2)nt"
  34.    "1:t"
  35.    "movel %3,%0@+nt"
  36.    "movel %3,%0@+nt"
  37.    "movel %3,%0@+nt"
  38.    "movel %3,%0@+nt"
  39.    "movel %3,%0@+nt"
  40.    "movel %3,%0@+nt"
  41.    "movel %3,%0@+nt"
  42.    "movel %3,%0@+nt"
  43.    "2:t"
  44.    "dbra  %1,1bnt"
  45.    "clrw  %1nt"
  46.    "subql #1,%1nt"
  47.    "jpl   1bnt"
  48.    : "=a" (ls), "=d" (temp), "=&d" (temp1)
  49.    : "d" (c), "0" (ls), "1" (temp)
  50.    );
  51.       s = ls;
  52.     }
  53.   if (count & 2)
  54.     {
  55.       short *ss = s;
  56.       *ss++ = c;
  57.       s = ss;
  58.     }
  59.   if (count & 1)
  60.     {
  61.       char *cs = s;
  62.       *cs = c;
  63.     }
  64.   return xs;
  65. }