Fixup previous memcpy optimization.
authorKevin O'Connor <kevin@koconnor.net>
Mon, 20 Apr 2009 03:18:54 +0000 (23:18 -0400)
committerKevin O'Connor <kevin@koconnor.net>
Mon, 20 Apr 2009 03:18:54 +0000 (23:18 -0400)
Different gcc versions handle __builtin_memcpy differently.
Add -minline-all-string to force inlining of memcpy on old gcc.
Always use __builtin_memcpy for all memcpy calls.
Use memcpy4() for the option rom case where 4-byte accesses is important.

Makefile
src/optionroms.c
src/util.c
src/util.h

index 1cf7ba264fda54b68324cd535ebc367e1b8b1e36..19e63d4037e1daf924fab427264fd11f44de8883 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -22,7 +22,8 @@ cc-option = $(shell if test -z "`$(1) $(2) -S -o /dev/null -xc \
 COMMONCFLAGS = -Wall -Os -MD -m32 -march=i386 -mregparm=3 \
                -mpreferred-stack-boundary=2 -mrtd -freg-struct-return \
                -ffreestanding -fwhole-program -fomit-frame-pointer \
-               -fno-delete-null-pointer-checks -Wno-strict-aliasing
+               -fno-delete-null-pointer-checks -Wno-strict-aliasing \
+               -minline-all-stringops
 COMMONCFLAGS += $(call cc-option,$(CC),-nopie,)
 COMMONCFLAGS += $(call cc-option,$(CC),-fno-stack-protector,)
 COMMONCFLAGS += $(call cc-option,$(CC),-fno-stack-protector-all,)
index def3febb457c9fa1d6cd8f5124f521a1ae169a01..32fb44b382a9cbef44d4b2d067fd95ea78d21bdf 100644 (file)
@@ -171,7 +171,7 @@ copy_rom(struct rom_header *rom)
     }
     dprintf(4, "Copying option rom (size %d) from %p to %x\n"
             , romsize, rom, next_rom);
-    memcpy((void*)next_rom, rom, romsize);
+    memcpy4((void*)next_rom, rom, romsize);
     return (struct rom_header *)next_rom;
 }
 
index a39668b112ab052ef7b725f269f9f448c218f91e..3c7117c4f7213ece58523bdfd306b5a023f565e7 100644 (file)
@@ -181,25 +181,15 @@ memcpy_far(u16 d_seg, void *d_far, u16 s_seg, const void *s_far, size_t len)
         : "cc", "memory");
 }
 
-noinline void *
-__memcpy(void *d1, const void *s1, size_t len)
+// Memcpy that uses 4-byte accesses
+void
+memcpy4(void *d1, const void *s1, size_t len)
 {
-    void *d = d1;
-    if (((u32)d1 | (u32)s1 | len) & 3) {
-        // non-aligned memcpy
-        asm volatile(
-            "rep movsb (%%esi),%%es:(%%edi)\n"
-            : "+c"(len), "+S"(s1), "+D"(d)
-            : : "cc", "memory");
-        return d1;
-    }
-    // Common case - use 4-byte copy
     len /= 4;
     asm volatile(
         "rep movsl (%%esi),%%es:(%%edi)\n"
-        : "+c"(len), "+S"(s1), "+D"(d)
+        : "+c"(len), "+S"(s1), "+D"(d1)
         : : "cc", "memory");
-    return d1;
 }
 
 void *
index ceb775e6a9dd48077cd704e01fd3a983bcaa40ef..bb1a445ac89f5595355afa6db7fefa3a14b683ab 100644 (file)
@@ -73,11 +73,8 @@ int memcmp(const void *s1, const void *s2, size_t n);
 size_t strlen(const char *s);
 int strcmp(const char *s1, const char *s2);
 void *memset(void *s, int c, size_t n);
-void *__memcpy(void *d1, const void *s1, size_t len);
-#define memcpy(d1, s1, len) (                           \
-        (__builtin_constant_p(len) && (len) <= 20)      \
-        ? __builtin_memcpy((d1), (s1), (len))           \
-        :  __memcpy((d1), (s1), (len)))
+void memcpy4(void *d1, const void *s1, size_t len);
+#define memcpy(d1, s1, len) __builtin_memcpy((d1), (s1), (len))
 inline void memcpy_far(u16 d_seg, void *d_far
                        , u16 s_seg, const void *s_far, size_t len);
 void *memmove(void *d, const void *s, size_t len);