Re: [PATCH v3 0/3] newlib: riscv: Add and optimize memchr() and memrchr() functions
Jeff Johnston <[email protected]>
| Newsgroups | gmane.comp.lib.newlib |
|---|---|
| Message-ID | <CAOox84tntxQhx4Y8DZwc83M4rE1R-acij5y58Eq2uuheWRBnFw@mail.gmail.com> |
Patches pushed to main, thanks. -- Jeff J. On Mon, May 12, 2025 at 10:53 AM Eric Salem <[email protected]> wrote: > The RISC-V port currently does not have its own implementations of > memchr() and memrchr(). Instead it uses the stock version that's common > to any port that omits its own implementations. > > This patch series adds port-specific implementations of both. It > improves upon the algorithm that's currently used, and also uses RISC-V > extensions when available. > > The proposed implementations were benchmarked on a Raspberry Pi Pico 2. > A 2 KB buffer was was used, and an offset into the buffer ranging from > 0-2047 was set where the matching byte would be found. > > To ensure that the benchmarking is objective as possible, a range of > addresses with various alignments were tested so neither algorithm had > an advantage. Addresses divided by eight with a remainder of 0-7 were > used for the benchmark. For example: > > 0x20002a80 > 0x20003289 > 0x20003a92 > 0x2000429b > 0x20004aa4 > 0x200052b5 > 0x20005ac6 > 0x200062d7 > > In all cases except two, the proposed memchr() was faster than the > existing. For those two cases they were tied, and both had an offset of > zero and unaligned addresses for the buffer. A total of 16,384 cases > were tested. > > The existing memrchr() implementation currently does misaligned > accesses, and so could not be benchmarked properly on the Pico 2. But > considering that every word load is misaligned, the proposed > implementation will be faster since it does aligned accesses only. The > algorithm was also improved upon in the same fashion as memchr(), along > with using RISC-V extensions when available. > > The final commit in this series is for regenerating a configuration > file. As described elsewhere,[1][2] this file doesn't need to be part > of the series. It's included only to aid in testing the changes without > having to manually regenerate the file. > > [1] https://sourceware.org/newlib/faq.html#q8 > [2] https://sourceware.org/pipermail/newlib/2025/021500.html > > Changes in v3: > - Don't use inline assembly for Zilsd since compilers will eventually > support it using only C > - Link to v2: https://sourceware.org/pipermail/newlib/2025/021742.html > > Changes in v2: > - Renamed macro used for register size > - Link to v1: https://sourceware.org/pipermail/newlib/2025/021738.html > > Eric Salem (3): > newlib: riscv: Add memchr() and memrchr() implementations > newlib: riscv: Optimize memchr() and memrchr() > newlib: Regenerate configuration file > > newlib/Makefile.in | 41 +++++- > newlib/libc/machine/riscv/Makefile.inc | 2 +- > newlib/libc/machine/riscv/memchr.c | 152 ++++++++++++++++++++++ > newlib/libc/machine/riscv/memrchr.c | 172 +++++++++++++++++++++++++ > newlib/libc/machine/riscv/rv_string.h | 45 ++++++- > newlib/libc/machine/riscv/xlenint.h | 7 + > 6 files changed, 410 insertions(+), 9 deletions(-) > create mode 100644 newlib/libc/machine/riscv/memchr.c > create mode 100644 newlib/libc/machine/riscv/memrchr.c > > -- > 2.49.0 > >