From 80fba9a2fe4eacaabee99cf0bbead872c2792231 Mon Sep 17 00:00:00 2001 From: David 'Digit' Turner Date: Sun, 26 Sep 2010 22:40:02 +0200 Subject: libc: memmove(): non-overlapping block optim. Change-Id: I5652f4f97ca59d95176443fc27c737ef76258183 --- libc/string/memmove.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'libc/string') diff --git a/libc/string/memmove.c b/libc/string/memmove.c index fcaf4ee..948a766 100644 --- a/libc/string/memmove.c +++ b/libc/string/memmove.c @@ -31,7 +31,11 @@ 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 highgly-optimized memcpy() if the destination + * is before the source, or if the two blocks are non-overlapping + */ + if (__builtin_expect((q < p || (q-p) <= (ptrdiff_t)n), 1)) { return memcpy(dst, src, n); } else { #define PRELOAD_DISTANCE 64 -- cgit v1.1