From patchwork Fri Aug 14 02:26:42 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pincheng Wang X-Patchwork-Id: 141355 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 67DCE4BA79A8 for ; Fri, 14 Aug 2026 02:28:04 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 67DCE4BA79A8 X-Original-To: newlib@sourceware.org Delivered-To: newlib@sourceware.org Received: from cstnet.cn (smtp81.cstnet.cn [159.226.251.81]) by sourceware.org (Postfix) with ESMTPS id 104144BA79A0 for ; Fri, 14 Aug 2026 02:27:04 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 104144BA79A0 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 104144BA79A0 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=159.226.251.81 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674425; cv=none; b=vIH3J2GlnRgJ9lSpkzhcXE+HEnZUzCDHrexDllTgkqByRolpYxRe3q0AoGIGztWKvq3e+HGHM8wYT8rW98T4C5aofwOs6PPCLlQM/eOvPCUo2sEr/kTK5Vco0qnYWi7O8o78Svy/7g939ghu7jaUbfWmtFFSVlfcz34Ln6Pv1dU= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674425; c=relaxed/simple; bh=D6tYdzCjY2JhB004RhzFlujzbVs+HU6M655/t7UST84=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=vsvNDwykPq5dh0A/YodDrEQymJ+4lKByYIB84OD1X1m4KBIPh9QShlj8B4UgVFmMRe2DCSy6tkKCh4uDYnbfHBbTUZGo2czuJ1IGoi+I4NP61uUTeKDEDQoVogoByzcKvUptgO278KXo1L3KDEGjTPOx9ZsA2v+4rSpVwNyMrvw= ARC-Authentication-Results: i=1; sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 104144BA79A0 Received: from ROG.localdomain (unknown [183.134.225.12]) by APP-03 (Coremail) with SMTP id rQCowACnsT_xfH5qsxNIBQ--.31342S3; Fri, 14 Aug 2026 10:26:58 +0800 (CST) From: Pincheng Wang To: newlib@sourceware.org Cc: Pincheng Wang Subject: [PATCH v3 01/15] riscv: add vectorized strlen Date: Fri, 14 Aug 2026 10:26:42 +0800 Message-Id: <20260814022656.1071643-2-pincheng.plct@isrc.iscas.ac.cn> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> References: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> MIME-Version: 1.0 X-CM-TRANSID: rQCowACnsT_xfH5qsxNIBQ--.31342S3 X-Coremail-Antispam: 1UD129KBjvJXoW7Cr1kur4kXF43GF4UWr15urg_yoW5Jr47pF sFkF4xt34rtrnayrsrXry8uF45Jasa9r13KFWrAa18tFWkGayfWFs3tw4aqr17Jr90vF17 u3Z2kw1ruw15Xw7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9214x267AKxVWUJVW8JwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_Jr4l82xGYIkIc2 x26xkF7I0E14v26r18M28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2z4x0Y4vE 2Ix0cI8IcVAFwI0_Jr0_JF4l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Jr0_Gr1l84ACjc xK6I8E87Iv67AKxVWUJVW8JwA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Jr0_Gr1le2I262IY c4CY6c8Ij28IcVAaY2xG8wAqx4xG64xvF2IEw4CE5I8CrVC2j2WlYx0E2Ix0cI8IcVAFwI 0_Jr0_Jr4lYx0Ex4A2jsIE14v26r1j6r4UMcvjeVCFs4IE7xkEbVWUJVW8JwACjcxG0xvY 0x0EwIxGrwACjI8F5VA0II8E6IAqYI8I648v4I1l42xK82IYc2Ij64vIr41l4I8I3I0E4I kC6x0Yz7v_Jr0_Gr1lx2IqxVAqx4xG67AKxVWUJVWUGwC20s026x8GjcxK67AKxVWUGVWU WwC2zVAF1VAY17CE14v26r1Y6r17MIIYrxkI7VAKI48JMIIF0xvE2Ix0cI8IcVAFwI0_Jr 0_JF4lIxAIcVC0I7IYx2IY6xkF7I0E14v26r1j6r4UMIIF0xvE42xK8VAvwI8IcIk0rVWU JVWUCwCI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E87Iv6xkF7I0E14v26r1j6r4UYx BIdaVFxhVjvjDU0xZFpf9x0JUqfO7UUUUU= X-Originating-IP: [183.134.225.12] X-CM-SenderInfo: pslquxhhqjh1xofwqxxvufhxpvfd2hldfou0/ X-Spam-Status: No, score=-11.8 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, PROLO_LEO1, RCVD_IN_PBL, SPF_HELO_PASS, SPF_PASS, TXREP shortcircuit=no 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: newlib@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Newlib mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: newlib-bounces~patchwork=sourceware.org@sourceware.org The vector implementation processes the string in vector-length chunks using fault-only-first loads (vle8ff.v), which keeps a vector load from ever crossing into an unmapped page, providing significant performance improvements on RVV-capable hardware. Use conditional compilation to fall back to the scalar implementation when __riscv_vector is not available, maintaining compatibility with non-vector RISC-V systems. Signed-off-by: Pincheng Wang --- newlib/libc/machine/riscv/Makefile.inc | 1 + newlib/libc/machine/riscv/strlen-asm.S | 21 +++++++++++++++++++++ newlib/libc/machine/riscv/strlen.c | 5 +++++ 3 files changed, 27 insertions(+) create mode 100644 newlib/libc/machine/riscv/strlen-asm.S diff --git a/newlib/libc/machine/riscv/Makefile.inc b/newlib/libc/machine/riscv/Makefile.inc index b4c743ff6..a410a512f 100644 --- a/newlib/libc/machine/riscv/Makefile.inc +++ b/newlib/libc/machine/riscv/Makefile.inc @@ -22,4 +22,5 @@ libc_a_SOURCES += \ %D%/stpcpy.c \ %D%/strcmp.S \ %D%/strcpy.c \ + %D%/strlen-asm.S \ %D%/strlen.c diff --git a/newlib/libc/machine/riscv/strlen-asm.S b/newlib/libc/machine/riscv/strlen-asm.S new file mode 100644 index 000000000..fb4a724ec --- /dev/null +++ b/newlib/libc/machine/riscv/strlen-asm.S @@ -0,0 +1,21 @@ +#include + +#if defined(__riscv_vector) && !defined(__OPTIMIZE_SIZE__) && !defined(PREFER_SIZE_OVER_SPEED) +ENTRY(strlen) + mv a1, a0 +.Lloop: + vsetvli a2, zero, e8, m2, ta, ma + vle8ff.v v0, (a1) + csrr a2, vl + vmseq.vi v2, v0, 0 + vfirst.m a3, v2 + add a1, a1, a2 + bltz a3, .Lloop + + add a0, a0, a2 + add a1, a1, a3 + sub a0, a1, a0 + + ret +END(strlen) +#endif diff --git a/newlib/libc/machine/riscv/strlen.c b/newlib/libc/machine/riscv/strlen.c index 8ab5ce537..10f2c431b 100644 --- a/newlib/libc/machine/riscv/strlen.c +++ b/newlib/libc/machine/riscv/strlen.c @@ -9,6 +9,10 @@ http://www.opensource.org/licenses. */ +#if defined(__riscv_vector) && !defined(__OPTIMIZE_SIZE__) && !defined(PREFER_SIZE_OVER_SPEED) +/* strlen defined in strlen-asm.S */ +#else + #include #include #include @@ -66,3 +70,4 @@ size_t strlen(const char *str) #endif #endif /* not PREFER_SIZE_OVER_SPEED */ } +#endif /* not __riscv_vector */ From patchwork Fri Aug 14 02:26:43 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pincheng Wang X-Patchwork-Id: 141351 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A74914BA9001 for ; Fri, 14 Aug 2026 02:27:22 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A74914BA9001 X-Original-To: newlib@sourceware.org Delivered-To: newlib@sourceware.org Received: from cstnet.cn (smtp81.cstnet.cn [159.226.251.81]) by sourceware.org (Postfix) with ESMTPS id 49A484BA7983 for ; Fri, 14 Aug 2026 02:27:03 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 49A484BA7983 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 49A484BA7983 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=159.226.251.81 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674425; cv=none; b=oT0dQ/KjfLJHd3OAGcRJ5YrphgkqXEUSXX6qyyO8uwLH2W9U3FPxlh4lA0+rTHXTjPLSrlRQS/AzsOLi+41NbLq62rZF0EgsdryWPvQM2HLfK9VtodpMcOuthkNZWDEsCvRkkIaewY6bmIW9ohXZjCrUIXxEB88tZzRGYbmQzdA= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674425; c=relaxed/simple; bh=KkJsvRnL+Y0tSC5ZucpQH2yirysLCMxf7fnc17Gpvx4=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=TRc6Y3IjEZ6daIKMgt6Kd5ddvzEp2qFuV48IPShLA7rjoRHYFjXQGofVJKF9EN/bELzPRhfBodOvotxSgnOInkFFMmQkJuapqkBdTKvCd1zOULg4DvtfzI9LXDdWKklTca1mCkAWRY8nI/6gySV5qbG2cg0d5NBRf9TEch4sQao= ARC-Authentication-Results: i=1; sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 49A484BA7983 Received: from ROG.localdomain (unknown [183.134.225.12]) by APP-03 (Coremail) with SMTP id rQCowACnsT_xfH5qsxNIBQ--.31342S4; Fri, 14 Aug 2026 10:26:59 +0800 (CST) From: Pincheng Wang To: newlib@sourceware.org Cc: Pincheng Wang Subject: [PATCH v3 02/15] riscv: add vectorized strnlen Date: Fri, 14 Aug 2026 10:26:43 +0800 Message-Id: <20260814022656.1071643-3-pincheng.plct@isrc.iscas.ac.cn> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> References: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> MIME-Version: 1.0 X-CM-TRANSID: rQCowACnsT_xfH5qsxNIBQ--.31342S4 X-Coremail-Antispam: 1UD129KBjvJXoW7Ww1rCrWktF1Dtw45tF1DZFb_yoW5JFykpF srGFWSy3Wftrnayrs7Xr18uFyUJF9a93W3GFWfZa1UtFs5G3yrGr4Dtw43tr17JF909Fn7 u3W7Kr15uw4UXw7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9S14x267AKxVW8JVW5JwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_Jryl82xGYIkIc2 x26xkF7I0E14v26r1Y6r1xM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2z4x0 Y4vE2Ix0cI8IcVAFwI0_Jr0_JF4l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Jr0_Gr1l84 ACjcxK6I8E87Iv67AKxVWUJVW8JwA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Jr0_Gr1le2I2 62IYc4CY6c8Ij28IcVAaY2xG8wAqx4xG64xvF2IEw4CE5I8CrVC2j2WlYx0E2Ix0cI8IcV AFwI0_Jr0_Jr4lYx0Ex4A2jsIE14v26r1j6r4UMcvjeVCFs4IE7xkEbVWUJVW8JwACjcxG 0xvY0x0EwIxGrwACjI8F5VA0II8E6IAqYI8I648v4I1l42xK82IYc2Ij64vIr41l4I8I3I 0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxVAqx4xG67AKxVWUJVWUGwC20s026x8GjcxK67AKxVWU GVWUWwC2zVAF1VAY17CE14v26r1Y6r17MIIYrxkI7VAKI48JMIIF0xvE2Ix0cI8IcVAFwI 0_Jr0_JF4lIxAIcVC0I7IYx2IY6xkF7I0E14v26r1j6r4UMIIF0xvE42xK8VAvwI8IcIk0 rVWUJVWUCwCI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E87Iv6xkF7I0E14v26r1j6r 4UYxBIdaVFxhVjvjDU0xZFpf9x0JUQJ5rUUUUU= X-Originating-IP: [183.134.225.12] X-CM-SenderInfo: pslquxhhqjh1xofwqxxvufhxpvfd2hldfou0/ X-Spam-Status: No, score=-11.5 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_PBL, SPF_HELO_PASS, SPF_PASS, TXREP shortcircuit=no 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: newlib@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Newlib mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: newlib-bounces~patchwork=sourceware.org@sourceware.org The vector implementation scans the string in vector-length chunks using fault-only-first loads (vle8ff.v); vl is additionally capped by the remaining count so the scan never reads past the maxlen-th byte and never crosses into an unmapped page. This provides significant performance improvements on RVV-capable hardware. Use conditional compilation to fall back to the generic implementation when __riscv_vector is not available, maintaining compatibility with non-vector RISC-V systems. Signed-off-by: Pincheng Wang --- newlib/libc/machine/riscv/Makefile.inc | 4 +++- newlib/libc/machine/riscv/strnlen-asm.S | 24 ++++++++++++++++++++++++ newlib/libc/machine/riscv/strnlen.c | 5 +++++ 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 newlib/libc/machine/riscv/strnlen-asm.S create mode 100644 newlib/libc/machine/riscv/strnlen.c diff --git a/newlib/libc/machine/riscv/Makefile.inc b/newlib/libc/machine/riscv/Makefile.inc index a410a512f..d3f72e471 100644 --- a/newlib/libc/machine/riscv/Makefile.inc +++ b/newlib/libc/machine/riscv/Makefile.inc @@ -23,4 +23,6 @@ libc_a_SOURCES += \ %D%/strcmp.S \ %D%/strcpy.c \ %D%/strlen-asm.S \ - %D%/strlen.c + %D%/strlen.c \ + %D%/strnlen-asm.S \ + %D%/strnlen.c diff --git a/newlib/libc/machine/riscv/strnlen-asm.S b/newlib/libc/machine/riscv/strnlen-asm.S new file mode 100644 index 000000000..6ab9833db --- /dev/null +++ b/newlib/libc/machine/riscv/strnlen-asm.S @@ -0,0 +1,24 @@ +#include + +#if defined(__riscv_vector) && !defined(__OPTIMIZE_SIZE__) && !defined(PREFER_SIZE_OVER_SPEED) +ENTRY(strnlen) + mv a2, a0 + mv a0, a1 +.Lloop: + beqz a1, .Ldone + vsetvli zero, a1, e8, m1, ta, ma + vle8ff.v v0, (a2) + vmseq.vi v8, v0, 0 + vfirst.m a4, v8 /* first occurrence of \0 */ + csrr a3, vl + add a2, a2, a3 + sub a1, a1, a3 + bltz a4, .Lloop + + add a1, a1, a3 + sub a0, a0, a1 + add a0, a0, a4 +.Ldone: + ret +END(strnlen) +#endif diff --git a/newlib/libc/machine/riscv/strnlen.c b/newlib/libc/machine/riscv/strnlen.c new file mode 100644 index 000000000..ca605b567 --- /dev/null +++ b/newlib/libc/machine/riscv/strnlen.c @@ -0,0 +1,5 @@ +#if defined(__OPTIMIZE_SIZE__) || defined(PREFER_SIZE_OVER_SPEED) || !defined(__riscv_vector) +# include "../../string/strnlen.c" +#else +/* strnlen defined in strnlen-asm.S */ +#endif From patchwork Fri Aug 14 02:26:44 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pincheng Wang X-Patchwork-Id: 141356 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id CBF6E4BA7987 for ; Fri, 14 Aug 2026 02:28:22 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org CBF6E4BA7987 X-Original-To: newlib@sourceware.org Delivered-To: newlib@sourceware.org Received: from cstnet.cn (smtp81.cstnet.cn [159.226.251.81]) by sourceware.org (Postfix) with ESMTPS id 4D4544BA7986 for ; Fri, 14 Aug 2026 02:27:04 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4D4544BA7986 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 4D4544BA7986 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=159.226.251.81 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674425; cv=none; b=dURDwtoT/9h0K0RPFiE+DJFZhuJCwT6RUi98Nk6CHeWn6IDrYhVwYrRzIZBjGRsAwd3IsOHeIO4I7PS7O4jaRbhWd8OlQMTFgdVO8rZrWZaDmLvWQt2iICXHlaODPdtt4w97fFnArw5YW/VKf2q2a/7X7tostXBXtgJEQ61Qdkc= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674425; c=relaxed/simple; bh=3cx2EzQFXeUZx292C273gl69NQpo8i/1s7kT+LiMdig=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=okFSq5QagG8vlaMhA5d/tCMWXoGRtWH20smcq1a3dA93htnx66u5gMPd+BjbQTrQmswpjW1uU/oCj+i6g3L1i9Gq6MpqpmTehfAgIG8qyhutnRXN1BWjCgLkzNdNw9+d1JRXxyP0FinMz/FlJkKRIHMdqiYjq9+qO8gO98azn6g= ARC-Authentication-Results: i=1; sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4D4544BA7986 Received: from ROG.localdomain (unknown [183.134.225.12]) by APP-03 (Coremail) with SMTP id rQCowACnsT_xfH5qsxNIBQ--.31342S5; Fri, 14 Aug 2026 10:26:59 +0800 (CST) From: Pincheng Wang To: newlib@sourceware.org Cc: Pincheng Wang Subject: [PATCH v3 03/15] riscv: add vectorized strchr Date: Fri, 14 Aug 2026 10:26:44 +0800 Message-Id: <20260814022656.1071643-4-pincheng.plct@isrc.iscas.ac.cn> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> References: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> MIME-Version: 1.0 X-CM-TRANSID: rQCowACnsT_xfH5qsxNIBQ--.31342S5 X-Coremail-Antispam: 1UD129KBjvJXoWxAr48uryxurWUGr1kXr4fXwb_yoW5GFy5pF sxGa1rtryftrn3Jrs7Xw48Zr15JF9Yg3W3GrWxAa1UtFs5GayrWF4Dtw43Zr43Jryqvr1x uanI9r1Y9w1DXaUanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9S14x267AKxVW8JVW5JwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JrWl82xGYIkIc2 x26xkF7I0E14v26r1I6r4UM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2z4x0 Y4vE2Ix0cI8IcVAFwI0_Jr0_JF4l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Jr0_Gr1l84 ACjcxK6I8E87Iv67AKxVWUJVW8JwA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Jr0_Gr1le2I2 62IYc4CY6c8Ij28IcVAaY2xG8wAqx4xG64xvF2IEw4CE5I8CrVC2j2WlYx0E2Ix0cI8IcV AFwI0_Jr0_Jr4lYx0Ex4A2jsIE14v26r1j6r4UMcvjeVCFs4IE7xkEbVWUJVW8JwACjcxG 0xvY0x0EwIxGrwACjI8F5VA0II8E6IAqYI8I648v4I1l42xK82IYc2Ij64vIr41l4I8I3I 0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxVAqx4xG67AKxVWUJVWUGwC20s026x8GjcxK67AKxVWU GVWUWwC2zVAF1VAY17CE14v26r1Y6r17MIIYrxkI7VAKI48JMIIF0xvE2Ix0cI8IcVAFwI 0_Jr0_JF4lIxAIcVC0I7IYx2IY6xkF7I0E14v26r1j6r4UMIIF0xvE42xK8VAvwI8IcIk0 rVWUJVWUCwCI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E87Iv6xkF7I0E14v26r1j6r 4UYxBIdaVFxhVjvjDU0xZFpf9x0JUkUUUUUUUU= X-Originating-IP: [183.134.225.12] X-CM-SenderInfo: pslquxhhqjh1xofwqxxvufhxpvfd2hldfou0/ X-Spam-Status: No, score=-12.1 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_PBL, SPF_HELO_PASS, SPF_PASS, TXREP shortcircuit=no 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: newlib@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Newlib mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: newlib-bounces~patchwork=sourceware.org@sourceware.org The vector implementation scans the string in vector-length chunks using fault-only-first loads (vle8ff.v), locating the target byte and the terminating NUL in the same pass while never crossing into an unmapped page. This provides significant performance improvements on RVV-capable hardware. Use conditional compilation to fall back to the generic implementation when __riscv_vector is not available, maintaining compatibility with non-vector RISC-V systems. Signed-off-by: Pincheng Wang --- newlib/libc/machine/riscv/Makefile.inc | 2 ++ newlib/libc/machine/riscv/strchr-asm.S | 25 +++++++++++++++++++++++++ newlib/libc/machine/riscv/strchr.c | 5 +++++ 3 files changed, 32 insertions(+) create mode 100644 newlib/libc/machine/riscv/strchr-asm.S create mode 100644 newlib/libc/machine/riscv/strchr.c diff --git a/newlib/libc/machine/riscv/Makefile.inc b/newlib/libc/machine/riscv/Makefile.inc index d3f72e471..01a0aaf50 100644 --- a/newlib/libc/machine/riscv/Makefile.inc +++ b/newlib/libc/machine/riscv/Makefile.inc @@ -20,6 +20,8 @@ libc_a_SOURCES += \ %D%/memset.S \ %D%/setjmp.S \ %D%/stpcpy.c \ + %D%/strchr-asm.S \ + %D%/strchr.c \ %D%/strcmp.S \ %D%/strcpy.c \ %D%/strlen-asm.S \ diff --git a/newlib/libc/machine/riscv/strchr-asm.S b/newlib/libc/machine/riscv/strchr-asm.S new file mode 100644 index 000000000..8cbd44ecf --- /dev/null +++ b/newlib/libc/machine/riscv/strchr-asm.S @@ -0,0 +1,25 @@ +#include + +#if defined(__riscv_vector) && !defined(__riscv_e) && !defined(__OPTIMIZE_SIZE__) && !defined(PREFER_SIZE_OVER_SPEED) +ENTRY(strchr) +.Lloop: + vsetvli t0, zero, e8, m1, ta, ma + vle8ff.v v0, (a0) + vmseq.vi v8, v0, 0 + vmseq.vx v9, v0, a1 + vfirst.m a2, v8 /* first occurrence of \0 */ + vfirst.m a3, v9 /* first occurrence of a1 */ + sltz a4, a3 + sltu a5, a2, a3 + or a4, a4, a5 + beqz a4, .Lfound /* found a1, not preceded by \0? */ + csrr a6, vl + add a0, a0, a6 + bltz a2, .Lloop /* didn't find \0? */ + li a0, 0 + ret +.Lfound: + add a0, a0, a3 + ret +END(strchr) +#endif diff --git a/newlib/libc/machine/riscv/strchr.c b/newlib/libc/machine/riscv/strchr.c new file mode 100644 index 000000000..459d3c5d8 --- /dev/null +++ b/newlib/libc/machine/riscv/strchr.c @@ -0,0 +1,5 @@ +#if defined(__OPTIMIZE_SIZE__) || defined(PREFER_SIZE_OVER_SPEED) || !defined(__riscv_vector) || defined(__riscv_e) +# include "../../string/strchr.c" +#else +/* strchr defined in strchr-asm.S */ +#endif From patchwork Fri Aug 14 02:26:45 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pincheng Wang X-Patchwork-Id: 141363 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id BAE864BA79AE for ; Fri, 14 Aug 2026 02:30:27 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org BAE864BA79AE X-Original-To: newlib@sourceware.org Delivered-To: newlib@sourceware.org Received: from cstnet.cn (smtp81.cstnet.cn [159.226.251.81]) by sourceware.org (Postfix) with ESMTPS id 8247A4BA901F for ; Fri, 14 Aug 2026 02:27:11 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 8247A4BA901F 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 8247A4BA901F Authentication-Results: sourceware.org; arc=none smtp.remote-ip=159.226.251.81 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674432; cv=none; b=NXbGKiRgNcS7lficscO1sQc3GL+jxBx9N5PizN2Na9aVqTQsujvMU9/u290lEBn/NZWNwD3cwx0REzJN2H/iNulTANGwv6dItI15lXWsDD1ZuCEER71EuY5WZZxEeTT9pJlU+DQGhmFPCTS4egO8gynGsoEHA6Z8ktzmhNcseOs= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674432; c=relaxed/simple; bh=xsT1kI7byix9U6XhATN9UMDsVg4bhlO/2QUg4lvTCFg=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=TzrIy2C4445Yi6G85O8G18cmsgePQ29Q+GsZ8SgGVvdlO5JTtJ2QJoWjfIeyD/GNOBQDotzMrJjZDLyAqujuXqnOGNMBx1GKy3NpRePcfipK3SNj2B929TPTEuZEhw+OVQZ9bRDVSoh34BwKlmxxKrGQxr/uwps/RXy7kFaHQ+o= ARC-Authentication-Results: i=1; sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 8247A4BA901F Received: from ROG.localdomain (unknown [183.134.225.12]) by APP-03 (Coremail) with SMTP id rQCowACnsT_xfH5qsxNIBQ--.31342S6; Fri, 14 Aug 2026 10:26:59 +0800 (CST) From: Pincheng Wang To: newlib@sourceware.org Cc: Pincheng Wang Subject: [PATCH v3 04/15] riscv: add vectorized strchrnul Date: Fri, 14 Aug 2026 10:26:45 +0800 Message-Id: <20260814022656.1071643-5-pincheng.plct@isrc.iscas.ac.cn> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> References: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> MIME-Version: 1.0 X-CM-TRANSID: rQCowACnsT_xfH5qsxNIBQ--.31342S6 X-Coremail-Antispam: 1UD129KBjvJXoWxWF1DXF4UJFWUWw4xCr47twb_yoW5GFyxpF sxCF4rtrySqr93Kws3Zw109r4UJa4kG3W3GrW8Aw4YyFZ5G3yrWr4Dta15Ar4fJFyqyr17 uanI9r1a93WUXw7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9m14x267AKxVW5JVWrJwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26r1I6r4UM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Jr0_JF4l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Jr0_Gr 1l84ACjcxK6I8E87Iv67AKxVWUJVW8JwA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Jr0_Gr1l e2I262IYc4CY6c8Ij28IcVAaY2xG8wAqx4xG64xvF2IEw4CE5I8CrVC2j2WlYx0E2Ix0cI 8IcVAFwI0_Jr0_Jr4lYx0Ex4A2jsIE14v26r1j6r4UMcvjeVCFs4IE7xkEbVWUJVW8JwAC jcxG0xvY0x0EwIxGrwACjI8F5VA0II8E6IAqYI8I648v4I1l42xK82IYc2Ij64vIr41l4I 8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxVAqx4xG67AKxVWUJVWUGwC20s026x8GjcxK67AK xVWUGVWUWwC2zVAF1VAY17CE14v26r1Y6r17MIIYrxkI7VAKI48JMIIF0xvE2Ix0cI8IcV AFwI0_Jr0_JF4lIxAIcVC0I7IYx2IY6xkF7I0E14v26r1j6r4UMIIF0xvE42xK8VAvwI8I cIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E87Iv6xkF7I0E14v26r 1j6r4UYxBIdaVFxhVjvjDU0xZFpf9x0JUDxhJUUUUU= X-Originating-IP: [183.134.225.12] X-CM-SenderInfo: pslquxhhqjh1xofwqxxvufhxpvfd2hldfou0/ X-Spam-Status: No, score=-12.2 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_PBL, SPF_HELO_PASS, SPF_PASS, TXREP shortcircuit=no 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: newlib@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Newlib mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: newlib-bounces~patchwork=sourceware.org@sourceware.org The vector implementation scans the string in vector-length chunks using fault-only-first loads (vle8ff.v), returning a pointer to the first match or to the terminating NUL without ever crossing into an unmapped page. This provides significant performance improvements on RVV-capable hardware. Use conditional compilation to fall back to the generic implementation when __riscv_vector is not available, maintaining compatibility with non-vector RISC-V systems. Signed-off-by: Pincheng Wang --- newlib/libc/machine/riscv/Makefile.inc | 2 ++ newlib/libc/machine/riscv/strchrnul-asm.S | 27 +++++++++++++++++++++++ newlib/libc/machine/riscv/strchrnul.c | 5 +++++ 3 files changed, 34 insertions(+) create mode 100644 newlib/libc/machine/riscv/strchrnul-asm.S create mode 100644 newlib/libc/machine/riscv/strchrnul.c diff --git a/newlib/libc/machine/riscv/Makefile.inc b/newlib/libc/machine/riscv/Makefile.inc index 01a0aaf50..3c13fbc1a 100644 --- a/newlib/libc/machine/riscv/Makefile.inc +++ b/newlib/libc/machine/riscv/Makefile.inc @@ -22,6 +22,8 @@ libc_a_SOURCES += \ %D%/stpcpy.c \ %D%/strchr-asm.S \ %D%/strchr.c \ + %D%/strchrnul-asm.S \ + %D%/strchrnul.c \ %D%/strcmp.S \ %D%/strcpy.c \ %D%/strlen-asm.S \ diff --git a/newlib/libc/machine/riscv/strchrnul-asm.S b/newlib/libc/machine/riscv/strchrnul-asm.S new file mode 100644 index 000000000..dfe4bcd72 --- /dev/null +++ b/newlib/libc/machine/riscv/strchrnul-asm.S @@ -0,0 +1,27 @@ +#include + +#if defined(__riscv_vector) && !defined(__OPTIMIZE_SIZE__) && !defined(PREFER_SIZE_OVER_SPEED) +ENTRY(strchrnul) +.Lloop: + vsetvli t0, zero, e8, m1, ta, ma + vle8ff.v v0, (a0) + vmseq.vx v8, v0, a1 + vmseq.vi v9, v0, 0 + vfirst.m a2, v8 + vfirst.m a3, v9 + bltz a2, .Lcheck_nul + bltz a3, .Lfound_char + bltu a2, a3, .Lfound_char +.Lfound_nul: + add a0, a0, a3 + ret +.Lfound_char: + add a0, a0, a2 + ret +.Lcheck_nul: + bgez a3, .Lfound_nul + csrr a4, vl + add a0, a0, a4 + j .Lloop +END(strchrnul) +#endif diff --git a/newlib/libc/machine/riscv/strchrnul.c b/newlib/libc/machine/riscv/strchrnul.c new file mode 100644 index 000000000..4a6d0e947 --- /dev/null +++ b/newlib/libc/machine/riscv/strchrnul.c @@ -0,0 +1,5 @@ +#if defined(__OPTIMIZE_SIZE__) || defined(PREFER_SIZE_OVER_SPEED) || !defined(__riscv_vector) || defined(__riscv_e) +# include "../../string/strchrnul.c" +#else +/* strchrnul defined in strchrnul-asm.S */ +#endif From patchwork Fri Aug 14 02:26:46 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pincheng Wang X-Patchwork-Id: 141354 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id C54C04BA900F for ; Fri, 14 Aug 2026 02:27:41 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C54C04BA900F X-Original-To: newlib@sourceware.org Delivered-To: newlib@sourceware.org Received: from cstnet.cn (smtp81.cstnet.cn [159.226.251.81]) by sourceware.org (Postfix) with ESMTPS id 4228A4BA23FF for ; Fri, 14 Aug 2026 02:27:03 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4228A4BA23FF 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 4228A4BA23FF Authentication-Results: sourceware.org; arc=none smtp.remote-ip=159.226.251.81 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674425; cv=none; b=wZd8ATlmCGMeBI6v2HJFpvqexJnkNbUqB8fhY9LWwY8WwlINOk9OVs7ZClitIjtamABve6oZk4IdNPBilrqmkCnhF2Xk1LWWIGDlPuMGxVgtiUb83iLBK8MGq7QTq39d/siUnuPNcKkSW3HONz5/ad60h8AuCzC7qmcYXkkR45g= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674425; c=relaxed/simple; bh=i0cCinoCBcWyredKPiFeYGMjSo71oQ+o+qes4wC3eRY=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=qPtsVhF2Sm6xnQjEw7gRh7thij9MkiOlHvYs9l+jpMP73QMpXPnZH1UPYG2eZc4uCeMNEEkRKPCk5YPto6U8pxq8EF8ydqfWvhOnUhMZMaQMz5SsFDDpe/nutiSvQFTCGESrEWhFZsJdMc78pOm5i43QqH/bUTnh4hAd14yCQgI= ARC-Authentication-Results: i=1; sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4228A4BA23FF Received: from ROG.localdomain (unknown [183.134.225.12]) by APP-03 (Coremail) with SMTP id rQCowACnsT_xfH5qsxNIBQ--.31342S7; Fri, 14 Aug 2026 10:27:00 +0800 (CST) From: Pincheng Wang To: newlib@sourceware.org Cc: Pincheng Wang Subject: [PATCH v3 05/15] riscv: add vectorized strrchr Date: Fri, 14 Aug 2026 10:26:46 +0800 Message-Id: <20260814022656.1071643-6-pincheng.plct@isrc.iscas.ac.cn> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> References: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> MIME-Version: 1.0 X-CM-TRANSID: rQCowACnsT_xfH5qsxNIBQ--.31342S7 X-Coremail-Antispam: 1UD129KBjvJXoWxGr17Kr4DJr1xWr4DGw4xXrb_yoW5uw18pa nFka1Fy3Wftrn3trn7Xr18urW5Jas3K3W3GFWrAw4UtFsYgayrWFs8tw43Aw4xJryqvF4x u3Wjgr1Y9w15XaUanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9G14x267AKxVW5JVWrJwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26r1I6r4UM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_JFI_Gr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr 1l84ACjcxK6I8E87Iv67AKxVWUJVW8JwA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1U M2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6xIIjx v20xvE14v26r1j6r18McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_Gr1l F7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7MxAIw28IcxkI7VAKI48JMx C20s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_Jr4lx2IqxVCjr7xvwVAF wI0_JrI_JrWlx4CE17CEb7AF67AKxVWUXVWUAwCIc40Y0x0EwIxGrwCI42IY6xIIjxv20x vE14v26r1I6r4UMIIF0xvE2Ix0cI8IcVCY1x0267AKxVW8JVWxJwCI42IY6xAIw20EY4v2 0xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Jr0_Gr1lIxAIcVC2z280aVCY1x0267AKxV W8JVW8JrUvcSsGvfC2KfnxnUUI43ZEXa7VUbj2MUUUUUU== X-Originating-IP: [183.134.225.12] X-CM-SenderInfo: pslquxhhqjh1xofwqxxvufhxpvfd2hldfou0/ X-Spam-Status: No, score=-12.0 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_PBL, SPF_HELO_PASS, SPF_PASS, TXREP shortcircuit=no 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: newlib@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Newlib mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: newlib-bounces~patchwork=sourceware.org@sourceware.org The vector implementation makes a single forward pass, loading each chunk with fault-only-first loads (vle8ff.v) and selecting the highest matching lane index with a masked max-index reduction, so it never crosses into an unmapped page. This provides significant performance improvements on RVV-capable hardware. Use conditional compilation to fall back to the generic implementation when __riscv_vector is not available, maintaining compatibility with non-vector RISC-V systems. Signed-off-by: Pincheng Wang --- newlib/libc/machine/riscv/Makefile.inc | 4 ++- newlib/libc/machine/riscv/strrchr-asm.S | 38 +++++++++++++++++++++++++ newlib/libc/machine/riscv/strrchr.c | 5 ++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 newlib/libc/machine/riscv/strrchr-asm.S create mode 100644 newlib/libc/machine/riscv/strrchr.c diff --git a/newlib/libc/machine/riscv/Makefile.inc b/newlib/libc/machine/riscv/Makefile.inc index 3c13fbc1a..4bb7fefbb 100644 --- a/newlib/libc/machine/riscv/Makefile.inc +++ b/newlib/libc/machine/riscv/Makefile.inc @@ -29,4 +29,6 @@ libc_a_SOURCES += \ %D%/strlen-asm.S \ %D%/strlen.c \ %D%/strnlen-asm.S \ - %D%/strnlen.c + %D%/strnlen.c \ + %D%/strrchr-asm.S \ + %D%/strrchr.c diff --git a/newlib/libc/machine/riscv/strrchr-asm.S b/newlib/libc/machine/riscv/strrchr-asm.S new file mode 100644 index 000000000..1bdb84338 --- /dev/null +++ b/newlib/libc/machine/riscv/strrchr-asm.S @@ -0,0 +1,38 @@ +#include + +#if defined(__riscv_vector) && !defined(__riscv_e) && !defined(__OPTIMIZE_SIZE__) && !defined(PREFER_SIZE_OVER_SPEED) +/* char *strrchr(const char *a0, int a1) + Return the last occurrence of (char)a1 in a0, including the terminating + NUL when a1==0, else NULL. Single forward pass: each chunk is loaded with + vle8ff (page-boundary safe) and the highest matching lane index is found + with a masked max-index reduction. */ +ENTRY(strrchr) + li a6, 0 /* result pointer = NULL so far */ +.Lloop: + vsetvli a2, zero, e8, m1, ta, ma + vle8ff.v v8, (a0) + csrr a2, vl + vmseq.vi v1, v8, 0 /* NUL lanes */ + vfirst.m a3, v1 /* first NUL position (or -1) */ + vmseq.vx v2, v8, a1 /* lanes equal to (char)c */ + vmsif.m v3, v1 /* valid lanes: up to & including first NUL */ + vmand.mm v0, v2, v3 /* candidate matches within the string */ + vfirst.m a4, v0 /* any candidate in this chunk? */ + bltz a4, .Lskip + /* reduce the maximum lane index over candidate lanes (need e16 to be + safe for large VLEN where vl can exceed 255). */ + vsetvli zero, a2, e16, m2, ta, ma + vid.v v16 + vmv.s.x v24, x0 + vredmaxu.vs v24, v16, v24, v0.t + vmv.x.s a5, v24 + add a6, a0, a5 +.Lskip: + bgez a3, .Ldone /* reached end of string */ + add a0, a0, a2 + j .Lloop +.Ldone: + mv a0, a6 + ret +END(strrchr) +#endif diff --git a/newlib/libc/machine/riscv/strrchr.c b/newlib/libc/machine/riscv/strrchr.c new file mode 100644 index 000000000..d06b31e4c --- /dev/null +++ b/newlib/libc/machine/riscv/strrchr.c @@ -0,0 +1,5 @@ +#if defined(__OPTIMIZE_SIZE__) || defined(PREFER_SIZE_OVER_SPEED) || !defined(__riscv_vector) || defined(__riscv_e) +# include "../../string/strrchr.c" +#else +/* strrchr defined in strrchr-asm.S */ +#endif From patchwork Fri Aug 14 02:26:47 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pincheng Wang X-Patchwork-Id: 141360 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 379EB4BAE7CF for ; Fri, 14 Aug 2026 02:29:28 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 379EB4BAE7CF X-Original-To: newlib@sourceware.org Delivered-To: newlib@sourceware.org Received: from cstnet.cn (smtp81.cstnet.cn [159.226.251.81]) by sourceware.org (Postfix) with ESMTPS id 56CDD4BA7988 for ; Fri, 14 Aug 2026 02:27:04 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 56CDD4BA7988 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 56CDD4BA7988 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=159.226.251.81 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674425; cv=none; b=AEOSVA2zk3DrJtBZ0nJofVhUfkilTKj1AvP/Duk06p3QVg0CID7W9b641lEaytDkScYGcFU1LKmvIZ6mG278c70Wx7O9xTAu/K6jpsCgckHKXUpLlvjbPdUgtCiotf/fH8DE+0KqEj8baDZozlECbzrSOYEclaNXMRR70d+CNf4= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674425; c=relaxed/simple; bh=/HQsCd7z3pY0sYiz2OWqotix68CPb2ZZbkUcADvn5IE=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=xlYScNWcYSSLE8078VKAnVItxXYiF0NGpEz67D9MoJD43Aag5alc+DnIKGJkmq7n8JpAqGLCzm26Hhf87lRQJyUb+pR1W7GCZ3dhxy0lgnuQusq1aLsVkQ7T3lfysP+f6hxh6xzyrO62mkTk4il5B5EHcSxbltrIwNVCpFIjLjo= ARC-Authentication-Results: i=1; sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 56CDD4BA7988 Received: from ROG.localdomain (unknown [183.134.225.12]) by APP-03 (Coremail) with SMTP id rQCowACnsT_xfH5qsxNIBQ--.31342S8; Fri, 14 Aug 2026 10:27:00 +0800 (CST) From: Pincheng Wang To: newlib@sourceware.org Cc: Pincheng Wang Subject: [PATCH v3 06/15] riscv: add vectorized strcmp Date: Fri, 14 Aug 2026 10:26:47 +0800 Message-Id: <20260814022656.1071643-7-pincheng.plct@isrc.iscas.ac.cn> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> References: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> MIME-Version: 1.0 X-CM-TRANSID: rQCowACnsT_xfH5qsxNIBQ--.31342S8 X-Coremail-Antispam: 1UD129KBjvJXoWxAr48uryxuF13Ary8GFW3Wrg_yoW5CrykpF 45Ka1YyFy8Krn3JFs7X3W8ZF4UGas7KwnxGr4rAa1UtFZ5Wa95Wrs8tw43A3WxXr9Iyan3 u3W2kr4a9r1UXw7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9G14x267AKxVW5JVWrJwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26r4j6ryUM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_JFI_Gr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr 1l84ACjcxK6I8E87Iv67AKxVWUJVW8JwA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1U M2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6xIIjx v20xvE14v26r1j6r18McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_Gr1l F7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7MxAIw28IcxkI7VAKI48JMx C20s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_Jr4lx2IqxVCjr7xvwVAF wI0_JrI_JrWlx4CE17CEb7AF67AKxVWUXVWUAwCIc40Y0x0EwIxGrwCI42IY6xIIjxv20x vE14v26r1I6r4UMIIF0xvE2Ix0cI8IcVCY1x0267AKxVW8JVWxJwCI42IY6xAIw20EY4v2 0xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Jr0_Gr1lIxAIcVC2z280aVCY1x0267AKxV W8JVW8JrUvcSsGvfC2KfnxnUUI43ZEXa7VUjjXdUUUUUU== X-Originating-IP: [183.134.225.12] X-CM-SenderInfo: pslquxhhqjh1xofwqxxvufhxpvfd2hldfou0/ X-Spam-Status: No, score=-12.2 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_PBL, SPF_HELO_PASS, SPF_PASS, TXREP shortcircuit=no 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: newlib@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Newlib mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: newlib-bounces~patchwork=sourceware.org@sourceware.org The vector implementation compares both operands in vector-length chunks using fault-only-first loads (vle8ff.v), detecting the terminating NUL and the first differing byte in the same pass without ever crossing into an unmapped page. This provides significant performance improvements on RVV-capable hardware. Use conditional compilation to fall back to the existing scalar implementation when __riscv_vector is not available, maintaining compatibility with non-vector RISC-V systems. Signed-off-by: Pincheng Wang --- newlib/libc/machine/riscv/Makefile.inc | 1 + newlib/libc/machine/riscv/strcmp-asm.S | 51 ++++++++++++++++++++++++++ newlib/libc/machine/riscv/strcmp.S | 4 ++ 3 files changed, 56 insertions(+) create mode 100644 newlib/libc/machine/riscv/strcmp-asm.S diff --git a/newlib/libc/machine/riscv/Makefile.inc b/newlib/libc/machine/riscv/Makefile.inc index 4bb7fefbb..243195b36 100644 --- a/newlib/libc/machine/riscv/Makefile.inc +++ b/newlib/libc/machine/riscv/Makefile.inc @@ -24,6 +24,7 @@ libc_a_SOURCES += \ %D%/strchr.c \ %D%/strchrnul-asm.S \ %D%/strchrnul.c \ + %D%/strcmp-asm.S \ %D%/strcmp.S \ %D%/strcpy.c \ %D%/strlen-asm.S \ diff --git a/newlib/libc/machine/riscv/strcmp-asm.S b/newlib/libc/machine/riscv/strcmp-asm.S new file mode 100644 index 000000000..5592a88b6 --- /dev/null +++ b/newlib/libc/machine/riscv/strcmp-asm.S @@ -0,0 +1,51 @@ +#include + +#if defined(__riscv_vector) && !defined(__OPTIMIZE_SIZE__) && !defined(PREFER_SIZE_OVER_SPEED) +ENTRY(strcmp) +.Lloop: + vsetvli a2, zero, e8, m1, ta, ma + vle8ff.v v0, (a0) + /* check if v0[i] == 0 */ + vmseq.vx v16, v0, zero + + vle8ff.v v8, (a1) + /* check if v0[i] != v8[i] */ + vmsne.vv v17, v0, v8 + + /* find the index x for v0[x]==0 */ + vfirst.m a3, v16 + /* find the index x for v0[x]!=v8[x] */ + vfirst.m a4, v17 + + bgez a3, .Lcheck1 + bgez a4, .Lcheck2 + + /* get the current vl updated by vle8ff. */ + csrr a2, vl + add a0, a0, a2 + add a1, a1, a2 + j .Lloop + + /* a3>=0 */ +.Lcheck1: + bltz a4, .Lreturn_at_nul + blt a4, a3, .Lcheck2 +.Lreturn_at_nul: + /* a4<0, or a4>=0 && a3<=a4 */ + add a0, a0, a3 + add a1, a1, a3 + lbu a3, 0(a0) + lbu a4, 0(a1) + sub a0, a3, a4 + ret + + /* a3<0 && a4>=0, or a4 #include "newlib.h" +#if !(defined(__riscv_vector) && !defined(__OPTIMIZE_SIZE__) && !defined(PREFER_SIZE_OVER_SPEED)) + ENTRY(strcmp) #if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) @@ -243,3 +245,5 @@ mask: .dword 0x7f7f7f7f7f7f7f7f #endif #endif + +#endif /* not __riscv_vector */ From patchwork Fri Aug 14 02:26:48 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pincheng Wang X-Patchwork-Id: 141352 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id C8EAC4BA79AD for ; Fri, 14 Aug 2026 02:27:40 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C8EAC4BA79AD X-Original-To: newlib@sourceware.org Delivered-To: newlib@sourceware.org Received: from cstnet.cn (smtp81.cstnet.cn [159.226.251.81]) by sourceware.org (Postfix) with ESMTPS id 4092E4BA23F8 for ; Fri, 14 Aug 2026 02:27:03 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4092E4BA23F8 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 4092E4BA23F8 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=159.226.251.81 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674425; cv=none; b=kW3280LL0x38uignoAW5B38xBt99xOuJPsy8uBSDqaj/E64OYfxvY8mzdOqsJA1s2qYDrBRBfL7UlEueehhFcXzx2RKyYbN78B/2Rhwuyx5l13RczXZujgCLlDwlYUE/efmwYTfUDnd0jm49G+y3qAEn9kYwocC0cmYSoZ5POws= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674425; c=relaxed/simple; bh=UDM4pcNWL3cXorzLEL5jw7yjW7bM/3dxx000Va3MKVM=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=f2+Fg7uQU5jzb4mCLsvd8itrWjJ/d2DJF3ywqYXItG58XVFgCFTAN3x8Yfrl63Bv6kM9wV6LZSB6jH5uHhnTv89HWs22TS7BF6jVnlgkyvgB02WmjpwuZYAOwfk9F8eXSiOZCJQ6XLrw4uzxMVhHwaFVMBLGZ2Xe8PunRVqA5vI= ARC-Authentication-Results: i=1; sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4092E4BA23F8 Received: from ROG.localdomain (unknown [183.134.225.12]) by APP-03 (Coremail) with SMTP id rQCowACnsT_xfH5qsxNIBQ--.31342S9; Fri, 14 Aug 2026 10:27:00 +0800 (CST) From: Pincheng Wang To: newlib@sourceware.org Cc: Pincheng Wang Subject: [PATCH v3 07/15] riscv: add vectorized strncmp Date: Fri, 14 Aug 2026 10:26:48 +0800 Message-Id: <20260814022656.1071643-8-pincheng.plct@isrc.iscas.ac.cn> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> References: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> MIME-Version: 1.0 X-CM-TRANSID: rQCowACnsT_xfH5qsxNIBQ--.31342S9 X-Coremail-Antispam: 1UD129KBjvJXoWxGFyDuFykJw1xtr4ktrWfAFb_yoW5WrWUpF srWa1rtF4xtryfJrZ2qF18uF45JFZ5KF13KrWrAa1YyrWkCa95WF4ktr43uw4fJr9IvF17 u3W2kr1S9r1UXw7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9G14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26r4j6ryUM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_JFI_Gr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr 1l84ACjcxK6I8E87Iv67AKxVWUJVW8JwA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1U M2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6xIIjx v20xvE14v26r1j6r18McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_Gr1l F7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7MxAIw28IcxkI7VAKI48JMx C20s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_Jr4lx2IqxVCjr7xvwVAF wI0_JrI_JrWlx4CE17CEb7AF67AKxVWUXVWUAwCIc40Y0x0EwIxGrwCI42IY6xIIjxv20x vE14v26r1I6r4UMIIF0xvE2Ix0cI8IcVCY1x0267AKxVW8JVWxJwCI42IY6xAIw20EY4v2 0xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Jr0_Gr1lIxAIcVC2z280aVCY1x0267AKxV W8JVW8JrUvcSsGvfC2KfnxnUUI43ZEXa7VUjeHq7UUUUU== X-Originating-IP: [183.134.225.12] X-CM-SenderInfo: pslquxhhqjh1xofwqxxvufhxpvfd2hldfou0/ X-Spam-Status: No, score=-11.7 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_PBL, SPF_HELO_PASS, SPF_PASS, TXREP shortcircuit=no 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: newlib@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Newlib mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: newlib-bounces~patchwork=sourceware.org@sourceware.org The vector implementation compares both operands in vector-length chunks using fault-only-first loads (vle8ff.v); vl is additionally capped by the remaining count so it never reads past the n-th byte and never crosses into an unmapped page. This provides significant performance improvements on RVV-capable hardware. Use conditional compilation to fall back to the generic implementation when __riscv_vector is not available, maintaining compatibility with non-vector RISC-V systems. Signed-off-by: Pincheng Wang --- newlib/libc/machine/riscv/Makefile.inc | 2 ++ newlib/libc/machine/riscv/strncmp-asm.S | 47 +++++++++++++++++++++++++ newlib/libc/machine/riscv/strncmp.c | 5 +++ 3 files changed, 54 insertions(+) create mode 100644 newlib/libc/machine/riscv/strncmp-asm.S create mode 100644 newlib/libc/machine/riscv/strncmp.c diff --git a/newlib/libc/machine/riscv/Makefile.inc b/newlib/libc/machine/riscv/Makefile.inc index 243195b36..015b91799 100644 --- a/newlib/libc/machine/riscv/Makefile.inc +++ b/newlib/libc/machine/riscv/Makefile.inc @@ -29,6 +29,8 @@ libc_a_SOURCES += \ %D%/strcpy.c \ %D%/strlen-asm.S \ %D%/strlen.c \ + %D%/strncmp-asm.S \ + %D%/strncmp.c \ %D%/strnlen-asm.S \ %D%/strnlen.c \ %D%/strrchr-asm.S \ diff --git a/newlib/libc/machine/riscv/strncmp-asm.S b/newlib/libc/machine/riscv/strncmp-asm.S new file mode 100644 index 000000000..c178c32e2 --- /dev/null +++ b/newlib/libc/machine/riscv/strncmp-asm.S @@ -0,0 +1,47 @@ +#include + +#if defined(__riscv_vector) && !defined(__OPTIMIZE_SIZE__) && !defined(PREFER_SIZE_OVER_SPEED) +ENTRY(strncmp) + beqz a2, .Lzero_length +.Lloop: + vsetvli zero, a2, e8, m1, ta, ma + + vle8ff.v v0, (a0) + /* v0[i] == 0. */ + vmseq.vx v8, v0, zero + + vle8ff.v v4, (a1) + /* v0[i] != v4[i]. */ + vmsne.vv v9, v0, v4 + + csrr a3, vl + + /* r = mask1 | mask2 + Combine the first NUL in a0 with the first differing byte so a single + vfirst.m locates whichever comes first. */ + vmor.mm v8, v8, v9 + + sub a2, a2, a3 + + vfirst.m a4, v8 + + bgez a4, .Lend_loop + + add a0, a0, a3 + add a1, a1, a3 + bnez a2, .Lloop +.Lend_loop: + + add a0, a0, a4 + add a1, a1, a4 + lbu a4, 0(a0) + lbu a5, 0(a1) + + sub a0, a4, a5 + ret + +.Lzero_length: + li a0, 0 + ret +END(strncmp) +#endif diff --git a/newlib/libc/machine/riscv/strncmp.c b/newlib/libc/machine/riscv/strncmp.c new file mode 100644 index 000000000..81ccf1e58 --- /dev/null +++ b/newlib/libc/machine/riscv/strncmp.c @@ -0,0 +1,5 @@ +#if defined(__OPTIMIZE_SIZE__) || defined(PREFER_SIZE_OVER_SPEED) || !defined(__riscv_vector) +# include "../../string/strncmp.c" +#else +/* strncmp defined in strncmp-asm.S */ +#endif From patchwork Fri Aug 14 02:26:49 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pincheng Wang X-Patchwork-Id: 141361 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A86794BA9023 for ; Fri, 14 Aug 2026 02:29:45 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A86794BA9023 X-Original-To: newlib@sourceware.org Delivered-To: newlib@sourceware.org Received: from cstnet.cn (smtp81.cstnet.cn [159.226.251.81]) by sourceware.org (Postfix) with ESMTPS id B630A4BA79A8 for ; Fri, 14 Aug 2026 02:27:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org B630A4BA79A8 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 B630A4BA79A8 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=159.226.251.81 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674428; cv=none; b=rhuYpO8LRwIcD48YpqELq+JUn9J3j6zu/1HagbMZxcjII7lPp5ZYjI1oYlnGMVkeA06199U6NvmkxIWsvWAOLd80qrkFBxAtjDl8tAhcskyWNMWyxNqE+e/GrfiCUx8dCkChC3aKA8gLrgFfUinbPXLkGT0KvAk+8UeHSB3nx8Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674428; c=relaxed/simple; bh=hliX7eBu/qKwZ9k7iDB3jUJ1iloCYa4d/eLSaqKwRxI=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=YkAwD2a2znDjh9a72IeEWYH3pgbqk/sw5/mrjmcgRj6CLr3hR+WjkNhP5nRMWWcw88fHPgJRpC9BrJXKyo1jf2cjE+zlyQKxMfBd4iEH4842Q4YIcZ6K/WlymzkP0YPBfiu8sfrnMibBApLg72SoMDlhxNdJQFwgzc+WOEYJNP0= ARC-Authentication-Results: i=1; sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B630A4BA79A8 Received: from ROG.localdomain (unknown [183.134.225.12]) by APP-03 (Coremail) with SMTP id rQCowACnsT_xfH5qsxNIBQ--.31342S10; Fri, 14 Aug 2026 10:27:00 +0800 (CST) From: Pincheng Wang To: newlib@sourceware.org Cc: Pincheng Wang Subject: [PATCH v3 08/15] riscv: add vectorized strcpy Date: Fri, 14 Aug 2026 10:26:49 +0800 Message-Id: <20260814022656.1071643-9-pincheng.plct@isrc.iscas.ac.cn> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> References: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> MIME-Version: 1.0 X-CM-TRANSID: rQCowACnsT_xfH5qsxNIBQ--.31342S10 X-Coremail-Antispam: 1UD129KBjvJXoW7AF1DXF15JF4kJFykGr47twb_yoW5JF4xpF srGF4FyryxJrn3Aws7Zw109FWUJF9agr13GrWrAan0yFZ5GayrWF4Dta13Xr1xJF9IvF13 u3W3Cr15urn8Xw7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9G14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26r4j6ryUM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_JFI_Gr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr 1l84ACjcxK6I8E87Iv67AKxVWUJVW8JwA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1U M2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6xIIjx v20xvE14v26r1j6r18McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_Gr1l F7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7MxAIw28IcxkI7VAKI48JMx C20s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_Jr4lx2IqxVCjr7xvwVAF wI0_JrI_JrWlx4CE17CEb7AF67AKxVWUXVWUAwCIc40Y0x0EwIxGrwCI42IY6xIIjxv20x vE14v26r1I6r4UMIIF0xvE2Ix0cI8IcVCY1x0267AKxVW8JVWxJwCI42IY6xAIw20EY4v2 0xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Jr0_Gr1lIxAIcVC2z280aVCY1x0267AKxV W8JVW8JrUvcSsGvfC2KfnxnUUI43ZEXa7VUjeHq7UUUUU== X-Originating-IP: [183.134.225.12] X-CM-SenderInfo: pslquxhhqjh1xofwqxxvufhxpvfd2hldfou0/ X-Spam-Status: No, score=-12.1 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_PBL, SPF_HELO_PASS, SPF_PASS, TXREP shortcircuit=no 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: newlib@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Newlib mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: newlib-bounces~patchwork=sourceware.org@sourceware.org The vector implementation copies the source in vector-length chunks using fault-only-first loads (vle8ff.v) and masked stores that include the terminating NUL, so the source is never read across an unmapped page. This provides significant performance improvements on RVV-capable hardware. Use conditional compilation to fall back to the scalar implementation when __riscv_vector is not available, maintaining compatibility with non-vector RISC-V systems. Signed-off-by: Pincheng Wang --- newlib/libc/machine/riscv/Makefile.inc | 1 + newlib/libc/machine/riscv/strcpy-asm.S | 20 ++++++++++++++++++++ newlib/libc/machine/riscv/strcpy.c | 5 +++++ 3 files changed, 26 insertions(+) create mode 100644 newlib/libc/machine/riscv/strcpy-asm.S diff --git a/newlib/libc/machine/riscv/Makefile.inc b/newlib/libc/machine/riscv/Makefile.inc index 015b91799..334d4351b 100644 --- a/newlib/libc/machine/riscv/Makefile.inc +++ b/newlib/libc/machine/riscv/Makefile.inc @@ -26,6 +26,7 @@ libc_a_SOURCES += \ %D%/strchrnul.c \ %D%/strcmp-asm.S \ %D%/strcmp.S \ + %D%/strcpy-asm.S \ %D%/strcpy.c \ %D%/strlen-asm.S \ %D%/strlen.c \ diff --git a/newlib/libc/machine/riscv/strcpy-asm.S b/newlib/libc/machine/riscv/strcpy-asm.S new file mode 100644 index 000000000..3c7272eac --- /dev/null +++ b/newlib/libc/machine/riscv/strcpy-asm.S @@ -0,0 +1,20 @@ +#include + +#if defined(__riscv_vector) && !defined(__OPTIMIZE_SIZE__) && !defined(PREFER_SIZE_OVER_SPEED) +ENTRY(strcpy) + mv a2, a0 +.Lloop: + vsetvli a3, zero, e8, m1, ta, ma + vle8ff.v v8, (a1) + vmseq.vx v1, v8, zero + csrr a4, vl + vfirst.m a5, v1 + vmsif.m v0, v1 + add a1, a1, a4 + vse8.v v8, (a2), v0.t + add a2, a2, a4 + bltz a5, .Lloop + + ret +END(strcpy) +#endif diff --git a/newlib/libc/machine/riscv/strcpy.c b/newlib/libc/machine/riscv/strcpy.c index a05ec1c0f..74f843939 100644 --- a/newlib/libc/machine/riscv/strcpy.c +++ b/newlib/libc/machine/riscv/strcpy.c @@ -9,6 +9,10 @@ http://www.opensource.org/licenses. */ +#if defined(__riscv_vector) && !defined(__OPTIMIZE_SIZE__) && !defined(PREFER_SIZE_OVER_SPEED) +/* strcpy defined in strcpy-asm.S */ +#else + #include #include "rv_string.h" @@ -16,3 +20,4 @@ char *strcpy(char *dst, const char *src) { return __libc_strcpy(dst, src, true); } +#endif From patchwork Fri Aug 14 02:26:50 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pincheng Wang X-Patchwork-Id: 141362 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id C65F04BA9023 for ; Fri, 14 Aug 2026 02:29:49 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C65F04BA9023 X-Original-To: newlib@sourceware.org Delivered-To: newlib@sourceware.org Received: from cstnet.cn (smtp81.cstnet.cn [159.226.251.81]) by sourceware.org (Postfix) with ESMTPS id D91644BA902F for ; Fri, 14 Aug 2026 02:27:11 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org D91644BA902F 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 D91644BA902F Authentication-Results: sourceware.org; arc=none smtp.remote-ip=159.226.251.81 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674432; cv=none; b=w7KZ0Flw6fddn+ZNE8FuFUuB2qbbD3Q+E1l8+Ea+QLodObhAOJP1oTRfV+718+bl1JLVTlt3Xym+vSBhDD6GyxQDMGq/f4BdNRtrfBl/KfaGJOd77o2X6su0kN/6sCYo3TClOypL97sY2BkVZPAtVxMJCy9TirUbtujZcB0Lx4c= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674432; c=relaxed/simple; bh=jneaNCojrnNmR94SF4jdroFRbLl0EWWj2ufDHokA8Mk=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=Vd9xAbLFwMwnVa1aeccZhbPI8pD8i9MiulYoBnXEoScq1UdlhjtpunJPEjz0VP2HikJowmPTeBD9MYdXsqSof0qOpElgz6EGzO8bls3xVcnEYJ7qZUlPIyE6bmR4fskSBysCjEZ/6bozG0wYyILCkVtgH5Ga5r6EXDRR/5BGKbs= ARC-Authentication-Results: i=1; sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D91644BA902F Received: from ROG.localdomain (unknown [183.134.225.12]) by APP-03 (Coremail) with SMTP id rQCowACnsT_xfH5qsxNIBQ--.31342S11; Fri, 14 Aug 2026 10:27:00 +0800 (CST) From: Pincheng Wang To: newlib@sourceware.org Cc: Pincheng Wang Subject: [PATCH v3 09/15] riscv: add vectorized strncpy Date: Fri, 14 Aug 2026 10:26:50 +0800 Message-Id: <20260814022656.1071643-10-pincheng.plct@isrc.iscas.ac.cn> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> References: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> MIME-Version: 1.0 X-CM-TRANSID: rQCowACnsT_xfH5qsxNIBQ--.31342S11 X-Coremail-Antispam: 1UD129KBjvJXoWxGFyDZF1UGry8CrW7Ww4fAFb_yoW5Zw48pF 43W3WfKFWxJrZ3GrZ7X3W8uF45XFZakF15KFyrAa1YyFZ5GayrGrs8tw43Aa1xJr9avF1x u3ZrCr1Y9Fy5Xw7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9G14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26r4j6ryUM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_JFI_Gr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr 1l84ACjcxK6I8E87Iv67AKxVWUJVW8JwA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1U M2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6xIIjx v20xvE14v26r1j6r18McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_Gr1l F7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7MxAIw28IcxkI7VAKI48JMx C20s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_Jr4lx2IqxVCjr7xvwVAF wI0_JrI_JrWlx4CE17CEb7AF67AKxVWUXVWUAwCIc40Y0x0EwIxGrwCI42IY6xIIjxv20x vE14v26r1I6r4UMIIF0xvE2Ix0cI8IcVCY1x0267AKxVW8JVWxJwCI42IY6xAIw20EY4v2 0xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Jr0_Gr1lIxAIcVC2z280aVCY1x0267AKxV W8JVW8JrUvcSsGvfC2KfnxnUUI43ZEXa7VUjeHq7UUUUU== X-Originating-IP: [183.134.225.12] X-CM-SenderInfo: pslquxhhqjh1xofwqxxvufhxpvfd2hldfou0/ X-Spam-Status: No, score=-12.2 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_PBL, SPF_HELO_PASS, SPF_PASS, TXREP shortcircuit=no 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: newlib@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Newlib mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: newlib-bounces~patchwork=sourceware.org@sourceware.org The vector implementation copies the source in vector-length chunks using fault-only-first loads (vle8ff.v); vl is capped by the remaining count so the source is never read past byte n or across an unmapped page, and the tail after a NUL is zero-filled with wide m8 stores. This provides significant performance improvements on RVV-capable hardware. Use conditional compilation to fall back to the generic implementation when __riscv_vector is not available, maintaining compatibility with non-vector RISC-V systems. Signed-off-by: Pincheng Wang --- newlib/libc/machine/riscv/Makefile.inc | 2 ++ newlib/libc/machine/riscv/strncpy-asm.S | 42 +++++++++++++++++++++++++ newlib/libc/machine/riscv/strncpy.c | 5 +++ 3 files changed, 49 insertions(+) create mode 100644 newlib/libc/machine/riscv/strncpy-asm.S create mode 100644 newlib/libc/machine/riscv/strncpy.c diff --git a/newlib/libc/machine/riscv/Makefile.inc b/newlib/libc/machine/riscv/Makefile.inc index 334d4351b..db572be82 100644 --- a/newlib/libc/machine/riscv/Makefile.inc +++ b/newlib/libc/machine/riscv/Makefile.inc @@ -32,6 +32,8 @@ libc_a_SOURCES += \ %D%/strlen.c \ %D%/strncmp-asm.S \ %D%/strncmp.c \ + %D%/strncpy-asm.S \ + %D%/strncpy.c \ %D%/strnlen-asm.S \ %D%/strnlen.c \ %D%/strrchr-asm.S \ diff --git a/newlib/libc/machine/riscv/strncpy-asm.S b/newlib/libc/machine/riscv/strncpy-asm.S new file mode 100644 index 000000000..00232fcfd --- /dev/null +++ b/newlib/libc/machine/riscv/strncpy-asm.S @@ -0,0 +1,42 @@ +#include + +#if defined(__riscv_vector) && !defined(__OPTIMIZE_SIZE__) && !defined(PREFER_SIZE_OVER_SPEED) +/* char *strncpy(char *a0, const char *a1, size_t a2) + Copy at most a2 bytes; if a NUL is met in src, the rest of dest is + zero-filled. Source is read with vle8ff (page-boundary safe) and vl is + also capped by the remaining count so we never read past byte a2. */ +ENTRY(strncpy) + mv a3, a0 /* keep a running destination pointer */ + beqz a2, .Ldone +.Lloop: + vsetvli zero, a2, e8, m1, ta, ma + vle8ff.v v8, (a1) + vmseq.vi v1, v8, 0 /* NUL mask */ + csrr a4, vl /* actual count (may be truncated by fault) */ + vfirst.m a5, v1 + bgez a5, .Lnul + /* no NUL: copy whole chunk */ + vse8.v v8, (a3) + add a1, a1, a4 + add a3, a3, a4 + sub a2, a2, a4 + bnez a2, .Lloop + j .Ldone +.Lnul: + /* NUL at index a5: copy the [0,a5) prefix, then zero-fill the rest */ + vmsbf.m v0, v1 /* mask = elements before first NUL */ + vse8.v v8, (a3), v0.t + add a3, a3, a5 + sub a2, a2, a5 /* remaining bytes to zero (>=1) */ +.Lfill: + beqz a2, .Ldone + vsetvli a4, a2, e8, m8, ta, ma + vmv.v.i v8, 0 + vse8.v v8, (a3) + add a3, a3, a4 + sub a2, a2, a4 + bnez a2, .Lfill +.Ldone: + ret +END(strncpy) +#endif diff --git a/newlib/libc/machine/riscv/strncpy.c b/newlib/libc/machine/riscv/strncpy.c new file mode 100644 index 000000000..54ded52cb --- /dev/null +++ b/newlib/libc/machine/riscv/strncpy.c @@ -0,0 +1,5 @@ +#if defined(__OPTIMIZE_SIZE__) || defined(PREFER_SIZE_OVER_SPEED) || !defined(__riscv_vector) +# include "../../string/strncpy.c" +#else +/* strncpy defined in strncpy-asm.S */ +#endif From patchwork Fri Aug 14 02:26:51 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pincheng Wang X-Patchwork-Id: 141366 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id AF20B4BA901E for ; Fri, 14 Aug 2026 02:34:49 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org AF20B4BA901E X-Original-To: newlib@sourceware.org Delivered-To: newlib@sourceware.org Received: from cstnet.cn (smtp81.cstnet.cn [159.226.251.81]) by sourceware.org (Postfix) with ESMTPS id 56BBE4BA23F8 for ; Fri, 14 Aug 2026 02:34:15 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 56BBE4BA23F8 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 56BBE4BA23F8 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=159.226.251.81 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674856; cv=none; b=dnB4sOjU083CSvDJkm3fV3OBuA4zswg1KlngN3usP2dZvJfJ5hf+eFUsR4OA7xeGnjbCJNUpdR3ArKNiLzcIBSDeUMl6rhH+Hr94LWPagq0TG29lVMV6c/ipTmme//Nu3iL+cuHWUabOzRaZkIJ60GHQvaSyDnIvVEaTu4fycLQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674856; c=relaxed/simple; bh=LXHbct5r+rbX8O8e5lTC1ax+FeAMLloLBq9aHObinio=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=JoNffjZ7jbH2iTCAHqZ+4Ra10BAado4Jf1QzCQKSWMWU/NzQfS71GTlCSOA+TMf2TXXNFHxnE2+5dxRegrCyT+5I3hKIAOzf6AVfZm7Zn3Ck6eBIU8ODotJaxmqepNbn6cpyPhaZIQohOedDsPPH/fu9F9jWZMDfFy8QyYJVpoQ= ARC-Authentication-Results: i=1; sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 56BBE4BA23F8 Received: from ROG.localdomain (unknown [183.134.225.12]) by APP-03 (Coremail) with SMTP id rQCowACnsT_xfH5qsxNIBQ--.31342S12; Fri, 14 Aug 2026 10:27:00 +0800 (CST) From: Pincheng Wang To: newlib@sourceware.org Cc: Pincheng Wang Subject: [PATCH v3 10/15] riscv: add vectorized strcat Date: Fri, 14 Aug 2026 10:26:51 +0800 Message-Id: <20260814022656.1071643-11-pincheng.plct@isrc.iscas.ac.cn> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> References: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> MIME-Version: 1.0 X-CM-TRANSID: rQCowACnsT_xfH5qsxNIBQ--.31342S12 X-Coremail-Antispam: 1UD129KBjvJXoWxJF43Kry7uw4kJF15ZFyfCrg_yoW5Xr4UpF 47ua1Sqryxtrs3Aws3Zr18ZF4UtF9Y93W3Grs3uw4Yya95GayrWFsrKa13Zw1xJFyqvr1x u3ZIkryY9wn8X3JanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9G14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26r4j6ryUM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Gr0_Xr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr 1l84ACjcxK6I8E87Iv67AKxVW8JVWxJwA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1U M2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6xIIjx v20xvE14v26r1j6r18McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_Gr1l F7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7MxAIw28IcxkI7VAKI48JMx C20s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_Jr4lx2IqxVCjr7xvwVAF wI0_JrI_JrWlx4CE17CEb7AF67AKxVWUXVWUAwCIc40Y0x0EwIxGrwCI42IY6xIIjxv20x vE14v26r4j6ryUMIIF0xvE2Ix0cI8IcVCY1x0267AKxVW8JVWxJwCI42IY6xAIw20EY4v2 0xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY1x0267AKxV W8JVW8JrUvcSsGvfC2KfnxnUUI43ZEXa7VUjeHq7UUUUU== X-Originating-IP: [183.134.225.12] X-CM-SenderInfo: pslquxhhqjh1xofwqxxvufhxpvfd2hldfou0/ X-Spam-Status: No, score=-12.2 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_PBL, SPF_HELO_PASS, SPF_PASS, TXREP shortcircuit=no 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: newlib@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Newlib mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: newlib-bounces~patchwork=sourceware.org@sourceware.org The vector implementation locates the end of the destination and appends the source in vector-length chunks using fault-only-first loads (vle8ff.v), so neither string is ever read across an unmapped page. This provides significant performance improvements on RVV-capable hardware. Use conditional compilation to fall back to the generic implementation when __riscv_vector is not available, maintaining compatibility with non-vector RISC-V systems. Signed-off-by: Pincheng Wang --- newlib/libc/machine/riscv/Makefile.inc | 2 ++ newlib/libc/machine/riscv/strcat-asm.S | 36 ++++++++++++++++++++++++++ newlib/libc/machine/riscv/strcat.c | 5 ++++ 3 files changed, 43 insertions(+) create mode 100644 newlib/libc/machine/riscv/strcat-asm.S create mode 100644 newlib/libc/machine/riscv/strcat.c diff --git a/newlib/libc/machine/riscv/Makefile.inc b/newlib/libc/machine/riscv/Makefile.inc index db572be82..b8f4d2f9c 100644 --- a/newlib/libc/machine/riscv/Makefile.inc +++ b/newlib/libc/machine/riscv/Makefile.inc @@ -20,6 +20,8 @@ libc_a_SOURCES += \ %D%/memset.S \ %D%/setjmp.S \ %D%/stpcpy.c \ + %D%/strcat-asm.S \ + %D%/strcat.c \ %D%/strchr-asm.S \ %D%/strchr.c \ %D%/strchrnul-asm.S \ diff --git a/newlib/libc/machine/riscv/strcat-asm.S b/newlib/libc/machine/riscv/strcat-asm.S new file mode 100644 index 000000000..edce2f67d --- /dev/null +++ b/newlib/libc/machine/riscv/strcat-asm.S @@ -0,0 +1,36 @@ +#include + +#if defined(__riscv_vector) && !defined(__OPTIMIZE_SIZE__) && !defined(PREFER_SIZE_OVER_SPEED) +ENTRY(strcat) + mv a2, a0 + /* Perform `strlen(a0)`. */ +.Lstrlen_loop: + vsetvli a3, zero, e8, m1, ta, ma + + vle8ff.v v8, (a2) + vmseq.vx v0, v8, zero + csrr a4, vl + vfirst.m a5, v0 + add a2, a2, a4 + bltz a5, .Lstrlen_loop + + sub a2, a2, a4 + add a2, a2, a5 + + /* Perform `strcpy(a0 + strlen(a0), a1)`. */ +.Lstrcpy_loop: + vsetvli a3, zero, e8, m1, ta, ma + + vle8ff.v v8, (a1) + vmseq.vx v1, v8, zero + csrr a4, vl + vfirst.m a5, v1 + vmsif.m v0, v1 + add a1, a1, a4 + vse8.v v8, (a2), v0.t + add a2, a2, a4 + bltz a5, .Lstrcpy_loop + + ret +END(strcat) +#endif diff --git a/newlib/libc/machine/riscv/strcat.c b/newlib/libc/machine/riscv/strcat.c new file mode 100644 index 000000000..e4daff495 --- /dev/null +++ b/newlib/libc/machine/riscv/strcat.c @@ -0,0 +1,5 @@ +#if defined(__OPTIMIZE_SIZE__) || defined(PREFER_SIZE_OVER_SPEED) || !defined(__riscv_vector) +# include "../../string/strcat.c" +#else +/* strcat defined in strcat-asm.S */ +#endif From patchwork Fri Aug 14 02:26:52 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pincheng Wang X-Patchwork-Id: 141358 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 1769E4BA79A0 for ; Fri, 14 Aug 2026 02:29:04 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 1769E4BA79A0 X-Original-To: newlib@sourceware.org Delivered-To: newlib@sourceware.org Received: from cstnet.cn (smtp81.cstnet.cn [159.226.251.81]) by sourceware.org (Postfix) with ESMTPS id 0017A4BA79A2 for ; Fri, 14 Aug 2026 02:27:05 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 0017A4BA79A2 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 0017A4BA79A2 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=159.226.251.81 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674426; cv=none; b=hfJwxofCvoDILFJnEnYVhjyHD9sODGHFR0P44wcia9uwDmQwBT+kZKn6XwI1NgrnGS2YG4m5cyIe7PEE+q+fj9loAIA2r4DyLTXieahlYsX1RdV4DkbHE2sfWRwzoJe1t6gVgdu5ER5ytXbo2RCnPL4ra0FuxLllWR+XUy81zqY= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674426; c=relaxed/simple; bh=/Q8N8DB4O2Vip+OEkyTQvXcupn+NJbBKfJKR1SRFGJc=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=ul3IkUE23ZTdBEQHNMuMis3GVqakdR5sJGpihi1AqZLhb59n81p/bfsABCxytoLmt4r7NbziTze+b+qHPUdwLpFosx7qglI4+a90j+oIf902vzibejs5MBxf2pKU9cN23MHPPLdlVAza+k4zL7oSV1ig++wCa0bLsZJg7MIafZU= ARC-Authentication-Results: i=1; sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0017A4BA79A2 Received: from ROG.localdomain (unknown [183.134.225.12]) by APP-03 (Coremail) with SMTP id rQCowACnsT_xfH5qsxNIBQ--.31342S13; Fri, 14 Aug 2026 10:27:01 +0800 (CST) From: Pincheng Wang To: newlib@sourceware.org Cc: Pincheng Wang Subject: [PATCH v3 11/15] riscv: add vectorized strncat Date: Fri, 14 Aug 2026 10:26:52 +0800 Message-Id: <20260814022656.1071643-12-pincheng.plct@isrc.iscas.ac.cn> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> References: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> MIME-Version: 1.0 X-CM-TRANSID: rQCowACnsT_xfH5qsxNIBQ--.31342S13 X-Coremail-Antispam: 1UD129KBjvJXoWxJF4xWrW3AFWkJw17XrW3trb_yoW5Ar13pF 47Wa15tF1xJr1fArs7Zr18uFsxta9akF13GFWrZa1Yv3ykGFZ5Wrs8tr43tw4xJr9Fvr17 u3ZFkr1Y9r1UXaUanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9G14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Gr0_Xr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr 1l84ACjcxK6I8E87Iv67AKxVW8JVWxJwA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1U M2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6xIIjx v20xvE14v26r1j6r18McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_Gr1l F7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7MxAIw28IcxkI7VAKI48JMx C20s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_Jr4lx2IqxVCjr7xvwVAF wI0_JrI_JrWlx4CE17CEb7AF67AKxVWUXVWUAwCIc40Y0x0EwIxGrwCI42IY6xIIjxv20x vE14v26r4j6ryUMIIF0xvE2Ix0cI8IcVCY1x0267AKxVW8JVWxJwCI42IY6xAIw20EY4v2 0xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY1x0267AKxV W8JVW8JrUvcSsGvfC2KfnxnUUI43ZEXa7VUbmZX7UUUUU== X-Originating-IP: [183.134.225.12] X-CM-SenderInfo: pslquxhhqjh1xofwqxxvufhxpvfd2hldfou0/ X-Spam-Status: No, score=-12.1 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_PBL, SPF_HELO_PASS, SPF_PASS, TXREP shortcircuit=no 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: newlib@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Newlib mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: newlib-bounces~patchwork=sourceware.org@sourceware.org The vector implementation locates the end of the destination and appends at most n bytes of the source in vector-length chunks using fault-only-first loads (vle8ff.v); vl is capped by the remaining count so the source is never read across an unmapped page, and the result is always NUL-terminated. This provides significant performance improvements on RVV-capable hardware. Use conditional compilation to fall back to the generic implementation when __riscv_vector is not available, maintaining compatibility with non-vector RISC-V systems. Signed-off-by: Pincheng Wang --- newlib/libc/machine/riscv/Makefile.inc | 2 ++ newlib/libc/machine/riscv/strncat-asm.S | 43 +++++++++++++++++++++++++ newlib/libc/machine/riscv/strncat.c | 5 +++ 3 files changed, 50 insertions(+) create mode 100644 newlib/libc/machine/riscv/strncat-asm.S create mode 100644 newlib/libc/machine/riscv/strncat.c diff --git a/newlib/libc/machine/riscv/Makefile.inc b/newlib/libc/machine/riscv/Makefile.inc index b8f4d2f9c..fae228e43 100644 --- a/newlib/libc/machine/riscv/Makefile.inc +++ b/newlib/libc/machine/riscv/Makefile.inc @@ -32,6 +32,8 @@ libc_a_SOURCES += \ %D%/strcpy.c \ %D%/strlen-asm.S \ %D%/strlen.c \ + %D%/strncat-asm.S \ + %D%/strncat.c \ %D%/strncmp-asm.S \ %D%/strncmp.c \ %D%/strncpy-asm.S \ diff --git a/newlib/libc/machine/riscv/strncat-asm.S b/newlib/libc/machine/riscv/strncat-asm.S new file mode 100644 index 000000000..426a0674d --- /dev/null +++ b/newlib/libc/machine/riscv/strncat-asm.S @@ -0,0 +1,43 @@ +#include + +#if defined(__riscv_vector) && !defined(__OPTIMIZE_SIZE__) && !defined(PREFER_SIZE_OVER_SPEED) +ENTRY(strncat) + mv a3, a0 + /* the strlen of a0. */ +.Lstrlen_loop: + vsetvli a4, zero, e8, m1, ta, ma + + vle8ff.v v8, (a3) + /* find the '\0'. */ + vmseq.vx v0, v8, zero + csrr a4, vl + vfirst.m a5, v0 + add a3, a3, a4 + bltz a5, .Lstrlen_loop + + sub a3, a3, a4 + add a3, a3, a5 + + /* copy at most a2 bytes of a1 to a3. */ +.Lstrcpy_loop: + vsetvli zero, a2, e8, m1, ta, ma + + vle8ff.v v8, (a1) + vmseq.vx v1, v8, zero + csrr a4, vl + vfirst.m a5, v1 + vmsif.m v0, v1 + add a1, a1, a4 + sub a2, a2, a4 + vse8.v v8, (a3), v0.t + add a3, a3, a4 + beqz a2, .Lfill_zero + bltz a5, .Lstrcpy_loop + ret +.Lfill_zero: + bgez a5, .Lfill_zero_end + sb zero, (a3) +.Lfill_zero_end: + ret +END(strncat) +#endif diff --git a/newlib/libc/machine/riscv/strncat.c b/newlib/libc/machine/riscv/strncat.c new file mode 100644 index 000000000..097d9157d --- /dev/null +++ b/newlib/libc/machine/riscv/strncat.c @@ -0,0 +1,5 @@ +#if defined(__OPTIMIZE_SIZE__) || defined(PREFER_SIZE_OVER_SPEED) || !defined(__riscv_vector) +# include "../../string/strncat.c" +#else +/* strncat defined in strncat-asm.S */ +#endif From patchwork Fri Aug 14 02:26:53 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pincheng Wang X-Patchwork-Id: 141353 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 8C02F4BA9011 for ; Fri, 14 Aug 2026 02:27:41 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 8C02F4BA9011 X-Original-To: newlib@sourceware.org Delivered-To: newlib@sourceware.org Received: from cstnet.cn (smtp81.cstnet.cn [159.226.251.81]) by sourceware.org (Postfix) with ESMTPS id 67C674BA798B for ; Fri, 14 Aug 2026 02:27:04 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 67C674BA798B 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 67C674BA798B Authentication-Results: sourceware.org; arc=none smtp.remote-ip=159.226.251.81 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674425; cv=none; b=uvTdG2zQU4cC+D87tfhVY9ZM0toJhsP+eRsirvTS5IReaGuXlPSjPvSHzPCsLQwwg6wrUvSCHfXS5VceIbw0rh9bmZPlo4E+7Z6WZsXDJ+KTjj7H3HbV1O0nh8I3v9Ke24RaAUxowMcuJ6jipxb2wniyHfO5ZkONCv9NBSqewKU= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674425; c=relaxed/simple; bh=WJdQDX3II6l+ewAGrXy3lIM5re+K0gd7vaF8/hGk0j0=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=UBJOjAuZP3uwyrcSWt0HHUhtQBmH3Mj/bj/R0WSQHpDtflqk5gVakOrJxcBM+M/ol4RI4EBACZRucoIe9LjcA8tnF7rwUJboJYQA+I3pu74+yNXoAuX8rMVNvvkFWLRAenB2fvXSS24GysftAssJ9bLX79GvPhFQd/W3UuhPpyA= ARC-Authentication-Results: i=1; sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 67C674BA798B Received: from ROG.localdomain (unknown [183.134.225.12]) by APP-03 (Coremail) with SMTP id rQCowACnsT_xfH5qsxNIBQ--.31342S14; Fri, 14 Aug 2026 10:27:01 +0800 (CST) From: Pincheng Wang To: newlib@sourceware.org Cc: Pincheng Wang Subject: [PATCH v3 12/15] riscv: add vectorized strspn Date: Fri, 14 Aug 2026 10:26:53 +0800 Message-Id: <20260814022656.1071643-13-pincheng.plct@isrc.iscas.ac.cn> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> References: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> MIME-Version: 1.0 X-CM-TRANSID: rQCowACnsT_xfH5qsxNIBQ--.31342S14 X-Coremail-Antispam: 1UD129KBjvJXoWxAF4rKF13KFyxGF4DKrW5Awb_yoW5uryUpF 4SkF4rtrn3Jrn3Cws3XF10vFW5Jas0g3W5GFWfAws0v3ykWw4rWFsxta13A3Waqryv9F12 93Wjgr1Y9wn8Xw7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9G14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Gr0_Xr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr 1l84ACjcxK6I8E87Iv67AKxVW8JVWxJwA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1U M2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6xIIjx v20xvE14v26r1j6r18McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_Gr1l F7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7MxAIw28IcxkI7VAKI48JMx C20s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_Jr4lx2IqxVCjr7xvwVAF wI0_JrI_JrWlx4CE17CEb7AF67AKxVWUXVWUAwCIc40Y0x0EwIxGrwCI42IY6xIIjxv20x vE14v26r4j6ryUMIIF0xvE2Ix0cI8IcVCY1x0267AKxVW8JVWxJwCI42IY6xAIw20EY4v2 0xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY1x0267AKxV W8JVW8JrUvcSsGvfC2KfnxnUUI43ZEXa7VUbmZX7UUUUU== X-Originating-IP: [183.134.225.12] X-CM-SenderInfo: pslquxhhqjh1xofwqxxvufhxpvfd2hldfou0/ X-Spam-Status: No, score=-12.1 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_PBL, SPF_HELO_PASS, SPF_PASS, TXREP shortcircuit=no 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: newlib@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Newlib mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: newlib-bounces~patchwork=sourceware.org@sourceware.org The vector implementation builds a 256-byte accept table on the stack and scans the string in vector-length chunks using fault-only-first loads (vle8ff.v) with an indexed gather into the table, so the scan never crosses into an unmapped page and the gather only touches the fully-mapped table. This provides significant performance improvements on RVV-capable hardware. Use conditional compilation to fall back to the generic implementation when __riscv_vector is not available, maintaining compatibility with non-vector RISC-V systems. Signed-off-by: Pincheng Wang --- newlib/libc/machine/riscv/Makefile.inc | 4 ++- newlib/libc/machine/riscv/strspn-asm.S | 47 ++++++++++++++++++++++++++ newlib/libc/machine/riscv/strspn.c | 5 +++ 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 newlib/libc/machine/riscv/strspn-asm.S create mode 100644 newlib/libc/machine/riscv/strspn.c diff --git a/newlib/libc/machine/riscv/Makefile.inc b/newlib/libc/machine/riscv/Makefile.inc index fae228e43..55f137a3c 100644 --- a/newlib/libc/machine/riscv/Makefile.inc +++ b/newlib/libc/machine/riscv/Makefile.inc @@ -41,4 +41,6 @@ libc_a_SOURCES += \ %D%/strnlen-asm.S \ %D%/strnlen.c \ %D%/strrchr-asm.S \ - %D%/strrchr.c + %D%/strrchr.c \ + %D%/strspn-asm.S \ + %D%/strspn.c diff --git a/newlib/libc/machine/riscv/strspn-asm.S b/newlib/libc/machine/riscv/strspn-asm.S new file mode 100644 index 000000000..03f3a6b25 --- /dev/null +++ b/newlib/libc/machine/riscv/strspn-asm.S @@ -0,0 +1,47 @@ +#include + +#if defined(__riscv_vector) && !defined(__riscv_e) && !defined(__OPTIMIZE_SIZE__) && !defined(PREFER_SIZE_OVER_SPEED) +/* size_t strspn(const char *a0, const char *a1) + Length of the initial segment of a0 made up entirely of bytes in a1. + Build a 256-byte "accept" table from a1 (NUL is never marked, since a1 is + a string), then scan a0 and stop at the first byte not in the set; a NUL + in a0 stops the scan naturally. The scan uses vle8ff (page-boundary safe); + the gather only touches the fully-mapped 256-byte table. */ +ENTRY(strspn) + addi sp, sp, -256 + li t1, 256 + mv t0, sp +.Lzero: + vsetvli t2, t1, e8, m8, ta, ma + vmv.v.i v8, 0 + vse8.v v8, (t0) + add t0, t0, t2 + sub t1, t1, t2 + bnez t1, .Lzero + li t1, 1 +.Lbuild: + lbu t0, 0(a1) + beqz t0, .Lscan + add t2, sp, t0 + sb t1, 0(t2) + addi a1, a1, 1 + j .Lbuild +.Lscan: + mv a2, a0 +.Lloop: + vsetvli t3, zero, e8, m1, ta, ma + vle8ff.v v8, (a0) + csrr t3, vl + vluxei8.v v16, (sp), v8 /* gather accept[a0[i]] */ + vmseq.vi v0, v16, 0 /* lanes NOT in the accept set */ + vfirst.m t4, v0 + bgez t4, .Lfound + add a0, a0, t3 + j .Lloop +.Lfound: + add a0, a0, t4 + sub a0, a0, a2 + addi sp, sp, 256 + ret +END(strspn) +#endif diff --git a/newlib/libc/machine/riscv/strspn.c b/newlib/libc/machine/riscv/strspn.c new file mode 100644 index 000000000..8d9d3fba9 --- /dev/null +++ b/newlib/libc/machine/riscv/strspn.c @@ -0,0 +1,5 @@ +#if defined(__OPTIMIZE_SIZE__) || defined(PREFER_SIZE_OVER_SPEED) || !defined(__riscv_vector) || defined(__riscv_e) +# include "../../string/strspn.c" +#else +/* strspn defined in strspn-asm.S */ +#endif From patchwork Fri Aug 14 02:26:54 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pincheng Wang X-Patchwork-Id: 141365 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B2BDD4BA798F for ; Fri, 14 Aug 2026 02:34:31 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B2BDD4BA798F X-Original-To: newlib@sourceware.org Delivered-To: newlib@sourceware.org Received: from cstnet.cn (smtp81.cstnet.cn [159.226.251.81]) by sourceware.org (Postfix) with ESMTPS id 4784C4BA79AF for ; Fri, 14 Aug 2026 02:34:15 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4784C4BA79AF 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 4784C4BA79AF Authentication-Results: sourceware.org; arc=none smtp.remote-ip=159.226.251.81 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674856; cv=none; b=HjjO2cvzJkvphlif67xbK54wV/2gXFd8DmW2AOsIs91I80lqR4MuRkH6vC8hqE9Vg5s5dgfB9QdAsj+PzJ6LbpgC6npqfBwt0kuBNeeECwhDRwRcAHi32Q4dgk5KNltZJfRi7a0FxLtypf13vXEfIee8k/oxyXFnsXwWE36Wbfg= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674856; c=relaxed/simple; bh=u/l6Y1lBQsp87zzVVWWGN1ivSB0VszSZXU3pUykr1Zk=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=i+ZuA9ioIapYAawb8l+wVAX4xe0BZBap5sH793cNkA4SNpWT26eV0ApUWTQwZyvGDtVxkEZ5xq2h+69yqbu3lYlRCZPFn2S3QGplueMCnUadFX2lAPMtEiYaTLi7R2w2V4hXBXhlTR61cl1sGNGxnt9bHkNk3wl+WkTp9ulozMU= ARC-Authentication-Results: i=1; sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4784C4BA79AF Received: from ROG.localdomain (unknown [183.134.225.12]) by APP-03 (Coremail) with SMTP id rQCowACnsT_xfH5qsxNIBQ--.31342S15; Fri, 14 Aug 2026 10:27:01 +0800 (CST) From: Pincheng Wang To: newlib@sourceware.org Cc: Pincheng Wang Subject: [PATCH v3 13/15] riscv: add vectorized strcspn Date: Fri, 14 Aug 2026 10:26:54 +0800 Message-Id: <20260814022656.1071643-14-pincheng.plct@isrc.iscas.ac.cn> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> References: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> MIME-Version: 1.0 X-CM-TRANSID: rQCowACnsT_xfH5qsxNIBQ--.31342S15 X-Coremail-Antispam: 1UD129KBjvJXoWxXr1DGr4fKF4fZw1UAw43ZFb_yoW5tF4xpF srKanIyr1fJrn3CrZ7W3W0vFW5J3s09r13GFWxZa1jy3ykG345WFs8tr43A3WxXFyvvFn7 u3Wjkr1Y9w1DXw7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9G14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Gr0_Xr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr 1l84ACjcxK6I8E87Iv67AKxVW8JVWxJwA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1U M2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6xIIjx v20xvE14v26r1j6r18McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_Gr1l F7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7MxAIw28IcxkI7VAKI48JMx C20s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_Jr4lx2IqxVCjr7xvwVAF wI0_JrI_JrWlx4CE17CEb7AF67AKxVWUXVWUAwCIc40Y0x0EwIxGrwCI42IY6xIIjxv20x vE14v26r4j6ryUMIIF0xvE2Ix0cI8IcVCY1x0267AKxVW8JVWxJwCI42IY6xAIw20EY4v2 0xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY1x0267AKxV W8JVW8JrUvcSsGvfC2KfnxnUUI43ZEXa7VUbmZX7UUUUU== X-Originating-IP: [183.134.225.12] X-CM-SenderInfo: pslquxhhqjh1xofwqxxvufhxpvfd2hldfou0/ X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_PBL, SPF_HELO_PASS, SPF_PASS, TXREP shortcircuit=no 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: newlib@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Newlib mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: newlib-bounces~patchwork=sourceware.org@sourceware.org The vector implementation builds a 256-byte stop table on the stack (the reject bytes plus NUL) and scans the string in vector-length chunks using fault-only-first loads (vle8ff.v) with an indexed gather into the table, so the scan never crosses into an unmapped page and the gather only touches the fully-mapped table. This provides significant performance improvements on RVV-capable hardware. Use conditional compilation to fall back to the generic implementation when __riscv_vector is not available, maintaining compatibility with non-vector RISC-V systems. Signed-off-by: Pincheng Wang --- newlib/libc/machine/riscv/Makefile.inc | 2 + newlib/libc/machine/riscv/strcspn-asm.S | 51 +++++++++++++++++++++++++ newlib/libc/machine/riscv/strcspn.c | 5 +++ 3 files changed, 58 insertions(+) create mode 100644 newlib/libc/machine/riscv/strcspn-asm.S create mode 100644 newlib/libc/machine/riscv/strcspn.c diff --git a/newlib/libc/machine/riscv/Makefile.inc b/newlib/libc/machine/riscv/Makefile.inc index 55f137a3c..1e35cf17d 100644 --- a/newlib/libc/machine/riscv/Makefile.inc +++ b/newlib/libc/machine/riscv/Makefile.inc @@ -30,6 +30,8 @@ libc_a_SOURCES += \ %D%/strcmp.S \ %D%/strcpy-asm.S \ %D%/strcpy.c \ + %D%/strcspn-asm.S \ + %D%/strcspn.c \ %D%/strlen-asm.S \ %D%/strlen.c \ %D%/strncat-asm.S \ diff --git a/newlib/libc/machine/riscv/strcspn-asm.S b/newlib/libc/machine/riscv/strcspn-asm.S new file mode 100644 index 000000000..106b46e43 --- /dev/null +++ b/newlib/libc/machine/riscv/strcspn-asm.S @@ -0,0 +1,51 @@ +#include + +#if defined(__riscv_vector) && !defined(__riscv_e) && !defined(__OPTIMIZE_SIZE__) && !defined(PREFER_SIZE_OVER_SPEED) +/* size_t strcspn(const char *a0, const char *a1) + Length of the initial segment of a0 made up of bytes NOT in a1. + Build a 256-byte "stop" table on the stack (a1's bytes plus NUL marked), + then scan a0: a gathered table entry != 0 ends the segment. The scan of + a0 uses vle8ff so it never loads across a page boundary; the indexed + gather only touches the fully-mapped 256-byte table. */ +ENTRY(strcspn) + addi sp, sp, -256 + /* zero the table */ + li t1, 256 + mv t0, sp +.Lzero: + vsetvli t2, t1, e8, m8, ta, ma + vmv.v.i v8, 0 + vse8.v v8, (t0) + add t0, t0, t2 + sub t1, t1, t2 + bnez t1, .Lzero + /* mark NUL as a stopper so the scan halts at end of string */ + li t1, 1 + sb t1, 0(sp) + /* mark every byte of a1 */ +.Lbuild: + lbu t0, 0(a1) + beqz t0, .Lscan + add t2, sp, t0 + sb t1, 0(t2) + addi a1, a1, 1 + j .Lbuild +.Lscan: + mv a2, a0 /* remember start */ +.Lloop: + vsetvli t3, zero, e8, m1, ta, ma + vle8ff.v v8, (a0) + csrr t3, vl + vluxei8.v v16, (sp), v8 /* gather table[a0[i]] */ + vmsne.vi v0, v16, 0 /* lanes that are stoppers */ + vfirst.m t4, v0 + bgez t4, .Lfound + add a0, a0, t3 + j .Lloop +.Lfound: + add a0, a0, t4 + sub a0, a0, a2 + addi sp, sp, 256 + ret +END(strcspn) +#endif diff --git a/newlib/libc/machine/riscv/strcspn.c b/newlib/libc/machine/riscv/strcspn.c new file mode 100644 index 000000000..eb3acf829 --- /dev/null +++ b/newlib/libc/machine/riscv/strcspn.c @@ -0,0 +1,5 @@ +#if defined(__OPTIMIZE_SIZE__) || defined(PREFER_SIZE_OVER_SPEED) || !defined(__riscv_vector) || defined(__riscv_e) +# include "../../string/strcspn.c" +#else +/* strcspn defined in strcspn-asm.S */ +#endif From patchwork Fri Aug 14 02:26:55 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pincheng Wang X-Patchwork-Id: 141359 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 57F734B9DB48 for ; Fri, 14 Aug 2026 02:29:04 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 57F734B9DB48 X-Original-To: newlib@sourceware.org Delivered-To: newlib@sourceware.org Received: from cstnet.cn (smtp81.cstnet.cn [159.226.251.81]) by sourceware.org (Postfix) with ESMTPS id 9E9DF4BA798F for ; Fri, 14 Aug 2026 02:27:04 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 9E9DF4BA798F 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 9E9DF4BA798F Authentication-Results: sourceware.org; arc=none smtp.remote-ip=159.226.251.81 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674425; cv=none; b=nLQ5LPSFoStdLIJI85qzG52YZWRQo0/txi2+BBGEYpravAoFlghdwEdeMeeGXSGfc4LNcfxaZPyP257DjKL8olc35dBO0mTz7uXF9JDLUEG8X0OIIXdE5PPvXj6VG/B1F8vOp3L9kqYLeXfBJe3gPNqRV7ltnZjXGfhaUNAVSG8= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674425; c=relaxed/simple; bh=Qm4kgGUnnG2DwIeSiQQmDAst9WXfhcZNNYRuTymzfL8=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=qB2U82AsG7x9XMTjE4+wt8R9T5FkIdOwU6oVBEsb0TOVwn85Fk1P6wPcaPLIAitdbuQDJlNoACvM/Al1s/ANfTFm8xbTktyR6/k5m2NrSD+tBeP3ZP0gGxLAvNLKxFy+dyhPhBZZRPwiuOCOD1keKUAIVKwycNk7FSTp1ZPUwS0= ARC-Authentication-Results: i=1; sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 9E9DF4BA798F Received: from ROG.localdomain (unknown [183.134.225.12]) by APP-03 (Coremail) with SMTP id rQCowACnsT_xfH5qsxNIBQ--.31342S16; Fri, 14 Aug 2026 10:27:01 +0800 (CST) From: Pincheng Wang To: newlib@sourceware.org Cc: Pincheng Wang Subject: [PATCH v3 14/15] riscv: add vectorized strpbrk Date: Fri, 14 Aug 2026 10:26:55 +0800 Message-Id: <20260814022656.1071643-15-pincheng.plct@isrc.iscas.ac.cn> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> References: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> MIME-Version: 1.0 X-CM-TRANSID: rQCowACnsT_xfH5qsxNIBQ--.31342S16 X-Coremail-Antispam: 1UD129KBjvJXoWxGF45AryDWFWkJFyDAw1fZwb_yoW5uw4UpF sIkF4rKr1xJrs3GrZ2q3W0vF4UJF98uF13GrW8Zw4YyF4kG3y5Wrs8tw4Yy3WfJrZIvF47 ua1vkr1Y9w15Xw7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9G14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Gr0_Xr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr 1l84ACjcxK6I8E87Iv67AKxVW8JVWxJwA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1U M2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6xIIjx v20xvE14v26r1j6r18McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_Gr1l F7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7MxAIw28IcxkI7VAKI48JMx C20s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_Jr4lx2IqxVCjr7xvwVAF wI0_JrI_JrWlx4CE17CEb7AF67AKxVWUXVWUAwCIc40Y0x0EwIxGrwCI42IY6xIIjxv20x vE14v26r4j6ryUMIIF0xvE2Ix0cI8IcVCY1x0267AKxVW8JVWxJwCI42IY6xAIw20EY4v2 0xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY1x0267AKxV W8JVW8JrUvcSsGvfC2KfnxnUUI43ZEXa7VUbmZX7UUUUU== X-Originating-IP: [183.134.225.12] X-CM-SenderInfo: pslquxhhqjh1xofwqxxvufhxpvfd2hldfou0/ X-Spam-Status: No, score=-12.2 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_PBL, SPF_HELO_PASS, SPF_PASS, TXREP shortcircuit=no 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: newlib@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Newlib mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: newlib-bounces~patchwork=sourceware.org@sourceware.org The vector implementation builds a 256-byte set table on the stack and scans the string in vector-length chunks using fault-only-first loads (vle8ff.v) with an indexed gather into the table, returning a pointer to the first byte in the set or NULL, without ever crossing into an unmapped page. This provides significant performance improvements on RVV-capable hardware. Use conditional compilation to fall back to the generic implementation when __riscv_vector is not available, maintaining compatibility with non-vector RISC-V systems. Signed-off-by: Pincheng Wang --- newlib/libc/machine/riscv/Makefile.inc | 2 + newlib/libc/machine/riscv/strpbrk-asm.S | 51 +++++++++++++++++++++++++ newlib/libc/machine/riscv/strpbrk.c | 5 +++ 3 files changed, 58 insertions(+) create mode 100644 newlib/libc/machine/riscv/strpbrk-asm.S create mode 100644 newlib/libc/machine/riscv/strpbrk.c diff --git a/newlib/libc/machine/riscv/Makefile.inc b/newlib/libc/machine/riscv/Makefile.inc index 1e35cf17d..d145a3024 100644 --- a/newlib/libc/machine/riscv/Makefile.inc +++ b/newlib/libc/machine/riscv/Makefile.inc @@ -42,6 +42,8 @@ libc_a_SOURCES += \ %D%/strncpy.c \ %D%/strnlen-asm.S \ %D%/strnlen.c \ + %D%/strpbrk-asm.S \ + %D%/strpbrk.c \ %D%/strrchr-asm.S \ %D%/strrchr.c \ %D%/strspn-asm.S \ diff --git a/newlib/libc/machine/riscv/strpbrk-asm.S b/newlib/libc/machine/riscv/strpbrk-asm.S new file mode 100644 index 000000000..b8584fb25 --- /dev/null +++ b/newlib/libc/machine/riscv/strpbrk-asm.S @@ -0,0 +1,51 @@ +#include + +#if defined(__riscv_vector) && !defined(__riscv_e) && !defined(__OPTIMIZE_SIZE__) && !defined(PREFER_SIZE_OVER_SPEED) +/* char *strpbrk(const char *a0, const char *a1) + Return a pointer to the first byte of a0 that appears in a1, or NULL. + Equivalent to s + strcspn(s, b), returning NULL when that lands on the + terminating NUL. Same page-safe vle8ff scan + stack-table gather as + strcspn; the NUL is marked as a stopper so the scan terminates. */ +ENTRY(strpbrk) + addi sp, sp, -256 + li t1, 256 + mv t0, sp +.Lzero: + vsetvli t2, t1, e8, m8, ta, ma + vmv.v.i v8, 0 + vse8.v v8, (t0) + add t0, t0, t2 + sub t1, t1, t2 + bnez t1, .Lzero + li t1, 1 + /* mark every byte of a1 (the set), but NOT NUL yet */ +.Lbuild: + lbu t0, 0(a1) + beqz t0, .Lsetnul + add t2, sp, t0 + sb t1, 0(t2) + addi a1, a1, 1 + j .Lbuild +.Lsetnul: + /* mark NUL as a stopper so the scan halts at end of string */ + sb t1, 0(sp) +.Lloop: + vsetvli t3, zero, e8, m1, ta, ma + vle8ff.v v8, (a0) + csrr t3, vl + vluxei8.v v16, (sp), v8 + vmsne.vi v0, v16, 0 + vfirst.m t4, v0 + bgez t4, .Lfound + add a0, a0, t3 + j .Lloop +.Lfound: + add a0, a0, t4 + lbu t5, 0(a0) /* did we stop on a real match or on the NUL? */ + bnez t5, .Ldone + li a0, 0 +.Ldone: + addi sp, sp, 256 + ret +END(strpbrk) +#endif diff --git a/newlib/libc/machine/riscv/strpbrk.c b/newlib/libc/machine/riscv/strpbrk.c new file mode 100644 index 000000000..6664f1404 --- /dev/null +++ b/newlib/libc/machine/riscv/strpbrk.c @@ -0,0 +1,5 @@ +#if defined(__OPTIMIZE_SIZE__) || defined(PREFER_SIZE_OVER_SPEED) || !defined(__riscv_vector) || defined(__riscv_e) +# include "../../string/strpbrk.c" +#else +/* strpbrk defined in strpbrk-asm.S */ +#endif From patchwork Fri Aug 14 02:26:56 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pincheng Wang X-Patchwork-Id: 141357 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 66C904BA79BE for ; Fri, 14 Aug 2026 02:29:03 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 66C904BA79BE X-Original-To: newlib@sourceware.org Delivered-To: newlib@sourceware.org Received: from cstnet.cn (smtp81.cstnet.cn [159.226.251.81]) by sourceware.org (Postfix) with ESMTPS id C90A04BA7990 for ; Fri, 14 Aug 2026 02:27:04 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org C90A04BA7990 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 C90A04BA7990 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=159.226.251.81 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674425; cv=none; b=SuPRGFnZUiart8RLNUWCjiUAyaqjXJA4crX1soN8BAqnNL/m3Oyu7IkDnRrOQGz+muQgwzV+3Pl1WlIf055VFxcWoPoC7LTpJPnffTxFnzsV0epOy5x+CmBzx3np8on+Z2IiKTKGDlaEM5D/3+k8TG2xDrB8BZNGm3Ojf1aBiWI= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1786674425; c=relaxed/simple; bh=zVjfWx8d6YFxzDsA7qHc/fgkP4o8Y3pSLZk0hnYtdiA=; h=From:To:Subject:Date:Message-Id:MIME-Version; b=sP8WPrfgU3Jt69yd30PniGj7TNwdpMFaL0DFLte7TAvxksDrlqBAXlemeRW8g5OIaUjfnC1fvAsCvAlVQx0z9gw0rpRJ+ABOHyEVIscVwVFLmRN5Hvshn7kbmGtqHLApHmSDfq/UShsMEXRS91Om5rUFXF3tsvtkcVoxVJ45+xo= ARC-Authentication-Results: i=1; sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C90A04BA7990 Received: from ROG.localdomain (unknown [183.134.225.12]) by APP-03 (Coremail) with SMTP id rQCowACnsT_xfH5qsxNIBQ--.31342S17; Fri, 14 Aug 2026 10:27:01 +0800 (CST) From: Pincheng Wang To: newlib@sourceware.org Cc: Pincheng Wang Subject: [PATCH v3 15/15] riscv: add vectorized strstr Date: Fri, 14 Aug 2026 10:26:56 +0800 Message-Id: <20260814022656.1071643-16-pincheng.plct@isrc.iscas.ac.cn> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> References: <20260814022656.1071643-1-pincheng.plct@isrc.iscas.ac.cn> MIME-Version: 1.0 X-CM-TRANSID: rQCowACnsT_xfH5qsxNIBQ--.31342S17 X-Coremail-Antispam: 1UD129KBjvJXoWxXw4fWw1rWr45Ar4kKw48JFb_yoWrJFW8pa n8Wayftr4xtrnxKrsIqF1I9a1UJr98C3W5GFWxAw4jyFWkKws5KFsrKw43Z3W3Jr90vF17 uw4DWr1F934UXw7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUU9G14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Gr0_Xr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr 1l84ACjcxK6I8E87Iv67AKxVW8JVWxJwA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1U M2AIxVAIcxkEcVAq07x20xvEncxIr21l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6xIIjx v20xvE14v26r1j6r18McIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_Gr1l F7xvr2IYc2Ij64vIr41lF7I21c0EjII2zVCS5cI20VAGYxC7MxAIw28IcxkI7VAKI48JMx C20s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_Jr4lx2IqxVCjr7xvwVAF wI0_JrI_JrWlx4CE17CEb7AF67AKxVWUXVWUAwCIc40Y0x0EwIxGrwCI42IY6xIIjxv20x vE14v26r4j6ryUMIIF0xvE2Ix0cI8IcVCY1x0267AKxVW8JVWxJwCI42IY6xAIw20EY4v2 0xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY1x0267AKxV W8JVW8JrUvcSsGvfC2KfnxnUUI43ZEXa7VUbmZX7UUUUU== X-Originating-IP: [183.134.225.12] X-CM-SenderInfo: pslquxhhqjh1xofwqxxvufhxpvfd2hldfou0/ X-Spam-Status: No, score=-12.2 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_PBL, SPF_HELO_PASS, SPF_PASS, TXREP shortcircuit=no 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: newlib@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Newlib mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: newlib-bounces~patchwork=sourceware.org@sourceware.org The vector implementation uses a fault-only-first (vle8ff.v) scan to find candidate positions of the needle's first byte, then verifies each candidate with a byte loop that stops at the needle's NUL or at a mismatch; both phases stop at a NUL, so no load ever crosses past the end of either string into an unmapped page. This provides significant performance improvements on RVV-capable hardware. Use conditional compilation to fall back to the generic implementation when __riscv_vector is not available, maintaining compatibility with non-vector RISC-V systems. Signed-off-by: Pincheng Wang --- newlib/libc/machine/riscv/Makefile.inc | 4 +- newlib/libc/machine/riscv/strstr-asm.S | 51 ++++++++++++++++++++++++++ newlib/libc/machine/riscv/strstr.c | 5 +++ 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 newlib/libc/machine/riscv/strstr-asm.S create mode 100644 newlib/libc/machine/riscv/strstr.c diff --git a/newlib/libc/machine/riscv/Makefile.inc b/newlib/libc/machine/riscv/Makefile.inc index d145a3024..c2d918d03 100644 --- a/newlib/libc/machine/riscv/Makefile.inc +++ b/newlib/libc/machine/riscv/Makefile.inc @@ -47,4 +47,6 @@ libc_a_SOURCES += \ %D%/strrchr-asm.S \ %D%/strrchr.c \ %D%/strspn-asm.S \ - %D%/strspn.c + %D%/strspn.c \ + %D%/strstr-asm.S \ + %D%/strstr.c diff --git a/newlib/libc/machine/riscv/strstr-asm.S b/newlib/libc/machine/riscv/strstr-asm.S new file mode 100644 index 000000000..d887458b9 --- /dev/null +++ b/newlib/libc/machine/riscv/strstr-asm.S @@ -0,0 +1,51 @@ +#include + +#if defined(__riscv_vector) && !defined(__riscv_e) && !defined(__OPTIMIZE_SIZE__) && !defined(PREFER_SIZE_OVER_SPEED) +/* char *strstr(const char *a0, const char *a1) + Locate substring a1 in a0. A vectorized scan (vle8ff, page-boundary safe) + finds candidate positions of needle[0]; each candidate is verified with a + byte loop that stops at the needle's NUL (match) or at a mismatch/the + haystack NUL. Both phases stop at a NUL, so no load ever crosses past the + end of either string into an unmapped page. */ +ENTRY(strstr) + lbu t0, 0(a1) /* c0 = needle[0] */ + beqz t0, .Lret_h /* empty needle -> return haystack */ +.Lloop: + vsetvli t1, zero, e8, m1, ta, ma + vle8ff.v v8, (a0) + csrr t1, vl + vmseq.vx v1, v8, t0 /* lanes == c0 */ + vmseq.vi v2, v8, 0 /* NUL lanes */ + vfirst.m t2, v1 + vfirst.m t3, v2 + bltz t2, .Lno_c0 /* no c0 in this chunk */ + bltz t3, .Lcandidate /* c0 present, no NUL -> candidate */ + bltu t2, t3, .Lcandidate /* c0 occurs before NUL */ + /* NUL at or before c0 -> end of haystack reached */ +.Lnotfound: + li a0, 0 + ret +.Lno_c0: + bgez t3, .Lnotfound /* hit NUL with no c0 -> not found */ + add a0, a0, t1 + j .Lloop +.Lcandidate: + add a0, a0, t2 /* a0 -> candidate (h[*]==c0) */ + mv t4, a0 /* haystack cursor */ + mv t5, a1 /* needle cursor */ +.Lverify: + lbu t6, 0(t5) + beqz t6, .Lmatch /* needle exhausted -> match at a0 */ + lbu a2, 0(t4) + bne a2, t6, .Ladvance /* mismatch (a2 may be NUL) */ + addi t4, t4, 1 + addi t5, t5, 1 + j .Lverify +.Ladvance: + addi a0, a0, 1 /* slide one byte and rescan */ + j .Lloop +.Lmatch: +.Lret_h: + ret +END(strstr) +#endif diff --git a/newlib/libc/machine/riscv/strstr.c b/newlib/libc/machine/riscv/strstr.c new file mode 100644 index 000000000..08cdd00a6 --- /dev/null +++ b/newlib/libc/machine/riscv/strstr.c @@ -0,0 +1,5 @@ +#if defined(__OPTIMIZE_SIZE__) || defined(PREFER_SIZE_OVER_SPEED) || !defined(__riscv_vector) || defined(__riscv_e) +# include "../../string/strstr.c" +#else +/* strstr defined in strstr-asm.S */ +#endif