Skip to content
Snippets Groups Projects
Commit 06dd5386 authored by Avi Kivity's avatar Avi Kivity
Browse files

libc: optimized memcpy()

If the cpu supports "Enhanced REP MOVS / STOS" (ERMS), use an rep movsb
instruction to implement memcpy.  This speeds up copies significantly,
especially large misaligned ones.
parent 5948f0d7
No related branches found
No related tags found
No related merge requests found
#include <string.h>
#include "processor.hh"
extern "C"
void *memcpy_base(void *__restrict dest, const void *__restrict src, size_t n);
extern "C"
void *memcpy_repmov(void *__restrict dest, const void *__restrict src, size_t n)
{
auto ret = dest;
asm volatile("rep movsb" : "+D"(dest), "+S"(src), "+c"(n) : : "memory");
return ret;
}
extern "C"
void *(*resolve_memcpy())(void *__restrict dest, const void *__restrict src, size_t n)
{
using processor::cpuid;
if (cpuid(0).a >= 7 && (cpuid(7, 0).b & 0x200)) {
return memcpy_repmov;
}
return memcpy_base;
}
void *memcpy(void *__restrict dest, const void *__restrict src, size_t n)
__attribute__((ifunc("resolve_memcpy")));
...@@ -409,6 +409,7 @@ objects += arch/x64/arch-setup.o ...@@ -409,6 +409,7 @@ objects += arch/x64/arch-setup.o
objects += arch/x64/smp.o objects += arch/x64/smp.o
objects += arch/x64/signal.o objects += arch/x64/signal.o
objects += arch/x64/cpuid.o objects += arch/x64/cpuid.o
objects += arch/x64/string.o
objects += core/mutex.o objects += core/mutex.o
objects += core/lfmutex.o objects += core/lfmutex.o
objects += core/semaphore.o objects += core/semaphore.o
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
#define ALIGN (sizeof(size_t)-1) #define ALIGN (sizeof(size_t)-1)
#define ONES ((size_t)-1/UCHAR_MAX) #define ONES ((size_t)-1/UCHAR_MAX)
void *memcpy(void *__restrict dest, const void *__restrict src, size_t n) void *memcpy_base(void *__restrict dest, const void *__restrict src, size_t n)
{ {
unsigned char *d = dest; unsigned char *d = dest;
const unsigned char *s = src; const unsigned char *s = src;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment