lib/string: optimized memmove
When the destination buffer is before the source one, or when the buffers doesn't overlap, it's safe to use memcpy() instead, which is optimized to use a bigger data size possible. This "optimization" only covers a common case. In future, proper code which does the same thing as memcpy() does but backwards can be done. Link: https://lkml.kernel.org/r/20210702123153.14093-3-mcroce@linux.microsoft.com Signed-off-by: Matteo Croce <mcroce@microsoft.com> Cc: Christoph Hellwig <hch@infradead.org> Cc: David Laight <David.Laight@aculab.com> Cc: Drew Fustini <drew@beagleboard.org> Cc: Emil Renner Berthing <kernel@esmil.dk> Cc: Guo Ren <guoren@kernel.org> Cc: Nick Desaulniers <ndesaulniers@google.com> Cc: Nick Kossifidis <mick@ics.forth.gr> Cc: Palmer Dabbelt <palmer@dabbelt.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au> Signed-off-by: Jebaitedneko <Jebaitedneko@gmail.com> Signed-off-by: celtare21 <celtare21@gmail.com>
This commit is contained in:
parent
e4f231582a
commit
95dce0e9be
1 changed files with 6 additions and 12 deletions
18
lib/string.c
18
lib/string.c
|
@ -932,19 +932,13 @@ EXPORT_SYMBOL(memcpy);
|
|||
*/
|
||||
void *memmove(void *dest, const void *src, size_t count)
|
||||
{
|
||||
char *tmp;
|
||||
const char *s;
|
||||
if (dest < src || src + count <= dest)
|
||||
return memcpy(dest, src, count);
|
||||
|
||||
if (dest > src) {
|
||||
const char *s = src + count;
|
||||
char *tmp = dest + count;
|
||||
|
||||
if (dest <= src) {
|
||||
tmp = dest;
|
||||
s = src;
|
||||
while (count--)
|
||||
*tmp++ = *s++;
|
||||
} else {
|
||||
tmp = dest;
|
||||
tmp += count;
|
||||
s = src;
|
||||
s += count;
|
||||
while (count--)
|
||||
*--tmp = *--s;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue