[PATCH v1 0/4] riscv: Add RVV str*/mem* routines with multiarch and ifunc
Yao Zihong
zihong.plct@isrc.iscas.ac.cn
Tue Sep 23 11:23:08 GMT 2025
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.
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.
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.
Relation
--------
Supersedes my earlier series
“riscv: Add multiarch/IFUNC and RVV implementation for strcpy”.
No ABI changes. On non-RVV systems, behavior is identical to before.
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 | 58 +++++++++++++
sysdeps/riscv/multiarch/memcmp-generic.c | 31 +++++++
sysdeps/riscv/multiarch/memcmp_vector.S | 66 ++++++++++++++
sysdeps/riscv/multiarch/memcmpeq-generic.c | 31 +++++++
sysdeps/riscv/multiarch/memcmpeq_vector.S | 60 +++++++++++++
sysdeps/riscv/multiarch/memcpy_vector.S | 46 ++++++++++
sysdeps/riscv/multiarch/memmove-generic.c | 26 ++++++
sysdeps/riscv/multiarch/memmove_vector.S | 66 ++++++++++++++
sysdeps/riscv/multiarch/memset-generic.c | 26 ++++++
sysdeps/riscv/multiarch/memset_vector.S | 45 ++++++++++
sysdeps/riscv/multiarch/strcat-generic.c | 26 ++++++
sysdeps/riscv/multiarch/strcat_vector.S | 67 +++++++++++++++
sysdeps/riscv/multiarch/strchr-generic.c | 24 ++++++
sysdeps/riscv/multiarch/strchr_vector.S | 56 ++++++++++++
sysdeps/riscv/multiarch/strcmp-generic.c | 24 ++++++
sysdeps/riscv/multiarch/strcmp_vector.S | 85 +++++++++++++++++++
sysdeps/riscv/multiarch/strcpy-generic.c | 26 ++++++
sysdeps/riscv/multiarch/strcpy_vector.S | 51 +++++++++++
sysdeps/riscv/multiarch/strlen-generic.c | 24 ++++++
sysdeps/riscv/multiarch/strlen_vector.S | 49 +++++++++++
sysdeps/riscv/multiarch/strncat-generic.c | 26 ++++++
sysdeps/riscv/multiarch/strncat_vector.S | 78 +++++++++++++++++
sysdeps/riscv/multiarch/strncmp-generic.c | 26 ++++++
sysdeps/riscv/multiarch/strncmp_vector.S | 80 +++++++++++++++++
sysdeps/riscv/multiarch/strncpy-generic.c | 26 ++++++
sysdeps/riscv/multiarch/strncpy_vector.S | 81 ++++++++++++++++++
sysdeps/riscv/multiarch/strnlen-generic.c | 24 ++++++
sysdeps/riscv/multiarch/strnlen_vector.S | 51 +++++++++++
.../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, 2203 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