From patchwork Tue Feb 3 15:05:25 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zihong Yao X-Patchwork-Id: 129494 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [127.0.0.1]) by sourceware.org (Postfix) with ESMTP id 107E54BA23D3 for ; Tue, 3 Feb 2026 15:17:41 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 107E54BA23D3 X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from cstnet.cn (smtp21.cstnet.cn [159.226.251.21]) by sourceware.org (Postfix) with ESMTPS id 8F7BC4BA2E15 for ; Tue, 3 Feb 2026 15:14:56 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 8F7BC4BA2E15 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=isrc.iscas.ac.cn Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=isrc.iscas.ac.cn ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 8F7BC4BA2E15 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=159.226.251.21 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1770131697; cv=none; b=ZtYz4f1YBqE6YjhuFYDDaJItWL9iefcuDCTjg5l6pFYh3WlMlGUo6HhZ2GbenrTyeiOP0nzu4oanQ7TaFLBBBV40SGvzxNmxInMKfZWAeg1D5fWTUx0hcAy57RNc3OQZkqPUx7cKDc1dPwzuHgzbN7itxyVBk7izgYVEN1dGfDY= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1770131697; c=relaxed/simple; bh=oueYK86HZWFBzfhiyWpI7z1i/mgyz9pFoH9Ipg0XVrI=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=De8xyk3BF3RBx4RUFGnQ1SNjx1+9K3kT8147WAQqzkMknYIWNGw1wiS8hJwQHaRmopQuvL9GIpsHMhx1y4YSu3w3uBfllAnrBlM5hH7dMaiBJYSkqy4ypC2uHOMBvOQ159SAg6YhLMAv7ETCaDOKEOHrqjhRk78d6TvqeKsEcdw= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 8F7BC4BA2E15 Received: from Mobilestation.localdomain (unknown [183.6.59.140]) by APP-01 (Coremail) with SMTP id qwCowADHbmriEIJpZ2EVBw--.24930S3; Tue, 03 Feb 2026 23:14:46 +0800 (CST) From: Yao Zihong To: libc-alpha@sourceware.org Cc: adhemerval.zanella@linaro.org, andrew@sifive.com, schwab@linux-m68k.org, bergner@tenstorrent.com, jlaw@ventanamicro.com, zhangyin2018@iscas.ac.cn, enh@google.com, zihongyao@outlook.com, Yao Zihong Subject: [PATCH v5 01/18] riscv: Add RVV memccpy for multiarch and non-multiarch Date: Tue, 3 Feb 2026 23:05:25 +0800 Message-ID: <20260203151406.27450-2-zihong.plct@isrc.iscas.ac.cn> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260203151406.27450-1-zihong.plct@isrc.iscas.ac.cn> References: <20260203151406.27450-1-zihong.plct@isrc.iscas.ac.cn> MIME-Version: 1.0 X-CM-TRANSID: qwCowADHbmriEIJpZ2EVBw--.24930S3 X-Coremail-Antispam: 1UD129KBjvJXoW3Gw17CF1fArW5ur4fWw1rZwb_yoWfXrWkpF Z5uF1UGr1kJr4xGrWSgw13X3WrAFn5Jrn8KryY9a1UJrWUJw4kWFsFvwn3KFykJrWFk3yf uFZ8uFyqkw4rAaDanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmj14x267AKxVW5JVWrJwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_Jr4l82xGYIkIc2 x26xkF7I0E14v26r1I6r4UM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2z4x0 Y4vE2Ix0cI8IcVAFwI0_Jr0_JF4l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr1l84 ACjcxK6I8E87Iv67AKxVWUJVW8JwA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1UM2AI xVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6xIIjxv20x vE14v26r1j6r18McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_Gr1lF7xv r2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7M4IIrI8v6xkF7I0E8cxan2IY04 v7MxkF7I0En4kS14v26r1q6r43MxAIw28IcxkI7VAKI48JMxC20s026xCaFVCjc4AY6r1j 6r4UMI8I3I0E5I8CrVAFwI0_Jr0_Jr4lx2IqxVCjr7xvwVAFwI0_JrI_JrWlx4CE17CEb7 AF67AKxVWUtVW8ZwCIc40Y0x0EwIxGrwCI42IY6xIIjxv20xvE14v26r1j6r1xMIIF0xvE 2Ix0cI8IcVCY1x0267AKxVW8JVWxJwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF4lIxAIcV C2z280aVAFwI0_Jr0_Gr1lIxAIcVC2z280aVCY1x0267AKxVW8JVW8JrUvcSsGvfC2Kfnx nUUI43ZEXa7VUbn2-7UUUUU== X-Originating-IP: [183.6.59.140] X-CM-SenderInfo: p2lk00vjoszunw6l223fol2u1dvotugofq/ X-Spam-Status: No, score=-11.3 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_SHORT, RCVD_IN_DNSWL_BLOCKED, RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED, SPF_HELO_PASS, SPF_PASS, TXREP, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: libc-alpha-bounces~patchwork=sourceware.org@sourceware.org Signed-off-by: Yao Zihong --- sysdeps/riscv/multiarch/memccpy-generic.c | 26 +++++++ sysdeps/riscv/multiarch/memccpy-vector.S | 24 +++++++ sysdeps/riscv/rvv/memccpy.S | 67 +++++++++++++++++++ .../unix/sysv/linux/riscv/multiarch/Makefile | 3 + .../linux/riscv/multiarch/ifunc-impl-list.c | 5 ++ .../unix/sysv/linux/riscv/multiarch/memccpy.c | 58 ++++++++++++++++ 6 files changed, 183 insertions(+) create mode 100644 sysdeps/riscv/multiarch/memccpy-generic.c create mode 100644 sysdeps/riscv/multiarch/memccpy-vector.S create mode 100644 sysdeps/riscv/rvv/memccpy.S create mode 100644 sysdeps/unix/sysv/linux/riscv/multiarch/memccpy.c diff --git a/sysdeps/riscv/multiarch/memccpy-generic.c b/sysdeps/riscv/multiarch/memccpy-generic.c new file mode 100644 index 0000000000..d7e6e2d847 --- /dev/null +++ b/sysdeps/riscv/multiarch/memccpy-generic.c @@ -0,0 +1,26 @@ +/* Re-include the default memccpy implementation. + Copyright (C) 2026 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include + +#if IS_IN(libc) +# define MEMCCPY __memccpy_generic +# undef weak_alias +# define weak_alias(x, x2) +# include +#endif diff --git a/sysdeps/riscv/multiarch/memccpy-vector.S b/sysdeps/riscv/multiarch/memccpy-vector.S new file mode 100644 index 0000000000..8ea121e444 --- /dev/null +++ b/sysdeps/riscv/multiarch/memccpy-vector.S @@ -0,0 +1,24 @@ +/* Re-include the RISC-V RVV based memccpy implementation. + Copyright (C) 2026 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#if IS_IN(libc) +# define MEMCCPY __memccpy_vector +# undef weak_alias +# define weak_alias(name, alias) +# include +#endif diff --git a/sysdeps/riscv/rvv/memccpy.S b/sysdeps/riscv/rvv/memccpy.S new file mode 100644 index 0000000000..5854d463c2 --- /dev/null +++ b/sysdeps/riscv/rvv/memccpy.S @@ -0,0 +1,67 @@ +/* RISC-V RVV based memccpy. + Copyright (C) 2026 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include + +#ifndef MEMCCPY +# define MEMCCPY __memccpy +#endif + +#define dst a0 +#define src a1 +#define c_val a2 +#define num a3 + +#define ivl a4 +#define dst_ptr a5 +#define vfirst_idx a6 + +#define ELEM_LMUL_SETTING m8 +#define vdata v0 +#define vmask v8 + +ENTRY (MEMCCPY) +.option push +.option arch, +v + mv dst_ptr, dst +L(loop): + vsetvli zero, num, e8, ELEM_LMUL_SETTING, ta, ma + vle8ff.v vdata, (src) + + vmseq.vx vmask, vdata, c_val + vfirst.m vfirst_idx, vmask + csrr ivl, vl + bgez vfirst_idx, L(found) + vse8.v vdata, (dst_ptr) + + sub num, num, ivl + add src, src, ivl + add dst_ptr, dst_ptr, ivl + bnez num, L(loop) + mv a0, zero + ret +L(found): + addi vfirst_idx, vfirst_idx, 1 + vsetvli zero, vfirst_idx, e8, ELEM_LMUL_SETTING, ta, ma + vse8.v vdata, (dst_ptr) + add a0, dst_ptr, vfirst_idx + ret +.option pop +END (MEMCCPY) +weak_alias (MEMCCPY, memccpy) diff --git a/sysdeps/unix/sysv/linux/riscv/multiarch/Makefile b/sysdeps/unix/sysv/linux/riscv/multiarch/Makefile index 1d26966ded..0c1c2b4467 100644 --- a/sysdeps/unix/sysv/linux/riscv/multiarch/Makefile +++ b/sysdeps/unix/sysv/linux/riscv/multiarch/Makefile @@ -1,5 +1,8 @@ ifeq ($(subdir),string) sysdep_routines += \ + memccpy \ + memccpy-generic \ + memccpy-vector \ memcpy \ memcpy-generic \ memcpy_noalignment \ diff --git a/sysdeps/unix/sysv/linux/riscv/multiarch/ifunc-impl-list.c b/sysdeps/unix/sysv/linux/riscv/multiarch/ifunc-impl-list.c index a3b5731411..cd9460f57e 100644 --- a/sysdeps/unix/sysv/linux/riscv/multiarch/ifunc-impl-list.c +++ b/sysdeps/unix/sysv/linux/riscv/multiarch/ifunc-impl-list.c @@ -53,5 +53,10 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, __memset_vector) IFUNC_IMPL_ADD (array, i, memset, 1, __memset_generic)) + IFUNC_IMPL (i, name, memccpy, + IFUNC_IMPL_ADD (array, i, memccpy, rvv_enabled, + __memccpy_vector) + IFUNC_IMPL_ADD (array, i, memccpy, 1, __memccpy_generic)) + return 0; } diff --git a/sysdeps/unix/sysv/linux/riscv/multiarch/memccpy.c b/sysdeps/unix/sysv/linux/riscv/multiarch/memccpy.c new file mode 100644 index 0000000000..84d300b3cc --- /dev/null +++ b/sysdeps/unix/sysv/linux/riscv/multiarch/memccpy.c @@ -0,0 +1,58 @@ +/* Multiple versions of memccpy. + All versions must be listed in ifunc-impl-list.c. + Copyright (C) 2026 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#if IS_IN (libc) +/* Redefine memccpy so that the compiler won't complain about the type + mismatch with the IFUNC selector in strong_alias, below. */ +# undef memccpy +# define memccpy __redirect_memccpy +# include +# include +# include +# include +# include + +extern __typeof (__redirect_memccpy) __libc_memccpy; + +extern __typeof (__redirect_memccpy) __memccpy_generic attribute_hidden; +extern __typeof (__redirect_memccpy) __memccpy_vector attribute_hidden; + +static inline __typeof (__redirect_memccpy) * +select_memccpy_ifunc (uint64_t dl_hwcap, __riscv_hwprobe_t hwprobe_func) +{ + unsigned long long v; + + if (__riscv_hwprobe_one (hwprobe_func, RISCV_HWPROBE_KEY_IMA_EXT_0, &v) == 0 + && (v & RISCV_HWPROBE_IMA_V) == RISCV_HWPROBE_IMA_V) + return __memccpy_vector; + + return __memccpy_generic; +} + +riscv_libc_ifunc (__libc_memccpy, select_memccpy_ifunc); + +# undef memccpy +weak_alias (__libc_memccpy, memccpy); +# ifdef SHARED +__hidden_ver1 (memccpy, __GI_memccpy, __redirect_memccpy) + __attribute__ ((visibility ("hidden"))) __attribute_copy__ (memccpy); +# endif +#else +# include +#endif