mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-25 14:30:06 +00:00
x86: Add support to build wcscpy with explicit ISA level
1. Add ISA level build guards to different implementations. - wcscpy-ssse3.S is used as ISA level 2/3/4. - wcscpy-generic.c is only used at ISA level 1 and will only build if compiled with ISA level == 1. Otherwise there is no reason to include it as we will always use wcscpy-ssse3.S 2. Refactor the ifunc selector and ifunc implementation list to use the ISA level aware wrapper macros that allow functions below the compiled ISA level (with a guranteed replacement) to be skipped. Tested with and without multiarch on x86_64 for ISA levels: {generic, x86-64-v2, x86-64-v3, x86-64-v4} And m32 with and without multiarch.
This commit is contained in:
parent
ceabdcd130
commit
192979ee35
@ -199,6 +199,7 @@ endif
|
||||
ifeq ($(subdir),wcsmbs)
|
||||
|
||||
sysdep_routines += \
|
||||
wcscpy-generic \
|
||||
wcsncmp-generic \
|
||||
wcsnlen-generic \
|
||||
# sysdep_routines
|
||||
|
@ -134,7 +134,6 @@ sysdep_routines += \
|
||||
wcscmp-avx2-rtm \
|
||||
wcscmp-evex \
|
||||
wcscmp-sse2 \
|
||||
wcscpy-generic \
|
||||
wcscpy-ssse3 \
|
||||
wcslen-avx2 \
|
||||
wcslen-avx2-rtm \
|
||||
|
@ -791,9 +791,15 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
|
||||
|
||||
/* Support sysdeps/x86_64/multiarch/wcscpy.c. */
|
||||
IFUNC_IMPL (i, name, wcscpy,
|
||||
IFUNC_IMPL_ADD (array, i, wcscpy, CPU_FEATURE_USABLE (SSSE3),
|
||||
/* ISA V4 wrapper for SSSE3 implementation because
|
||||
the SSSE3 implementation is also used at ISA
|
||||
level 3/4. */
|
||||
X86_IFUNC_IMPL_ADD_V4 (array, i, wcscpy,
|
||||
CPU_FEATURE_USABLE (SSSE3),
|
||||
__wcscpy_ssse3)
|
||||
IFUNC_IMPL_ADD (array, i, wcscpy, 1, __wcscpy_generic))
|
||||
X86_IFUNC_IMPL_ADD_V1 (array, i, wcscpy,
|
||||
1,
|
||||
__wcscpy_generic))
|
||||
|
||||
/* Support sysdeps/x86_64/multiarch/wcslen.c. */
|
||||
IFUNC_IMPL (i, name, wcslen,
|
||||
|
@ -17,8 +17,11 @@
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
|
||||
#if IS_IN (libc)
|
||||
# define WCSCPY __wcscpy_generic
|
||||
#endif
|
||||
#include <isa-level.h>
|
||||
|
||||
#if ISA_SHOULD_BUILD (1)
|
||||
|
||||
# define WCSCPY __wcscpy_generic
|
||||
# include <wcsmbs/wcscpy.c>
|
||||
|
||||
#endif
|
||||
|
@ -16,11 +16,21 @@
|
||||
License along with the GNU C Library; if not, see
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
#if IS_IN (libc)
|
||||
#include <isa-level.h>
|
||||
|
||||
/* MINIMUM_X86_ISA_LEVEL <= 4 because there are not V3/V4
|
||||
implementations so we need this to build for ISA V3/V4
|
||||
builds. */
|
||||
#if ISA_SHOULD_BUILD (4)
|
||||
|
||||
# ifndef WCSCPY
|
||||
# define WCSCPY __wcscpy_ssse3
|
||||
# endif
|
||||
|
||||
# include <sysdep.h>
|
||||
|
||||
.section .text.ssse3,"ax",@progbits
|
||||
ENTRY (__wcscpy_ssse3)
|
||||
ENTRY (WCSCPY)
|
||||
|
||||
mov %rsi, %rcx
|
||||
mov %rdi, %rdx
|
||||
@ -547,5 +557,5 @@ L(Exit16):
|
||||
mov %rdi, %rax
|
||||
ret
|
||||
|
||||
END(__wcscpy_ssse3)
|
||||
END(WCSCPY)
|
||||
#endif
|
||||
|
@ -26,15 +26,16 @@
|
||||
# define SYMBOL_NAME wcscpy
|
||||
# include <init-arch.h>
|
||||
|
||||
extern __typeof (REDIRECT_NAME) OPTIMIZE (generic) attribute_hidden;
|
||||
extern __typeof (REDIRECT_NAME) OPTIMIZE (ssse3) attribute_hidden;
|
||||
|
||||
extern __typeof (REDIRECT_NAME) OPTIMIZE (generic) attribute_hidden;
|
||||
|
||||
static inline void *
|
||||
IFUNC_SELECTOR (void)
|
||||
{
|
||||
const struct cpu_features* cpu_features = __get_cpu_features ();
|
||||
|
||||
if (CPU_FEATURE_USABLE_P (cpu_features, SSSE3))
|
||||
if (X86_ISA_CPU_FEATURE_USABLE_P (cpu_features, SSSE3))
|
||||
return OPTIMIZE (ssse3);
|
||||
|
||||
return OPTIMIZE (generic);
|
||||
|
31
sysdeps/x86_64/wcscpy-generic.c
Normal file
31
sysdeps/x86_64/wcscpy-generic.c
Normal file
@ -0,0 +1,31 @@
|
||||
/* wcscpy dispatch for RTLD and non-multiarch .c ISA level 1 build.
|
||||
Copyright (C) 2022 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
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* wcscpy non-multiarch build is split into two files,
|
||||
wcscpy-generic.c and wcscpy.S. The wcscpy-generic.c build is for
|
||||
ISA level <= 1 and just uses wcsmbs/wcscpy.c. This must be split
|
||||
into two files because we cannot include C code from assembly or
|
||||
vice versa. */
|
||||
|
||||
#include <isa-level.h>
|
||||
|
||||
#if MINIMUM_X86_ISA_LEVEL <= 1
|
||||
|
||||
# include "wcsmbs/wcscpy.c"
|
||||
|
||||
#endif
|
40
sysdeps/x86_64/wcscpy.S
Normal file
40
sysdeps/x86_64/wcscpy.S
Normal file
@ -0,0 +1,40 @@
|
||||
/* wcscpy dispatch for RTLD and non-multiarch .c files
|
||||
Copyright (C) 2022 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
|
||||
<https://www.gnu.org/licenses/>. */
|
||||
|
||||
/* wcscpy non-multiarch build is split into two files,
|
||||
wcscpy-generic.c and wcscpy.S. The wcscpy.S build is for
|
||||
ISA level >= 2 uses the optimized assembly implementations in
|
||||
multiarch/wcscpy*.S. This must be split into two files because
|
||||
we cannot include C code from assembly or vice versa. */
|
||||
|
||||
#include <isa-level.h>
|
||||
|
||||
#if MINIMUM_X86_ISA_LEVEL >= 2
|
||||
|
||||
# define WCSCPY __wcscpy
|
||||
|
||||
# define DEFAULT_IMPL_V2 "multiarch/wcscpy-ssse3.S"
|
||||
/* isa-default-impl.h expects DEFAULT_IMPL_V1 to be defined but it
|
||||
should never be used from here. */
|
||||
# define DEFAULT_IMPL_V1 "ERROR -- Invalid ISA IMPL"
|
||||
|
||||
# include "isa-default-impl.h"
|
||||
|
||||
weak_alias (__wcscpy, wcscpy)
|
||||
libc_hidden_def (__wcscpy)
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user