Here, this one actually has a chance of working, still, totally untested.
---Cut below--- cat > $HOME/Downloads/linusmemcpy.c <<EOF #include <sys/types.h>
void *memcpy(void *dst, const void *src, size_t size) { void *orig = dst; #if __WORDSIZE == 64 asm volatile("rep ; movsq" :"=D" (dst), "=S" (src) : "0" (dst), "1" (src), "c" (size >> 3) : "memory"); asm volatile("rep ; movsb" : "=D" (dst), "=S" (src) : "0" (dst), "1" (src), "c" (size & 7) : "memory"); #else asm volatile("rep ; movsl" :"=D" (dst), "=S" (src) : "0" (dst), "1" (src), "c" (size >> 2) : "memory"); asm volatile("rep ; movsb" : "=D" (dst), "=S" (src) : "0" (dst), "1" (src), "c" (size & 3) : "memory"); #endif return orig; } EOF cd $HOME/Downloads gcc -O2 -c linusmemcpy.c ld -G linusmemcpy.o -o linusmemcpy.so ---Stop cutting here---
Here, this one actually has a chance of working, still, totally untested.
---Cut below--- /linusmemcpy. c <<EOF
cat > $HOME/Downloads
#include <sys/types.h>
void *memcpy(void *dst, const void *src, size_t size)
{
void *orig = dst;
#if __WORDSIZE == 64
asm volatile("rep ; movsq" :"=D" (dst), "=S" (src)
: "0" (dst), "1" (src), "c" (size >> 3) : "memory");
asm volatile("rep ; movsb" : "=D" (dst), "=S" (src)
: "0" (dst), "1" (src), "c" (size & 7) : "memory");
#else
asm volatile("rep ; movsl" :"=D" (dst), "=S" (src)
: "0" (dst), "1" (src), "c" (size >> 2) : "memory");
asm volatile("rep ; movsb" : "=D" (dst), "=S" (src)
: "0" (dst), "1" (src), "c" (size & 3) : "memory");
#endif
return orig;
}
EOF
cd $HOME/Downloads
gcc -O2 -c linusmemcpy.c
ld -G linusmemcpy.o -o linusmemcpy.so
---Stop cutting here---