Go to the documentation of this file.
37 #define MEMCPY_BY_BLOCK_THRESHOLD (44 * 2)
40 __asm__ (
".syntax no_register_prefix");
43 memcpy(
void *pdst,
const void *psrc,
size_t pn)
52 register void *return_dst
__asm__ (
"r10") = pdst;
53 register unsigned char *
dst __asm__ (
"r13") = pdst;
54 register unsigned const char *
src __asm__ (
"r11") = psrc;
60 if (((
unsigned long)
dst & 3) != 0
65 if ((
unsigned long) dst & 1)
73 if ((
unsigned long) dst & 2)
76 *(
short *) dst = *(
short *)
src;
91 ;; GCC does promise correct register allocations, but let's \n\
92 ;; make sure it keeps its promises. \n\
93 .ifnc %0-%1-%2,$r13-$r11-$r12 \n\
94 .error \"GCC reg alloc bug: %0-%1-%4 != $r13-$r12-$r11\" \n\
97 ;; Save the registers we'll use in the movem process \n\
102 ;; Now we've got this: \n\
107 ;; Update n for the first loop. \n\
111 #ifdef __arch_common_v10_v32
116 " movem [r11+],r10 \n\
121 ;; Compensate for last loop underflowing n. \n\
124 ;; Restore registers from stack. \n\
128 :
"=r" (
dst),
"=r" (
src),
"=r" (
n)
131 :
"0" (dst),
"1" (
src),
"2" (
n));
136 *(
long *) dst = *(
long *)
src; dst += 4;
src += 4;
137 *(
long *) dst = *(
long *)
src; dst += 4;
src += 4;
138 *(
long *) dst = *(
long *)
src; dst += 4;
src += 4;
139 *(
long *) dst = *(
long *)
src; dst += 4;
src += 4;
154 *(
short *) dst = *(
short *)
src;
158 *(
short *) dst = *(
short *)
src; dst += 2;
src += 2;
163 *(
long *) dst = *(
long *)
src;
167 *(
long *) dst = *(
long *)
src; dst += 4;
src += 4;
172 *(
long *) dst = *(
long *)
src; dst += 4;
src += 4;
173 *(
short *) dst = *(
short *)
src;
177 *(
long *) dst = *(
long *)
src; dst += 4;
src += 4;
178 *(
short *) dst = *(
short *)
src; dst += 2;
src += 2;
183 *(
long *) dst = *(
long *)
src; dst += 4;
src += 4;
184 *(
long *) dst = *(
long *)
src;
188 *(
long *) dst = *(
long *)
src; dst += 4;
src += 4;
189 *(
long *) dst = *(
long *)
src; dst += 4;
src += 4;
194 *(
long *) dst = *(
long *)
src; dst += 4;
src += 4;
195 *(
long *) dst = *(
long *)
src; dst += 4;
src += 4;
196 *(
short *) dst = *(
short *)
src;
200 *(
long *) dst = *(
long *)
src; dst += 4;
src += 4;
201 *(
long *) dst = *(
long *)
src; dst += 4;
src += 4;
202 *(
short *) dst = *(
short *)
src; dst += 2;
src += 2;
207 *(
long *) dst = *(
long *)
src; dst += 4;
src += 4;
208 *(
long *) dst = *(
long *)
src; dst += 4;
src += 4;
209 *(
long *) dst = *(
long *)
src;
213 *(
long *) dst = *(
long *)
src; dst += 4;
src += 4;
214 *(
long *) dst = *(
long *)
src; dst += 4;
src += 4;
215 *(
long *) dst = *(
long *)
src; dst += 4;
src += 4;
220 *(
long *) dst = *(
long *)
src; dst += 4;
src += 4;
221 *(
long *) dst = *(
long *)
src; dst += 4;
src += 4;
222 *(
long *) dst = *(
long *)
src; dst += 4;
src += 4;
223 *(
short *) dst = *(
short *)
src;
227 *(
long *) dst = *(
long *)
src; dst += 4;
src += 4;
228 *(
long *) dst = *(
long *)
src; dst += 4;
src += 4;
229 *(
long *) dst = *(
long *)
src; dst += 4;
src += 4;
230 *(
short *) dst = *(
short *)
src; dst += 2;
src += 2;