summaryrefslogtreecommitdiff
path: root/libc/sysdeps/x86_64/multiarch
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/x86_64/multiarch')
-rw-r--r--libc/sysdeps/x86_64/multiarch/bcopy.S2
-rw-r--r--libc/sysdeps/x86_64/multiarch/bzero.S35
-rw-r--r--libc/sysdeps/x86_64/multiarch/ifunc-impl-list.c283
-rw-r--r--libc/sysdeps/x86_64/multiarch/memcmp.S5
-rw-r--r--libc/sysdeps/x86_64/multiarch/memcpy.S6
-rw-r--r--libc/sysdeps/x86_64/multiarch/memcpy_chk.S3
-rw-r--r--libc/sysdeps/x86_64/multiarch/memmove.c1
-rw-r--r--libc/sysdeps/x86_64/multiarch/memmove_chk.c3
-rw-r--r--libc/sysdeps/x86_64/multiarch/mempcpy.S5
-rw-r--r--libc/sysdeps/x86_64/multiarch/mempcpy_chk.S3
-rw-r--r--libc/sysdeps/x86_64/multiarch/memset.S8
-rw-r--r--libc/sysdeps/x86_64/multiarch/memset_chk.S3
-rw-r--r--libc/sysdeps/x86_64/multiarch/rawmemchr.S8
-rw-r--r--libc/sysdeps/x86_64/multiarch/stpcpy.S2
-rw-r--r--libc/sysdeps/x86_64/multiarch/stpncpy.S2
-rw-r--r--libc/sysdeps/x86_64/multiarch/strcasecmp_l.S2
-rw-r--r--libc/sysdeps/x86_64/multiarch/strcasestr-c.c3
-rw-r--r--libc/sysdeps/x86_64/multiarch/strcat.S5
-rw-r--r--libc/sysdeps/x86_64/multiarch/strchr.S8
-rw-r--r--libc/sysdeps/x86_64/multiarch/strcmp-sse42.S4
-rw-r--r--libc/sysdeps/x86_64/multiarch/strcmp.S8
-rw-r--r--libc/sysdeps/x86_64/multiarch/strcpy.S5
-rw-r--r--libc/sysdeps/x86_64/multiarch/strcspn.S3
-rw-r--r--libc/sysdeps/x86_64/multiarch/strlen.S7
-rw-r--r--libc/sysdeps/x86_64/multiarch/strncase_l.S2
-rw-r--r--libc/sysdeps/x86_64/multiarch/strncat.S2
-rw-r--r--libc/sysdeps/x86_64/multiarch/strncmp.S2
-rw-r--r--libc/sysdeps/x86_64/multiarch/strncpy.S2
-rw-r--r--libc/sysdeps/x86_64/multiarch/strnlen.S5
-rw-r--r--libc/sysdeps/x86_64/multiarch/strpbrk.S2
-rw-r--r--libc/sysdeps/x86_64/multiarch/strrchr.S9
-rw-r--r--libc/sysdeps/x86_64/multiarch/strspn.S3
-rw-r--r--libc/sysdeps/x86_64/multiarch/strstr-c.c1
-rw-r--r--libc/sysdeps/x86_64/multiarch/wcscpy.S3
-rw-r--r--libc/sysdeps/x86_64/multiarch/wmemcmp.S3
35 files changed, 391 insertions, 57 deletions
diff --git a/libc/sysdeps/x86_64/multiarch/bcopy.S b/libc/sysdeps/x86_64/multiarch/bcopy.S
index 11e250f1c..639f02bde 100644
--- a/libc/sysdeps/x86_64/multiarch/bcopy.S
+++ b/libc/sysdeps/x86_64/multiarch/bcopy.S
@@ -3,5 +3,5 @@
.text
ENTRY(bcopy)
xchg %rdi, %rsi
- jmp HIDDEN_BUILTIN_JUMPTARGET(memmove)
+ jmp __libc_memmove /* Branch to IFUNC memmove. */
END(bcopy)
diff --git a/libc/sysdeps/x86_64/multiarch/bzero.S b/libc/sysdeps/x86_64/multiarch/bzero.S
index 92e9fcfc7..23beab7a3 100644
--- a/libc/sysdeps/x86_64/multiarch/bzero.S
+++ b/libc/sysdeps/x86_64/multiarch/bzero.S
@@ -1,5 +1,5 @@
-/* Multiple versions of bzero
- Copyright (C) 2010 Free Software Foundation, Inc.
+/* bzero. x86-64 version.
+ Copyright (C) 2010-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -21,35 +21,8 @@
.text
ENTRY(__bzero)
- .type __bzero, @gnu_indirect_function
- cmpl $0, __cpu_features+KIND_OFFSET(%rip)
- jne 1f
- call __init_cpu_features
-1: leaq __bzero_x86_64(%rip), %rax
- testl $bit_Prefer_SSE_for_memop, __cpu_features+FEATURE_OFFSET+index_Prefer_SSE_for_memop(%rip)
- jz 2f
- leaq __bzero_sse2(%rip), %rax
-2: ret
-END(__bzero)
-
- .type __bzero_sse2, @function
-__bzero_sse2:
- cfi_startproc
- CALL_MCOUNT
mov %rsi,%rdx /* Adjust parameter. */
xorl %esi,%esi /* Fill with 0s. */
- jmp __memset_sse2
- cfi_endproc
- .size __bzero_sse2, .-__bzero_sse2
-
- .type __bzero_x86_64, @function
-__bzero_x86_64:
- cfi_startproc
- CALL_MCOUNT
- mov %rsi,%rdx /* Adjust parameter. */
- xorl %esi,%esi /* Fill with 0s. */
- jmp __memset_x86_64
- cfi_endproc
- .size __bzero_x86_64, .-__bzero_x86_64
-
+ jmp __libc_memset /* Branch to IFUNC memset. */
+END(__bzero)
weak_alias (__bzero, bzero)
diff --git a/libc/sysdeps/x86_64/multiarch/ifunc-impl-list.c b/libc/sysdeps/x86_64/multiarch/ifunc-impl-list.c
new file mode 100644
index 000000000..332a60d9c
--- /dev/null
+++ b/libc/sysdeps/x86_64/multiarch/ifunc-impl-list.c
@@ -0,0 +1,283 @@
+/* Enumerate available IFUNC implementations of a function. x86-64 version.
+ Copyright (C) 2012 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <assert.h>
+#include <string.h>
+#include <wchar.h>
+#include <ifunc-impl-list.h>
+#include "init-arch.h"
+
+/* Maximum number of IFUNC implementations. */
+#define MAX_IFUNC 4
+
+/* Fill ARRAY of MAX elements with IFUNC implementations for function
+ NAME supported on target machine and return the number of valid
+ entries. */
+
+size_t
+__libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
+ size_t max)
+{
+ assert (max >= MAX_IFUNC);
+
+ size_t i = 0;
+
+ /* Support sysdeps/x86_64/multiarch/memcmp.S. */
+ IFUNC_IMPL (i, name, memcmp,
+ IFUNC_IMPL_ADD (array, i, memcmp, HAS_SSE4_1,
+ __memcmp_sse4_1)
+ IFUNC_IMPL_ADD (array, i, memcmp, HAS_SSSE3, __memcmp_ssse3)
+ IFUNC_IMPL_ADD (array, i, memcmp, 1, __memcmp_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/memmove_chk.S. */
+ IFUNC_IMPL (i, name, __memmove_chk,
+ IFUNC_IMPL_ADD (array, i, __memmove_chk, HAS_SSSE3,
+ __memmove_chk_ssse3_back)
+ IFUNC_IMPL_ADD (array, i, __memmove_chk, HAS_SSSE3,
+ __memmove_chk_ssse3)
+ IFUNC_IMPL_ADD (array, i, __memmove_chk, 1,
+ __memmove_chk_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/memmove.S. */
+ IFUNC_IMPL (i, name, memmove,
+ IFUNC_IMPL_ADD (array, i, memmove, HAS_SSSE3,
+ __memmove_ssse3_back)
+ IFUNC_IMPL_ADD (array, i, memmove, HAS_SSSE3,
+ __memmove_ssse3)
+ IFUNC_IMPL_ADD (array, i, memmove, 1, __memmove_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/memset_chk.S. */
+ IFUNC_IMPL (i, name, __memset_chk,
+ IFUNC_IMPL_ADD (array, i, __memset_chk, 1, __memset_chk_sse2)
+ IFUNC_IMPL_ADD (array, i, __memset_chk, 1,
+ __memset_chk_x86_64))
+
+ /* Support sysdeps/x86_64/multiarch/memset.S. */
+ IFUNC_IMPL (i, name, memset,
+ IFUNC_IMPL_ADD (array, i, memset, 1, __memset_sse2)
+ IFUNC_IMPL_ADD (array, i, memset, 1, __memset_x86_64))
+
+ /* Support sysdeps/x86_64/multiarch/rawmemchr.S. */
+ IFUNC_IMPL (i, name, rawmemchr,
+ IFUNC_IMPL_ADD (array, i, rawmemchr, HAS_SSE4_2,
+ __rawmemchr_sse42)
+ IFUNC_IMPL_ADD (array, i, rawmemchr, 1, __rawmemchr_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/stpncpy.S. */
+ IFUNC_IMPL (i, name, stpncpy,
+ IFUNC_IMPL_ADD (array, i, stpncpy, HAS_SSSE3,
+ __stpncpy_ssse3)
+ IFUNC_IMPL_ADD (array, i, stpncpy, 1,
+ __stpncpy_sse2_unaligned)
+ IFUNC_IMPL_ADD (array, i, stpncpy, 1, __stpncpy_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/stpcpy.S. */
+ IFUNC_IMPL (i, name, stpcpy,
+ IFUNC_IMPL_ADD (array, i, stpcpy, HAS_SSSE3, __stpcpy_ssse3)
+ IFUNC_IMPL_ADD (array, i, stpcpy, 1, __stpcpy_sse2_unaligned)
+ IFUNC_IMPL_ADD (array, i, stpcpy, 1, __stpcpy_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/strcasecmp_l.S. */
+ IFUNC_IMPL (i, name, strcasecmp,
+ IFUNC_IMPL_ADD (array, i, strcasecmp, HAS_AVX,
+ __strcasecmp_avx)
+ IFUNC_IMPL_ADD (array, i, strcasecmp, HAS_SSE4_2,
+ __strcasecmp_sse42)
+ IFUNC_IMPL_ADD (array, i, strcasecmp, HAS_SSSE3,
+ __strcasecmp_ssse3)
+ IFUNC_IMPL_ADD (array, i, strcasecmp, 1, __strcasecmp_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/strcasecmp_l.S. */
+ IFUNC_IMPL (i, name, strcasecmp_l,
+ IFUNC_IMPL_ADD (array, i, strcasecmp_l, HAS_AVX,
+ __strcasecmp_l_avx)
+ IFUNC_IMPL_ADD (array, i, strcasecmp_l, HAS_SSE4_2,
+ __strcasecmp_l_sse42)
+ IFUNC_IMPL_ADD (array, i, strcasecmp_l, HAS_SSSE3,
+ __strcasecmp_l_ssse3)
+ IFUNC_IMPL_ADD (array, i, strcasecmp_l, 1,
+ __strcasecmp_l_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/strcasestr.c. */
+ IFUNC_IMPL (i, name, strcasestr,
+ IFUNC_IMPL_ADD (array, i, strcasestr, HAS_SSE4_2,
+ __strcasestr_sse42)
+ IFUNC_IMPL_ADD (array, i, strcasestr, 1, __strcasestr_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/strcat.S. */
+ IFUNC_IMPL (i, name, strcat,
+ IFUNC_IMPL_ADD (array, i, strcat, HAS_SSSE3, __strcat_ssse3)
+ IFUNC_IMPL_ADD (array, i, strcat, 1, __strcat_sse2_unaligned)
+ IFUNC_IMPL_ADD (array, i, strcat, 1, __strcat_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/strchr.S. */
+ IFUNC_IMPL (i, name, strchr,
+ IFUNC_IMPL_ADD (array, i, strchr, HAS_SSE4_2, __strchr_sse42)
+ IFUNC_IMPL_ADD (array, i, strchr, 1, __strchr_sse2_no_bsf)
+ IFUNC_IMPL_ADD (array, i, strchr, 1, __strchr_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/strcmp.S. */
+ IFUNC_IMPL (i, name, strcmp,
+ IFUNC_IMPL_ADD (array, i, strcmp, HAS_SSE4_2, __strcmp_sse42)
+ IFUNC_IMPL_ADD (array, i, strcmp, HAS_SSSE3, __strcmp_ssse3)
+ IFUNC_IMPL_ADD (array, i, strcmp, 1, __strcmp_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/strcpy.S. */
+ IFUNC_IMPL (i, name, strcpy,
+ IFUNC_IMPL_ADD (array, i, strcpy, HAS_SSSE3, __strcpy_ssse3)
+ IFUNC_IMPL_ADD (array, i, strcpy, 1, __strcpy_sse2_unaligned)
+ IFUNC_IMPL_ADD (array, i, strcpy, 1, __strcpy_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/strcspn.S. */
+ IFUNC_IMPL (i, name, strcspn,
+ IFUNC_IMPL_ADD (array, i, strcspn, HAS_SSE4_2,
+ __strcspn_sse42)
+ IFUNC_IMPL_ADD (array, i, strcspn, 1, __strcspn_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/strncase_l.S. */
+ IFUNC_IMPL (i, name, strncasecmp,
+ IFUNC_IMPL_ADD (array, i, strncasecmp, HAS_AVX,
+ __strncasecmp_avx)
+ IFUNC_IMPL_ADD (array, i, strncasecmp, HAS_SSE4_2,
+ __strncasecmp_sse42)
+ IFUNC_IMPL_ADD (array, i, strncasecmp, HAS_SSSE3,
+ __strncasecmp_ssse3)
+ IFUNC_IMPL_ADD (array, i, strncasecmp, 1,
+ __strncasecmp_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/strncase_l.S. */
+ IFUNC_IMPL (i, name, strncasecmp_l,
+ IFUNC_IMPL_ADD (array, i, strncasecmp_l, HAS_AVX,
+ __strncasecmp_l_avx)
+ IFUNC_IMPL_ADD (array, i, strncasecmp_l, HAS_SSE4_2,
+ __strncasecmp_l_sse42)
+ IFUNC_IMPL_ADD (array, i, strncasecmp_l, HAS_SSSE3,
+ __strncasecmp_l_ssse3)
+ IFUNC_IMPL_ADD (array, i, strncasecmp_l, 1,
+ __strncasecmp_l_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/strncat.S. */
+ IFUNC_IMPL (i, name, strncat,
+ IFUNC_IMPL_ADD (array, i, strncat, HAS_SSSE3,
+ __strncat_ssse3)
+ IFUNC_IMPL_ADD (array, i, strncat, 1,
+ __strncat_sse2_unaligned)
+ IFUNC_IMPL_ADD (array, i, strncat, 1, __strncat_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/strncpy.S. */
+ IFUNC_IMPL (i, name, strncpy,
+ IFUNC_IMPL_ADD (array, i, strncpy, HAS_SSSE3,
+ __strncpy_ssse3)
+ IFUNC_IMPL_ADD (array, i, strncpy, 1,
+ __strncpy_sse2_unaligned)
+ IFUNC_IMPL_ADD (array, i, strncpy, 1, __strncpy_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/strnlen.S. */
+ IFUNC_IMPL (i, name, strnlen,
+ IFUNC_IMPL_ADD (array, i, strnlen, 1, __strnlen_sse2_no_bsf)
+ IFUNC_IMPL_ADD (array, i, strnlen, 1, __strnlen_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/strpbrk.S. */
+ IFUNC_IMPL (i, name, strpbrk,
+ IFUNC_IMPL_ADD (array, i, strpbrk, HAS_SSE4_2,
+ __strpbrk_sse42)
+ IFUNC_IMPL_ADD (array, i, strpbrk, 1, __strpbrk_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/strrchr.S. */
+ IFUNC_IMPL (i, name, strrchr,
+ IFUNC_IMPL_ADD (array, i, strrchr, HAS_SSE4_2,
+ __strrchr_sse42)
+ IFUNC_IMPL_ADD (array, i, strrchr, 1, __strrchr_sse2_no_bsf)
+ IFUNC_IMPL_ADD (array, i, strrchr, 1, __strrchr_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/strspn.S. */
+ IFUNC_IMPL (i, name, strspn,
+ IFUNC_IMPL_ADD (array, i, strspn, HAS_SSE4_2, __strspn_sse42)
+ IFUNC_IMPL_ADD (array, i, strspn, 1, __strspn_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/strstr-c.c. */
+ IFUNC_IMPL (i, name, strstr,
+ IFUNC_IMPL_ADD (array, i, strstr, HAS_SSE4_2, __strstr_sse42)
+ IFUNC_IMPL_ADD (array, i, strstr, 1, __strstr_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/wcscpy.S. */
+ IFUNC_IMPL (i, name, wcscpy,
+ IFUNC_IMPL_ADD (array, i, wcscpy, HAS_SSSE3, __wcscpy_ssse3)
+ IFUNC_IMPL_ADD (array, i, wcscpy, 1, __wcscpy_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/wmemcmp.S. */
+ IFUNC_IMPL (i, name, wmemcmp,
+ IFUNC_IMPL_ADD (array, i, wmemcmp, HAS_SSE4_1,
+ __wmemcmp_sse4_1)
+ IFUNC_IMPL_ADD (array, i, wmemcmp, HAS_SSSE3,
+ __wmemcmp_ssse3)
+ IFUNC_IMPL_ADD (array, i, wmemcmp, 1, __wmemcmp_sse2))
+
+#ifdef SHARED
+ /* Support sysdeps/x86_64/multiarch/memcpy_chk.S. */
+ IFUNC_IMPL (i, name, __memcpy_chk,
+ IFUNC_IMPL_ADD (array, i, __memcpy_chk, HAS_SSSE3,
+ __memcpy_chk_ssse3_back)
+ IFUNC_IMPL_ADD (array, i, __memcpy_chk, HAS_SSSE3,
+ __memcpy_chk_ssse3)
+ IFUNC_IMPL_ADD (array, i, __memcpy_chk, 1,
+ __memcpy_chk_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/memcpy.S. */
+ IFUNC_IMPL (i, name, memcpy,
+ IFUNC_IMPL_ADD (array, i, memcpy, HAS_SSSE3,
+ __memcpy_ssse3_back)
+ IFUNC_IMPL_ADD (array, i, memcpy, HAS_SSSE3, __memcpy_ssse3)
+ IFUNC_IMPL_ADD (array, i, memcpy, 1, __memcpy_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/mempcpy_chk.S. */
+ IFUNC_IMPL (i, name, __mempcpy_chk,
+ IFUNC_IMPL_ADD (array, i, __mempcpy_chk, HAS_SSSE3,
+ __mempcpy_chk_ssse3_back)
+ IFUNC_IMPL_ADD (array, i, __mempcpy_chk, HAS_SSSE3,
+ __mempcpy_chk_ssse3)
+ IFUNC_IMPL_ADD (array, i, __mempcpy_chk, 1,
+ __mempcpy_chk_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/mempcpy.S. */
+ IFUNC_IMPL (i, name, mempcpy,
+ IFUNC_IMPL_ADD (array, i, mempcpy, HAS_SSSE3,
+ __mempcpy_ssse3_back)
+ IFUNC_IMPL_ADD (array, i, mempcpy, HAS_SSSE3,
+ __mempcpy_ssse3)
+ IFUNC_IMPL_ADD (array, i, mempcpy, 1, __mempcpy_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/strlen.S. */
+ IFUNC_IMPL (i, name, strlen,
+ IFUNC_IMPL_ADD (array, i, strlen, HAS_SSE4_2, __strlen_sse42)
+ IFUNC_IMPL_ADD (array, i, strlen, 1, __strlen_sse2_pminub)
+ IFUNC_IMPL_ADD (array, i, strlen, 1, __strlen_sse2_no_bsf)
+ IFUNC_IMPL_ADD (array, i, strlen, 1, __strlen_sse2)
+ IFUNC_IMPL_ADD (array, i, strlen, 1, __strlen_sse2))
+
+ /* Support sysdeps/x86_64/multiarch/strncmp.S. */
+ IFUNC_IMPL (i, name, strncmp,
+ IFUNC_IMPL_ADD (array, i, strncmp, HAS_SSE4_2,
+ __strncmp_sse42)
+ IFUNC_IMPL_ADD (array, i, strncmp, HAS_SSSE3,
+ __strncmp_ssse3)
+ IFUNC_IMPL_ADD (array, i, strncmp, 1, __strncmp_sse2))
+#endif
+
+ return i;
+}
diff --git a/libc/sysdeps/x86_64/multiarch/memcmp.S b/libc/sysdeps/x86_64/multiarch/memcmp.S
index b2bc4d797..a3f6a38f6 100644
--- a/libc/sysdeps/x86_64/multiarch/memcmp.S
+++ b/libc/sysdeps/x86_64/multiarch/memcmp.S
@@ -1,5 +1,6 @@
/* Multiple versions of memcmp
- Copyright (C) 2010, 2011 Free Software Foundation, Inc.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2010-2012 Free Software Foundation, Inc.
Contributed by Intel Corporation.
This file is part of the GNU C Library.
@@ -48,6 +49,8 @@ END(memcmp)
# define ENTRY(name) \
.type __memcmp_sse2, @function; \
.p2align 4; \
+ .globl __memcmp_sse2; \
+ .hidden __memcmp_sse2; \
__memcmp_sse2: cfi_startproc; \
CALL_MCOUNT
# undef END
diff --git a/libc/sysdeps/x86_64/multiarch/memcpy.S b/libc/sysdeps/x86_64/multiarch/memcpy.S
index a77cdfb65..c7a193f64 100644
--- a/libc/sysdeps/x86_64/multiarch/memcpy.S
+++ b/libc/sysdeps/x86_64/multiarch/memcpy.S
@@ -1,6 +1,6 @@
/* Multiple versions of memcpy
- Copyright (C) 2010, 2011
- Free Software Foundation, Inc.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2010-2012 Free Software Foundation, Inc.
Contributed by Intel Corporation.
This file is part of the GNU C Library.
@@ -45,6 +45,8 @@ END(__new_memcpy)
# undef ENTRY
# define ENTRY(name) \
.type __memcpy_sse2, @function; \
+ .globl __memcpy_sse2; \
+ .hidden __memcpy_sse2; \
.p2align 4; \
__memcpy_sse2: cfi_startproc; \
CALL_MCOUNT
diff --git a/libc/sysdeps/x86_64/multiarch/memcpy_chk.S b/libc/sysdeps/x86_64/multiarch/memcpy_chk.S
index 5d0059e3d..2283cf688 100644
--- a/libc/sysdeps/x86_64/multiarch/memcpy_chk.S
+++ b/libc/sysdeps/x86_64/multiarch/memcpy_chk.S
@@ -1,5 +1,6 @@
/* Multiple versions of __memcpy_chk
- Copyright (C) 2010 Free Software Foundation, Inc.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2010-2012 Free Software Foundation, Inc.
Contributed by Intel Corporation.
This file is part of the GNU C Library.
diff --git a/libc/sysdeps/x86_64/multiarch/memmove.c b/libc/sysdeps/x86_64/multiarch/memmove.c
index d6bdab4cc..af870d49b 100644
--- a/libc/sysdeps/x86_64/multiarch/memmove.c
+++ b/libc/sysdeps/x86_64/multiarch/memmove.c
@@ -1,4 +1,5 @@
/* Multiple versions of memmove.
+ All versions must be listed in ifunc-impl-list.c.
Copyright (C) 2010-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
diff --git a/libc/sysdeps/x86_64/multiarch/memmove_chk.c b/libc/sysdeps/x86_64/multiarch/memmove_chk.c
index f1f99d99c..da8160d4a 100644
--- a/libc/sysdeps/x86_64/multiarch/memmove_chk.c
+++ b/libc/sysdeps/x86_64/multiarch/memmove_chk.c
@@ -1,5 +1,6 @@
/* Multiple versions of __memmove_chk.
- Copyright (C) 2010 Free Software Foundation, Inc.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2010-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
diff --git a/libc/sysdeps/x86_64/multiarch/mempcpy.S b/libc/sysdeps/x86_64/multiarch/mempcpy.S
index caa435b74..b5a5d6d68 100644
--- a/libc/sysdeps/x86_64/multiarch/mempcpy.S
+++ b/libc/sysdeps/x86_64/multiarch/mempcpy.S
@@ -1,5 +1,6 @@
/* Multiple versions of mempcpy
- Copyright (C) 2010 Free Software Foundation, Inc.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2010-2012 Free Software Foundation, Inc.
Contributed by Intel Corporation.
This file is part of the GNU C Library.
@@ -43,6 +44,8 @@ END(__mempcpy)
# define ENTRY(name) \
.type __mempcpy_sse2, @function; \
.p2align 4; \
+ .globl __mempcpy_sse2; \
+ .hidden __mempcpy_sse2; \
__mempcpy_sse2: cfi_startproc; \
CALL_MCOUNT
# undef END
diff --git a/libc/sysdeps/x86_64/multiarch/mempcpy_chk.S b/libc/sysdeps/x86_64/multiarch/mempcpy_chk.S
index 604a72108..a3d3a59cb 100644
--- a/libc/sysdeps/x86_64/multiarch/mempcpy_chk.S
+++ b/libc/sysdeps/x86_64/multiarch/mempcpy_chk.S
@@ -1,5 +1,6 @@
/* Multiple versions of __mempcpy_chk
- Copyright (C) 2010 Free Software Foundation, Inc.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2010-2012 Free Software Foundation, Inc.
Contributed by Intel Corporation.
This file is part of the GNU C Library.
diff --git a/libc/sysdeps/x86_64/multiarch/memset.S b/libc/sysdeps/x86_64/multiarch/memset.S
index 1a7fa2dc7..f7c6a9f11 100644
--- a/libc/sysdeps/x86_64/multiarch/memset.S
+++ b/libc/sysdeps/x86_64/multiarch/memset.S
@@ -1,5 +1,6 @@
/* Multiple versions of memset
- Copyright (C) 2010 Free Software Foundation, Inc.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2010-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -33,6 +34,11 @@ ENTRY(memset)
2: ret
END(memset)
+/* Define internal IFUNC memset for bzero. */
+ .globl __libc_memset
+ .hidden __libc_memset
+ __libc_memset = memset
+
# define USE_SSE2 1
# undef ENTRY
diff --git a/libc/sysdeps/x86_64/multiarch/memset_chk.S b/libc/sysdeps/x86_64/multiarch/memset_chk.S
index 47d884114..5a10f1796 100644
--- a/libc/sysdeps/x86_64/multiarch/memset_chk.S
+++ b/libc/sysdeps/x86_64/multiarch/memset_chk.S
@@ -1,5 +1,6 @@
/* Multiple versions of __memset_chk
- Copyright (C) 2010 Free Software Foundation, Inc.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2010-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
diff --git a/libc/sysdeps/x86_64/multiarch/rawmemchr.S b/libc/sysdeps/x86_64/multiarch/rawmemchr.S
index c4157add8..be6ce84c0 100644
--- a/libc/sysdeps/x86_64/multiarch/rawmemchr.S
+++ b/libc/sysdeps/x86_64/multiarch/rawmemchr.S
@@ -1,4 +1,6 @@
-/* Copyright (C) 2009, 2011 Free Software Foundation, Inc.
+/* Multiple versions of rawmemchr
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2009-2012 Free Software Foundation, Inc.
Contributed by Ulrich Drepper <drepper@redhat.com>.
This file is part of the GNU C Library.
@@ -44,6 +46,8 @@ strong_alias (rawmemchr, __rawmemchr)
.section .text.sse4.2,"ax",@progbits
.align 16
.type __rawmemchr_sse42, @function
+ .globl __rawmemchr_sse42
+ .hidden __rawmemchr_sse42
__rawmemchr_sse42:
cfi_startproc
CALL_MCOUNT
@@ -81,6 +85,8 @@ __rawmemchr_sse42:
# define ENTRY(name) \
.type __rawmemchr_sse2, @function; \
.align 16; \
+ .globl __rawmemchr_sse2; \
+ .hidden __rawmemchr_sse2; \
__rawmemchr_sse2: cfi_startproc; \
CALL_MCOUNT
# undef END
diff --git a/libc/sysdeps/x86_64/multiarch/stpcpy.S b/libc/sysdeps/x86_64/multiarch/stpcpy.S
index b63d308ed..ee81ab6ae 100644
--- a/libc/sysdeps/x86_64/multiarch/stpcpy.S
+++ b/libc/sysdeps/x86_64/multiarch/stpcpy.S
@@ -1,3 +1,5 @@
+/* Multiple versions of stpcpy
+ All versions must be listed in ifunc-impl-list.c. */
#define USE_AS_STPCPY
#define STRCPY __stpcpy
#include "strcpy.S"
diff --git a/libc/sysdeps/x86_64/multiarch/stpncpy.S b/libc/sysdeps/x86_64/multiarch/stpncpy.S
index ff89a8949..2698ca6a8 100644
--- a/libc/sysdeps/x86_64/multiarch/stpncpy.S
+++ b/libc/sysdeps/x86_64/multiarch/stpncpy.S
@@ -1,3 +1,5 @@
+/* Multiple versions of stpncpy
+ All versions must be listed in ifunc-impl-list.c. */
#define STRCPY __stpncpy
#define USE_AS_STPCPY
#define USE_AS_STRNCPY
diff --git a/libc/sysdeps/x86_64/multiarch/strcasecmp_l.S b/libc/sysdeps/x86_64/multiarch/strcasecmp_l.S
index 5456b3a49..49f5b9fd9 100644
--- a/libc/sysdeps/x86_64/multiarch/strcasecmp_l.S
+++ b/libc/sysdeps/x86_64/multiarch/strcasecmp_l.S
@@ -1,3 +1,5 @@
+/* Multiple versions of strcasecmp and strcasecmp_l
+ All versions must be listed in ifunc-impl-list.c. */
#define STRCMP __strcasecmp_l
#define USE_AS_STRCASECMP_L
#include "strcmp.S"
diff --git a/libc/sysdeps/x86_64/multiarch/strcasestr-c.c b/libc/sysdeps/x86_64/multiarch/strcasestr-c.c
index 551492d8f..c13a4c44f 100644
--- a/libc/sysdeps/x86_64/multiarch/strcasestr-c.c
+++ b/libc/sysdeps/x86_64/multiarch/strcasestr-c.c
@@ -1,3 +1,6 @@
+/* Multiple versions of strcasestr
+ All versions must be listed in ifunc-impl-list.c. */
+
#include "init-arch.h"
#define STRCASESTR __strcasestr_sse2
diff --git a/libc/sysdeps/x86_64/multiarch/strcat.S b/libc/sysdeps/x86_64/multiarch/strcat.S
index 0c256dee3..ec486680e 100644
--- a/libc/sysdeps/x86_64/multiarch/strcat.S
+++ b/libc/sysdeps/x86_64/multiarch/strcat.S
@@ -1,5 +1,6 @@
/* Multiple versions of strcat
- Copyright (C) 2009, 2011 Free Software Foundation, Inc.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2009-2012 Free Software Foundation, Inc.
Contributed by Intel Corporation.
This file is part of the GNU C Library.
@@ -63,6 +64,8 @@ END(STRCAT)
# define ENTRY(name) \
.type STRCAT_SSE2, @function; \
.align 16; \
+ .globl STRCAT_SSE2; \
+ .hidden STRCAT_SSE2; \
STRCAT_SSE2: cfi_startproc; \
CALL_MCOUNT
# undef END
diff --git a/libc/sysdeps/x86_64/multiarch/strchr.S b/libc/sysdeps/x86_64/multiarch/strchr.S
index b9f88e4bd..5b589bab6 100644
--- a/libc/sysdeps/x86_64/multiarch/strchr.S
+++ b/libc/sysdeps/x86_64/multiarch/strchr.S
@@ -1,5 +1,5 @@
-/* strchr with SSE4.2
- Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+/* Multiple versions of strchr
+ Copyright (C) 2009-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -82,6 +82,8 @@ END(strchr)
.section .text.sse4.2,"ax",@progbits
.align 16
.type __strchr_sse42, @function
+ .globl __strchr_sse42
+ .hidden __strchr_sse42
__strchr_sse42:
cfi_startproc
CALL_MCOUNT
@@ -164,6 +166,8 @@ L(loop_exit):
# define ENTRY(name) \
.type __strchr_sse2, @function; \
.align 16; \
+ .globl __strchr_sse2; \
+ .hidden __strchr_sse2; \
__strchr_sse2: cfi_startproc; \
CALL_MCOUNT
# undef END
diff --git a/libc/sysdeps/x86_64/multiarch/strcmp-sse42.S b/libc/sysdeps/x86_64/multiarch/strcmp-sse42.S
index 9d00bbc5a..e13b8adb7 100644
--- a/libc/sysdeps/x86_64/multiarch/strcmp-sse42.S
+++ b/libc/sysdeps/x86_64/multiarch/strcmp-sse42.S
@@ -1,5 +1,5 @@
/* strcmp with SSE4.2
- Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
+ Copyright (C) 2009-2012 Free Software Foundation, Inc.
Contributed by Intel Corporation.
This file is part of the GNU C Library.
@@ -48,6 +48,8 @@
.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
diff --git a/libc/sysdeps/x86_64/multiarch/strcmp.S b/libc/sysdeps/x86_64/multiarch/strcmp.S
index d366d0969..f64ff46c7 100644
--- a/libc/sysdeps/x86_64/multiarch/strcmp.S
+++ b/libc/sysdeps/x86_64/multiarch/strcmp.S
@@ -1,4 +1,4 @@
-/* strcmp with SSE4.2
+/* Multiple versions of strcmp
Copyright (C) 2009-2012 Free Software Foundation, Inc.
Contributed by Intel Corporation.
This file is part of the GNU C Library.
@@ -171,6 +171,8 @@ weak_alias (__strncasecmp, strncasecmp)
# define ENTRY(name) \
.type STRCMP_SSE2, @function; \
.align 16; \
+ .globl STRCMP_SSE2; \
+ .hidden STRCMP_SSE2; \
STRCMP_SSE2: cfi_startproc; \
CALL_MCOUNT
# undef END
@@ -181,6 +183,8 @@ weak_alias (__strncasecmp, strncasecmp)
# define ENTRY2(name) \
.type __strcasecmp_sse2, @function; \
.align 16; \
+ .globl __strcasecmp_sse2; \
+ .hidden __strcasecmp_sse2; \
__strcasecmp_sse2: cfi_startproc; \
CALL_MCOUNT
# define END2(name) \
@@ -191,6 +195,8 @@ weak_alias (__strncasecmp, strncasecmp)
# define ENTRY2(name) \
.type __strncasecmp_sse2, @function; \
.align 16; \
+ .globl __strncasecmp_sse2; \
+ .hidden __strncasecmp_sse2; \
__strncasecmp_sse2: cfi_startproc; \
CALL_MCOUNT
# define END2(name) \
diff --git a/libc/sysdeps/x86_64/multiarch/strcpy.S b/libc/sysdeps/x86_64/multiarch/strcpy.S
index 7be1b8be7..082d03e9f 100644
--- a/libc/sysdeps/x86_64/multiarch/strcpy.S
+++ b/libc/sysdeps/x86_64/multiarch/strcpy.S
@@ -1,5 +1,6 @@
/* Multiple versions of strcpy
- Copyright (C) 2009, 2011 Free Software Foundation, Inc.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2009-2012 Free Software Foundation, Inc.
Contributed by Intel Corporation.
This file is part of the GNU C Library.
@@ -77,6 +78,8 @@ END(STRCPY)
# define ENTRY(name) \
.type STRCPY_SSE2, @function; \
.align 16; \
+ .globl STRCPY_SSE2; \
+ .hidden STRCPY_SSE2; \
STRCPY_SSE2: cfi_startproc; \
CALL_MCOUNT
# undef END
diff --git a/libc/sysdeps/x86_64/multiarch/strcspn.S b/libc/sysdeps/x86_64/multiarch/strcspn.S
index 715a1c45c..2d35ea6f8 100644
--- a/libc/sysdeps/x86_64/multiarch/strcspn.S
+++ b/libc/sysdeps/x86_64/multiarch/strcspn.S
@@ -1,5 +1,6 @@
/* Multiple versions of strcspn
- Copyright (C) 2009 Free Software Foundation, Inc.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2009-2012 Free Software Foundation, Inc.
Contributed by Intel Corporation.
This file is part of the GNU C Library.
diff --git a/libc/sysdeps/x86_64/multiarch/strlen.S b/libc/sysdeps/x86_64/multiarch/strlen.S
index 0c46b4f40..f93432e12 100644
--- a/libc/sysdeps/x86_64/multiarch/strlen.S
+++ b/libc/sysdeps/x86_64/multiarch/strlen.S
@@ -1,5 +1,6 @@
-/* strlen(str) -- determine the length of the string STR.
- Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
+/* Multiple versions of strlen(str) -- determine the length of the string STR.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2009-2012 Free Software Foundation, Inc.
Contributed by Ulrich Drepper <drepper@redhat.com>.
This file is part of the GNU C Library.
@@ -49,6 +50,8 @@ END(strlen)
# define ENTRY(name) \
.type __strlen_sse2, @function; \
.align 16; \
+ .globl __strlen_sse2; \
+ .hidden __strlen_sse2; \
__strlen_sse2: cfi_startproc; \
CALL_MCOUNT
# undef END
diff --git a/libc/sysdeps/x86_64/multiarch/strncase_l.S b/libc/sysdeps/x86_64/multiarch/strncase_l.S
index c725cd85b..9c0149788 100644
--- a/libc/sysdeps/x86_64/multiarch/strncase_l.S
+++ b/libc/sysdeps/x86_64/multiarch/strncase_l.S
@@ -1,3 +1,5 @@
+/* Multiple versions of strncasecmp and strncasecmp_l
+ All versions must be listed in ifunc-impl-list.c. */
#define STRCMP __strncasecmp_l
#define USE_AS_STRNCASECMP_L
#include "strcmp.S"
diff --git a/libc/sysdeps/x86_64/multiarch/strncat.S b/libc/sysdeps/x86_64/multiarch/strncat.S
index fd569c223..5c1bf4145 100644
--- a/libc/sysdeps/x86_64/multiarch/strncat.S
+++ b/libc/sysdeps/x86_64/multiarch/strncat.S
@@ -1,3 +1,5 @@
+/* Multiple versions of strncat
+ All versions must be listed in ifunc-impl-list.c. */
#define STRCAT strncat
#define USE_AS_STRNCAT
#include "strcat.S"
diff --git a/libc/sysdeps/x86_64/multiarch/strncmp.S b/libc/sysdeps/x86_64/multiarch/strncmp.S
index 0af34e7f1..fd5eb1397 100644
--- a/libc/sysdeps/x86_64/multiarch/strncmp.S
+++ b/libc/sysdeps/x86_64/multiarch/strncmp.S
@@ -1,3 +1,5 @@
+/* Multiple versions of strncmp
+ All versions must be listed in ifunc-impl-list.c. */
#define STRCMP strncmp
#define USE_AS_STRNCMP
#include "strcmp.S"
diff --git a/libc/sysdeps/x86_64/multiarch/strncpy.S b/libc/sysdeps/x86_64/multiarch/strncpy.S
index 327a4ce44..6d87a0ba3 100644
--- a/libc/sysdeps/x86_64/multiarch/strncpy.S
+++ b/libc/sysdeps/x86_64/multiarch/strncpy.S
@@ -1,3 +1,5 @@
+/* Multiple versions of strncpy
+ All versions must be listed in ifunc-impl-list.c. */
#define STRCPY strncpy
#define USE_AS_STRNCPY
#include "strcpy.S"
diff --git a/libc/sysdeps/x86_64/multiarch/strnlen.S b/libc/sysdeps/x86_64/multiarch/strnlen.S
index 044b910c6..4df05fc7d 100644
--- a/libc/sysdeps/x86_64/multiarch/strnlen.S
+++ b/libc/sysdeps/x86_64/multiarch/strnlen.S
@@ -1,5 +1,6 @@
/* multiple version of strnlen
- Copyright (C) 2011 Free Software Foundation, Inc.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2011-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -40,6 +41,8 @@ END(__strnlen)
# define ENTRY(name) \
.type __strnlen_sse2, @function; \
.align 16; \
+ .globl __strnlen_sse2; \
+ .hidden __strnlen_sse2; \
__strnlen_sse2: cfi_startproc; \
CALL_MCOUNT
# undef END
diff --git a/libc/sysdeps/x86_64/multiarch/strpbrk.S b/libc/sysdeps/x86_64/multiarch/strpbrk.S
index ed5bca6a9..7201d6376 100644
--- a/libc/sysdeps/x86_64/multiarch/strpbrk.S
+++ b/libc/sysdeps/x86_64/multiarch/strpbrk.S
@@ -1,3 +1,5 @@
+/* Multiple versions of strpbrk
+ All versions must be listed in ifunc-impl-list.c. */
#define STRCSPN strpbrk
#define USE_AS_STRPBRK
#include "strcspn.S"
diff --git a/libc/sysdeps/x86_64/multiarch/strrchr.S b/libc/sysdeps/x86_64/multiarch/strrchr.S
index c87d8fae0..6e548e504 100644
--- a/libc/sysdeps/x86_64/multiarch/strrchr.S
+++ b/libc/sysdeps/x86_64/multiarch/strrchr.S
@@ -1,5 +1,6 @@
-/* strrchr with SSE4.2
- Copyright (C) 2009 Free Software Foundation, Inc.
+/* Multiple versions of strrchr
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2009-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -87,6 +88,8 @@ END(strrchr)
.section .text.sse4.2,"ax",@progbits
.align 16
.type __strrchr_sse42, @function
+ .globl __strrchr_sse42
+ .hidden __strrchr_sse42
__strrchr_sse42:
cfi_startproc
CALL_MCOUNT
@@ -265,6 +268,8 @@ L(psrldq_table):
# define ENTRY(name) \
.type __strrchr_sse2, @function; \
.align 16; \
+ .globl __strrchr_sse2; \
+ .hidden __strrchr_sse2; \
__strrchr_sse2: cfi_startproc; \
CALL_MCOUNT
# undef END
diff --git a/libc/sysdeps/x86_64/multiarch/strspn.S b/libc/sysdeps/x86_64/multiarch/strspn.S
index 2d7288809..b4ee900c8 100644
--- a/libc/sysdeps/x86_64/multiarch/strspn.S
+++ b/libc/sysdeps/x86_64/multiarch/strspn.S
@@ -1,5 +1,6 @@
/* Multiple versions of strspn
- Copyright (C) 2009 Free Software Foundation, Inc.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2009-2012 Free Software Foundation, Inc.
Contributed by Intel Corporation.
This file is part of the GNU C Library.
diff --git a/libc/sysdeps/x86_64/multiarch/strstr-c.c b/libc/sysdeps/x86_64/multiarch/strstr-c.c
index e05c5f127..bb1f8c915 100644
--- a/libc/sysdeps/x86_64/multiarch/strstr-c.c
+++ b/libc/sysdeps/x86_64/multiarch/strstr-c.c
@@ -1,4 +1,5 @@
/* Multiple versions of strstr.
+ All versions must be listed in ifunc-impl-list.c.
Copyright (C) 2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
diff --git a/libc/sysdeps/x86_64/multiarch/wcscpy.S b/libc/sysdeps/x86_64/multiarch/wcscpy.S
index 194df007c..29261aae6 100644
--- a/libc/sysdeps/x86_64/multiarch/wcscpy.S
+++ b/libc/sysdeps/x86_64/multiarch/wcscpy.S
@@ -1,5 +1,6 @@
/* Multiple versions of wcscpy
- Copyright (C) 2011 Free Software Foundation, Inc.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2011-2012 Free Software Foundation, Inc.
Contributed by Intel Corporation.
This file is part of the GNU C Library.
diff --git a/libc/sysdeps/x86_64/multiarch/wmemcmp.S b/libc/sysdeps/x86_64/multiarch/wmemcmp.S
index 1bb529f04..98a187dc2 100644
--- a/libc/sysdeps/x86_64/multiarch/wmemcmp.S
+++ b/libc/sysdeps/x86_64/multiarch/wmemcmp.S
@@ -1,5 +1,6 @@
/* Multiple versions of wmemcmp
- Copyright (C) 2011 Free Software Foundation, Inc.
+ All versions must be listed in ifunc-impl-list.c.
+ Copyright (C) 2011-2012 Free Software Foundation, Inc.
Contributed by Intel Corporation.
This file is part of the GNU C Library.