From: Christoph Müllner <christoph.muell...@vrull.eu> This patchset adds includes patches to improve the following builtin expansions:
* cpymemsi: Allow by-pieces to generate overlapping memory accesses * cmpstrsi: Add expansion for strcmp and strncmp for aligned strings when zbb/orc.b is available * strlen<mode>: Add expansion for strlen when zbb/orc.b is available This changes were inspired a lot by the PowerPC backend (e.g. moving the expansion code into riscv-string.cc and emitting an unrolled loop which eventually calls the C runtime if necessary). This series is meant to be applied on top of the VT1 support series: https://gcc.gnu.org/pipermail/gcc-patches/2022-November/605959.html The patches come with their own tests and show no regressions to existing tests. Further the series has been tested with all SPEC CPU2017 benchmarks. Christoph Müllner (6): riscv: bitmanip/zbb: Add prefix/postfix and enable visiblity riscv: Enable overlap-by-pieces via tune param riscv: Move riscv_block_move_loop to separate file riscv: Use by-pieces to do overlapping accesses in block_move_straight riscv: Add support for strlen inline expansion riscv: Add support for str(n)cmp inline expansion Philipp Tomsich (1): riscv: bitmanip: add orc.b as an unspec gcc/config.gcc | 3 +- gcc/config/riscv/bitmanip.md | 12 +- gcc/config/riscv/riscv-protos.h | 7 +- gcc/config/riscv/riscv-string.cc | 687 ++++++++++++++++++ gcc/config/riscv/riscv.cc | 172 +---- gcc/config/riscv/riscv.md | 105 ++- gcc/config/riscv/riscv.opt | 5 + gcc/config/riscv/t-riscv | 4 + .../gcc.target/riscv/memcpy-nonoverlapping.c | 54 ++ .../gcc.target/riscv/memcpy-overlapping.c | 47 ++ .../gcc.target/riscv/memset-nonoverlapping.c | 45 ++ .../gcc.target/riscv/memset-overlapping.c | 43 ++ .../gcc.target/riscv/zbb-strcmp-unaligned.c | 36 + gcc/testsuite/gcc.target/riscv/zbb-strcmp.c | 55 ++ .../gcc.target/riscv/zbb-strlen-unaligned.c | 13 + gcc/testsuite/gcc.target/riscv/zbb-strlen.c | 18 + 16 files changed, 1132 insertions(+), 174 deletions(-) create mode 100644 gcc/config/riscv/riscv-string.cc create mode 100644 gcc/testsuite/gcc.target/riscv/memcpy-nonoverlapping.c create mode 100644 gcc/testsuite/gcc.target/riscv/memcpy-overlapping.c create mode 100644 gcc/testsuite/gcc.target/riscv/memset-nonoverlapping.c create mode 100644 gcc/testsuite/gcc.target/riscv/memset-overlapping.c create mode 100644 gcc/testsuite/gcc.target/riscv/zbb-strcmp-unaligned.c create mode 100644 gcc/testsuite/gcc.target/riscv/zbb-strcmp.c create mode 100644 gcc/testsuite/gcc.target/riscv/zbb-strlen-unaligned.c create mode 100644 gcc/testsuite/gcc.target/riscv/zbb-strlen.c -- 2.38.1