|
|
Message-Id: <20251113161518.57357-1-pincheng.plct@isrc.iscas.ac.cn>
Date: Fri, 14 Nov 2025 00:15:17 +0800
From: Pincheng Wang <pincheng.plct@...c.iscas.ac.cn>
To: musl@...ts.openwall.com
Cc: pincheng.plct@...c.iscas.ac.cn
Subject: [PATCH 0/1] riscv64: add optimized string functions
Hi all,
This patch series supersedes my previous RVV-optimized memset patch
series, now extending support to memmove and memcpy as well. It provides
optimized versions of these string functions for RISC-V with vector
extension, dispatching at runtime based on CPU capability (RVV support).
Implementation details:
- mem{set,cpy,move}.c are renamed internally to
__mem{set,cpy,move}_scalar via macro, preserving the generic C
implementation scalar fallback.
- mem{set,cpy,move}_vector.S provide the optimized
__mem{set,cpy,move}_vector symbols.
- string_dispatch.c exports the public mem{set,cpy,move}() symbols,
which dispatches via function pointer.
- __init_riscv_string_optimizations is called in __libc_start_main to
initialize the function pointer based on AT_HWCAP.
- The vector implementation uses m8 register grouping for bulk fills.
Performance:
Function Size Improvement
memset 16B 0.06%
memset 64B 49.22%
memset 256B 127.81%
memset 1KB 58.12%
memset 4KB 47.95%
memset 64KB 2.56%
memcpy 16B 0.02%
memcpy 64B 35.94%
memcpy 256B 205.10%
memcpy 1KB 126.01%
memcpy 4KB 107.71%
memcpy 64KB 36.15%
memmove_bwd 16B -0.67%
memmove_bwd 64B 47.03%
memmove_bwd 256B 207.32%
memmove_bwd 1KB 125.33%
memmove_bwd 4KB 106.72%
memmove_bwd 64KB 41.46%
Benchmarks are conducted on a Spacemit X60 CPU.
Functional behavior matches generic memset.
Thanks,
Pincheng Wang
Pincheng Wang (1):
riscv64: add optimized memset, memcpy and memmove
src/env/__libc_start_main.c | 3 ++
src/internal/libc.h | 3 ++
src/string/riscv64/memcpy.c | 4 ++
src/string/riscv64/memcpy_vector.S | 27 ++++++++++++++
src/string/riscv64/memmove.c | 4 ++
src/string/riscv64/memmove_vector.S | 51 ++++++++++++++++++++++++++
src/string/riscv64/memset.c | 4 ++
src/string/riscv64/memset_dispatch.c | 36 ++++++++++++++++++
src/string/riscv64/memset_vector.S | 28 ++++++++++++++
src/string/riscv64/string_dispatch.c | 55 ++++++++++++++++++++++++++++
10 files changed, 215 insertions(+)
create mode 100644 src/string/riscv64/memcpy.c
create mode 100644 src/string/riscv64/memcpy_vector.S
create mode 100644 src/string/riscv64/memmove.c
create mode 100644 src/string/riscv64/memmove_vector.S
create mode 100644 src/string/riscv64/memset.c
create mode 100644 src/string/riscv64/memset_dispatch.c
create mode 100644 src/string/riscv64/memset_vector.S
create mode 100644 src/string/riscv64/string_dispatch.c
--
2.39.5
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.