From 40d5534cff720d566cd52f532f26eea2bd86c1ae Mon Sep 17 00:00:00 2001 From: Tom Rini Date: Thu, 12 Jan 2017 13:16:02 -0500 Subject: [PATCH] ARM: Default to using optimized memset and memcpy routines We have long had available optimized versions of the memset and memcpy functions that are borrowed from the Linux kernel. We should use these in normal conditions as the speed wins in many workflows outweigh the relatively minor size increase. However, we have a number of places where we're simply too close to size limits in SPL and must be able to make the size vs performance trade-off in those cases. Cc: Philippe Reynes Cc: Eric Jarrige Cc: Heiko Schocher Cc: Magnus Lilja Cc: Lokesh Vutla Cc: Chander Kashyap Cc: Akshay Saraswat Cc: Simon Glass Cc: Stefan Roese Signed-off-by: Tom Rini Acked-by: Stefan Roese Reviewed-by: Simon Glass --- arch/arm/Kconfig | 22 ++++++++++++++++++++-- arch/arm/lib/Makefile | 4 ++-- common/init/board_init.c | 2 +- configs/apf27_defconfig | 1 + configs/axm_defconfig | 2 ++ configs/corvus_defconfig | 2 ++ configs/mx31pdk_defconfig | 2 ++ configs/omap4_sdp4430_defconfig | 2 ++ configs/smartweb_defconfig | 2 ++ configs/smdk5250_defconfig | 2 ++ configs/snow_defconfig | 2 ++ configs/spring_defconfig | 2 ++ configs/taurus_defconfig | 2 ++ configs/x600_defconfig | 2 ++ examples/api/Makefile | 5 ++++- 15 files changed, 48 insertions(+), 6 deletions(-) diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 80038ecb24..855871c64f 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -128,7 +128,16 @@ config ENABLE_ARM_SOC_BOOT0_HOOK config USE_ARCH_MEMCPY bool "Use an assembly optimized implementation of memcpy" - default y if CPU_V7 + default y + depends on !ARM64 + help + Enable the generation of an optimized version of memcpy. + Such implementation may be faster under some conditions + but may increase the binary size. + +config SPL_USE_ARCH_MEMCPY + bool "Use an assembly optimized implementation of memcpy" + default y if USE_ARCH_MEMCPY depends on !ARM64 help Enable the generation of an optimized version of memcpy. @@ -137,7 +146,16 @@ config USE_ARCH_MEMCPY config USE_ARCH_MEMSET bool "Use an assembly optimized implementation of memset" - default y if CPU_V7 + default y + depends on !ARM64 + help + Enable the generation of an optimized version of memset. + Such implementation may be faster under some conditions + but may increase the binary size. + +config SPL_USE_ARCH_MEMSET + bool "Use an assembly optimized implementation of memset" + default y if USE_ARCH_MEMSET depends on !ARM64 help Enable the generation of an optimized version of memset. diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile index 024139da25..166fa9e3da 100644 --- a/arch/arm/lib/Makefile +++ b/arch/arm/lib/Makefile @@ -30,12 +30,12 @@ obj-$(CONFIG_CMD_BOOTI) += bootm.o obj-$(CONFIG_CMD_BOOTM) += bootm.o obj-$(CONFIG_CMD_BOOTZ) += bootm.o zimage.o obj-$(CONFIG_SYS_L2_PL310) += cache-pl310.o -obj-$(CONFIG_USE_ARCH_MEMSET) += memset.o -obj-$(CONFIG_USE_ARCH_MEMCPY) += memcpy.o else obj-$(CONFIG_SPL_FRAMEWORK) += spl.o obj-$(CONFIG_SPL_FRAMEWORK) += zimage.o endif +obj-$(CONFIG_$(SPL_)USE_ARCH_MEMSET) += memset.o +obj-$(CONFIG_$(SPL_)USE_ARCH_MEMCPY) += memcpy.o obj-$(CONFIG_SEMIHOSTING) += semihosting.o obj-y += sections.o diff --git a/common/init/board_init.c b/common/init/board_init.c index ef01a9aeaa..193d8180a9 100644 --- a/common/init/board_init.c +++ b/common/init/board_init.c @@ -17,7 +17,7 @@ DECLARE_GLOBAL_DATA_PTR; */ #if !defined(CONFIG_SPL_BUILD) || \ (defined(CONFIG_SPL_LIBGENERIC_SUPPORT) && \ - !defined(CONFIG_USE_ARCH_MEMSET)) + !defined(CONFIG_SPL_USE_ARCH_MEMCPY)) #define _USE_MEMCPY #endif diff --git a/configs/apf27_defconfig b/configs/apf27_defconfig index 2da500aec6..64040aa321 100644 --- a/configs/apf27_defconfig +++ b/configs/apf27_defconfig @@ -1,4 +1,5 @@ CONFIG_ARM=y +# CONFIG_SPL_USE_ARCH_MEMCPY is not set CONFIG_TARGET_APF27=y CONFIG_SPL_NAND_SUPPORT=y CONFIG_SPL_SERIAL_SUPPORT=y diff --git a/configs/axm_defconfig b/configs/axm_defconfig index db988c8be7..539e776592 100644 --- a/configs/axm_defconfig +++ b/configs/axm_defconfig @@ -1,4 +1,6 @@ CONFIG_ARM=y +# CONFIG_SPL_USE_ARCH_MEMCPY is not set +# CONFIG_SPL_USE_ARCH_MEMSET is not set CONFIG_ARCH_AT91=y CONFIG_TARGET_TAURUS=y CONFIG_SPL_GPIO_SUPPORT=y diff --git a/configs/corvus_defconfig b/configs/corvus_defconfig index e33d3719b9..fc10399844 100644 --- a/configs/corvus_defconfig +++ b/configs/corvus_defconfig @@ -1,4 +1,6 @@ CONFIG_ARM=y +# CONFIG_SPL_USE_ARCH_MEMCPY is not set +# CONFIG_SPL_USE_ARCH_MEMSET is not set CONFIG_ARCH_AT91=y CONFIG_TARGET_CORVUS=y CONFIG_SPL_GPIO_SUPPORT=y diff --git a/configs/mx31pdk_defconfig b/configs/mx31pdk_defconfig index bb1f121f3f..59084d7b65 100644 --- a/configs/mx31pdk_defconfig +++ b/configs/mx31pdk_defconfig @@ -1,4 +1,6 @@ CONFIG_ARM=y +# CONFIG_SPL_USE_ARCH_MEMCPY is not set +# CONFIG_SPL_USE_ARCH_MEMSET is not set CONFIG_TARGET_MX31PDK=y CONFIG_SPL_LIBGENERIC_SUPPORT=y CONFIG_SPL_NAND_SUPPORT=y diff --git a/configs/omap4_sdp4430_defconfig b/configs/omap4_sdp4430_defconfig index f3a8b0c8d2..862f3f01a3 100644 --- a/configs/omap4_sdp4430_defconfig +++ b/configs/omap4_sdp4430_defconfig @@ -1,4 +1,6 @@ CONFIG_ARM=y +# CONFIG_SPL_USE_ARCH_MEMCPY is not set +# CONFIG_SPL_USE_ARCH_MEMSET is not set CONFIG_OMAP44XX=y # CONFIG_SPL_I2C_SUPPORT is not set # CONFIG_SPL_NAND_SUPPORT is not set diff --git a/configs/smartweb_defconfig b/configs/smartweb_defconfig index eab598e41f..a0d31666e8 100644 --- a/configs/smartweb_defconfig +++ b/configs/smartweb_defconfig @@ -1,4 +1,6 @@ CONFIG_ARM=y +# CONFIG_SPL_USE_ARCH_MEMCPY is not set +# CONFIG_SPL_USE_ARCH_MEMSET is not set CONFIG_ARCH_AT91=y CONFIG_TARGET_SMARTWEB=y CONFIG_SPL_GPIO_SUPPORT=y diff --git a/configs/smdk5250_defconfig b/configs/smdk5250_defconfig index a34f915d55..ff52a3757a 100644 --- a/configs/smdk5250_defconfig +++ b/configs/smdk5250_defconfig @@ -1,4 +1,6 @@ CONFIG_ARM=y +# CONFIG_SPL_USE_ARCH_MEMCPY is not set +# CONFIG_SPL_USE_ARCH_MEMSET is not set CONFIG_ARCH_EXYNOS=y CONFIG_ARCH_EXYNOS5=y CONFIG_TARGET_SMDK5250=y diff --git a/configs/snow_defconfig b/configs/snow_defconfig index 2ef3774041..d6a48cb12c 100644 --- a/configs/snow_defconfig +++ b/configs/snow_defconfig @@ -1,4 +1,6 @@ CONFIG_ARM=y +# CONFIG_SPL_USE_ARCH_MEMCPY is not set +# CONFIG_SPL_USE_ARCH_MEMSET is not set CONFIG_ARCH_EXYNOS=y CONFIG_ARCH_EXYNOS5=y CONFIG_TARGET_SNOW=y diff --git a/configs/spring_defconfig b/configs/spring_defconfig index 243a9ec540..a64e648b67 100644 --- a/configs/spring_defconfig +++ b/configs/spring_defconfig @@ -1,4 +1,6 @@ CONFIG_ARM=y +# CONFIG_SPL_USE_ARCH_MEMCPY is not set +# CONFIG_SPL_USE_ARCH_MEMSET is not set CONFIG_ARCH_EXYNOS=y CONFIG_ARCH_EXYNOS5=y CONFIG_TARGET_SPRING=y diff --git a/configs/taurus_defconfig b/configs/taurus_defconfig index 793de2909f..0f6841b21f 100644 --- a/configs/taurus_defconfig +++ b/configs/taurus_defconfig @@ -1,4 +1,6 @@ CONFIG_ARM=y +# CONFIG_SPL_USE_ARCH_MEMCPY is not set +# CONFIG_SPL_USE_ARCH_MEMSET is not set CONFIG_ARCH_AT91=y CONFIG_TARGET_TAURUS=y CONFIG_SPL_GPIO_SUPPORT=y diff --git a/configs/x600_defconfig b/configs/x600_defconfig index 4b47fc68f6..28e268e19b 100644 --- a/configs/x600_defconfig +++ b/configs/x600_defconfig @@ -1,4 +1,6 @@ CONFIG_ARM=y +# CONFIG_SPL_USE_ARCH_MEMCPY is not set +# CONFIG_SPL_USE_ARCH_MEMSET is not set CONFIG_TARGET_X600=y CONFIG_SPL_LIBCOMMON_SUPPORT=y CONFIG_SPL_LIBGENERIC_SUPPORT=y diff --git a/examples/api/Makefile b/examples/api/Makefile index 6cffee7465..dab6398bab 100644 --- a/examples/api/Makefile +++ b/examples/api/Makefile @@ -35,6 +35,9 @@ EXT_COBJ-y += lib/string.o EXT_COBJ-y += lib/time.o EXT_COBJ-y += lib/vsprintf.o EXT_SOBJ-$(CONFIG_PPC) += arch/powerpc/lib/ppcstring.o +ifeq ($(ARCH),arm) +EXT_SOBJ-$(CONFIG_USE_ARCH_MEMSET) += arch/arm/lib/memset.o +endif # Create a list of object files to be compiled OBJS := $(OBJ-y) $(notdir $(EXT_COBJ-y) $(EXT_SOBJ-y)) @@ -60,5 +63,5 @@ $(addprefix $(obj)/,$(notdir $(EXT_COBJ-y))): $(obj)/%.o: lib/%.c FORCE $(call if_changed_rule,cc_o_c) # Rule to build architecture-specific library assembly files -$(addprefix $(obj)/,$(notdir $(EXT_SOBJ-y))): $(obj)/%.o: arch/powerpc/lib/%.S FORCE +$(addprefix $(obj)/,$(notdir $(EXT_SOBJ-y))): $(obj)/%.o: arch/$(ARCH)/lib/%.S FORCE $(call if_changed_dep,as_o_S)