memmove is used in a number of performance critical places, like copying the
linux kernel from nor flash to ram, so optimizing it can be interesting.

Unfortunately, an arch specific version of memmove often isn't used, and
not supported at all on a number of archs (arm/mips/nds32/nios2/x86) -
But memcpy typically is.

Often memmove is called for copies where src/dest don't overlap, so we
could use the more efficient memcpy instead. Detect these situations and
forward those request to memcpy instead.

Adds 40 bytes to memmove and speeds up boot with ~300ms on a 400MHz arm9.

Signed-off-by: Peter Korsgaard <jac...@sunsite.dk>
---
 lib/string.c |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/lib/string.c b/lib/string.c
index 2c4f0ec..239cc11 100644
--- a/lib/string.c
+++ b/lib/string.c
@@ -504,12 +504,16 @@ void * memmove(void * dest,const void *src,size_t count)
                return dest;
 
        if (dest <= src) {
+               if (dest + count <= src)
+                       return memcpy(dest, src, count);
                tmp = (char *) dest;
                s = (char *) src;
                while (count--)
                        *tmp++ = *s++;
                }
        else {
+               if (src + count <= dest)
+                       return memcpy(dest, src, count);
                tmp = (char *) dest + count;
                s = (char *) src + count;
                while (count--)
-- 
1.7.6.3

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to