[PATCH 11/20] alpha: add assembly mempcpy sharing the ev6 memcpy

Adhemerval Zanella Netto adhemerval.zanella@linaro.org
Wed Aug 12 20:58:47 GMT 2026



On 11/08/26 22:19, Matt Turner wrote:
> Alpha had no assembly mempcpy and used the generic C.  mempcpy differs from
> memcpy only in its return value (dest + n rather than dest), so build it from
> the ev6 memcpy with USE_AS_MEMPCPY, following the established convention used
> by other architectures.
> 
> memcpy.S gains two small, behaviour-preserving changes so it can be reused:
> the entry computes the return value through USE_AS_MEMPCPY, and the misaligned
> path now derives its working dest pointer and alignment from the (still
> original) $16 instead of $0, freeing $0 to carry dest + n for mempcpy.  The
> plain memcpy path is unchanged ($0 == $16 on entry).

Do we really need to essentially duplicate the memcpy code for this optimization?
The alpha ABI cost us a bit more instruction for the function call (compare to
aarch64 for instance), but it does cost a lot less i-cache.

The aarch64 uses the generic mempcpy.c and it seems not be a problem.

> ---
>  sysdeps/alpha/alphaev6/memcpy.S  | 13 ++++++++++---
>  sysdeps/alpha/alphaev6/mempcpy.S | 27 +++++++++++++++++++++++++++
>  2 files changed, 37 insertions(+), 3 deletions(-)
>  create mode 100644 sysdeps/alpha/alphaev6/mempcpy.S
> 
> diff --git ./sysdeps/alpha/alphaev6/memcpy.S ./sysdeps/alpha/alphaev6/memcpy.S
> index d5b72d4961..d11138420d 100644
> --- ./sysdeps/alpha/alphaev6/memcpy.S
> +++ ./sysdeps/alpha/alphaev6/memcpy.S
> @@ -40,7 +40,11 @@
>  ENTRY(memcpy)
>  	.prologue 0
>  
> -	mov	$16, $0			# E : copy dest to return
> +#ifdef USE_AS_MEMPCPY
> +	addq	$16, $18, $0		# E : mempcpy returns dest + n
> +#else
> +	mov	$16, $0			# E : memcpy returns dest
> +#endif
>  	ble	$18, $nomoredata	# U : done with the copy?
>  	xor	$16, $17, $1		# E : are source and dest alignments the same?
>  	and	$1, 7, $1		# E : are they the same mod 8?
> @@ -289,8 +293,9 @@ $tail_bytes:
>  	nop				# E :
>  
>  $misaligned:
> -	mov	$0, $4			# E : dest temp
> -	and	$0, 7, $1		# E : dest alignment mod8
> +	mov	$16, $4			# E : dest temp (orig dest still in $16 here;
> +					#     $0 may hold dest+n for mempcpy)
> +	and	$16, 7, $1		# E : dest alignment mod8
>  	beq	$1, $dest_0mod8		# U : life doesn't totally suck
>  	nop
>  
> @@ -367,4 +372,6 @@ $nomoredata:
>  	nop				# E :
>  
>  END(memcpy)
> +#ifndef USE_AS_MEMPCPY
>  libc_hidden_builtin_def (memcpy)
> +#endif
> diff --git ./sysdeps/alpha/alphaev6/mempcpy.S ./sysdeps/alpha/alphaev6/mempcpy.S
> new file mode 100644
> index 0000000000..95385e4111
> --- /dev/null
> +++ ./sysdeps/alpha/alphaev6/mempcpy.S
> @@ -0,0 +1,27 @@
> +/* Copyright (C) 2026 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
> +   <https://www.gnu.org/licenses/>.  */
> +
> +/* mempcpy is the ev6 memcpy with USE_AS_MEMPCPY, which only changes the
> +   return value (dest + n instead of dest) and the exported symbol.  */
> +
> +#define USE_AS_MEMPCPY
> +#define memcpy __mempcpy
> +#include <sysdeps/alpha/alphaev6/memcpy.S>
> +
> +libc_hidden_def (__mempcpy)
> +weak_alias (__mempcpy, mempcpy)
> +libc_hidden_builtin_def (mempcpy)



More information about the Libc-alpha mailing list