[PATCH v2 00/15] RISC-V: Add Zbb-optimized string routines as ifuncs
Christoph Müllner
christoph.muellner@vrull.eu
Mon Jun 3 21:08:33 GMT 2024
Ping.
On Mon, May 27, 2024 at 1:19 PM Christoph Müllner
<christoph.muellner@vrull.eu> wrote:
>
> Glibc recently got hwprobe() support for RISC-V, which allows querying
> avaiable extensions at runtime. On top of that an optimized memcpy()
> routine (for fast unaligned accesses) has been merged, which is built by
> recompiling the generic C code with a different compiler flag. An ifunc
> resolver then detects which routine should be run using hwprobe().
>
> This patchset follows this idea and recompiles the following functions
> for Zbb (via function attributes) and enables the existing Zbb/orc.b
> optimization in riscv/string-fza.h:
> memchr, memrchr, strchrnul, strcmp, strlen, strncmp.
> The resulting optimized routines are then selected by the resolver function
> if the Zbb extension is present at runtime.
>
> To use target function attributes, a few issues had to be resovled:
> - The functions above got a mechanism to be compiled with function attributes
> (patches 2-7). Only those routines have been touched, which are
> required for the purpose of this patchset.
> - Ensuring that inlined functions also get the same function attributes
> (first patch).
> - Add mechanism to explicitly enable the orc.b optimization for string functions
> (patch 8), which is a bit inspired by USE_FFS_BUILTIN.
>
> One of the design questions is, if Zbb represents a broad enough optimization
> target. Tests with Zb* extensions showed, that no further code improvements
> can be achieved with them. Also most other extensions likely won't affect
> the generated code for string routines (ignoring vector instructions, which
> are a different topic). Therefore, Zbb seemed like a sufficient target.
>
> This series was tested by writing a simple test program to invoke the
> libc routines (e.g. strcmp) and a modified QEMU that reports the
> emulation of orc.b on stderr. With that the QEMU can be used to test
> if the optimized routines are executed (-cpu "rv64,zbb=[false,true]").
> Further, this series was tested with SPEC CPU 2017 intrate with Zbb
> enabled. The function attribute detection mechanism was tested with
> GCC 13 and GCC 14.
>
> Changes in v2:
> - Drop "Use .insn directive form for orc.b"
> - Introduce use of target function attribute (and all depenendcies)
> - Introduce detection of target function attribute support
> - Make orc.b optimization explicit
> - Small cleanups
>
> Christoph Müllner (15):
> cdefs: Add mechanism to add attributes to __always_inline functions
> string/memchr: Add mechanism to set function attributes
> string/memrchr: Add mechanism to set function attributes
> string/strchrnul: Add mechanism to set function attributes
> string/strcmp: Add mechanism to set function attributes
> string/strlen: Add mechanism to set function attributes
> string/strncmp: Add mechanism to set function attributes
> RISC-V: string-fz[a,i].h: Make orc.b optimization explicit
> RISC-V: Add compiler test for Zbb function attribute support
> RISC-V: Add Zbb optimized memchr as ifunc
> RISC-V: Add Zbb optimized memrchr as ifunc
> RISC-V: Add Zbb optimized strchrnul as ifunc
> RISC-V: Add Zbb optimized strcmp as ifunc
> RISC-V: Add Zbb optimized strlen as ifunc
> RISC-V: Add Zbb optimized strncmp as ifunc
>
> config.h.in | 3 +
> misc/sys/cdefs.h | 8 ++-
> string/memchr.c | 5 ++
> string/memrchr.c | 5 ++
> string/strchrnul.c | 5 ++
> string/strcmp.c | 8 +++
> string/strlen.c | 5 ++
> string/strncmp.c | 8 +++
> sysdeps/riscv/configure | 27 ++++++++
> sysdeps/riscv/configure.ac | 18 +++++
> sysdeps/riscv/multiarch/memchr-generic.c | 24 +++++++
> sysdeps/riscv/multiarch/memchr-zbb.c | 23 +++++++
> sysdeps/riscv/multiarch/memrchr-generic.c | 24 +++++++
> sysdeps/riscv/multiarch/memrchr-zbb.c | 23 +++++++
> sysdeps/riscv/multiarch/strchrnul-generic.c | 24 +++++++
> sysdeps/riscv/multiarch/strchrnul-zbb.c | 23 +++++++
> sysdeps/riscv/multiarch/strcmp-generic.c | 24 +++++++
> sysdeps/riscv/multiarch/strcmp-zbb.c | 23 +++++++
> sysdeps/riscv/multiarch/strlen-generic.c | 24 +++++++
> sysdeps/riscv/multiarch/strlen-zbb.c | 23 +++++++
> sysdeps/riscv/multiarch/strncmp-generic.c | 26 +++++++
> sysdeps/riscv/multiarch/strncmp-zbb.c | 25 +++++++
> sysdeps/riscv/string-fza.h | 22 +++++-
> sysdeps/riscv/string-fzi.h | 20 +++++-
> .../unix/sysv/linux/riscv/multiarch/Makefile | 23 +++++++
> .../linux/riscv/multiarch/ifunc-impl-list.c | 67 +++++++++++++++++--
> .../unix/sysv/linux/riscv/multiarch/memchr.c | 60 +++++++++++++++++
> .../unix/sysv/linux/riscv/multiarch/memrchr.c | 63 +++++++++++++++++
> .../sysv/linux/riscv/multiarch/strchrnul.c | 63 +++++++++++++++++
> .../unix/sysv/linux/riscv/multiarch/strcmp.c | 59 ++++++++++++++++
> .../unix/sysv/linux/riscv/multiarch/strlen.c | 59 ++++++++++++++++
> .../unix/sysv/linux/riscv/multiarch/strncmp.c | 59 ++++++++++++++++
> 32 files changed, 863 insertions(+), 10 deletions(-)
> create mode 100644 sysdeps/riscv/multiarch/memchr-generic.c
> create mode 100644 sysdeps/riscv/multiarch/memchr-zbb.c
> create mode 100644 sysdeps/riscv/multiarch/memrchr-generic.c
> create mode 100644 sysdeps/riscv/multiarch/memrchr-zbb.c
> create mode 100644 sysdeps/riscv/multiarch/strchrnul-generic.c
> create mode 100644 sysdeps/riscv/multiarch/strchrnul-zbb.c
> create mode 100644 sysdeps/riscv/multiarch/strcmp-generic.c
> create mode 100644 sysdeps/riscv/multiarch/strcmp-zbb.c
> create mode 100644 sysdeps/riscv/multiarch/strlen-generic.c
> create mode 100644 sysdeps/riscv/multiarch/strlen-zbb.c
> create mode 100644 sysdeps/riscv/multiarch/strncmp-generic.c
> create mode 100644 sysdeps/riscv/multiarch/strncmp-zbb.c
> create mode 100644 sysdeps/unix/sysv/linux/riscv/multiarch/memchr.c
> create mode 100644 sysdeps/unix/sysv/linux/riscv/multiarch/memrchr.c
> create mode 100644 sysdeps/unix/sysv/linux/riscv/multiarch/strchrnul.c
> create mode 100644 sysdeps/unix/sysv/linux/riscv/multiarch/strcmp.c
> create mode 100644 sysdeps/unix/sysv/linux/riscv/multiarch/strlen.c
> create mode 100644 sysdeps/unix/sysv/linux/riscv/multiarch/strncmp.c
>
> --
> 2.45.1
>
More information about the Libc-alpha
mailing list