[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