Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Add strstr with unaligned loads. Fixes bug 12100.
A sse42 version of strstr used pcmpistr instruction which is quite
ineffective. A faster way is look for pairs of characters which is uses
sse2, is faster than pcmpistr and for real strings a pairs we look for
are relatively rare.

For linear time complexity we use buy or rent technique which switches
to two-way algorithm when superlinear behaviour is detected.
  • Loading branch information
Ondřej Bílka committed Dec 14, 2013
1 parent 8a5c789 commit 584b18e
Show file tree
Hide file tree
Showing 10 changed files with 441 additions and 506 deletions.
14 changes: 14 additions & 0 deletions ChangeLog
@@ -1,3 +1,17 @@
2013-12-14 Ondřej Bílka <neleai@seznam.cz>

[BZ #12100]
* sysdeps/x86_64/multiarch/strstr-sse2-unaligned.S: New file
* sysdeps/x86_64/multiarch/strstr-c.c: Moved to ...
* sysdeps/x86_64/multiarch/strstr.c: ... here.
(strstr): Add __strstr_sse2_unaligned ifunc.
* sysdeps/x86_64/multiarch/strcasestr-c.c: Moved to ...
* sysdeps/x86_64/multiarch/strcasestr.c ... here.
(strcasestr): Remove __strcasestr_sse42 ifunc.
* sysdeps/x86_64/multiarch/strcasestr-nonascii.c: Remove.
* sysdeps/x86_64/multiarch/ifunc-impl-list.c: Update.
* sysdeps/x86_64/multiarch/Makefile (sysdep_routines): Update.

2013-12-14 Kaz Kojima <kkojima@rr.iij4u.or.jp>

* sysdeps/sh/sh4/fpu/bits/fenv.h: Move to ...
Expand Down
24 changes: 12 additions & 12 deletions NEWS
Expand Up @@ -10,18 +10,18 @@ Version 2.19
* The following bugs are resolved with this release:

156, 387, 431, 832, 926, 2801, 4772, 6786, 6787, 6807, 6810, 7003, 9954,
10253, 10278, 11087, 11157, 11214, 12486, 13028, 13982, 13985, 14029,
14032, 14143, 14155, 14547, 14699, 14752, 14876, 14910, 15004, 15048,
15089, 15218, 15268, 15277, 15308, 15362, 15374, 15400, 15425, 15427,
15483, 15522, 15531, 15532, 15593, 15601, 15608, 15609, 15610, 15632,
15640, 15670, 15672, 15680, 15681, 15723, 15734, 15735, 15736, 15748,
15749, 15754, 15760, 15763, 15764, 15797, 15799, 15825, 15843, 15844,
15847, 15849, 15855, 15856, 15857, 15859, 15867, 15886, 15887, 15890,
15892, 15893, 15895, 15897, 15901, 15905, 15909, 15915, 15917, 15919,
15921, 15923, 15939, 15941, 15948, 15963, 15966, 15985, 15988, 15997,
16032, 16034, 16036, 16037, 16038, 16041, 16055, 16071, 16072, 16074,
16077, 16078, 16103, 16112, 16143, 16144, 16146, 16150, 16151, 16153,
16167, 16172, 16195, 16214, 16245, 16271, 16274, 16283, 16289.
10253, 10278, 11087, 11157, 11214, 12100, 12486, 13028, 13982, 13985,
14029, 14032, 14143, 14155, 14547, 14699, 14752, 14876, 14910, 15004,
15048, 15089, 15218, 15268, 15277, 15308, 15362, 15374, 15400, 15425,
15427, 15483, 15522, 15531, 15532, 15593, 15601, 15608, 15609, 15610,
15632, 15640, 15670, 15672, 15680, 15681, 15723, 15734, 15735, 15736,
15748, 15749, 15754, 15760, 15763, 15764, 15797, 15799, 15825, 15843,
15844, 15847, 15849, 15855, 15856, 15857, 15859, 15867, 15886, 15887,
15890, 15892, 15893, 15895, 15897, 15901, 15905, 15909, 15915, 15917,
15919, 15921, 15923, 15939, 15941, 15948, 15963, 15966, 15985, 15988,
15997, 16032, 16034, 16036, 16037, 16038, 16041, 16055, 16071, 16072,
16074, 16077, 16078, 16103, 16112, 16143, 16144, 16146, 16150, 16151,
16153, 16167, 16172, 16195, 16214, 16245, 16271, 16274, 16283, 16289.

* The public headers no longer use __unused nor __block. This change is to
support compiling programs that are derived from BSD sources and use
Expand Down
9 changes: 3 additions & 6 deletions sysdeps/x86_64/multiarch/Makefile
Expand Up @@ -11,22 +11,19 @@ sysdep_routines += strncat-c stpncpy-c strncpy-c strcmp-ssse3 \
memcmp-sse4 memcpy-ssse3 \
memcpy-sse2-unaligned mempcpy-ssse3 \
memmove-ssse3 memcpy-ssse3-back mempcpy-ssse3-back \
memmove-ssse3-back strcasestr-nonascii strcasecmp_l-ssse3 \
memmove-ssse3-back strcasecmp_l-ssse3 \
strncase_l-ssse3 strcat-ssse3 strncat-ssse3\
strcpy-ssse3 strncpy-ssse3 stpcpy-ssse3 stpncpy-ssse3 \
strcpy-sse2-unaligned strncpy-sse2-unaligned \
stpcpy-sse2-unaligned stpncpy-sse2-unaligned \
strcat-sse2-unaligned strncat-sse2-unaligned \
strchr-sse2-no-bsf memcmp-ssse3
strchr-sse2-no-bsf memcmp-ssse3 strstr-sse2-unaligned
ifeq (yes,$(config-cflags-sse4))
sysdep_routines += strcspn-c strpbrk-c strspn-c strstr-c strcasestr-c varshift
sysdep_routines += strcspn-c strpbrk-c strspn-c varshift
CFLAGS-varshift.c += -msse4
CFLAGS-strcspn-c.c += -msse4
CFLAGS-strpbrk-c.c += -msse4
CFLAGS-strspn-c.c += -msse4
CFLAGS-strstr.c += -msse4
CFLAGS-strcasestr.c += -msse4
CFLAGS-strcasestr-nonascii.c += -msse4
endif
endif

Expand Down
4 changes: 1 addition & 3 deletions sysdeps/x86_64/multiarch/ifunc-impl-list.c
Expand Up @@ -98,8 +98,6 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,

/* Support sysdeps/x86_64/multiarch/strcasestr.c. */
IFUNC_IMPL (i, name, strcasestr,
IFUNC_IMPL_ADD (array, i, strcasestr, HAS_SSE4_2,
__strcasestr_sse42)
IFUNC_IMPL_ADD (array, i, strcasestr, 1, __strcasestr_sse2))

/* Support sysdeps/x86_64/multiarch/strcat.S. */
Expand Down Expand Up @@ -184,7 +182,7 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,

/* Support sysdeps/x86_64/multiarch/strstr-c.c. */
IFUNC_IMPL (i, name, strstr,
IFUNC_IMPL_ADD (array, i, strstr, HAS_SSE4_2, __strstr_sse42)
IFUNC_IMPL_ADD (array, i, strstr, 1, __strstr_sse2_unaligned)
IFUNC_IMPL_ADD (array, i, strstr, 1, __strstr_sse2))

/* Support sysdeps/x86_64/multiarch/wcscpy.S. */
Expand Down
19 changes: 0 additions & 19 deletions sysdeps/x86_64/multiarch/strcasestr-c.c

This file was deleted.

50 changes: 0 additions & 50 deletions sysdeps/x86_64/multiarch/strcasestr-nonascii.c

This file was deleted.

18 changes: 12 additions & 6 deletions sysdeps/x86_64/multiarch/strcasestr.c
@@ -1,7 +1,13 @@
extern char *__strcasestr_sse42_nonascii (const unsigned char *s1,
const unsigned char *s2)
attribute_hidden;
/* Multiple versions of strcasestr
All versions must be listed in ifunc-impl-list.c. */

#define USE_AS_STRCASESTR
#define STRSTR_SSE42 __strcasestr_sse42
#include "strstr.c"
#include "init-arch.h"

#define STRCASESTR __strcasestr_sse2

#include "string/strcasestr.c"

extern __typeof (__strcasestr_sse2) __strcasestr_sse2 attribute_hidden;

libc_ifunc (__strcasestr,
__strcasestr_sse2);
47 changes: 0 additions & 47 deletions sysdeps/x86_64/multiarch/strstr-c.c

This file was deleted.

0 comments on commit 584b18e

Please sign in to comment.