1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-28 00:21:52 +03:00

Micro-optimize critical path of strstr, strcase and memmem.

This commit is contained in:
Maxim Kuvyrkov
2012-05-28 22:46:07 -07:00
parent 99677e5755
commit bcca089526
4 changed files with 18 additions and 1 deletions

View 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

View 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)

View 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