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)
|
ifeq ($(subdir),wcsmbs)
|
||||||
|
|
||||||
sysdep_routines += \
|
sysdep_routines += \
|
||||||
|
wcscpy-generic \
|
||||||
wcsncmp-generic \
|
wcsncmp-generic \
|
||||||
wcsnlen-generic \
|
wcsnlen-generic \
|
||||||
# sysdep_routines
|
# sysdep_routines
|
||||||
|
@ -134,7 +134,6 @@ sysdep_routines += \
|
|||||||
wcscmp-avx2-rtm \
|
wcscmp-avx2-rtm \
|
||||||
wcscmp-evex \
|
wcscmp-evex \
|
||||||
wcscmp-sse2 \
|
wcscmp-sse2 \
|
||||||
wcscpy-generic \
|
|
||||||
wcscpy-ssse3 \
|
wcscpy-ssse3 \
|
||||||
wcslen-avx2 \
|
wcslen-avx2 \
|
||||||
wcslen-avx2-rtm \
|
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. */
|
/* Support sysdeps/x86_64/multiarch/wcscpy.c. */
|
||||||
IFUNC_IMPL (i, name, wcscpy,
|
IFUNC_IMPL (i, name, wcscpy,
|
||||||
IFUNC_IMPL_ADD (array, i, wcscpy, CPU_FEATURE_USABLE (SSSE3),
|
/* ISA V4 wrapper for SSSE3 implementation because
|
||||||
__wcscpy_ssse3)
|
the SSSE3 implementation is also used at ISA
|
||||||
IFUNC_IMPL_ADD (array, i, wcscpy, 1, __wcscpy_generic))
|
level 3/4. */
|
||||||
|
X86_IFUNC_IMPL_ADD_V4 (array, i, wcscpy,
|
||||||
|
CPU_FEATURE_USABLE (SSSE3),
|
||||||
|
__wcscpy_ssse3)
|
||||||
|
X86_IFUNC_IMPL_ADD_V1 (array, i, wcscpy,
|
||||||
|
1,
|
||||||
|
__wcscpy_generic))
|
||||||
|
|
||||||
/* Support sysdeps/x86_64/multiarch/wcslen.c. */
|
/* Support sysdeps/x86_64/multiarch/wcslen.c. */
|
||||||
IFUNC_IMPL (i, name, wcslen,
|
IFUNC_IMPL (i, name, wcslen,
|
||||||
|
@ -17,8 +17,11 @@
|
|||||||
<https://www.gnu.org/licenses/>. */
|
<https://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
|
||||||
#if IS_IN (libc)
|
#include <isa-level.h>
|
||||||
# define WCSCPY __wcscpy_generic
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <wcsmbs/wcscpy.c>
|
#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
|
License along with the GNU C Library; if not, see
|
||||||
<https://www.gnu.org/licenses/>. */
|
<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>
|
# include <sysdep.h>
|
||||||
|
|
||||||
.section .text.ssse3,"ax",@progbits
|
.section .text.ssse3,"ax",@progbits
|
||||||
ENTRY (__wcscpy_ssse3)
|
ENTRY (WCSCPY)
|
||||||
|
|
||||||
mov %rsi, %rcx
|
mov %rsi, %rcx
|
||||||
mov %rdi, %rdx
|
mov %rdi, %rdx
|
||||||
@ -547,5 +557,5 @@ L(Exit16):
|
|||||||
mov %rdi, %rax
|
mov %rdi, %rax
|
||||||
ret
|
ret
|
||||||
|
|
||||||
END(__wcscpy_ssse3)
|
END(WCSCPY)
|
||||||
#endif
|
#endif
|
||||||
|
@ -26,15 +26,16 @@
|
|||||||
# define SYMBOL_NAME wcscpy
|
# define SYMBOL_NAME wcscpy
|
||||||
# include <init-arch.h>
|
# 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 (ssse3) attribute_hidden;
|
||||||
|
|
||||||
|
extern __typeof (REDIRECT_NAME) OPTIMIZE (generic) attribute_hidden;
|
||||||
|
|
||||||
static inline void *
|
static inline void *
|
||||||
IFUNC_SELECTOR (void)
|
IFUNC_SELECTOR (void)
|
||||||
{
|
{
|
||||||
const struct cpu_features* cpu_features = __get_cpu_features ();
|
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 (ssse3);
|
||||||
|
|
||||||
return OPTIMIZE (generic);
|
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