Fix SSSE3/SSE4.2 strcasecmp[_l]/strncasecmp[_l] for non-PIC and -mno-tls-direct-seg...
authorAndreas Schwab <schwab@redhat.com>
Wed, 16 Nov 2011 08:36:15 +0000 (09:36 +0100)
committerAndreas Schwab <schwab@redhat.com>
Wed, 16 Nov 2011 10:48:10 +0000 (11:48 +0100)
ChangeLog
sysdeps/i386/i686/multiarch/strcmp-sse4.S
sysdeps/i386/i686/multiarch/strcmp-ssse3.S

index c469e10..fced7f1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2011-11-16  Andreas Schwab  <schwab@redhat.com>
+
+       * sysdeps/i386/i686/multiarch/strcmp-ssse3.S
+       [USE_AS_STRCASECMP_L]: Fix argument offsets for non-PIC.
+       [USE_AS_STRNCASECMP_L]: Likewise.
+       (__strcasecmp_ssse3, __strncasecmp_ssse3): Handle
+       NO_TLS_DIRECT_SEG_REFS.
+       * sysdeps/i386/i686/multiarch/strcmp-sse4.S [USE_AS_STRCASECMP_L]:
+       Fix argument offsets for non-PIC.
+       [USE_AS_STRNCASECMP_L]: Likewise.
+       (__strcasecmp_sse4_2, __strncasecmp_sse4_2): Handle
+       NO_TLS_DIRECT_SEG_REFS.
+
 2011-11-15  Ulrich Drepper  <drepper@gmail.com>
 
        * locale/loadarchive.c (_nl_load_locale_from_archive): Open files to
index 1df63e3..c9e0317 100644 (file)
 # ifndef STRCMP
 #  define STRCMP       __strcasecmp_l_sse4_2
 # endif
-# define STR1          12
+# ifdef PIC
+#  define STR1         12
+# else
+#  define STR1         8
+# endif
 # define STR2          STR1+4
 # define LOCALE                12      /* Loaded before the adjustement.  */
 # ifdef PIC
 # ifndef STRCMP
 #  define STRCMP       __strncasecmp_l_sse4_2
 # endif
-# define STR1          16
+# ifdef PIC
+#  define STR1         16
+# else
+#  define STR1         12
+# endif
 # define STR2          STR1+4
 # define CNT           STR2+4
 # define LOCALE                16      /* Loaded before the adjustement.  */
@@ -95,10 +103,20 @@ ENTRY (__strcasecmp_sse4_2)
        call    __i686.get_pc_thunk.bx
        addl    $_GLOBAL_OFFSET_TABLE_, %ebx
        movl    __libc_tsd_LOCALE@GOTNTPOFF(%ebx), %eax
+#  ifdef NO_TLS_DIRECT_SEG_REFS
+       addl    %gs:0, %eax
+       movl    (%eax), %eax
+#  else
+       movl    %gs:(%eax), %eax
+#  endif
 # else
-       movl    __libc_tsd_LOCALE@NTPOFF, %eax
+#  ifdef NO_TLS_DIRECT_SEG_REFS
+       movl    %gs:0, %eax
+       movl    __libc_tsd_LOCALE@NTPOFF(%eax), %eax
+#  else
+       movl    %gs:__libc_tsd_LOCALE@NTPOFF, %eax
+#  endif
 # endif
-       movl    %gs:(%eax), %eax
 # if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
        movl    LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
 # else
@@ -117,10 +135,20 @@ ENTRY (__strncasecmp_sse4_2)
        call    __i686.get_pc_thunk.bx
        addl    $_GLOBAL_OFFSET_TABLE_, %ebx
        movl    __libc_tsd_LOCALE@GOTNTPOFF(%ebx), %eax
+#  ifdef NO_TLS_DIRECT_SEG_REFS
+       addl    %gs:0, %eax
+       movl    (%eax), %eax
+#  else
+       movl    %gs:(%eax), %eax
+#  endif
 # else
-       movl    __libc_tsd_LOCALE@NTPOFF, %eax
+#  ifdef NO_TLS_DIRECT_SEG_REFS
+       movl    %gs:0, %eax
+       movl    __libc_tsd_LOCALE@NTPOFF(%eax), %eax
+#  else
+       movl    %gs:__libc_tsd_LOCALE@NTPOFF, %eax
+#  endif
 # endif
-       movl    %gs:(%eax), %eax
 # if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
        movl    LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
 # else
index 137596d..cbba465 100644 (file)
 # ifndef STRCMP
 #  define STRCMP       __strcasecmp_l_ssse3
 # endif
-# define STR1          8
+# ifdef PIC
+#  define STR1         8
+# else
+#  define STR1         4
+# endif
 # define STR2          STR1+4
 # define LOCALE                12      /* Loaded before the adjustement.  */
 # ifdef PIC
 # ifndef STRCMP
 #  define STRCMP       __strncasecmp_l_ssse3
 # endif
-# define STR1          12
+# ifdef PIC
+#  define STR1         12
+# else
+#  define STR1         8
+# endif
 # define STR2          STR1+4
 # define CNT           STR2+4
 # define LOCALE                16      /* Loaded before the adjustement.  */
@@ -112,10 +120,20 @@ ENTRY (__strcasecmp_ssse3)
        call    __i686.get_pc_thunk.bx
        addl    $_GLOBAL_OFFSET_TABLE_, %ebx
        movl    __libc_tsd_LOCALE@GOTNTPOFF(%ebx), %eax
+#  ifdef NO_TLS_DIRECT_SEG_REFS
+       addl    %gs:0, %eax
+       movl    (%eax), %eax
+#  else
+       movl    %gs:(%eax), %eax
+#  endif
 # else
-       movl    __libc_tsd_LOCALE@NTPOFF, %eax
+#  ifdef NO_TLS_DIRECT_SEG_REFS
+       movl    %gs:0, %eax
+       movl    __libc_tsd_LOCALE@NTPOFF(%eax), %eax
+#  else
+       movl    %gs:__libc_tsd_LOCALE@NTPOFF, %eax
+#  endif
 # endif
-       movl    %gs:(%eax), %eax
 # if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
        movl    LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
 # else
@@ -134,10 +152,20 @@ ENTRY (__strncasecmp_ssse3)
        call    __i686.get_pc_thunk.bx
        addl    $_GLOBAL_OFFSET_TABLE_, %ebx
        movl    __libc_tsd_LOCALE@GOTNTPOFF(%ebx), %eax
+#  ifdef NO_TLS_DIRECT_SEG_REFS
+       addl    %gs:0, %eax
+       movl    (%eax), %eax
+#  else
+       movl    %gs:(%eax), %eax
+#  endif
 # else
-       movl    __libc_tsd_LOCALE@NTPOFF, %eax
+#  ifdef NO_TLS_DIRECT_SEG_REFS
+       movl    %gs:0, %eax
+       movl    __libc_tsd_LOCALE@NTPOFF(%eax), %eax
+#  else
+       movl    %gs:__libc_tsd_LOCALE@NTPOFF, %eax
+#  endif
 # endif
-       movl    %gs:(%eax), %eax
 # if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
        movl    LOCALE_T___LOCALES+LC_CTYPE*4(%eax), %eax
 # else