[PATCH 11/20] alpha: add assembly mempcpy sharing the ev6 memcpy
Matt Turner
mattst88@gmail.com
Wed Aug 12 01:19:48 GMT 2026
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).
---
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)
--
2.54.0
More information about the Libc-alpha
mailing list