Fix handling LC_CTYPE nonascii-case fallback in i686 SSE4.2 and SSSE3 strcasecmp...
authorAndreas Schwab <schwab@suse.de>
Mon, 29 Jul 2013 12:58:41 +0000 (14:58 +0200)
committerAndreas Schwab <schwab@suse.de>
Tue, 27 Aug 2013 10:19:03 +0000 (12:19 +0200)
ChangeLog
sysdeps/i386/i686/multiarch/strcmp-sse4.S
sysdeps/i386/i686/multiarch/strcmp-ssse3.S

index ed8d7fe..89f2fef 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2013-08-27  Andreas Schwab  <schwab@suse.de>
+
+       * sysdeps/i386/i686/multiarch/strcmp-sse4.S (__strcasecmp_sse4_2)
+       (__strncasecmp_sse4_2) [PIC]: Restore %ebx before falling through
+       to __strcasecmp_nonascii and __strncasecmp_nonascii.
+       * sysdeps/i386/i686/multiarch/strcmp-ssse3.S (__strcasecmp_ssse3)
+       (__strncasecmp_ssse3) [PIC]: Likewise.
+
 2013-08-26  Roland McGrath  <roland@hack.frob.com>
 
        * io/lxstat64.c: Just call __xstat64, for parity with stub __lxstat.
index 62f458f..355ed4e 100644 (file)
@@ -121,8 +121,14 @@ ENTRY (__strcasecmp_sse4_2)
        movl    (%eax), %eax
 # endif
        testl   $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
+# ifdef PIC
+       je      L(ascii)
+       POP     (%ebx)
+       jmp     __strcasecmp_nonascii
+# else
        jne     __strcasecmp_nonascii
        jmp     L(ascii)
+# endif
 END (__strcasecmp_sse4_2)
 #endif
 
@@ -152,8 +158,14 @@ ENTRY (__strncasecmp_sse4_2)
        movl    (%eax), %eax
 # endif
        testl   $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
+# ifdef PIC
+       je      L(ascii)
+       POP     (%ebx)
+       jmp     __strncasecmp_nonascii
+# else
        jne     __strncasecmp_nonascii
        jmp     L(ascii)
+# endif
 END (__strncasecmp_sse4_2)
 #endif
 
index 5fd9ac8..3eb304b 100644 (file)
@@ -138,8 +138,14 @@ ENTRY (__strcasecmp_ssse3)
        movl    (%eax), %eax
 # endif
        testl   $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
+# ifdef PIC
+       je      L(ascii)
+       POP     (%ebx)
+       jmp     __strcasecmp_nonascii
+# else
        jne     __strcasecmp_nonascii
        jmp     L(ascii)
+# endif
 END (__strcasecmp_ssse3)
 #endif
 
@@ -169,8 +175,14 @@ ENTRY (__strncasecmp_ssse3)
        movl    (%eax), %eax
 # endif
        testl   $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%eax)
+# ifdef PIC
+       je      L(ascii)
+       POP     (%ebx)
+       jmp     __strncasecmp_nonascii
+# else
        jne     __strncasecmp_nonascii
        jmp     L(ascii)
+# endif
 END (__strncasecmp_ssse3)
 #endif