POK(kernelpart)
/home/jaouen/pok_official/pok/trunk/kernel/libc/memcpy.c
Go to the documentation of this file.
00001 /*
00002  *                               POK header
00003  * 
00004  * The following file is a part of the POK project. Any modification should
00005  * made according to the POK licence. You CANNOT use this file or a part of
00006  * this file is this part of a file for your own project
00007  *
00008  * For more information on the POK licence, please see our LICENCE FILE
00009  *
00010  * Please follow the coding guidelines described in doc/CODING_GUIDELINES
00011  *
00012  *                                      Copyright (c) 2007-2009 POK team 
00013  *
00014  * Created by julien on Thu Jan 15 23:34:13 2009 
00015  */
00016 
00017 
00018 #include <libc.h>
00019 
00020 void* memcpy (void*        to,
00021               const void*  from,
00022               size_t       n)
00023 {
00024 #ifdef __i386__
00025   int d0;
00026   int d1;
00027   int d2;
00028 
00029   __asm__ __volatile__(
00030                        "rep ; movsl\n\t"
00031                        "testb $2,%b4\n\t"
00032                        "je 1f\n\t"
00033                        "movsw\n"
00034                        "1:\ttestb $1,%b4\n\t"
00035                        "je 2f\n\t"
00036                        "movsb\n"
00037                        "2:"
00038                        : "=&c" (d0), "=&D" (d1), "=&S" (d2)
00039                        :"0" (n/4), "q" (n),"1" ((long) to),"2" ((long) from)
00040                        : "memory");
00041 #else
00042   char *cto = (char *)to;
00043   const char *cfrom = (const char *)from;
00044 
00045   for (; n > 0; n--)
00046   {
00047        *cto++ = *cfrom++;
00048   }
00049 #endif
00050   return (to);
00051 }
00052