From 5b81b918173b4bf446c1a85240c094e4dd77231f Mon Sep 17 00:00:00 2001 From: David 'Digit' Turner Date: Thu, 7 Oct 2010 11:03:32 +0200 Subject: libc: optimize memmove() with memcpy() if possible. Change-Id: I90e578fdc82e427caee8fa4157ce3f8c6c99926d --- libc/string/memmove.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'libc') diff --git a/libc/string/memmove.c b/libc/string/memmove.c index fcaf4ee..98ecfc9 100644 --- a/libc/string/memmove.c +++ b/libc/string/memmove.c @@ -31,7 +31,10 @@ void *memmove(void *dst, const void *src, size_t n) { const char *p = src; char *q = dst; - if (__builtin_expect(q < p, 1)) { + /* We can use the optimized memcpy if the destination is below the + * source (i.e. q < p), or if it is completely over it (i.e. q >= p+n). + */ + if (__builtin_expect((q < p) || ((size_t)(q - p) >= n), 1)) { return memcpy(dst, src, n); } else { #define PRELOAD_DISTANCE 64 -- cgit v1.1