riscv: optimized memmove
[platform/kernel/linux-starfive.git] / arch / riscv / lib / string.c
index 32509ab..bd52581 100644 (file)
@@ -89,3 +89,26 @@ EXPORT_SYMBOL(__memcpy);
 
 void *memcpy(void *dest, const void *src, size_t count) __weak __alias(__memcpy);
 EXPORT_SYMBOL(memcpy);
+
+/*
+ * Simply check if the buffer overlaps an call memcpy() in case,
+ * otherwise do a simple one byte at time backward copy.
+ */
+void *__memmove(void *dest, const void *src, size_t count)
+{
+       if (dest < src || src + count <= dest)
+               return __memcpy(dest, src, count);
+
+       if (dest > src) {
+               const char *s = src + count;
+               char *tmp = dest + count;
+
+               while (count--)
+                       *--tmp = *--s;
+       }
+       return dest;
+}
+EXPORT_SYMBOL(__memmove);
+
+void *memmove(void *dest, const void *src, size_t count) __weak __alias(__memmove);
+EXPORT_SYMBOL(memmove);