x86: Add evex optimized functions for the wchar_t strcpy family

Implemented:
    wcscat-evex  (+ 905 bytes)
    wcscpy-evex  (+ 674 bytes)
    wcpcpy-evex  (+ 709 bytes)
    wcsncpy-evex (+1358 bytes)
    wcpncpy-evex (+1467 bytes)
    wcsncat-evex (+1213 bytes)

Performance Changes:
    Times are from N = 10 runs of the benchmark suite and are reported
    as geometric mean of all ratios of New Implementation / Best Old
    Implementation. Best Old Implementation was determined with the
    highest ISA implementation.

    wcscat-evex     -> 0.991
    wcscpy-evex     -> 0.587
    wcpcpy-evex     -> 0.695
    wcsncpy-evex    -> 0.719
    wcpncpy-evex    -> 0.694
    wcsncat-evex    -> 0.979

Code Size Changes:
    This change  increase the size of libc.so by ~6.3kb bytes. For
    reference the patch optimizing the normal strcpy family functions
    decreases libc.so by ~5.7kb.

Full check passes on x86-64 and build succeeds for all ISA levels w/
and w/o multiarch.
This commit is contained in:
Noah Goldstein 2022-11-08 17:38:40 -08:00
parent 642933158e
commit 64b8b6516b
33 changed files with 858 additions and 7 deletions

View File

@ -188,8 +188,13 @@ endif
ifeq ($(subdir),wcsmbs)
sysdep_routines += \
wcpcpy-generic \
wcpncpy-generic \
wcscat-generic \
wcscpy-generic \
wcsncat-generic \
wcsncmp-generic \
wcsncpy-generic \
wcsnlen-generic \
# sysdep_routines

View File

@ -131,6 +131,12 @@ endif
ifeq ($(subdir),wcsmbs)
sysdep_routines += \
wcpcpy-evex \
wcpcpy-generic \
wcpncpy-evex \
wcpncpy-generic \
wcscat-evex \
wcscat-generic \
wcschr-avx2 \
wcschr-avx2-rtm \
wcschr-evex \
@ -140,6 +146,8 @@ sysdep_routines += \
wcscmp-avx2-rtm \
wcscmp-evex \
wcscmp-sse2 \
wcscpy-evex \
wcscpy-generic \
wcscpy-ssse3 \
wcslen-avx2 \
wcslen-avx2-rtm \
@ -147,9 +155,13 @@ sysdep_routines += \
wcslen-evex512 \
wcslen-sse2 \
wcslen-sse4_1 \
wcsncat-evex \
wcsncat-generic \
wcsncmp-avx2 \
wcsncmp-avx2-rtm \
wcsncmp-evex \
wcsncpy-evex \
wcsncpy-generic \
wcsnlen-avx2 \
wcsnlen-avx2-rtm \
wcsnlen-evex \
@ -163,8 +175,8 @@ sysdep_routines += \
wmemchr-avx2 \
wmemchr-avx2-rtm \
wmemchr-evex \
wmemchr-evex512 \
wmemchr-evex-rtm \
wmemchr-evex512 \
wmemchr-sse2 \
wmemcmp-avx2-movbe \
wmemcmp-avx2-movbe-rtm \

View File

@ -901,16 +901,73 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
/* Support sysdeps/x86_64/multiarch/wcscpy.c. */
IFUNC_IMPL (i, name, wcscpy,
/* 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 (AVX512VL)
&& CPU_FEATURE_USABLE (AVX512BW)
&& CPU_FEATURE_USABLE (BMI2)),
__wcscpy_evex)
X86_IFUNC_IMPL_ADD_V3 (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/wcsncpy.c. */
IFUNC_IMPL (i, name, wcsncpy,
X86_IFUNC_IMPL_ADD_V4 (array, i, wcsncpy,
(CPU_FEATURE_USABLE (AVX512VL)
&& CPU_FEATURE_USABLE (AVX512BW)
&& CPU_FEATURE_USABLE (BMI2)),
__wcsncpy_evex)
X86_IFUNC_IMPL_ADD_V3 (array, i, wcpncpy,
1,
__wcsncpy_generic))
/* Support sysdeps/x86_64/multiarch/wcpcpy.c. */
IFUNC_IMPL (i, name, wcpcpy,
X86_IFUNC_IMPL_ADD_V4 (array, i, wcpcpy,
(CPU_FEATURE_USABLE (AVX512VL)
&& CPU_FEATURE_USABLE (AVX512BW)
&& CPU_FEATURE_USABLE (BMI2)),
__wcpcpy_evex)
X86_IFUNC_IMPL_ADD_V3 (array, i, wcpcpy,
1,
__wcpcpy_generic))
/* Support sysdeps/x86_64/multiarch/wcpncpy.c. */
IFUNC_IMPL (i, name, wcpncpy,
X86_IFUNC_IMPL_ADD_V4 (array, i, wcpncpy,
(CPU_FEATURE_USABLE (AVX512VL)
&& CPU_FEATURE_USABLE (AVX512BW)
&& CPU_FEATURE_USABLE (BMI2)),
__wcpncpy_evex)
X86_IFUNC_IMPL_ADD_V3 (array, i, wcsncpy,
1,
__wcpncpy_generic))
/* Support sysdeps/x86_64/multiarch/wcscat.c. */
IFUNC_IMPL (i, name, wcscat,
X86_IFUNC_IMPL_ADD_V4 (array, i, wcscat,
(CPU_FEATURE_USABLE (AVX512VL)
&& CPU_FEATURE_USABLE (AVX512BW)
&& CPU_FEATURE_USABLE (BMI2)),
__wcscat_evex)
X86_IFUNC_IMPL_ADD_V3 (array, i, wcscat,
1,
__wcscat_generic))
/* Support sysdeps/x86_64/multiarch/wcsncat.c. */
IFUNC_IMPL (i, name, wcsncat,
X86_IFUNC_IMPL_ADD_V4 (array, i, wcsncat,
(CPU_FEATURE_USABLE (AVX512VL)
&& CPU_FEATURE_USABLE (AVX512BW)
&& CPU_FEATURE_USABLE (BMI2)),
__wcsncat_evex)
X86_IFUNC_IMPL_ADD_V3 (array, i, wcsncat,
1,
__wcsncat_generic))
/* Support sysdeps/x86_64/multiarch/wcslen.c. */
IFUNC_IMPL (i, name, wcslen,
X86_IFUNC_IMPL_ADD_V4 (array, i, wcslen,

View File

@ -0,0 +1,48 @@
/* Common definition for ifunc selections optimized wide-character
string copy functions.
All versions must be listed in ifunc-impl-list.c.
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/>. */
#include <init-arch.h>
#ifndef GENERIC
# define GENERIC generic
#endif
extern __typeof (REDIRECT_NAME) OPTIMIZE (evex) 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 (X86_ISA_CPU_FEATURE_USABLE_P (cpu_features, AVX2)
&& X86_ISA_CPU_FEATURE_USABLE_P (cpu_features, BMI2)
&& X86_ISA_CPU_FEATURES_ARCH_P (cpu_features,
AVX_Fast_Unaligned_Load, ))
{
if (X86_ISA_CPU_FEATURE_USABLE_P (cpu_features, AVX512VL)
&& X86_ISA_CPU_FEATURE_USABLE_P (cpu_features, AVX512BW))
return OPTIMIZE (evex);
}
return OPTIMIZE (GENERIC);
}

View File

@ -0,0 +1,8 @@
#ifndef WCPCPY
# define WCPCPY __wcpcpy_evex
#endif
#define USE_AS_STPCPY
#define USE_AS_WCSCPY
#define STRCPY WCPCPY
#include "strcpy-evex.S"

View File

@ -0,0 +1,27 @@
/* wcpcpy.
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/>. */
/* We always need to build this implementation as strspn-sse4 needs to
be able to fallback to it. */
#include <isa-level.h>
#if ISA_SHOULD_BUILD (3)
# define WCPCPY __wcpcpy_generic
# include <wcsmbs/wcpcpy.c>
#endif

View File

@ -0,0 +1,37 @@
/* Multiple versions of wcpcpy.
All versions must be listed in ifunc-impl-list.c.
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/>. */
/* Define multiple versions only for the definition in libc. */
#if IS_IN (libc)
# define __wcpcpy __redirect_wcpcpy
# include <wchar.h>
# undef __wcpcpy
# define SYMBOL_NAME wcpcpy
# include <init-arch.h>
# include "ifunc-wcs.h"
libc_ifunc_redirected (__redirect_wcpcpy, __wcpcpy, IFUNC_SELECTOR ());
weak_alias (__wcpcpy, wcpcpy)
# ifdef SHARED
__hidden_ver1 (__wcpcpy, __GI___wcpcpy, __redirect_wcpcpy)
__attribute__((visibility ("hidden"))) __attribute_copy__ (wcpcpy);
# endif
#endif

View File

@ -0,0 +1,8 @@
#ifndef WCPNCPY
# define WCPNCPY __wcpncpy_evex
#endif
#define USE_AS_WCSCPY
#define USE_AS_STPCPY
#define STRNCPY WCPNCPY
#include "strncpy-evex.S"

View File

@ -0,0 +1,27 @@
/* wcpncpy.
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/>. */
/* We always need to build this implementation as strspn-sse4 needs to
be able to fallback to it. */
#include <isa-level.h>
#if ISA_SHOULD_BUILD (3)
# define WCPNCPY __wcpncpy_generic
# include <wcsmbs/wcpncpy.c>
#endif

View File

@ -0,0 +1,37 @@
/* Multiple versions of wcpncpy.
All versions must be listed in ifunc-impl-list.c.
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/>. */
/* Define multiple versions only for the definition in libc. */
#if IS_IN (libc)
# define __wcpncpy __redirect_wcpncpy
# include <wchar.h>
# undef __wcpncpy
# define SYMBOL_NAME wcpncpy
# include <init-arch.h>
# include "ifunc-wcs.h"
libc_ifunc_redirected (__redirect_wcpncpy, __wcpncpy, IFUNC_SELECTOR ());
weak_alias (__wcpncpy, wcpncpy)
# ifdef SHARED
__hidden_ver1 (__wcpncpy, __GI___wcpncpy, __redirect_wcpncpy)
__attribute__((visibility ("hidden"))) __attribute_copy__ (wcpncpy);
# endif
#endif

View File

@ -0,0 +1,9 @@
#ifndef WCSCAT
# define WCSCAT __wcscat_evex
#endif
#define USE_AS_WCSCPY
#define USE_AS_STRCAT
#define STRCPY WCSCAT
#include "strcpy-evex.S"

View File

@ -0,0 +1,27 @@
/* wcscat.
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/>. */
/* We always need to build this implementation as strspn-sse4 needs to
be able to fallback to it. */
#include <isa-level.h>
#if ISA_SHOULD_BUILD (3)
# define WCSCAT __wcscat_generic
# include <wcsmbs/wcscat.c>
#endif

View File

@ -0,0 +1,37 @@
/* Multiple versions of wcscat.
All versions must be listed in ifunc-impl-list.c.
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/>. */
/* Define multiple versions only for the definition in libc. */
#if IS_IN (libc)
# define __wcscat __redirect_wcscat
# include <wchar.h>
# undef __wcscat
# define SYMBOL_NAME wcscat
# include <init-arch.h>
# include "ifunc-wcs.h"
libc_ifunc_redirected (__redirect_wcscat, __wcscat, IFUNC_SELECTOR ());
weak_alias (__wcscat, wcscat)
# ifdef SHARED
__hidden_ver1 (__wcscat, __GI___wcscat, __redirect_wcscat)
__attribute__((visibility ("hidden"))) __attribute_copy__ (wcscat);
# endif
#endif

View File

@ -0,0 +1,7 @@
#ifndef WCSCPY
# define WCSCPY __wcscpy_evex
#endif
#define USE_AS_WCSCPY
#define STRCPY WCSCPY
#include "strcpy-evex.S"

View File

@ -18,8 +18,7 @@
#include <isa-level.h>
#if ISA_SHOULD_BUILD (1)
#if ISA_SHOULD_BUILD (3)
# define WCSCPY __wcscpy_generic
# include <wcsmbs/wcscpy.c>

View File

@ -26,6 +26,8 @@
# define SYMBOL_NAME wcscpy
# include <init-arch.h>
extern __typeof (REDIRECT_NAME) OPTIMIZE (evex) attribute_hidden;
extern __typeof (REDIRECT_NAME) OPTIMIZE (ssse3) attribute_hidden;
extern __typeof (REDIRECT_NAME) OPTIMIZE (generic) attribute_hidden;
@ -35,6 +37,15 @@ IFUNC_SELECTOR (void)
{
const struct cpu_features* cpu_features = __get_cpu_features ();
if (X86_ISA_CPU_FEATURE_USABLE_P (cpu_features, AVX2)
&& X86_ISA_CPU_FEATURE_USABLE_P (cpu_features, BMI2)
&& X86_ISA_CPU_FEATURES_ARCH_P (cpu_features, AVX_Fast_Unaligned_Load, ))
{
if (X86_ISA_CPU_FEATURE_USABLE_P (cpu_features, AVX512VL)
&& X86_ISA_CPU_FEATURE_USABLE_P (cpu_features, AVX512BW))
return OPTIMIZE (evex);
}
if (X86_ISA_CPU_FEATURE_USABLE_P (cpu_features, SSSE3))
return OPTIMIZE (ssse3);

View File

@ -0,0 +1,9 @@
#ifndef WCSCAT
# define WCSCAT __wcsncat_evex
#endif
#define USE_AS_WCSCPY
#define USE_AS_STRCAT
#define STRNCAT WCSCAT
#include "strncat-evex.S"

View File

@ -0,0 +1,27 @@
/* wcsncat.
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/>. */
/* We always need to build this implementation as strspn-sse4 needs to
be able to fallback to it. */
#include <isa-level.h>
#if ISA_SHOULD_BUILD (3)
# define WCSNCAT __wcsncat_generic
# include <wcsmbs/wcsncat.c>
#endif

View File

@ -0,0 +1,34 @@
/* Multiple versions of wcsncat.
All versions must be listed in ifunc-impl-list.c.
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/>. */
/* Define multiple versions only for the definition in libc. */
#if IS_IN (libc)
# define wcsncat __redirect_wcsncat
# include <wchar.h>
# undef wcsncat
# define SYMBOL_NAME wcsncat
# include "ifunc-wcs.h"
libc_ifunc_redirected (__redirect_wcsncat, wcsncat, IFUNC_SELECTOR ());
# ifdef SHARED
__hidden_ver1 (wcsncat, __GI_wcsncat, __redirect_wcsncat)
__attribute__((visibility ("hidden"))) __attribute_copy__ (wcsncat);
# endif
#endif

View File

@ -0,0 +1,7 @@
#ifndef WCSNCPY
# define WCSNCPY __wcsncpy_evex
#endif
#define USE_AS_WCSCPY
#define STRNCPY WCSNCPY
#include "strncpy-evex.S"

View File

@ -0,0 +1,27 @@
/* wcsncpy.
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/>. */
/* We always need to build this implementation as strspn-sse4 needs to
be able to fallback to it. */
#include <isa-level.h>
#if ISA_SHOULD_BUILD (3)
# define WCSNCPY __wcsncpy_generic
# include <wcsmbs/wcsncpy.c>
#endif

View File

@ -0,0 +1,37 @@
/* Multiple versions of wcsncpy.
All versions must be listed in ifunc-impl-list.c.
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/>. */
/* Define multiple versions only for the definition in libc. */
#if IS_IN (libc)
# define __wcsncpy __redirect_wcsncpy
# include <wchar.h>
# undef __wcsncpy
# define SYMBOL_NAME wcsncpy
# include <init-arch.h>
# include "ifunc-wcs.h"
libc_ifunc_redirected (__redirect_wcsncpy, __wcsncpy, IFUNC_SELECTOR ());
weak_alias (__wcsncpy, wcsncpy)
# ifdef SHARED
__hidden_ver1 (__wcsncpy, __GI___wcsncpy, __redirect_wcsncpy)
__attribute__((visibility ("hidden"))) __attribute_copy__ (wcsncpy);
# endif
#endif

View File

@ -0,0 +1,31 @@
/* ISA level static dispatch for wcpcpy .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/>. */
/* wcpcpy non-multiarch build is split into two files,
wcpcpy-generic.c and wcpcpy.S. The wcpcpy-generic.c build is
for ISA level <= 1 and just uses multiarch/wcpcpy-generic.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 <= 3
# include <wcsmbs/wcpcpy.c>
#endif

40
sysdeps/x86_64/wcpcpy.S Normal file
View File

@ -0,0 +1,40 @@
/* ISA level static dispatch for wcpcpy .S 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/>. */
/* wcpcpy non-multiarch build is split into two files,
wcpcpy-generic.c and wcpcpy.S. The wcpcpy-generic.c build is
for ISA level <= 1 and just uses multiarch/wcpcpy-generic.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 >= 4
# define WCPCPY __wcpcpy
# define DEFAULT_IMPL_V4 "multiarch/wcpcpy-evex.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 (__wcpcpy, wcpcpy)
libc_hidden_def (__wcpcpy)
#endif

View File

@ -0,0 +1,31 @@
/* ISA level static dispatch for wcpncpy .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/>. */
/* wcpncpy non-multiarch build is split into two files,
wcpncpy-generic.c and wcpncpy.S. The wcpncpy-generic.c build is
for ISA level <= 1 and just uses multiarch/wcpncpy-generic.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 <= 3
# include <wcsmbs/wcpncpy.c>
#endif

40
sysdeps/x86_64/wcpncpy.S Normal file
View File

@ -0,0 +1,40 @@
/* ISA level static dispatch for wcpcpy .S 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/>. */
/* wcpncpy non-multiarch build is split into two files,
wcpncpy-generic.c and wcpncpy.S. The wcpncpy-generic.c build is
for ISA level <= 1 and just uses multiarch/wcpncpy-generic.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 >= 4
# define WCPNCPY __wcpncpy
# define DEFAULT_IMPL_V4 "multiarch/wcpncpy-evex.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 (__wcpncpy, wcpncpy)
libc_hidden_def (__wcpncpy)
#endif

View File

@ -0,0 +1,31 @@
/* ISA level static dispatch for wcscat .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/>. */
/* wcscat non-multiarch build is split into two files,
wcscat-generic.c and wcscat.S. The wcscat-generic.c build is
for ISA level <= 1 and just uses multiarch/wcscat-generic.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 <= 3
# include <wcsmbs/wcscat.c>
#endif

40
sysdeps/x86_64/wcscat.S Normal file
View File

@ -0,0 +1,40 @@
/* ISA level static dispatch for wcscat .S 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/>. */
/* wcscat non-multiarch build is split into two files,
wcscat-generic.c and wcscat.S. The wcscat-generic.c build is
for ISA level <= 1 and just uses multiarch/wcscat-generic.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 >= 4
# define WCSCAT __wcscat
# define DEFAULT_IMPL_V4 "multiarch/wcscat-evex.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 (__wcscat, wcscat)
libc_hidden_def (__wcscat)
#endif

View File

@ -1,4 +1,4 @@
/* wcscpy dispatch for RTLD and non-multiarch .c files
/* ISA level static dispatch for wcscpy .S files.
Copyright (C) 2022 Free Software Foundation, Inc.
This file is part of the GNU C Library.
@ -28,6 +28,7 @@
# define WCSCPY __wcscpy
# define DEFAULT_IMPL_V4 "multiarch/wcscpy-evex.S"
# 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. */

View File

@ -0,0 +1,31 @@
/* ISA level static dispatch for wcsncat .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/>. */
/* wcsncat non-multiarch build is split into two files,
wcsncat-generic.c and wcsncat.S. The wcsncat-generic.c build is
for ISA level <= 1 and just uses multiarch/wcsncat-generic.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 <= 3
# include <wcsmbs/wcsncat.c>
#endif

38
sysdeps/x86_64/wcsncat.S Normal file
View File

@ -0,0 +1,38 @@
/* ISA level static dispatch for wcsncat .S 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/>. */
/* wcsncat non-multiarch build is split into two files,
wcsncat-generic.c and wcsncat.S. The wcsncat-generic.c build is
for ISA level <= 1 and just uses multiarch/wcsncat-generic.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 >= 4
# define WCSNCAT wcsncat
# define DEFAULT_IMPL_V4 "multiarch/wcsncat-evex.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"
#endif

View File

@ -0,0 +1,31 @@
/* ISA level static dispatch for wcsncpy .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/>. */
/* wcsncpy non-multiarch build is split into two files,
wcsncpy-generic.c and wcsncpy.S. The wcsncpy-generic.c build is
for ISA level <= 1 and just uses multiarch/wcsncpy-generic.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 <= 3
# include <wcsmbs/wcsncpy.c>
#endif

40
sysdeps/x86_64/wcsncpy.S Normal file
View File

@ -0,0 +1,40 @@
/* ISA level static dispatch for wcsncpy .S 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/>. */
/* wcsncpy non-multiarch build is split into two files,
wcsncpy-generic.c and wcsncpy.S. The wcsncpy-generic.c build is
for ISA level <= 1 and just uses multiarch/wcsncpy-generic.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 >= 4
# define WCSNCPY __wcsncpy
# define DEFAULT_IMPL_V4 "multiarch/wcsncpy-evex.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 (__wcsncpy, wcsncpy)
libc_hidden_def (__wcsncpy)
#endif