Skip to content

Commit 5b21e2d

Browse files
teknoraveresmil
authored andcommitted
riscv: 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. Signed-off-by: Matteo Croce <mcroce@microsoft.com>
1 parent 45e2002 commit 5b21e2d

5 files changed

Lines changed: 26 additions & 70 deletions

File tree

arch/riscv/include/asm/string.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ extern asmlinkage void *__memset(void *, int, size_t);
1717
#define __HAVE_ARCH_MEMCPY
1818
void *memcpy(void *dest, const void *src, size_t count);
1919
void *__memcpy(void *dest, const void *src, size_t count);
20+
#define __HAVE_ARCH_MEMMOVE
21+
void *memmove(void *dest, const void *src, size_t count);
22+
void *__memmove(void *dest, const void *src, size_t count);
2023
#endif
2124

22-
#define __HAVE_ARCH_MEMMOVE
23-
extern asmlinkage void *memmove(void *, const void *, size_t);
24-
extern asmlinkage void *__memmove(void *, const void *, size_t);
2525
/* For those files which don't want to check by kasan. */
2626
#if defined(CONFIG_KASAN) && !defined(__SANITIZE_ADDRESS__)
2727
#define memcpy(dst, src, len) __memcpy(dst, src, len)

arch/riscv/kernel/riscv_ksyms.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,4 @@
1010
* Assembly functions that may be used (directly or indirectly) by modules
1111
*/
1212
EXPORT_SYMBOL(memset);
13-
EXPORT_SYMBOL(memmove);
1413
EXPORT_SYMBOL(__memset);
15-
EXPORT_SYMBOL(__memmove);

arch/riscv/lib/Makefile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
# SPDX-License-Identifier: GPL-2.0-only
22
lib-y += delay.o
33
lib-y += memset.o
4-
lib-y += memmove.o
54
lib-$(CONFIG_MMU) += uaccess.o
65
lib-$(CONFIG_64BIT) += tishift.o
76
lib-$(CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE) += string.o

arch/riscv/lib/memmove.S

Lines changed: 0 additions & 64 deletions
This file was deleted.

arch/riscv/lib/string.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,26 @@ EXPORT_SYMBOL(__memcpy);
9393

9494
void *memcpy(void *dest, const void *src, size_t count) __weak __alias(__memcpy);
9595
EXPORT_SYMBOL(memcpy);
96+
97+
/*
98+
* Simply check if the buffer overlaps an call memcpy() in case,
99+
* otherwise do a simple one byte at time backward copy.
100+
*/
101+
void *__memmove(void *dest, const void *src, size_t count)
102+
{
103+
if (dest < src || src + count <= dest)
104+
return memcpy(dest, src, count);
105+
106+
if (dest > src) {
107+
const char *s = src + count;
108+
char *tmp = dest + count;
109+
110+
while (count--)
111+
*--tmp = *--s;
112+
}
113+
return dest;
114+
}
115+
EXPORT_SYMBOL(__memmove);
116+
117+
void *memmove(void *dest, const void *src, size_t count) __weak __alias(__memmove);
118+
EXPORT_SYMBOL(memmove);

0 commit comments

Comments
 (0)