From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: 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-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@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 15:20:00 -0000 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> X-SW-Source: 2016-03/txt/msg00665.txt.bz2 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(-) 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) -- 1.9.1