[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