00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 typedef unsigned size_t;
00027
00028
00030
00031
00032
00034
00036
00043 void memcpy(void* dest,void* src,size_t size) {
00044 char *end=((char*)src)+size;
00045 int dummy;
00046 __asm__ __volatile__(
00047 #ifdef CONF_ROM_MEMCPY
00048 "\n\
00049 ; memcpy == [r1,r1+r2) -> [r0,r0+r2)\n\
00050 ; rom == [r0,r1) -> [r2,r2+r1-r0)\n\
00051 mov.w r0,r3\n\
00052 mov.w r1,r0\n\
00053 add.w r2,r1\n\
00054 mov.w r3,r2\n\
00055 jmp @rom_memcpy\n\
00056 "
00057 #else
00058 "\n\
00059 0:cmp %1,%2\n\
00060 beq 1f\n\
00061 mov.b @%1+,%0l\n\
00062 mov.b %0l,@%3\n\
00063 adds #1,%3\n\
00064 bra 0b\n\
00065 1:\n\
00066 "
00067 #endif
00068 : "=&r" (dummy)
00069 : "r" (src), "r" (end), "r" (dest)
00070 : "cc","memory"
00071 );
00072 }