]> git.sur5r.net Git - u-boot/commitdiff
lib_generic memcpy: copy one word at a time if possible
authorAlessandro Rubini <rubini@unipv.it>
Sat, 10 Oct 2009 09:51:05 +0000 (11:51 +0200)
committerWolfgang Denk <wd@denx.de>
Sun, 18 Oct 2009 21:10:37 +0000 (23:10 +0200)
If source and destination are aligned, this copies ulong values
until possible, trailing part is copied by byte. Thanks for the details
to Wolfgang Denk, Mike Frysinger, Peter Tyser, Chris Moore.

Signed-off-by: Alessandro Rubini <rubini@unipv.it>
Acked-by: Andrea Gallo <andrea.gallo@stericsson.com>
Acked-by: Mike Frysinger <vapier@gentoo.org>
lib_generic/string.c

index 181eda614993167894f9a172d81c1b713cd30e2b..61a45dc94d26c9fc9c42682ee0c67221c26c4a2f 100644 (file)
@@ -446,12 +446,23 @@ char * bcopy(const char * src, char * dest, int count)
  * You should not use this function to access IO space, use memcpy_toio()
  * or memcpy_fromio() instead.
  */
-void * memcpy(void * dest,const void *src,size_t count)
+void * memcpy(void *dest, const void *src, size_t count)
 {
-       char *tmp = (char *) dest, *s = (char *) src;
-
+       unsigned long *dl = (unsigned long *)dest, *sl = (unsigned long *)src;
+       char *d8, *s8;
+
+       /* while all data is aligned (common case), copy a word at a time */
+       if ( (((ulong)dest | (ulong)src) & (sizeof(*dl) - 1)) == 0) {
+               while (count >= sizeof(*dl)) {
+                       *dl++ = *sl++;
+                       count -= sizeof(*dl);
+               }
+       }
+       /* copy the reset one byte at a time */
+       d8 = (char *)dl;
+       s8 = (char *)sl;
        while (count--)
-               *tmp++ = *s++;
+               *d8++ = *s8++;
 
        return dest;
 }