[PATCH] [aarch64][v2] Add an ASIMD variant of strlen for falkor

Szabolcs Nagy szabolcs.nagy@arm.com
Wed Aug 15 13:49:00 GMT 2018


On 13/08/18 17:38, Siddhesh Poyarekar wrote:
> This variant of strlen uses vector loads and operations to reduce the
> size of the code and also eliminate the non-ascii fallback.  This
> works very well for falkor because of its two vector units and
> efficient vector ops.  In the best case it reduces latency of cases in
> bench-strlen by 48%, with gains throughout the benchmark.
> strlen-walk also sees uniform gains in the 5%-15% range.
> 
> Overall the routine appears to work better than the stock one for falkor
> regardless of the benchmark, length of string or cache state.
> 
> The same cannot be said of a53 and a72 though.  a53 performance was
> greatly reduced and for a72 it was a bit of a mixed bag, slightly on the
> negative side but I reckon it might be fast in some situations.
> 
> Changes from v1:
> 
> - Renamed *_falkor to *_asimd to make the interface cleaner for other
>    cores to use.
> 
> 	* sysdeps/aarch64/strlen.S (__strlen): Rename to STRLEN.
> 	[!STRLEN](STRLEN): Set to __strlen.
> 	* sysdeps/aarch64/multiarch/strlen.c: New file.
> 	* sysdeps/aarch64/multiarch/strlen_generic.S: Likewise.
> 	* sysdeps/aarch64/multiarch/strlen_asimd.S: Likewise.
> 	* sysdeps/aarch64/multiarch/ifunc-impl-list.c
> 	(__libc_ifunc_impl_list): Add strlen.
> 	* sysdeps/aarch64/multiarch/Makefile (sysdep_routines): Add
> 	strlen_generic and strlen_asimd.
> 
> CC: szabolcs.nagy@arm.com
> CC: pinskia@gmail.com

please fix the memmove comments in strlen_generic.S,
with that fixed it's ok to commit.

Reviewed-By: Szabolcs Nagy <szabolcs.nagy@arm.com>

> +++ b/sysdeps/aarch64/multiarch/strlen_generic.S
> @@ -0,0 +1,42 @@
> +/* A Generic Optimized strlen implementation for AARCH64.
> +   Copyright (C) 2018 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <http://www.gnu.org/licenses/>.  */
> +
> +/* The actual strlen and memmove code is in ../strlen.S.  If we are
> +   building libc this file defines __strlen_generic and __memmove_generic.
> +   Otherwise the include of ../strlen.S will define the normal __strlen
> +   and__memmove entry points.  */
> +

the memmove comment seems to be copied from memcpy_generic.S
but does not apply here.

> +#include <sysdep.h>
> +
> +#if IS_IN (libc)
> +
> +# define STRLEN __strlen_generic
> +
> +/* Do not hide the generic versions of strlen and memmove, we use them
> +   internally.  */

likewise.

> +# undef libc_hidden_builtin_def
> +# define libc_hidden_builtin_def(name)
> +
> +# ifdef SHARED
> +/* It doesn't make sense to send libc-internal strlen calls through a PLT. */
> +	.globl __GI_strlen; __GI_strlen = __strlen_generic
> +# endif
> +
> +#endif
> +
> +#include "../strlen.S"



More information about the Libc-alpha mailing list