Check Prefer_ERMS in memmove/memcpy/mempcpy/memset
[glibc.git] / sysdeps / x86_64 / multiarch / mempcpy.S
blob4011a1a4f0ca0f8276edd59cbd57b2bdbbf21473
1 /* Multiple versions of mempcpy
2    All versions must be listed in ifunc-impl-list.c.
3    Copyright (C) 2010-2016 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 # ifdef HAVE_AVX512_ASM_SUPPORT
36         HAS_ARCH_FEATURE (AVX512F_Usable)
37         jz      1f
38         lea     __mempcpy_avx512_no_vzeroupper(%rip), %RAX_LP
39         HAS_ARCH_FEATURE (Prefer_No_VZEROUPPER)
40         jnz     2f
41         lea     __mempcpy_avx512_unaligned_erms(%rip), %RAX_LP
42         HAS_CPU_FEATURE (ERMS)
43         jnz     2f
44         lea     __mempcpy_avx512_unaligned(%rip), %RAX_LP
45         ret
46 # endif
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