Skip to content

Commit

Permalink
Add SSSE3-optimized implementation of str{,n}cmp for x86-64.
Browse files Browse the repository at this point in the history
  • Loading branch information
Ulrich Drepper committed Aug 8, 2009
1 parent 9083bcc commit 0fda545
Show file tree
Hide file tree
Showing 6 changed files with 194 additions and 47 deletions.
9 changes: 9 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
2009-08-07 Ulrich Drepper <drepper@redhat.com>

* sysdeps/x86_64/strcmp.S: Add support to compile with
USE_SSSE3. In this case palignr is used.
* sysdeps/x86_64/multiarch/strcmp.S (strcmp): If SSE4.3 is not
available but SSSE3 is, pick __str{,n}cmp_ssse3.
* sysdeps/x86_64/multiarch/Makefile [subdir=string] (sysdep_routines):
Add strcmp-ssse3 and strncmp-ssse3.
* sysdeps/x86_64/multiarch/strcmp-ssse3.S: New file.
* sysdeps/x86_64/multiarch/strncmp-ssse3.S: New file.

* sysdeps/x86_64/multiarch/strcspn-c.c (STRCSPN_SSE42): Avoid
warning through fake initialization.

Expand Down
2 changes: 1 addition & 1 deletion sysdeps/x86_64/multiarch/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ gen-as-const-headers += ifunc-defines.sym
endif

ifeq ($(subdir),string)
sysdep_routines += stpncpy-c strncpy-c
sysdep_routines += stpncpy-c strncpy-c strcmp-ssse3 strncmp-ssse3
ifeq (yes,$(config-cflags-sse4))
sysdep_routines += strcspn-c strpbrk-c strspn-c strstr-c strcasestr-c
CFLAGS-strcspn-c.c += -msse4
Expand Down
3 changes: 3 additions & 0 deletions sysdeps/x86_64/multiarch/strcmp-ssse3.S
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#define USE_SSSE3 1
#define STRCMP __strcmp_ssse3
#include "../strcmp.S"
12 changes: 9 additions & 3 deletions sysdeps/x86_64/multiarch/strcmp.S
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,15 @@
mov %r9, %r11

#define STRCMP_SSE42 __strncmp_sse42
#define STRCMP_SSSE3 __strncmp_ssse3
#define STRCMP_SSE2 __strncmp_sse2
#define __GI_STRCMP __GI_strncmp
#else
#define UPDATE_STRNCMP_COUNTER
#ifndef STRCMP
#define STRCMP strcmp
#define STRCMP_SSE42 __strcmp_sse42
#define STRCMP_SSSE3 __strcmp_ssse3
#define STRCMP_SSE2 __strcmp_sse2
#define __GI_STRCMP __GI_strcmp
#endif
Expand All @@ -60,10 +62,14 @@ ENTRY(STRCMP)
cmpl $0, __cpu_features+KIND_OFFSET(%rip)
jne 1f
call __init_cpu_features
1: leaq STRCMP_SSE2(%rip), %rax
testl $(1<<20), __cpu_features+CPUID_OFFSET+COMMON_CPUID_INDEX_1*CPUID_SIZE+CPUID_ECX_OFFSET(%rip)
jz 2f
1:
leaq STRCMP_SSE42(%rip), %rax
testl $(1<<20), __cpu_features+CPUID_OFFSET+COMMON_CPUID_INDEX_1*CPUID_SIZE+CPUID_ECX_OFFSET(%rip)
jnz 2f
leaq STRCMP_SSSE3(%rip), %rax
testl $(1<<9), __cpu_features+CPUID_OFFSET+COMMON_CPUID_INDEX_1*CPUID_SIZE+CPUID_ECX_OFFSET(%rip)
jnz 2f
leaq STRCMP_SSE2(%rip), %rax
2: ret
END(STRCMP)

Expand Down
4 changes: 4 additions & 0 deletions sysdeps/x86_64/multiarch/strncmp-ssse3.S
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#define USE_SSSE3 1
#define STRCMP __strncmp_ssse3
#define USE_AS_STRNCMP
#include "../strcmp.S"
Loading

0 comments on commit 0fda545

Please sign in to comment.