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_