[U-Boot-Users] [PATCH 2/2][MIPS] Add lib_mips/string.c and stop using inline asm functions.

[MIPS] Add lib_mips/string.c and stop using inline asm functions.
From: Shinya Kuribayashi shinya.kuribayashi@necel.com
We MIPS stop using inline string functions as other ARCHs do so, since the optimized inline asm versions are not small.
This change was triggered by a following MIPS build error: common/libcommon.a(exports.o)(.text+0xdc): In function `jumptable_init': common/exports.c:32: undefined reference to `strcmp' make: *** [u-boot] Error 1
Signed-off-by: Shinya Kuribayashi shinya.kuribayashi@necel.com ---
include/asm-mips/string.h | 18 +++++++ lib_mips/Makefile | 2 - lib_mips/string.c | 122 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 141 insertions(+), 1 deletions(-)
diff --git a/include/asm-mips/string.h b/include/asm-mips/string.h index 4739c18..b9da3a9 100644 --- a/include/asm-mips/string.h +++ b/include/asm-mips/string.h @@ -10,6 +10,12 @@ #ifndef _ASM_STRING_H #define _ASM_STRING_H
+/* + * We don't do inline string functions, since the + * optimised inline asm versions are not small. + * + * All the following inline asm functions are moved to lib_mips/string.c. + */
/* * Most of the inline functions are rather naive implementations so I just @@ -20,6 +26,8 @@ #ifndef IN_STRING_C
#define __HAVE_ARCH_STRCPY +extern char *strcpy(char *__dest, __const__ char *__src); +#if 0 static __inline__ char *strcpy(char *__dest, __const__ char *__src) { char *__xdest = __dest; @@ -40,8 +48,11 @@ static __inline__ char *strcpy(char *__dest, __const__ char *__src)
return __xdest; } +#endif
#define __HAVE_ARCH_STRNCPY +extern char *strncpy(char *__dest, __const__ char *__src, size_t __n); +#if 0 static __inline__ char *strncpy(char *__dest, __const__ char *__src, size_t __n) { char *__xdest = __dest; @@ -68,8 +79,11 @@ static __inline__ char *strncpy(char *__dest, __const__ char *__src, size_t __n)
return __xdest; } +#endif
#define __HAVE_ARCH_STRCMP +extern int strcmp(__const__ char *__cs, __const__ char *__ct); +#if 0 static __inline__ int strcmp(__const__ char *__cs, __const__ char *__ct) { int __res; @@ -96,10 +110,13 @@ static __inline__ int strcmp(__const__ char *__cs, __const__ char *__ct)
return __res; } +#endif
#endif /* !defined(IN_STRING_C) */
#define __HAVE_ARCH_STRNCMP +extern int strncmp(__const__ char *__cs, __const__ char *__ct, size_t __count); +#if 0 static __inline__ int strncmp(__const__ char *__cs, __const__ char *__ct, size_t __count) { @@ -129,6 +146,7 @@ strncmp(__const__ char *__cs, __const__ char *__ct, size_t __count)
return __res; } +#endif #endif /* CONFIG_32BIT */
/* diff --git a/lib_mips/Makefile b/lib_mips/Makefile index 3163f00..7a004b4 100644 --- a/lib_mips/Makefile +++ b/lib_mips/Makefile @@ -27,7 +27,7 @@ LIB = $(obj)lib$(ARCH).a
SOBJS =
-COBJS = board.o time.o mips_linux.o +COBJS = board.o string.o time.o mips_linux.o
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c) OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS)) diff --git a/lib_mips/string.c b/lib_mips/string.c new file mode 100644 index 0000000..2e1d33f --- /dev/null +++ b/lib_mips/string.c @@ -0,0 +1,122 @@ +/* + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (c) 1994, 95, 96, 97, 98, 2000, 01 Ralf Baechle + * Copyright (c) 2000 by Silicon Graphics, Inc. + * Copyright (c) 2001 MIPS Technologies, Inc. + */ +#include <linux/string.h> + +#ifdef __HAVE_ARCH_STRCPY +char *strcpy(char *__dest, __const__ char *__src) +{ + char *__xdest = __dest; + + __asm__ __volatile__( + ".set\tnoreorder\n\t" + ".set\tnoat\n" + "1:\tlbu\t$1,(%1)\n\t" + "addiu\t%1,1\n\t" + "sb\t$1,(%0)\n\t" + "bnez\t$1,1b\n\t" + "addiu\t%0,1\n\t" + ".set\tat\n\t" + ".set\treorder" + : "=r" (__dest), "=r" (__src) + : "0" (__dest), "1" (__src) + : "memory"); + + return __xdest; +} +#endif /* __HAVE_ARCH_STRCPY */ + +#ifdef __HAVE_ARCH_STRNCPY +char *strncpy(char *__dest, __const__ char *__src, size_t __n) +{ + char *__xdest = __dest; + + if (__n == 0) + return __xdest; + + __asm__ __volatile__( + ".set\tnoreorder\n\t" + ".set\tnoat\n" + "1:\tlbu\t$1,(%1)\n\t" + "subu\t%2,1\n\t" + "sb\t$1,(%0)\n\t" + "beqz\t$1,2f\n\t" + "addiu\t%0,1\n\t" + "bnez\t%2,1b\n\t" + "addiu\t%1,1\n" + "2:\n\t" + ".set\tat\n\t" + ".set\treorder" + : "=r" (__dest), "=r" (__src), "=r" (__n) + : "0" (__dest), "1" (__src), "2" (__n) + : "memory"); + + return __xdest; +} +#endif /* __HAVE_ARCH_STRNCPY */ + +#ifdef __HAVE_ARCH_STRCMP +int strcmp(__const__ char *__cs, __const__ char *__ct) +{ + int __res; + + __asm__ __volatile__( + ".set\tnoreorder\n\t" + ".set\tnoat\n\t" + "lbu\t%2,(%0)\n" + "1:\tlbu\t$1,(%1)\n\t" + "addiu\t%0,1\n\t" + "bne\t$1,%2,2f\n\t" + "addiu\t%1,1\n\t" + "bnez\t%2,1b\n\t" + "lbu\t%2,(%0)\n\t" +#if defined(CONFIG_CPU_R3000) + "nop\n\t" +#endif + "move\t%2,$1\n" + "2:\tsubu\t%2,$1\n" + "3:\t.set\tat\n\t" + ".set\treorder" + : "=r" (__cs), "=r" (__ct), "=r" (__res) + : "0" (__cs), "1" (__ct)); + + return __res; +} +#endif /* __HAVE_ARCH_STRCMP */ + +#ifdef __HAVE_ARCH_STRNCMP +int strncmp(__const__ char *__cs, __const__ char *__ct, size_t __count) +{ + int __res; + + __asm__ __volatile__( + ".set\tnoreorder\n\t" + ".set\tnoat\n" + "1:\tlbu\t%3,(%0)\n\t" + "beqz\t%2,2f\n\t" + "lbu\t$1,(%1)\n\t" + "subu\t%2,1\n\t" + "bne\t$1,%3,3f\n\t" + "addiu\t%0,1\n\t" + "bnez\t%3,1b\n\t" + "addiu\t%1,1\n" + "2:\n\t" +#if defined(CONFIG_CPU_R3000) + "nop\n\t" +#endif + "move\t%3,$1\n" + "3:\tsubu\t%3,$1\n\t" + ".set\tat\n\t" + ".set\treorder" + : "=r" (__cs), "=r" (__ct), "=r" (__count), "=r" (__res) + : "0" (__cs), "1" (__ct), "2" (__count)); + + return __res; +} +#endif /* __HAVE_ARCH_STRNCMP */

In message 46D296A8.3000407@necel.com you wrote:
[MIPS] Add lib_mips/string.c and stop using inline asm functions.
From: Shinya Kuribayashi shinya.kuribayashi@necel.com
We MIPS stop using inline string functions as other ARCHs do so, since the optimized inline asm versions are not small.
I agree with this change in general, but the implementation looks broken to me.
+++ b/include/asm-mips/string.h @@ -10,6 +10,12 @@ #ifndef _ASM_STRING_H #define _ASM_STRING_H
+/*
- We don't do inline string functions, since the
- optimised inline asm versions are not small.
- All the following inline asm functions are moved to lib_mips/string.c.
- */
Moving *inline* functions to lib_mips/string.c makes no sense to me.
#define __HAVE_ARCH_STRCPY +extern char *strcpy(char *__dest, __const__ char *__src); +#if 0 static __inline__ char *strcpy(char *__dest, __const__ char *__src) { char *__xdest = __dest; @@ -40,8 +48,11 @@ static __inline__ char *strcpy(char *__dest, __const__ char *__src)
return __xdest; } +#endif
Please don't do this. Instead of "#if 0", please remove the code.
Best regards,
Wolfgang Denk
participants (2)
-
Shinya Kuribayashi
-
Wolfgang Denk