From patchwork Mon Mar 28 15:19:48 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella X-Patchwork-Id: 64531 Delivered-To: patch@linaro.org Received: by 10.112.199.169 with SMTP id jl9csp1505597lbc; Mon, 28 Mar 2016 08:20:45 -0700 (PDT) X-Received: by 10.98.13.88 with SMTP id v85mr43458801pfi.150.1459178445506; Mon, 28 Mar 2016 08:20:45 -0700 (PDT) Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id i5si15990380pfj.121.2016.03.28.08.20.45 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 28 Mar 2016 08:20:45 -0700 (PDT) Received-SPF: pass (google.com: domain of libc-alpha-return-68385-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org; spf=pass (google.com: domain of libc-alpha-return-68385-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-68385-patch=linaro.org@sourceware.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=wSxB9C2Uzimd5HCDPeVKXbG5iJGCkT+ 0bp5DchumGK8inKlvMjCTYMzGKwTolvJCPx2UsRbQXNI79/TkcqD+cCHXu2PqdFF eW4UfqzKTYjwud9mMbaCypgrSp6fYEdjBi3Br3mUQe4QJ6Re6/PO1GAVW75Yt9cB FFl0dGeJ5kgo= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; s=default; bh=iw1J9JTDTt7Fduzqyxk1m7SBrw8=; b=i8+U0 FimLKwyCC7qLQPJUCsLqQlSXYwmEC1Y77vOFBtJ/RSVI1EGyq3NODNlc6qGxrmGl 87MUeX/dqQ+A8b5UgkzMvtE+H9sesls1sH5S/IwNKPwL/DK9SgNMHJIT+V1PPEZu povmEyZNixkNT+5hP35iHVo4DWnM6jvdhdArHw= Received: (qmail 16354 invoked by alias); 28 Mar 2016 15:20:10 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 14780 invoked by uid 89); 28 Mar 2016 15:20:09 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.6 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 spammy=strpbrkc, sk:libc_hi, sk:_have_s, sk:_HAVE_S X-HELO: mail-qk0-f175.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=GBi9tnhftJkUyRr8GTD28jhUFm7VAndsPdBMQc21zZc=; b=ZKPF1ZbBvoe2Hs6xwYQIqMXKG0rhKOpjFRTMBZPA/9XgIJZzdjHaSLAZkSscZS1xdi jNzSaTRsU2ZAgeb4MgcELn01+biMgy/NmISAJmTofzWqeo38qzaC3hKc99/Q9A4cVwZ5 fUvIaxoduIugiHLw1LKPkUKx9Elqq0yx4wbS2Q/ijnj7+EkS/2lppRaDcZ1xRS/kNvvj 7sGYaMbUK2cX2BaHhZ+k0Sk3OEc5MCdjgZJTilrH0jrS/mCJR6AKCNkrrQzhr9slGsLB PRnrLhQo5l3+eL4yBu5sEN5pnAIgFm8mVk9SOH/ToIedaxWyoV7+RXWV25sx+WkFWcCv C0sw== X-Gm-Message-State: AD7BkJILg900n6CtSCS8V9FCbIOqrE8zLltj/iHgsWcex4ZUGPUonYI2Q6V3NHlKfeqXtDSv X-Received: by 10.129.102.8 with SMTP id a8mr13210079ywc.332.1459178400409; Mon, 28 Mar 2016 08:20:00 -0700 (PDT) From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH 3/4] Improve generic strpbrk performance Date: Mon, 28 Mar 2016 12:19:48 -0300 Message-Id: <1459178389-14133-4-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1459178389-14133-1-git-send-email-adhemerval.zanella@linaro.org> References: <1459178389-14133-1-git-send-email-adhemerval.zanella@linaro.org> With now a faster strcspn implementation, it is faster to just use it with some return tests than reimplementing strpbrk itself. As for strcspn optimization, it is generally at least 10 times faster than the existing implementation on bench-strspn on a few AArch64 implementations. Also the string/bits/string2.h inlines make no longer sense, as current implementation will already implement most of the optimizations. Tested on x86_64, i386, and aarch64. * string/strpbrk.c (strpbrk): Rewrite function. * string/bits/string2.h (strpbrk): Use __builtin_strpbrk. --- ChangeLog | 3 +++ string/bits/string2.h | 41 ++++++----------------------------------- string/strpbrk.c | 12 ++---------- 3 files changed, 11 insertions(+), 45 deletions(-) -- 1.9.1 diff --git a/string/bits/string2.h b/string/bits/string2.h index a1684eb..76a179a 100644 --- a/string/bits/string2.h +++ b/string/bits/string2.h @@ -999,43 +999,14 @@ __strspn_c3 (const char *__s, int __accept1, int __accept2, int __accept3) /* Find the first occurrence in S of any character in ACCEPT. */ -#if !defined _HAVE_STRING_ARCH_strpbrk || defined _FORCE_INLINES -# ifndef _HAVE_STRING_ARCH_strpbrk -# if __GNUC_PREREQ (3, 2) -# define strpbrk(s, accept) \ - __extension__ \ - ({ char __a0, __a1, __a2; \ - (__builtin_constant_p (accept) && __string2_1bptr_p (accept) \ - ? ((__builtin_constant_p (s) && __string2_1bptr_p (s)) \ - ? __builtin_strpbrk (s, accept) \ - : ((__a0 = ((const char *) (accept))[0], __a0 == '\0') \ - ? ((void) (s), (char *) NULL) \ - : ((__a1 = ((const char *) (accept))[1], __a1 == '\0') \ - ? __builtin_strchr (s, __a0) \ - : ((__a2 = ((const char *) (accept))[2], __a2 == '\0') \ - ? __strpbrk_c2 (s, __a0, __a1) \ - : (((const char *) (accept))[3] == '\0' \ - ? __strpbrk_c3 (s, __a0, __a1, __a2) \ - : __builtin_strpbrk (s, accept)))))) \ - : __builtin_strpbrk (s, accept)); }) -# else -# define strpbrk(s, accept) \ - __extension__ \ - ({ char __a0, __a1, __a2; \ - (__builtin_constant_p (accept) && __string2_1bptr_p (accept) \ - ? ((__a0 = ((const char *) (accept))[0], __a0 == '\0') \ - ? ((void) (s), (char *) NULL) \ - : ((__a1 = ((const char *) (accept))[1], __a1 == '\0') \ - ? strchr (s, __a0) \ - : ((__a2 = ((const char *) (accept))[2], __a2 == '\0') \ - ? __strpbrk_c2 (s, __a0, __a1) \ - : (((const char *) (accept))[3] == '\0' \ - ? __strpbrk_c3 (s, __a0, __a1, __a2) \ - : strpbrk (s, accept))))) \ - : strpbrk (s, accept)); }) -# endif +#ifndef _HAVE_STRING_ARCH_strpbrk +# if __GNUC_PREREQ (3, 2) +# define strpbrk(s, accept) __builtin_strpbrk (s, accept) # endif +/* The inline functions are not used from GLIBC 2.24 and forward, however + they are required to provide the symbols through string-inlines.c + (if inlining is not possible for compatibility reasons). */ __STRING_INLINE char *__strpbrk_c2 (const char *__s, int __accept1, int __accept2); __STRING_INLINE char * diff --git a/string/strpbrk.c b/string/strpbrk.c index fddd473..1ede719 100644 --- a/string/strpbrk.c +++ b/string/strpbrk.c @@ -27,15 +27,7 @@ char * STRPBRK (const char *s, const char *accept) { - while (*s != '\0') - { - const char *a = accept; - while (*a != '\0') - if (*a++ == *s) - return (char *) s; - ++s; - } - - return NULL; + s += strcspn (s, accept); + return *s ? (char *)s : NULL; } libc_hidden_builtin_def (strpbrk)