x86: Use AVX2 memcpy/memset on Skylake server [BZ #21396]
[glibc.git] / sysdeps / x86_64 / multiarch / mempcpy.S
blobb8b2b28094a6fac69125de060fc33f71826e5bc1
1 /* Multiple versions of mempcpy
2    All versions must be listed in ifunc-impl-list.c.
3    Copyright (C) 2010-2017 Free Software Foundation, Inc.
4    Contributed by Intel Corporation.
5    This file is part of the GNU C Library.
7    The GNU C Library is free software; you can redistribute it and/or
8    modify it under the terms of the GNU Lesser General Public
9    License as published by the Free Software Foundation; either
10    version 2.1 of the License, or (at your option) any later version.
12    The GNU C Library is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15    Lesser General Public License for more details.
17    You should have received a copy of the GNU Lesser General Public
18    License along with the GNU C Library; if not, see
19    <http://www.gnu.org/licenses/>.  */
21 #include <sysdep.h>
22 #include <init-arch.h>
24 /* Define multiple versions only for the definition in lib and for
25    DSO.  In static binaries we need mempcpy before the initialization
26    happened.  */
27 #if defined SHARED && IS_IN (libc)
28         .text
29 ENTRY(__mempcpy)
30         .type   __mempcpy, @gnu_indirect_function
31         LOAD_RTLD_GLOBAL_RO_RDX
32         lea     __mempcpy_erms(%rip), %RAX_LP
33         HAS_ARCH_FEATURE (Prefer_ERMS)
34         jnz     2f
35         HAS_ARCH_FEATURE (Prefer_No_AVX512)
36         jnz     1f
37         HAS_ARCH_FEATURE (AVX512F_Usable)
38         jz      1f
39         lea     __mempcpy_avx512_no_vzeroupper(%rip), %RAX_LP
40         HAS_ARCH_FEATURE (Prefer_No_VZEROUPPER)
41         jnz     2f
42         lea     __mempcpy_avx512_unaligned_erms(%rip), %RAX_LP
43         HAS_CPU_FEATURE (ERMS)
44         jnz     2f
45         lea     __mempcpy_avx512_unaligned(%rip), %RAX_LP
46         ret
47 1:      lea     __mempcpy_avx_unaligned(%rip), %RAX_LP
48         HAS_ARCH_FEATURE (AVX_Fast_Unaligned_Load)
49         jz      L(Fast_Unaligned_Load)
50         HAS_CPU_FEATURE (ERMS)
51         jz      2f
52         lea     __mempcpy_avx_unaligned_erms(%rip), %RAX_LP
53         ret
54 L(Fast_Unaligned_Load):
55         lea     __mempcpy_sse2_unaligned(%rip), %RAX_LP
56         HAS_ARCH_FEATURE (Fast_Unaligned_Copy)
57         jz      L(SSSE3)
58         HAS_CPU_FEATURE (ERMS)
59         jz      2f
60         lea     __mempcpy_sse2_unaligned_erms(%rip), %RAX_LP
61         ret
62 L(SSSE3):
63         HAS_CPU_FEATURE (SSSE3)
64         jz      2f
65         lea    __mempcpy_ssse3_back(%rip), %RAX_LP
66         HAS_ARCH_FEATURE (Fast_Copy_Backward)
67         jnz     2f
68         lea     __mempcpy_ssse3(%rip), %RAX_LP
69 2:      ret
70 END(__mempcpy)
72 weak_alias (__mempcpy, mempcpy)
73 #endif