[PATCH v2 0/4] riscv: Add RVV str*/mem* routines with multiarch and ifunc
Yao Zihong
zihong.plct@isrc.iscas.ac.cn
Tue Sep 30 00:34:49 GMT 2025
Changes since v1
----------------
- Wrap RVV assembly with `#if IS_IN (libc)` so that rtld/* does not
include vectorized code.
- Add `.option push` / `.option arch, +v` / `.option pop` around
vectorized functions, so builds succeed even when compilers are
invoked without global +v support.
Hi all,
This series introduces RVV implementations for the RISC-V str*/mem* family
under a unified multiarch/IFUNC framework.
1/4: Add scaffolding, generic re-exports and resolvers (all resolve to generic).
2/4: Import mem* RVV code (rebased from Hau Hsu v3, no logic changes).
3/4: Import str* RVV code (rebased from Hau Hsu v3, no logic changes).
4/4: Enable runtime IFUNC dispatch to RVV when available.
Background
----------
Based on Hau Hsu’s v3 patches from 2023, previously reviewed on libc-alpha.
https://inbox.sourceware.org/libc-alpha/20230504074851.38763-1-hau.hsu@sifive.com/
Jeff Law previously suggested that we should start by integrating Hau Hsu’s
generic RVV routines under IFUNC scaffolding. This series follows that advice
and provides a complete framework around Hau’s implementations.
For the imported implementations (2/4 and 3/4), the logic is unchanged; only
symbol naming was adjusted to fit the current multiarch layout. RVV variants
remain inactive until 4/4.
Yao Zihong (4):
riscv: Add multiarch scaffolding for str*/mem* routines
riscv: Add RVV implementations for mem* routines
riscv: Add RVV implementations for str* routines
riscv: Enable RVV selection in ifunc resolvers
sysdeps/riscv/multiarch/memchr-generic.c | 24 +++++
sysdeps/riscv/multiarch/memchr_vector.S | 65 +++++++++++++
sysdeps/riscv/multiarch/memcmp-generic.c | 31 +++++++
sysdeps/riscv/multiarch/memcmp_vector.S | 73 +++++++++++++++
sysdeps/riscv/multiarch/memcmpeq-generic.c | 31 +++++++
sysdeps/riscv/multiarch/memcmpeq_vector.S | 67 ++++++++++++++
sysdeps/riscv/multiarch/memcpy_vector.S | 53 +++++++++++
sysdeps/riscv/multiarch/memmove-generic.c | 26 ++++++
sysdeps/riscv/multiarch/memmove_vector.S | 73 +++++++++++++++
sysdeps/riscv/multiarch/memset-generic.c | 26 ++++++
sysdeps/riscv/multiarch/memset_vector.S | 52 +++++++++++
sysdeps/riscv/multiarch/strcat-generic.c | 26 ++++++
sysdeps/riscv/multiarch/strcat_vector.S | 74 +++++++++++++++
sysdeps/riscv/multiarch/strchr-generic.c | 24 +++++
sysdeps/riscv/multiarch/strchr_vector.S | 63 +++++++++++++
sysdeps/riscv/multiarch/strcmp-generic.c | 24 +++++
sysdeps/riscv/multiarch/strcmp_vector.S | 92 +++++++++++++++++++
sysdeps/riscv/multiarch/strcpy-generic.c | 26 ++++++
sysdeps/riscv/multiarch/strcpy_vector.S | 58 ++++++++++++
sysdeps/riscv/multiarch/strlen-generic.c | 24 +++++
sysdeps/riscv/multiarch/strlen_vector.S | 56 +++++++++++
sysdeps/riscv/multiarch/strncat-generic.c | 26 ++++++
sysdeps/riscv/multiarch/strncat_vector.S | 85 +++++++++++++++++
sysdeps/riscv/multiarch/strncmp-generic.c | 26 ++++++
sysdeps/riscv/multiarch/strncmp_vector.S | 87 ++++++++++++++++++
sysdeps/riscv/multiarch/strncpy-generic.c | 26 ++++++
sysdeps/riscv/multiarch/strncpy_vector.S | 88 ++++++++++++++++++
sysdeps/riscv/multiarch/strnlen-generic.c | 24 +++++
sysdeps/riscv/multiarch/strnlen_vector.S | 58 ++++++++++++
.../unix/sysv/linux/riscv/multiarch/Makefile | 43 +++++++++
.../linux/riscv/multiarch/ifunc-impl-list.c | 78 ++++++++++++++++
.../unix/sysv/linux/riscv/multiarch/memchr.c | 55 +++++++++++
.../unix/sysv/linux/riscv/multiarch/memcmp.c | 57 ++++++++++++
.../sysv/linux/riscv/multiarch/memcmpeq.c | 53 +++++++++++
.../unix/sysv/linux/riscv/multiarch/memcpy.c | 5 +
.../unix/sysv/linux/riscv/multiarch/memmove.c | 55 +++++++++++
.../unix/sysv/linux/riscv/multiarch/memset.c | 55 +++++++++++
.../unix/sysv/linux/riscv/multiarch/strcat.c | 55 +++++++++++
.../unix/sysv/linux/riscv/multiarch/strchr.c | 57 ++++++++++++
.../unix/sysv/linux/riscv/multiarch/strcmp.c | 55 +++++++++++
.../unix/sysv/linux/riscv/multiarch/strcpy.c | 55 +++++++++++
.../unix/sysv/linux/riscv/multiarch/strlen.c | 55 +++++++++++
.../unix/sysv/linux/riscv/multiarch/strncat.c | 55 +++++++++++
.../unix/sysv/linux/riscv/multiarch/strncmp.c | 55 +++++++++++
.../unix/sysv/linux/riscv/multiarch/strncpy.c | 55 +++++++++++
.../unix/sysv/linux/riscv/multiarch/strnlen.c | 57 ++++++++++++
46 files changed, 2308 insertions(+)
create mode 100644 sysdeps/riscv/multiarch/memchr-generic.c
create mode 100644 sysdeps/riscv/multiarch/memchr_vector.S
create mode 100644 sysdeps/riscv/multiarch/memcmp-generic.c
create mode 100644 sysdeps/riscv/multiarch/memcmp_vector.S
create mode 100644 sysdeps/riscv/multiarch/memcmpeq-generic.c
create mode 100644 sysdeps/riscv/multiarch/memcmpeq_vector.S
create mode 100644 sysdeps/riscv/multiarch/memcpy_vector.S
create mode 100644 sysdeps/riscv/multiarch/memmove-generic.c
create mode 100644 sysdeps/riscv/multiarch/memmove_vector.S
create mode 100644 sysdeps/riscv/multiarch/memset-generic.c
create mode 100644 sysdeps/riscv/multiarch/memset_vector.S
create mode 100644 sysdeps/riscv/multiarch/strcat-generic.c
create mode 100644 sysdeps/riscv/multiarch/strcat_vector.S
create mode 100644 sysdeps/riscv/multiarch/strchr-generic.c
create mode 100644 sysdeps/riscv/multiarch/strchr_vector.S
create mode 100644 sysdeps/riscv/multiarch/strcmp-generic.c
create mode 100644 sysdeps/riscv/multiarch/strcmp_vector.S
create mode 100644 sysdeps/riscv/multiarch/strcpy-generic.c
create mode 100644 sysdeps/riscv/multiarch/strcpy_vector.S
create mode 100644 sysdeps/riscv/multiarch/strlen-generic.c
create mode 100644 sysdeps/riscv/multiarch/strlen_vector.S
create mode 100644 sysdeps/riscv/multiarch/strncat-generic.c
create mode 100644 sysdeps/riscv/multiarch/strncat_vector.S
create mode 100644 sysdeps/riscv/multiarch/strncmp-generic.c
create mode 100644 sysdeps/riscv/multiarch/strncmp_vector.S
create mode 100644 sysdeps/riscv/multiarch/strncpy-generic.c
create mode 100644 sysdeps/riscv/multiarch/strncpy_vector.S
create mode 100644 sysdeps/riscv/multiarch/strnlen-generic.c
create mode 100644 sysdeps/riscv/multiarch/strnlen_vector.S
create mode 100644 sysdeps/unix/sysv/linux/riscv/multiarch/memchr.c
create mode 100644 sysdeps/unix/sysv/linux/riscv/multiarch/memcmp.c
create mode 100644 sysdeps/unix/sysv/linux/riscv/multiarch/memcmpeq.c
create mode 100644 sysdeps/unix/sysv/linux/riscv/multiarch/memmove.c
create mode 100644 sysdeps/unix/sysv/linux/riscv/multiarch/memset.c
create mode 100644 sysdeps/unix/sysv/linux/riscv/multiarch/strcat.c
create mode 100644 sysdeps/unix/sysv/linux/riscv/multiarch/strchr.c
create mode 100644 sysdeps/unix/sysv/linux/riscv/multiarch/strcmp.c
create mode 100644 sysdeps/unix/sysv/linux/riscv/multiarch/strcpy.c
create mode 100644 sysdeps/unix/sysv/linux/riscv/multiarch/strlen.c
create mode 100644 sysdeps/unix/sysv/linux/riscv/multiarch/strncat.c
create mode 100644 sysdeps/unix/sysv/linux/riscv/multiarch/strncmp.c
create mode 100644 sysdeps/unix/sysv/linux/riscv/multiarch/strncpy.c
create mode 100644 sysdeps/unix/sysv/linux/riscv/multiarch/strnlen.c
--
2.47.2
More information about the Libc-alpha
mailing list