]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - sysdeps/x86_64/multiarch/strcmp-sse42.S
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / sysdeps / x86_64 / multiarch / strcmp-sse42.S
index 52cb70693c53d00fecd154c27a3dee89e351b72b..6fa0c2c7d257c1a0f825b64987997e15fa5a8dad 100644 (file)
@@ -1,5 +1,5 @@
 /* strcmp with SSE4.2
-   Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 2009-2018 Free Software Foundation, Inc.
    Contributed by Intel Corporation.
    This file is part of the GNU C Library.
 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#include <sysdep.h>
+
+#ifndef STRCMP_SSE42
+# define STRCMP_SSE42  __strcmp_sse42
+#endif
+
+#if defined USE_AS_STRCASECMP_L || defined USE_AS_STRNCASECMP_L
+# include "locale-defines.h"
+#endif
+
+#if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
+/* Since the counter, %r11, is unsigned, we branch to strcmp_exitz
+   if the new counter > the old one or is 0.  */
+# define UPDATE_STRNCMP_COUNTER                                \
+       /* calculate left number to compare */          \
+       lea     -16(%rcx, %r11), %r9;                   \
+       cmp     %r9, %r11;                              \
+       jb      LABEL(strcmp_exitz);                    \
+       test    %r9, %r9;                               \
+       je      LABEL(strcmp_exitz);                    \
+       mov     %r9, %r11
+#else
+# define UPDATE_STRNCMP_COUNTER
+#endif
+
+#ifdef USE_AVX
+# define SECTION       avx
+# define GLABEL(l)     l##_avx
+#else
+# define SECTION       sse4.2
+# define GLABEL(l)     l##_sse42
+#endif
+
+#define LABEL(l)       .L##l
 
 /* We use 0x1a:
        _SIDD_SBYTE_OPS
        .section .text.SECTION,"ax",@progbits
        .align  16
        .type   STRCMP_SSE42, @function
+       .globl  STRCMP_SSE42
+       .hidden STRCMP_SSE42
 #ifdef USE_AS_STRCASECMP_L
 ENTRY (GLABEL(__strcasecmp))
        movq    __libc_tsd_LOCALE@gottpoff(%rip),%rax
-       movq    %fs:(%rax),%rdx
+       mov     %fs:(%rax),%RDX_LP
 
        // XXX 5 byte should be before the function
        /* 5-byte NOP.  */
@@ -62,7 +98,7 @@ END (GLABEL(__strcasecmp))
 #ifdef USE_AS_STRNCASECMP_L
 ENTRY (GLABEL(__strncasecmp))
        movq    __libc_tsd_LOCALE@gottpoff(%rip),%rax
-       movq    %fs:(%rax),%rcx
+       mov     %fs:(%rax),%RCX_LP
 
        // XXX 5 byte should be before the function
        /* 5-byte NOP.  */
@@ -99,9 +135,9 @@ STRCMP_SSE42:
        /* We have to fall back on the C implementation for locales
           with encodings not matching ASCII for single bytes.  */
 # if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
-       movq    LOCALE_T___LOCALES+LC_CTYPE*8(%rdx), %rax
+       mov     LOCALE_T___LOCALES+LC_CTYPE*LP_SIZE(%rdx), %RAX_LP
 # else
-       movq    (%rdx), %rax
+       mov     (%rdx), %RAX_LP
 # endif
        testl   $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%rax)
        jne     __strcasecmp_l_nonascii
@@ -110,9 +146,9 @@ STRCMP_SSE42:
        /* We have to fall back on the C implementation for locales
           with encodings not matching ASCII for single bytes.  */
 # if LOCALE_T___LOCALES != 0 || LC_CTYPE != 0
-       movq    LOCALE_T___LOCALES+LC_CTYPE*8(%rcx), %rax
+       mov     LOCALE_T___LOCALES+LC_CTYPE*LP_SIZE(%rcx), %RAX_LP
 # else
-       movq    (%rcx), %rax
+       mov     (%rcx), %RAX_LP
 # endif
        testl   $1, LOCALE_DATA_VALUES+_NL_CTYPE_NONASCII_CASE*SIZEOF_VALUES(%rax)
        jne     __strncasecmp_l_nonascii
@@ -204,7 +240,7 @@ LABEL(touppermask):
        jnz     LABEL(less16bytes)/* If not, find different value or null char */
 #if defined USE_AS_STRNCMP || defined USE_AS_STRNCASECMP_L
        sub     $16, %r11
-       jbe     LABEL(strcmp_exitz)/* finish comparision */
+       jbe     LABEL(strcmp_exitz)/* finish comparison */
 #endif
        add     $16, %rsi               /* prepare to search next 16 bytes */
        add     $16, %rdi               /* prepare to search next 16 bytes */