#include #include // // Inline ix86 memcpy() that contains no jumps. Not copied from // anybody. Contributed by rjohnson@analogic.com // static __inline__ void *memcpy(void *dst, void *src, size_t len) { void *ret = dst; __asm__ __volatile__( \ "cld\n" \ "shr $1, %%ecx\n" \ "pushf\n" \ "shr $1, %%ecx\n" \ "pushf\n" \ "rep\n" \ "movsl\n" \ "popf\n" \ "adcl %%ecx, %%ecx\n" \ "rep\n" \ "movsw\n" \ "popf\n" \ "adcl %%ecx, %%ecx\n" \ "rep\n" \ "movsb\n" \ : "=D" (dst), "=S" (src), "=c"(len) : "0" (dst), "1" (src), "2" (len) : "memory" ); return ret; } const char tester[]= "0123456789" "0123456789" "0123456789" "0123456789" "0123456789" "0123456789" "0123456789" "0123456789"; char allocated[0x1000]; int main() { size_t i; char buf[0x1000]; memset(buf, 0x00, sizeof(buf)); for(i=0; i< sizeof(buf); i++) puts(memcpy(buf, (char *)tester, i)); memset(buf, 0x00, sizeof(buf)); for(i=0; i< sizeof(buf)-1; i++) puts(memcpy(&buf[1], (char *)tester, i)); memset(buf, 0x00, sizeof(buf)); for(i=0; i< sizeof(buf)-2; i++) puts(memcpy(&buf[2], (char *)tester, i)); memset(buf, 0x00, sizeof(buf)); for(i=0; i< sizeof(buf)-3; i++) puts(memcpy(&buf[3], (char *)tester, i)); return 0; }