Micro-optimize critical path of strstr, strcase and memmem.
authorMaxim Kuvyrkov <maxim@codesourcery.com>
Tue, 29 May 2012 05:46:07 +0000 (22:46 -0700)
committerMaxim Kuvyrkov <maxim@codesourcery.com>
Wed, 22 Aug 2012 01:07:47 +0000 (18:07 -0700)
ChangeLog
string/str-two-way.h
string/strcasestr.c
string/strstr.c

index 4cc8e47..104147f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
 2012-08-21  Maxim Kuvyrkov  <maxim@codesourcery.com>
 
+       * 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  <maxim@codesourcery.com>
+
        * string/str-two-way.h (two_way_short_needle): Use pointers instead of
        array references.
        * string/strcasestr.c (TOLOWER): Make side-effect safe.
index 1b7a8ba..59609b8 100644 (file)
@@ -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
index b6458ae..9467b7a 100644 (file)
@@ -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)
index ec2a1e9..cfed771 100644 (file)
@@ -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