2010-10-25 Ulrich Drepper [BZ #12159] * sysdeps/x86_64/multiarch/strchr.S: Fix propagation of search byte into all bytes of SSE register. Patch by Richard Li . Index: glibc-2.12-2-gc4ccff1/string/Makefile =================================================================== --- glibc-2.12-2-gc4ccff1.orig/string/Makefile +++ glibc-2.12-2-gc4ccff1/string/Makefile @@ -55,7 +55,7 @@ tests := tester inl-tester noinl-tester tst-strtok tst-strxfrm bug-strcoll1 tst-strfry \ bug-strtok1 $(addprefix test-,$(strop-tests)) \ bug-envz1 tst-strxfrm2 tst-endian tst-svc2 \ - bug-strstr1 + bug-strstr1 bug-strchr1 distribute := memcopy.h pagecopy.h tst-svc.expect test-string.h \ str-two-way.h Index: glibc-2.12-2-gc4ccff1/string/bug-strchr1.c =================================================================== --- /dev/null +++ glibc-2.12-2-gc4ccff1/string/bug-strchr1.c @@ -0,0 +1,14 @@ +#include +#include + +static int +do_test (void) +{ + char s[] __attribute__((aligned(16))) = "\xff"; + char *p = strchr (s, '\xfe'); + printf ("%p\n", p); + return p != NULL; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" Index: glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strchr.S =================================================================== --- glibc-2.12-2-gc4ccff1.orig/sysdeps/x86_64/multiarch/strchr.S +++ glibc-2.12-2-gc4ccff1/sysdeps/x86_64/multiarch/strchr.S @@ -87,13 +87,13 @@ __strchr_sse42: pxor %xmm2, %xmm2 movd %esi, %xmm1 movl %edi, %ecx + pshufb %xmm2, %xmm1 andl $15, %ecx movq %rdi, %r8 je L(aligned_start) /* Handle unaligned string. */ andq $-16, %r8 - pshufb %xmm2, %xmm1 movdqa (%r8), %xmm0 pcmpeqb %xmm0, %xmm2 pcmpeqb %xmm1, %xmm0