Re: [PATCH 11/20] alpha: add assembly mempcpy sharing the ev6 memcpy
Adhemerval Zanella Netto <[email protected]>
| Newsgroups | gmane.comp.lib.glibc.alpha |
|---|---|
| Organization | Linaro |
| Message-ID | <[email protected]> |
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)