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 Netto X-Patchwork-Id: 602509 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3qYczs17Pnz9sDD for ; Tue, 29 Mar 2016 02:20:40 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b=nMVIsJ++; dkim-atps=neutral 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=qJ+pkPkXUgcU89aOgxNXFAumX9ngjgS al2wnv0xMCuHWlfS/f9KgRem9MvW8o9axnXw5i6qr2uwULkCgNY/RtWULDpTir6G CoVHRpEeA1h50KXxkQlO9n9UQM0k9WyWVmIPZLRGuwBLw32/S4p+zptBNmZHcK0B KUokFEd2Fpqw= 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=nMVIs J++ZCZgcrUrP41TZ/KOQMP3B3O4sQV9BbUrHIK5elHyRaCaSbcomMG8SpfcdIua4 M4leND1FIGkMrjop5LVjMZT8Hkuknvw+omroPz+RoCZXtB7i2DERKMIagEkidVO4 X0HXWiSFYOtDECFcxGbhs7UwcxDr1ZXkA9RzyI= 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(-) 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)