aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxim Kuvyrkov <maxim@codesourcery.com>2012-05-28 22:46:07 -0700
committerMaxim Kuvyrkov <maxim@codesourcery.com>2012-08-21 18:07:47 -0700
commitbcca089526c6859e775243731037a469aec3065c (patch)
tree646370482233fa52fcb5311b066f65fef2946d84
parent99677e575504ec526546501b1fdb86221493768a (diff)
downloadglibc-bcca089526c6859e775243731037a469aec3065c.tar
glibc-bcca089526c6859e775243731037a469aec3065c.tar.gz
glibc-bcca089526c6859e775243731037a469aec3065c.tar.bz2
glibc-bcca089526c6859e775243731037a469aec3065c.zip
Micro-optimize critical path of strstr, strcase and memmem.
-rw-r--r--ChangeLog6
-rw-r--r--string/str-two-way.h11
-rw-r--r--string/strcasestr.c1
-rw-r--r--string/strstr.c1
4 files changed, 18 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 4cc8e47c94..104147f88b 100644
--- 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.
diff --git a/string/str-two-way.h b/string/str-two-way.h
index 1b7a8baea0..59609b8685 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 b6458aef52..9467b7a759 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 ec2a1e91e7..cfed77119d 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