From: Piotr Caban Subject: [PATCH] msvcrt: Optimize memmove implementation. Message-Id: <0ddd3c8d-0456-cd63-a66e-b1cfea579337@codeweavers.com> Date: Wed, 19 Aug 2020 19:00:35 +0200 Based on Torbjorn Granlund code from Glibc. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49663 Signed-off-by: Piotr Caban --- dlls/msvcrt/string.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/dlls/msvcrt/string.c b/dlls/msvcrt/string.c index ab6747db5c..4a7eb5c02a 100644 --- a/dlls/msvcrt/string.c +++ b/dlls/msvcrt/string.c @@ -2485,17 +2485,35 @@ int __cdecl MSVCRT_memcmp(const void *ptr1, const void *ptr2, MSVCRT_size_t n) */ void * __cdecl MSVCRT_memmove(void *dst, const void *src, MSVCRT_size_t n) { - volatile unsigned char *d = dst; /* avoid gcc optimizations */ + unsigned char *d = dst; const unsigned char *s = src; + if (!n) return dst; + if ((MSVCRT_size_t)dst - (MSVCRT_size_t)src >= n) { + while ((MSVCRT_size_t)d % sizeof(MSVCRT_size_t) && n--) *d++ = *s++; + while (n >= sizeof(MSVCRT_size_t)) + { + *(DWORD*)d = *(DWORD*)s; + d += sizeof(MSVCRT_size_t); + s += sizeof(MSVCRT_size_t); + n -= sizeof(MSVCRT_size_t); + } while (n--) *d++ = *s++; } else { d += n - 1; s += n - 1; + while ((MSVCRT_size_t)d % sizeof(MSVCRT_size_t) && n--) *d-- = *s--; + while (n >= sizeof(MSVCRT_size_t)) + { + d -= sizeof(MSVCRT_size_t); + s -= sizeof(MSVCRT_size_t); + *(DWORD*)d = *(DWORD*)s; + n -= sizeof(MSVCRT_size_t); + } while (n--) *d-- = *s--; } return dst;