00001 #ifndef _MEMCPY_H_ 00002 #define _MEMCPY_H_ 00003 00004 #include <nlibc.h> 00005 00006 #define memcpy(DEST,SRC,N) wmemcpy((DEST),(SRC),((N+15)>>4)) 00007 00013 #ifndef __HAS_MAIN 00014 extern void *wmemcpy(void * restrict dest, const void * restrict src, size_t words); 00015 #else 00016 #if !defined(__cflow_processed) || defined(_uses_wmemcpy_memcpy_h) 00017 void *wmemcpy(void * restrict dest, const void * restrict src, size_t words) { 00018 int todo, i = 0; 00019 todo = words; 00020 for(i = 0; i+6 < words; i+=6 ) { 00021 asm("\tlmtr [%R0 %R1 %R2 %R3 %R4 %R5] 0.%2.%0\n" 00022 "\trtm 0.%2.%1 [%R0 %R1 %R2 %R3 %R4 %R5]" :: "r" (src), "r" (dest), "r" (i)); 00023 todo -= 6; 00024 } 00025 switch( todo ) { 00026 case 5: asm("\tlmtr [%R0 %R1 %R2 %R3 %R4] 0.%2.%0\n" 00027 "\trtm 0.%2.%1 [%R0 %R1 %R2 %R3 %R4]" :: "r" (src), "r" (dest), "r" (i)); 00028 break; 00029 case 4: asm("\tlmtr [%R0 %R1 %R2 %R3] 0.%2.%0\n" 00030 "\trtm 0.%2.%1 [%R0 %R1 %R2 %R3]" :: "r" (src), "r" (dest), "r" (i)); 00031 break; 00032 case 3: asm("\tlmtr [%R0 %R1 %R2] 0.%2.%0\n" 00033 "\trtm 0.%2.%1 [%R0 %R1 %R2]" :: "r" (src), "r" (dest), "r" (i)); 00034 break; 00035 case 2: asm("\tlmtr [%R0 %R1] 0.%2.%0\n" 00036 "\trtm 0.%2.%1 [%R0 %R1]" :: "r" (src), "r" (dest), "r" (i)); 00037 break; 00038 case 1: asm("\tlmtr %R0 0.%2.%0\n" 00039 "\trtm 0.%2.%1 %R0" :: "r" (src), "r" (dest), "r" (i)); 00040 break; 00041 default: break; 00042 } 00043 return dest; 00044 } 00045 #endif // _uses_wmemcpy_memcpy_h 00046 #endif // Has Main 00047 00048 #endif // _MEMCPY_H_