POK(kernelpart)
|
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