This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RE: Update newlib to support efficient string operation functions for Thumb.


Ping?

> -----Original Message-----
> From: Hale Wang [mailto:Hale.Wang@arm.com]
> Sent: 2014å8æ26æ 17:45
> To: newlib@sourceware.org
> Cc: 'Jeff Johnston'; 'vinschen@redhat.com'
> Subject: RE: Update newlib to support efficient string operation functions for
> Thumb.
> 
> Hi,
> 
> This patch is used to resubmit the previous newlib patch. And at the same
> time, this patch can also clean up the arm backend in newlib.
> 
> The memchr-stub.c and memcpy-stub.c are redundant. There is no need to
> explicitely include the corresponding source files(../../string/*.c).
> 
> Jeff Johnston provided a cleaner way to realize this. This patch use this
> solution to clean up all the functions in newlib/libc/machine/arm.
> 
> By the way, the previous issue fixed in the previous patch is also included in
> this patch.
> 
> Bootstrap and no make check regression on X86-64.
> 
> Patch also attached for convenience.
> 
> Thanks and Best Regards,
> Hale Wang
> 
> ============================================================
> =
> newlib/ChangeLog:
> 
> 2014-08-25  Hale Wang  <hale.wang@arm.com>
> 	* libc/machine/arm/memchr.S: Clean up the wrapper.
> 	* libc/machine/arm/memcpy.S: Likewise.
> 	* libc/machine/arm/memchr-stub.c: Delete this redundant file.
> 	* libc/machine/arm/memcpy-stub.c: Likewise.
> 	* libc/machine/arm/strcmp.S: Add speed-preferred wrapper.
> 	* libc/machine/arm/strlen.S: Likewise.
> 	* libc/machine/arm/Makefile.am: Add dependencies.
> 	* libc/machine/arm/Makefile.in: Regenerated.
> 	* libc/machine/arm/configure.in: Add dependencies.
> 	* libc/machine/arm/configure: Regenerated.
> 
> ============================================================
> =
> 
> diff --git a/newlib/libc/machine/arm/Makefile.am
> b/newlib/libc/machine/arm/Makefile.am
> index fb33926..ad14ae2 100644
> --- a/newlib/libc/machine/arm/Makefile.am
> +++ b/newlib/libc/machine/arm/Makefile.am
> @@ -6,13 +6,60 @@ INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS)
> $(TARGET_CFLAGS)
> 
>  AM_CCASFLAGS = $(INCLUDES)
> 
> +if HAVE_THUMB1
> +if OPT_SIZE
> +STRCMP_SRC=strcmp.S
> +STRCMP_OBJ=$(lpfx)strcmp.o
> +STRLEN_SRC=strlen.c
> +STRLEN_OBJ=$(lpfx)strlen.o
> +else
> +STRCMP_SRC=
> +STRCMP_OBJ=
> +STRLEN_SRC=
> +STRLEN_OBJ=
> +endif
> +else
> +STRCMP_SRC=strcmp.S
> +STRCMP_OBJ=$(lpfx)strcmp.o
> +STRLEN_SRC=strlen.c
> +STRLEN_OBJ=$(lpfx)strlen.o
> +endif
> +
> +if HAVE_ARMV7
> +MEMCHR_SRC=memchr.S
> +MEMCHR_OBJ=$(lpfx)memchr.o
> +else
> +MEMCHR_SRC=
> +MEMCHR_OBJ=
> +endif
> +
> +if OPT_SIZE
> +MEMCPY_SRC=
> +MEMCPY_OBJ=
> +else
> +if HAVE_ARMV7A
> +MEMCPY_SRC=memcpy.S
> +MEMCPY_OBJ=$(lpfx)memcpy.o
> +else
> +if HAVE_ARMV7M
> +MEMCPY_SRC=memcpy.S
> +MEMCPY_OBJ=$(lpfx)memcpy.o
> +else
> +MEMCPY_SRC=
> +MEMCPY_OBJ=
> +endif !HAVE_ARMV7M
> +endif !HAVE_ARMV7A
> +endif !OPT_SIZE
> +
>  noinst_LIBRARIES = lib.a
> 
> -lib_a_SOURCES = setjmp.S access.c strlen.c strcmp.S strcpy.c \
> -	        memcpy.S memcpy-stub.c memchr-stub.c memchr.S \
> -		strlen.c strlen-armv7.S
> +lib_a_SOURCES = setjmp.S access.c $(STRCMP_SRC) strcpy.c \
> +	        $(MEMCPY_SRC) $(MEMCHR_SRC) $(STRLEN_SRC) \
> +		strlen-armv7.S
>  lib_a_CCASFLAGS=$(AM_CCASFLAGS)
>  lib_a_CFLAGS = $(AM_CFLAGS)
> +lib_a_LIBADD = $(STRCMP_OBJ) $(STRLEN_OBJ) $(MEMCHR_OBJ)
> $(MEMCPY_OBJ)
> +lib_a_DEPENDENCIES = $(STRCMP_OBJ) $(STRLEN_OBJ) $(MEMCHR_OBJ)
> +$(MEMCPY_OBJ)
> 
>  ACLOCAL_AMFLAGS = -I ../../.. -I ../../../..
>  CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host diff --git
> a/newlib/libc/machine/arm/Makefile.in
> b/newlib/libc/machine/arm/Makefile.in
> index 1ccfac5..ac39f7f 100644
> --- a/newlib/libc/machine/arm/Makefile.in
> +++ b/newlib/libc/machine/arm/Makefile.in
> @@ -68,13 +68,27 @@ CONFIG_CLEAN_VPATH_FILES =  LIBRARIES =
> $(noinst_LIBRARIES)  ARFLAGS = cru  lib_a_AR = $(AR) $(ARFLAGS) -
> lib_a_LIBADD =
> +@HAVE_THUMB1_FALSE@am__DEPENDENCIES_1 = $(lpfx)strcmp.o
> +@HAVE_THUMB1_TRUE@@OPT_SIZE_TRUE@am__DEPENDENCIES_1 =
> $(lpfx)strcmp.o
> +@HAVE_THUMB1_FALSE@am__DEPENDENCIES_2 = $(lpfx)strlen.o
> +@HAVE_THUMB1_TRUE@@OPT_SIZE_TRUE@am__DEPENDENCIES_2 =
> $(lpfx)strlen.o
> +@HAVE_ARMV7_TRUE@am__DEPENDENCIES_3 = $(lpfx)memchr.o
> +@HAVE_ARMV7A_FALSE@@HAVE_ARMV7M_TRUE@@OPT_SIZE_FALSE@a
> m__DEPENDENCIES_4
> += $(lpfx)memcpy.o
> +@HAVE_ARMV7A_TRUE@@OPT_SIZE_FALSE@am__DEPENDENCIES_4 =  \
> +@HAVE_ARMV7A_TRUE@@OPT_SIZE_FALSE@	$(lpfx)memcpy.o
> +@HAVE_THUMB1_FALSE@am__objects_1 = lib_a-strcmp.$(OBJEXT)
> +@HAVE_THUMB1_TRUE@@OPT_SIZE_TRUE@am__objects_1 =  \
> +@HAVE_THUMB1_TRUE@@OPT_SIZE_TRUE@	lib_a-strcmp.$(OBJEXT)
> +@HAVE_ARMV7A_FALSE@@HAVE_ARMV7M_TRUE@@OPT_SIZE_FALSE@a
> m__objects_2 =
> +lib_a-memcpy.$(OBJEXT)
> +@HAVE_ARMV7A_TRUE@@OPT_SIZE_FALSE@am__objects_2 =  \
> +@HAVE_ARMV7A_TRUE@@OPT_SIZE_FALSE@	lib_a-
> memcpy.$(OBJEXT)
> +@HAVE_ARMV7_TRUE@am__objects_3 = lib_a-memchr.$(OBJEXT)
> +@HAVE_THUMB1_FALSE@am__objects_4 = lib_a-strlen.$(OBJEXT)
> +@HAVE_THUMB1_TRUE@@OPT_SIZE_TRUE@am__objects_4 =  \
> +@HAVE_THUMB1_TRUE@@OPT_SIZE_TRUE@	lib_a-strlen.$(OBJEXT)
>  am_lib_a_OBJECTS = lib_a-setjmp.$(OBJEXT) lib_a-access.$(OBJEXT) \
> -	lib_a-strlen.$(OBJEXT) lib_a-strcmp.$(OBJEXT) \
> -	lib_a-strcpy.$(OBJEXT) lib_a-memcpy.$(OBJEXT) \
> -	lib_a-memcpy-stub.$(OBJEXT) lib_a-memchr-stub.$(OBJEXT) \
> -	lib_a-memchr.$(OBJEXT) lib_a-strlen.$(OBJEXT) \
> -	lib_a-strlen-armv7.$(OBJEXT)
> +	$(am__objects_1) lib_a-strcpy.$(OBJEXT) $(am__objects_2) \
> +	$(am__objects_3) $(am__objects_4) lib_a-strlen-armv7.$(OBJEXT)
>  lib_a_OBJECTS = $(am_lib_a_OBJECTS)
>  DEFAULT_INCLUDES = -I.@am__isrc@
>  depcomp =
> @@ -105,6 +119,7 @@ CC = @CC@
>  CCAS = @CCAS@
>  CCASFLAGS = @CCASFLAGS@
>  CCDEPMODE = @CCDEPMODE@
> +CFLAGS = @CFLAGS@
>  CYGPATH_W = @CYGPATH_W@
>  DEFS = @DEFS@
>  DEPDIR = @DEPDIR@
> @@ -199,13 +214,39 @@ top_srcdir = @top_srcdir@  AUTOMAKE_OPTIONS
> = cygnus  INCLUDES = $(NEWLIB_CFLAGS) $(CROSS_CFLAGS)
> $(TARGET_CFLAGS)  AM_CCASFLAGS = $(INCLUDES)
> +@HAVE_THUMB1_FALSE@STRCMP_SRC = strcmp.S
> +@HAVE_THUMB1_TRUE@@OPT_SIZE_FALSE@STRCMP_SRC =
> +@HAVE_THUMB1_TRUE@@OPT_SIZE_TRUE@STRCMP_SRC = strcmp.S
> +@HAVE_THUMB1_FALSE@STRCMP_OBJ = $(lpfx)strcmp.o
> +@HAVE_THUMB1_TRUE@@OPT_SIZE_FALSE@STRCMP_OBJ =
> +@HAVE_THUMB1_TRUE@@OPT_SIZE_TRUE@STRCMP_OBJ =
> $(lpfx)strcmp.o
> +@HAVE_THUMB1_FALSE@STRLEN_SRC = strlen.c
> +@HAVE_THUMB1_TRUE@@OPT_SIZE_FALSE@STRLEN_SRC =
> +@HAVE_THUMB1_TRUE@@OPT_SIZE_TRUE@STRLEN_SRC = strlen.c
> +@HAVE_THUMB1_FALSE@STRLEN_OBJ = $(lpfx)strlen.o
> +@HAVE_THUMB1_TRUE@@OPT_SIZE_FALSE@STRLEN_OBJ =
> +@HAVE_THUMB1_TRUE@@OPT_SIZE_TRUE@STRLEN_OBJ = $(lpfx)strlen.o
> +@HAVE_ARMV7_FALSE@MEMCHR_SRC =
> @HAVE_ARMV7_TRUE@MEMCHR_SRC = memchr.S
> +@HAVE_ARMV7_FALSE@MEMCHR_OBJ =
> @HAVE_ARMV7_TRUE@MEMCHR_OBJ =
> +$(lpfx)memchr.o
> +@HAVE_ARMV7A_FALSE@@HAVE_ARMV7M_FALSE@@OPT_SIZE_FALSE@
> MEMCPY_SRC =
> +@HAVE_ARMV7A_FALSE@@HAVE_ARMV7M_TRUE@@OPT_SIZE_FALSE@
> MEMCPY_SRC =
> +memcpy.S @HAVE_ARMV7A_TRUE@@OPT_SIZE_FALSE@MEMCPY_SRC =
> memcpy.S
> +@OPT_SIZE_TRUE@MEMCPY_SRC =
> +@HAVE_ARMV7A_FALSE@@HAVE_ARMV7M_FALSE@@OPT_SIZE_FALSE@
> MEMCPY_OBJ =
> +@HAVE_ARMV7A_FALSE@@HAVE_ARMV7M_TRUE@@OPT_SIZE_FALSE@
> MEMCPY_OBJ =
> +$(lpfx)memcpy.o
> @HAVE_ARMV7A_TRUE@@OPT_SIZE_FALSE@MEMCPY_OBJ =
> +$(lpfx)memcpy.o @OPT_SIZE_TRUE@MEMCPY_OBJ =
>  noinst_LIBRARIES = lib.a
> -lib_a_SOURCES = setjmp.S access.c strlen.c strcmp.S strcpy.c \
> -	        memcpy.S memcpy-stub.c memchr-stub.c memchr.S \
> -		strlen.c strlen-armv7.S
> +lib_a_SOURCES = setjmp.S access.c $(STRCMP_SRC) strcpy.c \
> +	        $(MEMCPY_SRC) $(MEMCHR_SRC) $(STRLEN_SRC) \
> +		strlen-armv7.S
> 
>  lib_a_CCASFLAGS = $(AM_CCASFLAGS)
>  lib_a_CFLAGS = $(AM_CFLAGS)
> +lib_a_LIBADD = $(STRCMP_OBJ) $(STRLEN_OBJ) $(MEMCHR_OBJ)
> $(MEMCPY_OBJ)
> +lib_a_DEPENDENCIES = $(STRCMP_OBJ) $(STRLEN_OBJ) $(MEMCHR_OBJ)
> +$(MEMCPY_OBJ)
>  ACLOCAL_AMFLAGS = -I ../../.. -I ../../../..
>  CONFIG_STATUS_DEPENDENCIES = $(newlib_basedir)/configure.host
> MEMCPY_DEP = memcpy-armv7a.S memcpy-armv7m.S @@ -312,29 +353,17
> @@ lib_a-access.o: access.c
>  lib_a-access.obj: access.c
>  	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS)
> $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-access.obj `if test -f
> 'access.c'; then $(CYGPATH_W) 'access.c'; else $(CYGPATH_W)
> '$(srcdir)/access.c'; fi`
> 
> -lib_a-strlen.o: strlen.c
> -	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS)
> $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-strlen.o `test -f 'strlen.c'
> || echo '$(srcdir)/'`strlen.c
> -
> -lib_a-strlen.obj: strlen.c
> -	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS)
> $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-strlen.obj `if test -f
> 'strlen.c'; then $(CYGPATH_W) 'strlen.c'; else $(CYGPATH_W)
> '$(srcdir)/strlen.c'; fi`
> -
>  lib_a-strcpy.o: strcpy.c
>  	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS)
> $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-strcpy.o `test -f 'strcpy.c'
> || echo '$(srcdir)/'`strcpy.c
> 
>  lib_a-strcpy.obj: strcpy.c
>  	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS)
> $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-strcpy.obj `if test -f
> 'strcpy.c'; then $(CYGPATH_W) 'strcpy.c'; else $(CYGPATH_W)
> '$(srcdir)/strcpy.c'; fi`
> 
> -lib_a-memcpy-stub.o: memcpy-stub.c
> -	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS)
> $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-memcpy-stub.o `test -f
> 'memcpy-stub.c' || echo '$(srcdir)/'`memcpy-stub.c
> -
> -lib_a-memcpy-stub.obj: memcpy-stub.c
> -	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS)
> $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-memcpy-stub.obj `if test -
> f 'memcpy-stub.c'; then $(CYGPATH_W) 'memcpy-stub.c'; else $(CYGPATH_W)
> '$(srcdir)/memcpy-stub.c'; fi`
> -
> -lib_a-memchr-stub.o: memchr-stub.c
> -	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS)
> $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-memchr-stub.o `test -f
> 'memchr-stub.c' || echo '$(srcdir)/'`memchr-stub.c
> +lib_a-strlen.o: strlen.c
> +	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS)
> +$(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-strlen.o `test -f
> +'strlen.c' || echo '$(srcdir)/'`strlen.c
> 
> -lib_a-memchr-stub.obj: memchr-stub.c
> -	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS)
> $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-memchr-stub.obj `if test -f
> 'memchr-stub.c'; then $(CYGPATH_W) 'memchr-stub.c'; else $(CYGPATH_W)
> '$(srcdir)/memchr-stub.c'; fi`
> +lib_a-strlen.obj: strlen.c
> +	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS)
> +$(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-strlen.obj `if test
> +-f 'strlen.c'; then $(CYGPATH_W) 'strlen.c'; else $(CYGPATH_W)
> +'$(srcdir)/strlen.c'; fi`
> 
>  ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
>  	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ diff --git
> a/newlib/libc/machine/arm/configure b/newlib/libc/machine/arm/configure
> index bf0c669..4cecba4 100755
> --- a/newlib/libc/machine/arm/configure
> +++ b/newlib/libc/machine/arm/configure
> @@ -564,6 +564,17 @@ PACKAGE_URL=''
>  ac_unique_file="Makefile.am"
>  ac_subst_vars='LTLIBOBJS
>  LIBOBJS
> +CFLAGS
> +HAVE_ARMV7M_FALSE
> +HAVE_ARMV7M_TRUE
> +HAVE_ARMV7A_FALSE
> +HAVE_ARMV7A_TRUE
> +HAVE_ARMV7_FALSE
> +HAVE_ARMV7_TRUE
> +OPT_SIZE_FALSE
> +OPT_SIZE_TRUE
> +HAVE_THUMB1_FALSE
> +HAVE_THUMB1_TRUE
>  sys_dir
>  machine_dir
>  libm_machine_dir
> @@ -3410,6 +3421,218 @@ OBJEXT=${oext}
> 
> 
> 
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using
> +thumb1" >&5 $as_echo_n "checking whether we are using thumb1... " >&6;
> +} if ${acnewlib_cv_thumb1_processor+:} false; then :
> +  $as_echo_n "(cached) " >&6
> +else
> +  cat > conftest.c <<EOF
> +
> +#if defined (__thumb__) && !defined (__thumb2__)
> +  #define _THUMB1
> + #else
> +  #error "not thumb1"
> +#endif
> +int main () {
> +  return 0;
> +}
> +EOF
> +if { ac_try='${CC} $CFLAGS $CPPFLAGS -c -o conftest.o conftest.c
> +							1>&5'
> +  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> +  (eval $ac_try) 2>&5
> +  ac_status=$?
> +  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> +  test $ac_status = 0; }; }
> +then
> +  acnewlib_cv_thumb1_processor=yes;
> +else
> +  acnewlib_cv_thumb1_processor=no;
> +fi
> +rm -f conftest*
> +fi
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result:
> +$acnewlib_cv_thumb1_processor" >&5 $as_echo
> +"$acnewlib_cv_thumb1_processor" >&6; }
> +
> + if test x"$acnewlib_cv_thumb1_processor" = x"yes"; then
> +  HAVE_THUMB1_TRUE=
> +  HAVE_THUMB1_FALSE='#'
> +else
> +  HAVE_THUMB1_TRUE='#'
> +  HAVE_THUMB1_FALSE=
> +fi
> +
> +
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the size is
> +preferred" >&5 $as_echo_n "checking whether the size is preferred... "
> +>&6; } if ${acnewlib_cv_opt_size+:} false; then :
> +  $as_echo_n "(cached) " >&6
> +else
> +  cat > conftest.c <<EOF
> +
> +#if defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)
> +  #define OPT_SIZE
> + #else
> +  #error "not need for size optimization."
> +#endif
> +int main () {
> +  return 0;
> +}
> +EOF
> +if { ac_try='${CC} $CFLAGS $CPPFLAGS -c -o conftest.o conftest.c
> +							1>&5'
> +  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> +  (eval $ac_try) 2>&5
> +  ac_status=$?
> +  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> +  test $ac_status = 0; }; }
> +then
> +  acnewlib_cv_opt_size=yes;
> +else
> +  acnewlib_cv_opt_size=no;
> +fi
> +rm -f conftest*
> +fi
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acnewlib_cv_opt_size"
> +>&5 $as_echo "$acnewlib_cv_opt_size" >&6; }
> +
> + if test x"$acnewlib_cv_opt_size" = x"yes"; then
> +  OPT_SIZE_TRUE=
> +  OPT_SIZE_FALSE='#'
> +else
> +  OPT_SIZE_TRUE='#'
> +  OPT_SIZE_FALSE=
> +fi
> +
> +
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether armv7
> +processor is supported" >&5 $as_echo_n "checking whether armv7
> +processor is supported... " >&6; } if ${acnewlib_cv_armv7_processor+:} false;
> then :
> +  $as_echo_n "(cached) " >&6
> +else
> +  cat > conftest.c <<EOF
> +
> +#if defined (_ISA_ARM_7) || defined (__ARM_ARCH_6T2__)
> +  #define HAVE_ARMV7
> + #else
> +  #error "ARMV7 is not supported."
> +#endif
> +int main () {
> +  return 0;
> +}
> +EOF
> +if { ac_try='${CC} $CFLAGS $CPPFLAGS -c -o conftest.o conftest.c
> +							1>&5'
> +  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> +  (eval $ac_try) 2>&5
> +  ac_status=$?
> +  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> +  test $ac_status = 0; }; }
> +then
> +  acnewlib_cv_armv7_processor=yes;
> +else
> +  acnewlib_cv_armv7_processor=no;
> +fi
> +rm -f conftest*
> +fi
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result:
> +$acnewlib_cv_armv7_processor" >&5 $as_echo
> +"$acnewlib_cv_armv7_processor" >&6; }
> +
> + if test x"$acnewlib_cv_armv7_processor" = x"yes"; then
> +  HAVE_ARMV7_TRUE=
> +  HAVE_ARMV7_FALSE='#'
> +else
> +  HAVE_ARMV7_TRUE='#'
> +  HAVE_ARMV7_FALSE=
> +fi
> +
> +
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether armv7a
> +processor is supported" >&5 $as_echo_n "checking whether armv7a
> +processor is supported... " >&6; } if ${acnewlib_cv_armv7a_processor+:}
> false; then :
> +  $as_echo_n "(cached) " >&6
> +else
> +  cat > conftest.c <<EOF
> +
> +#if defined (__ARM_ARCH_7A__) && defined
> (__ARM_FEATURE_UNALIGNED)
> +  #define HAVE_ARMV7A
> + #else
> +  #error "ARMV7A is not supported."
> +#endif
> +int main () {
> +  return 0;
> +}
> +EOF
> +if { ac_try='${CC} $CFLAGS $CPPFLAGS -c -o conftest.o conftest.c
> +							1>&5'
> +  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> +  (eval $ac_try) 2>&5
> +  ac_status=$?
> +  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> +  test $ac_status = 0; }; }
> +then
> +  acnewlib_cv_armv7a_processor=yes;
> +else
> +  acnewlib_cv_armv7a_processor=no;
> +fi
> +rm -f conftest*
> +fi
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result:
> +$acnewlib_cv_armv7a_processor" >&5 $as_echo
> +"$acnewlib_cv_armv7a_processor" >&6; }
> +
> + if test x"$acnewlib_cv_armv7a_processor" = x"yes"; then
> +  HAVE_ARMV7A_TRUE=
> +  HAVE_ARMV7A_FALSE='#'
> +else
> +  HAVE_ARMV7A_TRUE='#'
> +  HAVE_ARMV7A_FALSE=
> +fi
> +
> +
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether armv7m
> +processor is supported" >&5 $as_echo_n "checking whether armv7m
> +processor is supported... " >&6; } if ${acnewlib_cv_armv7m_processor+:}
> false; then :
> +  $as_echo_n "(cached) " >&6
> +else
> +  cat > conftest.c <<EOF
> +
> +#if defined (__ARM_ARCH_7M__) || defined (__ARM_ARCH_7EM__)
> +  #define HAVE_ARMV7M
> + #else
> +  #error "ARMV7M is not supported."
> +#endif
> +int main () {
> +  return 0;
> +}
> +EOF
> +if { ac_try='${CC} $CFLAGS $CPPFLAGS -c -o conftest.o conftest.c
> +							1>&5'
> +  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
> +  (eval $ac_try) 2>&5
> +  ac_status=$?
> +  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
> +  test $ac_status = 0; }; }
> +then
> +  acnewlib_cv_armv7m_processor=yes;
> +else
> +  acnewlib_cv_armv7m_processor=no;
> +fi
> +rm -f conftest*
> +fi
> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result:
> +$acnewlib_cv_armv7m_processor" >&5 $as_echo
> +"$acnewlib_cv_armv7m_processor" >&6; }
> +
> + if test x"$acnewlib_cv_armv7m_processor" = x"yes"; then
> +  HAVE_ARMV7M_TRUE=
> +  HAVE_ARMV7M_FALSE='#'
> +else
> +  HAVE_ARMV7M_TRUE='#'
> +  HAVE_ARMV7M_FALSE=
> +fi
> +
> +
> +
> +
>  ac_config_files="$ac_config_files Makefile"
> 
>  cat >confcache <<\_ACEOF
> @@ -3598,6 +3821,26 @@ if test -z "${USE_LIBTOOL_TRUE}" && test -z
> "${USE_LIBTOOL_FALSE}"; then
>    as_fn_error $? "conditional \"USE_LIBTOOL\" was never defined.
>  Usually this means the macro was only invoked conditionally." "$LINENO" 5  fi
> +if test -z "${HAVE_THUMB1_TRUE}" && test -z "${HAVE_THUMB1_FALSE}";
> +then
> +  as_fn_error $? "conditional \"HAVE_THUMB1\" was never defined.
> +Usually this means the macro was only invoked conditionally." "$LINENO"
> +5 fi if test -z "${OPT_SIZE_TRUE}" && test -z "${OPT_SIZE_FALSE}"; then
> +  as_fn_error $? "conditional \"OPT_SIZE\" was never defined.
> +Usually this means the macro was only invoked conditionally." "$LINENO"
> +5 fi if test -z "${HAVE_ARMV7_TRUE}" && test -z "${HAVE_ARMV7_FALSE}";
> +then
> +  as_fn_error $? "conditional \"HAVE_ARMV7\" was never defined.
> +Usually this means the macro was only invoked conditionally." "$LINENO"
> +5 fi if test -z "${HAVE_ARMV7A_TRUE}" && test -z
> +"${HAVE_ARMV7A_FALSE}"; then
> +  as_fn_error $? "conditional \"HAVE_ARMV7A\" was never defined.
> +Usually this means the macro was only invoked conditionally." "$LINENO"
> +5 fi if test -z "${HAVE_ARMV7M_TRUE}" && test -z
> +"${HAVE_ARMV7M_FALSE}"; then
> +  as_fn_error $? "conditional \"HAVE_ARMV7M\" was never defined.
> +Usually this means the macro was only invoked conditionally." "$LINENO"
> +5 fi
> 
>  : "${CONFIG_STATUS=./config.status}"
>  ac_write_fail=0
> diff --git a/newlib/libc/machine/arm/configure.in
> b/newlib/libc/machine/arm/configure.in
> index 6236338..edf9222 100644
> --- a/newlib/libc/machine/arm/configure.in
> +++ b/newlib/libc/machine/arm/configure.in
> @@ -10,5 +10,133 @@ AC_CONFIG_AUX_DIR(../../../..)
> 
>  NEWLIB_CONFIGURE(../../..)
> 
> +dnl Check for Thumb1 supported.
> +AC_CACHE_CHECK(whether we are using thumb1,
> +	       acnewlib_cv_thumb1_processor, [dnl cat > conftest.c <<EOF
> +
> +#if defined (__thumb__) && !defined (__thumb2__)
> +  #define _THUMB1
> + #else
> +  #error "not thumb1"
> +#endif
> +int main () {
> +  return 0;
> +}
> +EOF
> +if AC_TRY_COMMAND([${CC} $CFLAGS $CPPFLAGS -c -o conftest.o conftest.c
> +
> 	1>&AS_MESSAGE_LOG_FD])
> +then
> +  acnewlib_cv_thumb1_processor=yes;
> +else
> +  acnewlib_cv_thumb1_processor=no;
> +fi
> +rm -f conftest*])
> +
> +AM_CONDITIONAL(HAVE_THUMB1, test
> x"$acnewlib_cv_thumb1_processor" =
> +x"yes")
> +
> +dnl Check for whether the size is preferred.
> +AC_CACHE_CHECK(whether the size is preferred,
> +	       acnewlib_cv_opt_size, [dnl
> +cat > conftest.c <<EOF
> +
> +#if defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)
> +  #define OPT_SIZE
> + #else
> +  #error "not need for size optimization."
> +#endif
> +int main () {
> +  return 0;
> +}
> +EOF
> +if AC_TRY_COMMAND([${CC} $CFLAGS $CPPFLAGS -c -o conftest.o conftest.c
> +
> 	1>&AS_MESSAGE_LOG_FD])
> +then
> +  acnewlib_cv_opt_size=yes;
> +else
> +  acnewlib_cv_opt_size=no;
> +fi
> +rm -f conftest*])
> +
> +AM_CONDITIONAL(OPT_SIZE, test x"$acnewlib_cv_opt_size" = x"yes")
> +
> +dnl Check for whether ARM_7 or ARM_ARCH_6T2 is defined.
> +dnl This macro is used to support memchr() for old CPU.
> +AC_CACHE_CHECK(whether armv7 processor is supported,
> +	       acnewlib_cv_armv7_processor, [dnl cat > conftest.c <<EOF
> +
> +#if defined (_ISA_ARM_7) || defined (__ARM_ARCH_6T2__)
> +  #define HAVE_ARMV7
> + #else
> +  #error "ARMV7 is not supported."
> +#endif
> +int main () {
> +  return 0;
> +}
> +EOF
> +if AC_TRY_COMMAND([${CC} $CFLAGS $CPPFLAGS -c -o conftest.o conftest.c
> +
> 	1>&AS_MESSAGE_LOG_FD])
> +then
> +  acnewlib_cv_armv7_processor=yes;
> +else
> +  acnewlib_cv_armv7_processor=no;
> +fi
> +rm -f conftest*])
> +
> +AM_CONDITIONAL(HAVE_ARMV7, test x"$acnewlib_cv_armv7_processor" =
> +x"yes")
> +
> +dnl Check for whether ARM_ARCH_7A is defined.
> +AC_CACHE_CHECK(whether armv7a processor is supported,
> +	       acnewlib_cv_armv7a_processor, [dnl cat > conftest.c <<EOF
> +
> +#if defined (__ARM_ARCH_7A__) && defined
> (__ARM_FEATURE_UNALIGNED)
> +  #define HAVE_ARMV7A
> + #else
> +  #error "ARMV7A is not supported."
> +#endif
> +int main () {
> +  return 0;
> +}
> +EOF
> +if AC_TRY_COMMAND([${CC} $CFLAGS $CPPFLAGS -c -o conftest.o conftest.c
> +
> 	1>&AS_MESSAGE_LOG_FD])
> +then
> +  acnewlib_cv_armv7a_processor=yes;
> +else
> +  acnewlib_cv_armv7a_processor=no;
> +fi
> +rm -f conftest*])
> +
> +AM_CONDITIONAL(HAVE_ARMV7A, test
> x"$acnewlib_cv_armv7a_processor" =
> +x"yes")
> +
> +dnl Check for whether ARM_ARCH_7M is defined.
> +AC_CACHE_CHECK(whether armv7m processor is supported,
> +	       acnewlib_cv_armv7m_processor, [dnl cat > conftest.c <<EOF
> +
> +#if defined (__ARM_ARCH_7M__) || defined (__ARM_ARCH_7EM__)
> +  #define HAVE_ARMV7M
> + #else
> +  #error "ARMV7M is not supported."
> +#endif
> +int main () {
> +  return 0;
> +}
> +EOF
> +if AC_TRY_COMMAND([${CC} $CFLAGS $CPPFLAGS -c -o conftest.o conftest.c
> +
> 	1>&AS_MESSAGE_LOG_FD])
> +then
> +  acnewlib_cv_armv7m_processor=yes;
> +else
> +  acnewlib_cv_armv7m_processor=no;
> +fi
> +rm -f conftest*])
> +
> +AM_CONDITIONAL(HAVE_ARMV7M, test
> x"$acnewlib_cv_armv7m_processor" =
> +x"yes")
> +
> +AC_SUBST(CFLAGS)
> +
>  AC_CONFIG_FILES([Makefile])
>  AC_OUTPUT
> diff --git a/newlib/libc/machine/arm/memchr-stub.c
> b/newlib/libc/machine/arm/memchr-stub.c
> deleted file mode 100644
> index 04d9d5f..0000000
> --- a/newlib/libc/machine/arm/memchr-stub.c
> +++ /dev/null
> @@ -1,42 +0,0 @@
> -/* Copyright (c) 2010-2011, Linaro Limited
> -   All rights reserved.
> -
> -   Redistribution and use in source and binary forms, with or without
> -   modification, are permitted provided that the following conditions
> -   are met:
> -
> -      * Redistributions of source code must retain the above copyright
> -      notice, this list of conditions and the following disclaimer.
> -
> -      * Redistributions in binary form must reproduce the above copyright
> -      notice, this list of conditions and the following disclaimer in the
> -      documentation and/or other materials provided with the distribution.
> -
> -      * Neither the name of Linaro Limited nor the names of its
> -      contributors may be used to endorse or promote products derived
> -      from this software without specific prior written permission.
> -
> -   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
> CONTRIBUTORS
> -   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> -   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
> FOR
> -   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
> COPYRIGHT
> -   HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
> INCIDENTAL,
> -   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> -   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
> USE,
> -   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
> ON ANY
> -   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> -   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
> USE
> -   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> -*/
> -
> -#include "arm_asm.h"
> -
> -
> -/* Note: This ifdef MUST match the one in memchr.S */ -#if
> defined(_ISA_ARM_7) || defined(__ARM_ARCH_6T2__)
> -  /* Do nothing - the memchr.S will get used */ -#else
> -  /* For an older CPU we just fall back to the .c code */ -#include
> "../../string/memchr.c"
> -#endif
> -
> diff --git a/newlib/libc/machine/arm/memchr.S
> b/newlib/libc/machine/arm/memchr.S
> index 1ba8268..a17dfa3 100644
> --- a/newlib/libc/machine/arm/memchr.S
> +++ b/newlib/libc/machine/arm/memchr.S
> @@ -164,5 +164,19 @@ memchr:
>  	pop	{r4,r5,r6,r7}
>  	subs	r0,r0,#1
>  	bx	lr
> -
> +#else
> +  /* For an older CPU we just fall back to the .c code.  */
> +
> +  /* Leave this field blank.  So the memchr() is not defined, and this will
> +     automatically pull in the default C definition of memchr() from
> +     ../../string/memchr.c.  No need to include this file explicitely.
> +     The lib_a-memchr.o will not be generated, so it won't replace the
> +     default lib_a-memchr.o which is generated by ../../string/memchr.c.
> +     See the commands in configure.in and Makefile.am for more details.
> +
> +     However, if we need to rewrite this function to be more efficient, we
> +     can add the corresponding assembly code into this field and change the
> +     commands in configure.in and Makefile.am to allow the corresponding
> +     lib_a-memchr.o to be generated.
> +  */
>  #endif
> diff --git a/newlib/libc/machine/arm/memcpy-stub.c
> b/newlib/libc/machine/arm/memcpy-stub.c
> deleted file mode 100644
> index 449d31a..0000000
> --- a/newlib/libc/machine/arm/memcpy-stub.c
> +++ /dev/null
> @@ -1,40 +0,0 @@
> -/*
> - * Copyright (c) 2013 ARM Ltd
> - * All rights reserved.
> - *
> - * Redistribution and use in source and binary forms, with or without
> - * modification, are permitted provided that the following conditions
> - * are met:
> - * 1. Redistributions of source code must retain the above copyright
> - *    notice, this list of conditions and the following disclaimer.
> - * 2. Redistributions in binary form must reproduce the above copyright
> - *    notice, this list of conditions and the following disclaimer in the
> - *    documentation and/or other materials provided with the distribution.
> - * 3. The name of the company may not be used to endorse or promote
> - *    products derived from this software without specific prior written
> - *    permission.
> - *
> - * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR
> IMPLIED
> - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> OF
> - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
> DISCLAIMED.
> - * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT,
> INCIDENTAL,
> - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> NOT LIMITED
> - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> DATA, OR
> - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> THEORY OF
> - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
> - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
> - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> - */
> -
> -/* The sole purpose of this file is to include the plain memcpy provided
> -   in newlib.  An optimized version of memcpy is provided in the assembly
> -   file memcpy.S in this directory. */
> -#if (defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED) ||
> \
> -     (!((defined (__ARM_ARCH_7A__) && defined
> (__ARM_FEATURE_UNALIGNED)) \
> -        || defined (__ARM_ARCH_7EM__) || defined (__ARM_ARCH_7M__))))
> -
> -#include "../../string/memcpy.c"
> -
> -#else
> -        /* Do nothing. See memcpy.S in this directory. */
> -#endif
> diff --git a/newlib/libc/machine/arm/memcpy.S
> b/newlib/libc/machine/arm/memcpy.S
> index 734a197..3997524 100644
> --- a/newlib/libc/machine/arm/memcpy.S
> +++ b/newlib/libc/machine/arm/memcpy.S
> @@ -27,7 +27,19 @@
>   */
> 
>  #if defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)
> -        /* Do nothing here. See memcpy-stub.c in the same directory. */
> +  /* Leave this field blank.  So the memcpy() is not defined, and this will
> +     automatically pull in the default C definition of memcpy() from
> +     ../../string/memcpy.c.  No need to include this file explicitely.
> +     The lib_a-memcpy.o will not be generated, so it won't replace the default
> +     lib_a-memcpy.o which is generated by ../../string/memcpy.c.
> +     See the commands in configure.in and Makefile.am for more details.
> +
> +     However, if we need to rewrite this function to be more efficient, we
> +     can add the corresponding assembly code into this field and change the
> +     commands in configure.in and Makefile.am to allow the corresponding
> +     lib_a-memcpy.o to be generated.
> +  */
> +
>  #elif defined (__ARM_ARCH_7A__) && defined
> (__ARM_FEATURE_UNALIGNED)  #include "memcpy-armv7a.S"
> 
> @@ -35,5 +47,5 @@
>  #include "memcpy-armv7m.S"
> 
>  #else
> -        /* Do nothing here. See memcpy-stub.c in the same directory. */
> +  /* Leave this filed blank.  See the commands above.  */
>  #endif
> diff --git a/newlib/libc/machine/arm/strcmp.S
> b/newlib/libc/machine/arm/strcmp.S
> index 1742322..fecfdfd 100644
> --- a/newlib/libc/machine/arm/strcmp.S
> +++ b/newlib/libc/machine/arm/strcmp.S
> @@ -64,8 +64,27 @@
>  	|| (__ARM_ARCH == 6 && __ARM_ARCH_PROFILE == 'M')
> 
>  # if defined (__thumb__) && !defined (__thumb2__)
> -/* Thumb1 only variant.  */
> -#  include "strcmp-armv4t.S"
> +/* Thumb1 only variant.  If size is preferred, use strcmp-armv4t.S.
> +   If speed is preferred, the strcmp function in ../../string/strcmp.c
> +   will be used.  */
> +
> +#  if defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED)
> +#   include "strcmp-armv4t.S"
> +#  else
> +    /* Leave this field blank.  So the strcmp() is not defined, and this will
> +       automatically pull in the default C definition of strcmp() from
> +       ../../string/strcmp.c.  No need to include this file explicitely.
> +       The lib_a-strcmp.o will not be generated, so it won't replace the
> +       default lib_a-strcmp.o which is generated by ../../string/strcmp.c.
> +       See the commands in configure.in and Makefile.am for more details.
> +
> +       However, if we need to rewrite this function to be more efficient,
> +       we can add the corresponding assembly code into this field and
> +       change the commands in configure.in and Makefile.am to allow the
> +       corresponding lib_a-strcmp.o to be generated.
> +    */
> +#  endif
> +
>  # else
>  #  include "strcmp-arm-tiny.S"
>  # endif
> diff --git a/newlib/libc/machine/arm/strlen.c
> b/newlib/libc/machine/arm/strlen.c
> index b8de229..7e59e75 100644
> --- a/newlib/libc/machine/arm/strlen.c
> +++ b/newlib/libc/machine/arm/strlen.c
> @@ -34,6 +34,24 @@
>  #if defined (__OPTIMIZE_SIZE__) || defined (PREFER_SIZE_OVER_SPEED) || \
>    (defined (__thumb__) && !defined (__thumb2__))
> 
> +# if !defined (PREFER_SIZE_OVER_SPEED) && !defined (__OPTIMIZE_SIZE__)
> +/* Thumb1 only variant.
> +   If speed is preferred, the strlen() function in ../../string/strlen.c
> +   will be used.
> +
> +   Leave this field blank.  So the strlen() is not defined, and this will
> +   automatically pull in the default C definition of strlen() from
> +   ../../string/strlen.c.  No need to include this file explicitely.
> +   The lib_a-strlen.o will not be generated, so it won't replace the default
> +   lib_a-strlen.o which is generated by ../../string/strlen.c.  See the
> +   commands in configure.in and Makefile.am for more details.
> +
> +   However, if we need to rewrite this function to be more efficient,
> +   we can add the corresponding assembly code into this field and change
> +   the commands in configure.in and Makefile.am to allow the corresponding
> +   lib_a-strlen.o to be generated.
> +*/
> +# else
>  size_t
>  strlen (const char* str)
>  {
> @@ -43,7 +61,7 @@ strlen (const char* str)
>    asm ("mov	%0, #0\n"
>         "1:\n\t"
>         "ldrb	%1, [%2, %0]\n\t"
> -       "add 	%0, %0, #1\n\t"
> +       "add	%0, %0, #1\n\t"
>         "cmp	%1, #0\n\t"
>         "bne	1b"
>         : "=&r" (len), "=&r" (scratch) : "r" (str) : "memory", "cc"); @@ -58,6 +76,7
> @@ strlen (const char* str)
>    return end - str - 1;
>  #endif
>  }
> +#endif
>  #else
> 
>  #if !(defined(_ISA_ARM_7) || defined(__ARM_ARCH_6T2__))




Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]