Optimize memcpy more

This commit is contained in:
iabdalkader 2014-09-11 19:01:48 +02:00
parent 81b2ddf5d1
commit d60580eb5e

View File

@ -30,14 +30,36 @@
#define likely(x) __builtin_expect((x), 1) #define likely(x) __builtin_expect((x), 1)
void *memcpy(void *dst, const void *src, size_t n) { void *memcpy(void *dst, const void *src, size_t n) {
if (likely(!(n&3) && !((long)dst&3) && !((long)src&3))) { if (likely(!((long)dst&3) && !((long)src&3))) {
//aligned access, copy words //copy words from aligned pointers first
long *d = dst; long *d = dst;
const long *s = src; const long *s = src;
for (n=(n>>2); n; n--) { for (int i=(n>>2); i; i--) {
*d++ = *s++; *d++ = *s++;
} }
//copy remaining bytes
if (n&3) {
char *d8 = (char*)d;
const char *s8 =(char*) s;
switch (n&3) {
case 1:
*d8=*s8;
break;
case 2:
*d8++=*s8++;
*d8=*s8;
break;
case 3:
*d8++=*s8++;
*d8++=*s8++;
*d8=*s8;
break;
}
}
} else { } else {
//unaligned access, copy bytes //unaligned access, copy bytes
char *d = dst; char *d = dst;