From: Felix Fietkau Subject: [PATCH] mips: allow the compiler to optimize memset, memcmp, memcpy for better performance and (in some instances) smaller code lede-commit: 07e59c7bc7f375f792ec9734be42fe4fa391a8bb Signed-off-by: Felix Fietkau --- arch/mips/boot/compressed/Makefile | 3 ++- arch/mips/include/asm/string.h | 38 ++++++++++++++++++++++++++++++++++++++ arch/mips/lib/Makefile | 2 +- arch/mips/lib/memcmp.c | 22 ++++++++++++++++++++++ 4 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 arch/mips/lib/memcmp.c --- a/arch/mips/boot/compressed/Makefile +++ b/arch/mips/boot/compressed/Makefile @@ -23,7 +23,8 @@ KBUILD_CFLAGS := $(filter-out -pg, $(KBU KBUILD_CFLAGS := $(filter-out -fstack-protector, $(KBUILD_CFLAGS)) KBUILD_CFLAGS := $(KBUILD_CFLAGS) -D__KERNEL__ \ - -DBOOT_HEAP_SIZE=$(BOOT_HEAP_SIZE) -D"VMLINUX_LOAD_ADDRESS_ULL=$(VMLINUX_LOAD_ADDRESS)ull" + -DBOOT_HEAP_SIZE=$(BOOT_HEAP_SIZE) -D"VMLINUX_LOAD_ADDRESS_ULL=$(VMLINUX_LOAD_ADDRESS)ull" \ + -D__ZBOOT__ KBUILD_AFLAGS := $(KBUILD_AFLAGS) -D__ASSEMBLY__ \ -DBOOT_HEAP_SIZE=$(BOOT_HEAP_SIZE) \ --- a/arch/mips/include/asm/string.h +++ b/arch/mips/include/asm/string.h @@ -140,4 +140,42 @@ extern void *memcpy(void *__to, __const_ #define __HAVE_ARCH_MEMMOVE extern void *memmove(void *__dest, __const__ void *__src, size_t __n); +#ifndef __ZBOOT__ +#define memset(__s, __c, len) \ +({ \ + size_t __len = (len); \ + void *__ret; \ + if (__builtin_constant_p(len) && __len >= 64) \ + __ret = memset((__s), (__c), __len); \ + else \ + __ret = __builtin_memset((__s), (__c), __len); \ + __ret; \ +}) + +#define memcpy(dst, src, len) \ +({ \ + size_t __len = (len); \ + void *__ret; \ + if (__builtin_constant_p(len) && __len >= 64) \ + __ret = memcpy((dst), (src), __len); \ + else \ + __ret = __builtin_memcpy((dst), (src), __len); \ + __ret; \ +}) + +#define memmove(dst, src, len) \ +({ \ + size_t __len = (len); \ + void *__ret; \ + if (__builtin_constant_p(len) && __len >= 64) \ + __ret = memmove((dst), (src), __len); \ + else \ + __ret = __builtin_memmove((dst), (src), __len); \ + __ret; \ +}) + +#define __HAVE_ARCH_MEMCMP +#define memcmp(src1, src2, len) __builtin_memcmp((src1), (src2), (len)) +#endif + #endif /* _ASM_STRING_H */ --- a/arch/mips/lib/Makefile +++ b/arch/mips/lib/Makefile @@ -5,7 +5,7 @@ lib-y += bitops.o csum_partial.o delay.o memcpy.o memset.o \ mips-atomic.o strncpy_user.o \ - strnlen_user.o uncached.o + strnlen_user.o uncached.o memcmp.o obj-y += iomap.o iomap_copy.o obj-$(CONFIG_PCI) += iomap-pci.o --- /dev/null +++ b/arch/mips/lib/memcmp.c @@ -0,0 +1,22 @@ +/* + * copied from linux/lib/string.c + * + * Copyright (C) 1991, 1992 Linus Torvalds + */ + +#include +#include + +#undef memcmp +int memcmp(const void *cs, const void *ct, size_t count) +{ + const unsigned char *su1, *su2; + int res = 0; + + for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--) + if ((res = *su1 - *su2) != 0) + break; + return res; +} +EXPORT_SYMBOL(memcmp); +