From: Maxim Kuvyrkov Date: Tue, 29 May 2012 05:46:07 +0000 (-0700) Subject: Micro-optimize critical path of strstr, strcase and memmem. X-Git-Tag: glibc-2.17~636 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bcca089526c6859e775243731037a469aec3065c;p=thirdparty%2Fglibc.git Micro-optimize critical path of strstr, strcase and memmem. --- diff --git a/ChangeLog b/ChangeLog index 4cc8e47c94b..104147f88b6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2012-08-21 Maxim Kuvyrkov + + * string/str-two-way.h (AVAILABLE1_USES_J): New macro, define default. + (two_way_short_needle): Use it. + * string/{strstr.c, strcasestr.c} (AVAILABLE1_USES_J): Define. + 2012-08-21 Maxim Kuvyrkov * string/str-two-way.h (two_way_short_needle): Use pointers instead of diff --git a/string/str-two-way.h b/string/str-two-way.h index 1b7a8baea0d..59609b86855 100644 --- a/string/str-two-way.h +++ b/string/str-two-way.h @@ -84,6 +84,9 @@ #ifndef RET0_IF_0 # define RET0_IF_0(a) /* nothing */ #endif +#ifndef AVAILABLE1_USES_J +# define AVAILABLE1_USES_J (1) +#endif /* Perform a critical factorization of NEEDLE, of length NEEDLE_LEN. Return the index of the first byte in the right half, and set @@ -295,12 +298,17 @@ two_way_short_needle (const unsigned char *haystack, size_t haystack_len, != (haystack_char = CANON_ELEMENT (*phaystack++))) { RET0_IF_0 (haystack_char); +#if AVAILABLE1_USES_J ++j; +#endif continue; } - /* Calculate J. */ +#if !AVAILABLE1_USES_J + /* Calculate J if it wasn't kept up-to-date in the first-character + loop. */ j = phaystack - &haystack[suffix] - 1; +#endif /* Scan for matches in right half. */ i = suffix + 1; @@ -497,6 +505,7 @@ two_way_long_needle (const unsigned char *haystack, size_t haystack_len, #undef AVAILABLE #undef AVAILABLE1 #undef AVAILABLE2 +#undef AVAILABLE1_USES_J #undef CANON_ELEMENT #undef CMP_FUNC #undef RET0_IF_0 diff --git a/string/strcasestr.c b/string/strcasestr.c index b6458aef523..9467b7a7594 100644 --- a/string/strcasestr.c +++ b/string/strcasestr.c @@ -46,6 +46,7 @@ #define AVAILABLE1(h, h_l, j, n_l) (true) #define AVAILABLE2(h, h_l, j, n_l) AVAILABLE (h, h_l, j, n_l) #define RET0_IF_0(a) if (!a) goto ret0 +#define AVAILABLE1_USES_J (0) #define CANON_ELEMENT(c) TOLOWER (c) #define CMP_FUNC(p1, p2, l) \ __strncasecmp ((const char *) (p1), (const char *) (p2), l) diff --git a/string/strstr.c b/string/strstr.c index ec2a1e91e7d..cfed77119d7 100644 --- a/string/strstr.c +++ b/string/strstr.c @@ -38,6 +38,7 @@ #define AVAILABLE1(h, h_l, j, n_l) (true) #define AVAILABLE2(h, h_l, j, n_l) AVAILABLE (h, h_l, j, n_l) #define RET0_IF_0(a) if (!a) goto ret0 +#define AVAILABLE1_USES_J (0) #include "str-two-way.h" #undef strstr