/branches/18.06.1/target/linux/generic/pending-4.14/306-mips_mem_functions_performance.patch |
@@ -0,0 +1,106 @@ |
From: Felix Fietkau <nbd@nbd.name> |
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 <nbd@nbd.name> |
--- |
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 <linux/module.h> |
+#include <linux/string.h> |
+ |
+#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); |
+ |