From nobody Thu Apr 2 14:07:34 2026 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1B73637FF6D for ; Fri, 27 Mar 2026 19:57:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774641472; cv=none; b=T9O9nB2kNZyEvvyNOaD2LbmPm5gdZ8Sa/5bbeHS7CxDs0GdFSTUmtUbk/GjVpQsnPkXG8WsBJB3sZ/hkDsXt5gIamBXHsDFFsF1WSctBVMblj72YwWtDSFfUpCMlSILCh8eX9SSEI1IlSwGKTPvtfNoBGxW+sV0mGSvm3QBf3bo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774641472; c=relaxed/simple; bh=034t7nVWCv6jZ+JTjJPIL3VPLxgm3a12RWQlLzUecSc=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=fkqcI+12E+RSNs92omARwtCQdGDaCkSi/b7GFznXJJ4Tui8M6NE/BW6GNmTQT36fz6JqbWl3X1Tcpnge1HpXblBw+9T1/jiZHCgbmGhL0OQdE5/zUyYEfOt9LnRrJJ10o9qEfwJbFO/MS+GAVrqpyIiXLBbNLJ+3yo961W7qqWQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=ifgArlR5; arc=none smtp.client-ip=209.85.128.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="ifgArlR5" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-486fd3a577eso22338625e9.1 for ; Fri, 27 Mar 2026 12:57:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1774641469; x=1775246269; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=loB1uiBsUm6S4VdOr2XVq5kIWP/dKuHnZTvkT6+SSCM=; b=ifgArlR5zCa+C400Q8pTLino6lNpfr+hFNTDM35AEAhzXLKbP2Ekk5nVNnzyQfcc/2 Qqdc414/teH81NCGXGKl9Akr7IjMF5UITmcsgR2SQ5D2KuVnGutK/BPEqi3W14fCFKyb w6NgqZ5u9vzLGFJvCyND1i+TTzFkEjz+o+dijLob+1Wz+RXwiuldE4oGP47oXduXwjeJ AOBr218a6omYRXVGWexEQ0paaQ/57XJJcKh1ojNk+WBYwGPP7/5kX4OsxDfH6lk1YqCX wKRF+H1CqSa7siK6PMe/qFjGaNP07numxD4JPDVfQPe3PGc1mUI4pcrT96n7XcxyAWN8 LRyA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774641469; x=1775246269; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=loB1uiBsUm6S4VdOr2XVq5kIWP/dKuHnZTvkT6+SSCM=; b=qiMno4cbpOtdI8idprMEyeixPNyUQEO46dxwt6wThY8MAv9AC0oaxVYEB0JhfdgLkF bI1W4LIIpVPzjaI7E/gd8CqDHRtg78/PztDO1c9IoRabDnxux2kSdnm8q14/Agxsgw1z ZK+2y8cgBHLBj8j4n8xdTB0eaKC3EsGPzchc9eyw1QuhXMAky8WpqkD+S+G5ulqy9ZxD lITYaEzKHL00/hiRWWrPB5bPEPkV4g5x/aDwsR3vGBljXVAX1kdOp7SO0kCUxOQoWd32 ywzBD/wSj45xhaBN/UsntC8Rb4TGJgf4hWO9Hgsgopi5Cwn1d18aXBQoHfYHMM4GIOIK qKLQ== X-Forwarded-Encrypted: i=1; AJvYcCX8PrrWe7hpvp/q4ToscEm42P/Se6OQcCFhlZ5YJgbc7Fwukf8u5R8CfJdVfnSA2KrVnKteOnoZf5aFxxU=@vger.kernel.org X-Gm-Message-State: AOJu0Yy1d3Z7LlhyFqrtk0e2mQLhQ1WOfIX7eETiN30fescHvBMU1rrz meXC+buIxRBjYLSVgGYN4JNWRaGk+XV6Wrgz7XSJieiam4WDb9hQmGvV X-Gm-Gg: ATEYQzzBZzkxRkC97tSuzK8t8I1kpHF1EdVknkO7BLsRSWpgFVJknt53vbRcI831Qm8 oivBq3FlX8fQkhG7KmpwLoY/6rmNM2M8LLkE4TMWmdIT3uFQ1yGnUtbfZgoSwkIE7KtieBz+zSh 5AVeKxXUTpfAczxqHIgJ1zPDvxMD9L6PkUaqRW/8eAt/BEmshxLT2n9KVjod8b1xgD/ada7XM1T 56ERFbFExXq9XzYdCdv7ARth0TOjnqX8ww27AR3ZHZtbigo58Khsh50rFobTGyaHO4/Gw0wMTPK a644kZeejiVIdjyzKSoQJPwQSEuNPVG8pCpnfjYKZObmtS0py6qzhhbHrpEGl43hKYJbIlVZbNh bguwEBNFT0Vh//9+JAu6kmh3TUuqq7MotOgIo8KjE1nM9dEK0DP3LR2iCaTdj66FYklRhRdJANE k26HYW80OeIEFha1N0AXKwwx+tcITBHhNNLywVpTXE+TkuzJXQdyuX4UGiX8jptzqYq2RDV0x4/ 5+xp/1nuph+ X-Received: by 2002:a05:600c:8b03:b0:486:fdca:ea8d with SMTP id 5b1f17b1804b1-48727ef5550mr68092145e9.25.1774641469379; Fri, 27 Mar 2026 12:57:49 -0700 (PDT) Received: from snowdrop.snailnet.com (82-69-66-36.dsl.in-addr.zen.co.uk. [82.69.66.36]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-48730628f14sm3643165e9.4.2026.03.27.12.57.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 27 Mar 2026 12:57:49 -0700 (PDT) From: david.laight.linux@gmail.com To: Andrew Morton , Andy Shevchenko , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Dave Hansen , x86@kernel.org, "H. Peter Anvin" , Uros Bizjak , linux-kernel@vger.kernel.org, Kees Cook , Linus Torvalds Cc: David Laight Subject: [PATCH next] i386: Remove string functions that use 'rep scasb' Date: Fri, 27 Mar 2026 19:57:47 +0000 Message-Id: <20260327195747.89556-1-david.laight.linux@gmail.com> X-Mailer: git-send-email 2.39.5 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Laight The fixed overhead of all the 'rep xxx' instructions is rather more that might expect. While 'rep movs' is getting better on more recent CPU, the same is not true for 'rep scasb'. On my Zen-5 it has a fixed overhead of 150 clocks and then takes 3 clocks for each byte. I've not measured any Intel CPU, but the cost might be 'only' 40 + 2n. Remove the asm versions of strcat() strncat() strlen() memchr() and memscan(), the generic C versions will be faster. It is quite likely that all these functions are slower than the generic code on pretty much all CPU since the 486. Signed-off-by: David Laight --- arch/x86/include/asm/string_32.h | 18 ------- arch/x86/lib/string_32.c | 89 -------------------------------- 2 files changed, 107 deletions(-) diff --git a/arch/x86/include/asm/string_32.h b/arch/x86/include/asm/string= _32.h index e9cce169bb4c..b245db5d7f3c 100644 --- a/arch/x86/include/asm/string_32.h +++ b/arch/x86/include/asm/string_32.h @@ -12,12 +12,6 @@ extern char *strcpy(char *dest, const char *src); #define __HAVE_ARCH_STRNCPY extern char *strncpy(char *dest, const char *src, size_t count); =20 -#define __HAVE_ARCH_STRCAT -extern char *strcat(char *dest, const char *src); - -#define __HAVE_ARCH_STRNCAT -extern char *strncat(char *dest, const char *src, size_t count); - #define __HAVE_ARCH_STRCMP extern int strcmp(const char *cs, const char *ct); =20 @@ -27,9 +21,6 @@ extern int strncmp(const char *cs, const char *ct, size_t= count); #define __HAVE_ARCH_STRCHR extern char *strchr(const char *s, int c); =20 -#define __HAVE_ARCH_STRLEN -extern size_t strlen(const char *s); - static __always_inline void *__memcpy(void *to, const void *from, size_t n) { int d0, d1, d2; @@ -159,9 +150,6 @@ extern int memcmp(const void *, const void *, size_t); #define memcmp __builtin_memcmp #endif =20 -#define __HAVE_ARCH_MEMCHR -extern void *memchr(const void *cs, int c, size_t count); - static inline void *__memset_generic(void *s, char c, size_t count) { int d0, d1; @@ -216,12 +204,6 @@ static inline void *memset32(uint32_t *s, uint32_t v, = size_t n) return s; } =20 -/* - * find the first occurrence of byte 'c', or 1 past the area if none - */ -#define __HAVE_ARCH_MEMSCAN -extern void *memscan(void *addr, int c, size_t size); - #endif /* __KERNEL__ */ =20 #endif /* _ASM_X86_STRING_32_H */ diff --git a/arch/x86/lib/string_32.c b/arch/x86/lib/string_32.c index f87ec24fa579..3602e808b584 100644 --- a/arch/x86/lib/string_32.c +++ b/arch/x86/lib/string_32.c @@ -49,46 +49,6 @@ char *strncpy(char *dest, const char *src, size_t count) EXPORT_SYMBOL(strncpy); #endif =20 -#ifdef __HAVE_ARCH_STRCAT -char *strcat(char *dest, const char *src) -{ - int d0, d1, d2, d3; - asm volatile("repne scasb\n\t" - "decl %1\n" - "1:\tlodsb\n\t" - "stosb\n\t" - "testb %%al,%%al\n\t" - "jne 1b" - : "=3D&S" (d0), "=3D&D" (d1), "=3D&a" (d2), "=3D&c" (d3) - : "0" (src), "1" (dest), "2" (0), "3" (0xffffffffu) : "memory"); - return dest; -} -EXPORT_SYMBOL(strcat); -#endif - -#ifdef __HAVE_ARCH_STRNCAT -char *strncat(char *dest, const char *src, size_t count) -{ - int d0, d1, d2, d3; - asm volatile("repne scasb\n\t" - "decl %1\n\t" - "movl %8,%3\n" - "1:\tdecl %3\n\t" - "js 2f\n\t" - "lodsb\n\t" - "stosb\n\t" - "testb %%al,%%al\n\t" - "jne 1b\n" - "2:\txorl %2,%2\n\t" - "stosb" - : "=3D&S" (d0), "=3D&D" (d1), "=3D&a" (d2), "=3D&c" (d3) - : "0" (src), "1" (dest), "2" (0), "3" (0xffffffffu), "g" (count) - : "memory"); - return dest; -} -EXPORT_SYMBOL(strncat); -#endif - #ifdef __HAVE_ARCH_STRCMP int strcmp(const char *cs, const char *ct) { @@ -159,55 +119,6 @@ char *strchr(const char *s, int c) EXPORT_SYMBOL(strchr); #endif =20 -#ifdef __HAVE_ARCH_STRLEN -size_t strlen(const char *s) -{ - int d0; - size_t res; - asm volatile("repne scasb" - : "=3Dc" (res), "=3D&D" (d0) - : "1" (s), "a" (0), "0" (0xffffffffu) - : "memory"); - return ~res - 1; -} -EXPORT_SYMBOL(strlen); -#endif - -#ifdef __HAVE_ARCH_MEMCHR -void *memchr(const void *cs, int c, size_t count) -{ - int d0; - void *res; - if (!count) - return NULL; - asm volatile("repne scasb\n\t" - "je 1f\n\t" - "movl $1,%0\n" - "1:\tdecl %0" - : "=3DD" (res), "=3D&c" (d0) - : "a" (c), "0" (cs), "1" (count) - : "memory"); - return res; -} -EXPORT_SYMBOL(memchr); -#endif - -#ifdef __HAVE_ARCH_MEMSCAN -void *memscan(void *addr, int c, size_t size) -{ - if (!size) - return addr; - asm volatile("repnz scasb\n\t" - "jnz 1f\n\t" - "dec %%edi\n" - "1:" - : "=3DD" (addr), "=3Dc" (size) - : "0" (addr), "1" (size), "a" (c) - : "memory"); - return addr; -} -EXPORT_SYMBOL(memscan); -#endif =20 #ifdef __HAVE_ARCH_STRNLEN size_t strnlen(const char *s, size_t count) --=20 2.39.5