74d00a8c38
* properly format/comment all patches * merge debloat patches * merge Kconfig patches * merge swconfig patches * merge hotplug patches * drop 200-fix_localversion.patch - upstream * drop 222-arm_zimage_none.patch - unused * drop 252-mv_cesa_depends.patch - no longer required * drop 410-mtd-move-forward-declaration-of-struct-mtd_info.patch - unused * drop 661-fq_codel_keep_dropped_stats.patch - outdated * drop 702-phy_add_aneg_done_function.patch - upstream * drop 840-rtc7301.patch - unused * drop 841-rtc_pt7c4338.patch - upstream * drop 921-use_preinit_as_init.patch - unused * drop spio-gpio-old and gpio-mmc - unused Signed-off-by: John Crispin <john@phrozen.org>
118 lines
3.7 KiB
Diff
118 lines
3.7 KiB
Diff
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
|
|
|
|
diff --git a/arch/mips/boot/compressed/Makefile b/arch/mips/boot/compressed/Makefile
|
|
index 90aca95fe314..3cd3b391ef49 100644
|
|
--- a/arch/mips/boot/compressed/Makefile
|
|
+++ b/arch/mips/boot/compressed/Makefile
|
|
@@ -23,7 +23,8 @@ KBUILD_CFLAGS := $(shell echo $(KBUILD_CFLAGS) | sed -e "s/-pg//")
|
|
KBUILD_CFLAGS := $(filter-out -fstack-protector, $(KBUILD_CFLAGS))
|
|
|
|
KBUILD_CFLAGS := $(LINUXINCLUDE) $(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 := $(LINUXINCLUDE) $(KBUILD_AFLAGS) -D__ASSEMBLY__ \
|
|
-DBOOT_HEAP_SIZE=$(BOOT_HEAP_SIZE) \
|
|
diff --git a/arch/mips/include/asm/string.h b/arch/mips/include/asm/string.h
|
|
index 29030cb398ee..7b737f9b6d58 100644
|
|
--- a/arch/mips/include/asm/string.h
|
|
+++ b/arch/mips/include/asm/string.h
|
|
@@ -140,4 +140,42 @@ extern void *memcpy(void *__to, __const__ void *__from, size_t __n);
|
|
#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 */
|
|
diff --git a/arch/mips/lib/Makefile b/arch/mips/lib/Makefile
|
|
index 0344e575f522..33a0211e954a 100644
|
|
--- a/arch/mips/lib/Makefile
|
|
+++ b/arch/mips/lib/Makefile
|
|
@@ -4,7 +4,7 @@
|
|
|
|
lib-y += bitops.o csum_partial.o delay.o memcpy.o memset.o \
|
|
mips-atomic.o strlen_user.o strncpy_user.o \
|
|
- strnlen_user.o uncached.o
|
|
+ strnlen_user.o uncached.o memcmp.o
|
|
|
|
obj-y += iomap.o
|
|
obj-$(CONFIG_PCI) += iomap-pci.o
|
|
diff --git a/arch/mips/lib/memcmp.c b/arch/mips/lib/memcmp.c
|
|
new file mode 100644
|
|
index 000000000000..35ef1646286e
|
|
--- /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);
|
|
+
|
|
--
|
|
2.11.0
|
|
|