[v3] x86: Rename generic functions with unique postfix for clarity

Message ID 20220616221111.1290819-1-goldstein.w.n@gmail.com
State Committed
Commit c22eb807b0c8125101f6a274795425be2bbd0386
Headers
Series [v3] x86: Rename generic functions with unique postfix for clarity |

Checks

Context Check Description
dj/TryBot-apply_patch success Patch applied to master at the time it was sent
dj/TryBot-32bit fail Patch series failed to build

Commit Message

Noah Goldstein June 16, 2022, 10:11 p.m. UTC
  No functions are changed. It just renames generic implementations from
'{func}_sse2' to '{func}_generic'. This is just because the postfix
"_sse2" was overloaded and was used for files that had hand-optimized
sse2 assembly implementations and files that just redirected back
to the generic implementation.

Full xcheck passed on x86_64.
---
Note this change is in preperation to further changes to the file
organization in the multiarch directory.
 sysdeps/x86_64/multiarch/Makefile             | 33 ++++++++++---------
 sysdeps/x86_64/multiarch/ifunc-avx2.h         |  8 +++--
 sysdeps/x86_64/multiarch/ifunc-impl-list.c    | 18 +++++-----
 sysdeps/x86_64/multiarch/ifunc-sse4_2.h       |  4 +--
 sysdeps/x86_64/multiarch/ifunc-strcpy.h       |  8 +++--
 sysdeps/x86_64/multiarch/ifunc-wcslen.h       |  8 +++--
 sysdeps/x86_64/multiarch/stpncpy-c.c          |  7 ----
 sysdeps/x86_64/multiarch/stpncpy-generic.c    | 26 +++++++++++++++
 sysdeps/x86_64/multiarch/stpncpy.c            |  1 +
 .../{strcspn-sse2.c => strcspn-generic.c}     |  2 +-
 .../multiarch/{strcspn-c.c => strcspn-sse4.c} |  8 ++---
 sysdeps/x86_64/multiarch/strncat-c.c          |  2 --
 sysdeps/x86_64/multiarch/strncat-generic.c    | 21 ++++++++++++
 sysdeps/x86_64/multiarch/strncat.c            |  1 +
 sysdeps/x86_64/multiarch/strncpy-c.c          |  5 ---
 sysdeps/x86_64/multiarch/strncpy-generic.c    | 24 ++++++++++++++
 sysdeps/x86_64/multiarch/strncpy.c            |  1 +
 .../{strpbrk-sse2.c => strpbrk-generic.c}     |  2 +-
 .../multiarch/{strpbrk-c.c => strpbrk-sse4.c} |  4 +--
 .../{strspn-sse2.c => strspn-generic.c}       |  2 +-
 .../multiarch/{strspn-c.c => strspn-sse4.c}   |  4 +--
 sysdeps/x86_64/multiarch/wcscpy-c.c           |  5 ---
 sysdeps/x86_64/multiarch/wcscpy-generic.c     | 24 ++++++++++++++
 sysdeps/x86_64/multiarch/wcscpy.c             |  4 +--
 .../{wcsncmp-sse2.c => wcsncmp-generic.c}     |  4 +--
 sysdeps/x86_64/multiarch/wcsncmp.c            |  2 ++
 sysdeps/x86_64/multiarch/wcsnlen-c.c          |  9 -----
 sysdeps/x86_64/multiarch/wcsnlen-generic.c    | 28 ++++++++++++++++
 sysdeps/x86_64/multiarch/wcsnlen.c            |  1 +
 29 files changed, 190 insertions(+), 76 deletions(-)
 delete mode 100644 sysdeps/x86_64/multiarch/stpncpy-c.c
 create mode 100644 sysdeps/x86_64/multiarch/stpncpy-generic.c
 rename sysdeps/x86_64/multiarch/{strcspn-sse2.c => strcspn-generic.c} (96%)
 rename sysdeps/x86_64/multiarch/{strcspn-c.c => strcspn-sse4.c} (96%)
 delete mode 100644 sysdeps/x86_64/multiarch/strncat-c.c
 create mode 100644 sysdeps/x86_64/multiarch/strncat-generic.c
 delete mode 100644 sysdeps/x86_64/multiarch/strncpy-c.c
 create mode 100644 sysdeps/x86_64/multiarch/strncpy-generic.c
 rename sysdeps/x86_64/multiarch/{strpbrk-sse2.c => strpbrk-generic.c} (96%)
 rename sysdeps/x86_64/multiarch/{strpbrk-c.c => strpbrk-sse4.c} (92%)
 rename sysdeps/x86_64/multiarch/{strspn-sse2.c => strspn-generic.c} (96%)
 rename sysdeps/x86_64/multiarch/{strspn-c.c => strspn-sse4.c} (97%)
 delete mode 100644 sysdeps/x86_64/multiarch/wcscpy-c.c
 create mode 100644 sysdeps/x86_64/multiarch/wcscpy-generic.c
 rename sysdeps/x86_64/multiarch/{wcsncmp-sse2.c => wcsncmp-generic.c} (92%)
 delete mode 100644 sysdeps/x86_64/multiarch/wcsnlen-c.c
 create mode 100644 sysdeps/x86_64/multiarch/wcsnlen-generic.c
  

Comments

H.J. Lu June 16, 2022, 10:43 p.m. UTC | #1
On Thu, Jun 16, 2022 at 3:12 PM Noah Goldstein <goldstein.w.n@gmail.com> wrote:
>
> No functions are changed. It just renames generic implementations from
> '{func}_sse2' to '{func}_generic'. This is just because the postfix
> "_sse2" was overloaded and was used for files that had hand-optimized
> sse2 assembly implementations and files that just redirected back
> to the generic implementation.
>
> Full xcheck passed on x86_64.
> ---
> Note this change is in preperation to further changes to the file
> organization in the multiarch directory.
>  sysdeps/x86_64/multiarch/Makefile             | 33 ++++++++++---------
>  sysdeps/x86_64/multiarch/ifunc-avx2.h         |  8 +++--
>  sysdeps/x86_64/multiarch/ifunc-impl-list.c    | 18 +++++-----
>  sysdeps/x86_64/multiarch/ifunc-sse4_2.h       |  4 +--
>  sysdeps/x86_64/multiarch/ifunc-strcpy.h       |  8 +++--
>  sysdeps/x86_64/multiarch/ifunc-wcslen.h       |  8 +++--
>  sysdeps/x86_64/multiarch/stpncpy-c.c          |  7 ----
>  sysdeps/x86_64/multiarch/stpncpy-generic.c    | 26 +++++++++++++++
>  sysdeps/x86_64/multiarch/stpncpy.c            |  1 +
>  .../{strcspn-sse2.c => strcspn-generic.c}     |  2 +-
>  .../multiarch/{strcspn-c.c => strcspn-sse4.c} |  8 ++---
>  sysdeps/x86_64/multiarch/strncat-c.c          |  2 --
>  sysdeps/x86_64/multiarch/strncat-generic.c    | 21 ++++++++++++
>  sysdeps/x86_64/multiarch/strncat.c            |  1 +
>  sysdeps/x86_64/multiarch/strncpy-c.c          |  5 ---
>  sysdeps/x86_64/multiarch/strncpy-generic.c    | 24 ++++++++++++++
>  sysdeps/x86_64/multiarch/strncpy.c            |  1 +
>  .../{strpbrk-sse2.c => strpbrk-generic.c}     |  2 +-
>  .../multiarch/{strpbrk-c.c => strpbrk-sse4.c} |  4 +--
>  .../{strspn-sse2.c => strspn-generic.c}       |  2 +-
>  .../multiarch/{strspn-c.c => strspn-sse4.c}   |  4 +--
>  sysdeps/x86_64/multiarch/wcscpy-c.c           |  5 ---
>  sysdeps/x86_64/multiarch/wcscpy-generic.c     | 24 ++++++++++++++
>  sysdeps/x86_64/multiarch/wcscpy.c             |  4 +--
>  .../{wcsncmp-sse2.c => wcsncmp-generic.c}     |  4 +--
>  sysdeps/x86_64/multiarch/wcsncmp.c            |  2 ++
>  sysdeps/x86_64/multiarch/wcsnlen-c.c          |  9 -----
>  sysdeps/x86_64/multiarch/wcsnlen-generic.c    | 28 ++++++++++++++++
>  sysdeps/x86_64/multiarch/wcsnlen.c            |  1 +
>  29 files changed, 190 insertions(+), 76 deletions(-)
>  delete mode 100644 sysdeps/x86_64/multiarch/stpncpy-c.c
>  create mode 100644 sysdeps/x86_64/multiarch/stpncpy-generic.c
>  rename sysdeps/x86_64/multiarch/{strcspn-sse2.c => strcspn-generic.c} (96%)
>  rename sysdeps/x86_64/multiarch/{strcspn-c.c => strcspn-sse4.c} (96%)
>  delete mode 100644 sysdeps/x86_64/multiarch/strncat-c.c
>  create mode 100644 sysdeps/x86_64/multiarch/strncat-generic.c
>  delete mode 100644 sysdeps/x86_64/multiarch/strncpy-c.c
>  create mode 100644 sysdeps/x86_64/multiarch/strncpy-generic.c
>  rename sysdeps/x86_64/multiarch/{strpbrk-sse2.c => strpbrk-generic.c} (96%)
>  rename sysdeps/x86_64/multiarch/{strpbrk-c.c => strpbrk-sse4.c} (92%)
>  rename sysdeps/x86_64/multiarch/{strspn-sse2.c => strspn-generic.c} (96%)
>  rename sysdeps/x86_64/multiarch/{strspn-c.c => strspn-sse4.c} (97%)
>  delete mode 100644 sysdeps/x86_64/multiarch/wcscpy-c.c
>  create mode 100644 sysdeps/x86_64/multiarch/wcscpy-generic.c
>  rename sysdeps/x86_64/multiarch/{wcsncmp-sse2.c => wcsncmp-generic.c} (92%)
>  delete mode 100644 sysdeps/x86_64/multiarch/wcsnlen-c.c
>  create mode 100644 sysdeps/x86_64/multiarch/wcsnlen-generic.c
>
> diff --git a/sysdeps/x86_64/multiarch/Makefile b/sysdeps/x86_64/multiarch/Makefile
> index 3d153cac35..666ee4d5d6 100644
> --- a/sysdeps/x86_64/multiarch/Makefile
> +++ b/sysdeps/x86_64/multiarch/Makefile
> @@ -43,7 +43,7 @@ sysdep_routines += \
>    stpcpy-sse2-unaligned \
>    stpncpy-avx2 \
>    stpncpy-avx2-rtm \
> -  stpncpy-c \
> +  stpncpy-generic \
>    stpncpy-evex \
>    stpncpy-sse2-unaligned \
>    strcasecmp_l-avx2 \
> @@ -76,8 +76,8 @@ sysdep_routines += \
>    strcpy-evex \
>    strcpy-sse2 \
>    strcpy-sse2-unaligned \
> -  strcspn-c \
> -  strcspn-sse2 \
> +  strcspn-generic \
> +  strcspn-sse4 \
>    strlen-avx2 \
>    strlen-avx2-rtm \
>    strlen-evex \
> @@ -90,7 +90,7 @@ sysdep_routines += \
>    strncase_l-sse4_2 \
>    strncat-avx2 \
>    strncat-avx2-rtm \
> -  strncat-c \
> +  strncat-generic \
>    strncat-evex \
>    strncat-sse2-unaligned \
>    strncmp-avx2 \
> @@ -100,7 +100,7 @@ sysdep_routines += \
>    strncmp-sse4_2 \
>    strncpy-avx2 \
>    strncpy-avx2-rtm \
> -  strncpy-c \
> +  strncpy-generic \
>    strncpy-evex \
>    strncpy-sse2-unaligned \
>    strnlen-avx2 \
> @@ -108,22 +108,23 @@ sysdep_routines += \
>    strnlen-evex \
>    strnlen-evex512 \
>    strnlen-sse2 \
> -  strpbrk-c \
> -  strpbrk-sse2 \
> +  strpbrk-generic \
> +  strpbrk-sse4 \
>    strrchr-avx2 \
>    strrchr-avx2-rtm \
>    strrchr-evex \
>    strrchr-sse2 \
> -  strspn-c \
> -  strspn-sse2 \
> +  strspn-generic \
> +  strspn-sse4 \
>    strstr-avx512 \
>    strstr-sse2-unaligned \
>    varshift \
>  # sysdep_routines
> -CFLAGS-varshift.c += -msse4
> -CFLAGS-strcspn-c.c += -msse4
> -CFLAGS-strpbrk-c.c += -msse4
> -CFLAGS-strspn-c.c += -msse4
> +
> +CFLAGS-strcspn-sse4.c += -msse4
> +CFLAGS-strpbrk-sse4.c += -msse4
> +CFLAGS-strspn-sse4.c += -msse4
> +
>  CFLAGS-strstr-avx512.c += -mavx512f -mavx512vl -mavx512dq -mavx512bw -mbmi -mbmi2 -O3
>  endif
>
> @@ -137,7 +138,7 @@ sysdep_routines += \
>    wcscmp-avx2-rtm \
>    wcscmp-evex \
>    wcscmp-sse2 \
> -  wcscpy-c \
> +  wcscpy-generic \
>    wcscpy-ssse3 \
>    wcslen-avx2 \
>    wcslen-avx2-rtm \
> @@ -147,11 +148,11 @@ sysdep_routines += \
>    wcslen-sse4_1 \
>    wcsncmp-avx2 \
>    wcsncmp-avx2-rtm \
> +  wcsncmp-generic \
>    wcsncmp-evex \
> -  wcsncmp-sse2 \
>    wcsnlen-avx2 \
>    wcsnlen-avx2-rtm \
> -  wcsnlen-c \
> +  wcsnlen-generic \
>    wcsnlen-evex \
>    wcsnlen-evex512 \
>    wcsnlen-sse4_1 \
> diff --git a/sysdeps/x86_64/multiarch/ifunc-avx2.h b/sysdeps/x86_64/multiarch/ifunc-avx2.h
> index 4289df29ec..1d9cdfcfec 100644
> --- a/sysdeps/x86_64/multiarch/ifunc-avx2.h
> +++ b/sysdeps/x86_64/multiarch/ifunc-avx2.h
> @@ -19,7 +19,11 @@
>
>  #include <init-arch.h>
>
> -extern __typeof (REDIRECT_NAME) OPTIMIZE (sse2) attribute_hidden;
> +#ifndef GENERIC
> +# define GENERIC sse2
> +#endif
> +
> +extern __typeof (REDIRECT_NAME) OPTIMIZE (GENERIC) attribute_hidden;
>  extern __typeof (REDIRECT_NAME) OPTIMIZE (avx2) attribute_hidden;
>  extern __typeof (REDIRECT_NAME) OPTIMIZE (avx2_rtm) attribute_hidden;
>  extern __typeof (REDIRECT_NAME) OPTIMIZE (evex) attribute_hidden;
> @@ -44,5 +48,5 @@ IFUNC_SELECTOR (void)
>         return OPTIMIZE (avx2);
>      }
>
> -  return OPTIMIZE (sse2);
> +  return OPTIMIZE (GENERIC);
>  }
> diff --git a/sysdeps/x86_64/multiarch/ifunc-impl-list.c b/sysdeps/x86_64/multiarch/ifunc-impl-list.c
> index dc595752e0..883362f63d 100644
> --- a/sysdeps/x86_64/multiarch/ifunc-impl-list.c
> +++ b/sysdeps/x86_64/multiarch/ifunc-impl-list.c
> @@ -367,7 +367,7 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
>                               __stpncpy_evex)
>               IFUNC_IMPL_ADD (array, i, stpncpy, 1,
>                               __stpncpy_sse2_unaligned)
> -             IFUNC_IMPL_ADD (array, i, stpncpy, 1, __stpncpy_sse2))
> +             IFUNC_IMPL_ADD (array, i, stpncpy, 1, __stpncpy_generic))
>
>    /* Support sysdeps/x86_64/multiarch/stpcpy.c.  */
>    IFUNC_IMPL (i, name, stpcpy,
> @@ -526,7 +526,7 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
>    IFUNC_IMPL (i, name, strcspn,
>               IFUNC_IMPL_ADD (array, i, strcspn, CPU_FEATURE_USABLE (SSE4_2),
>                               __strcspn_sse42)
> -             IFUNC_IMPL_ADD (array, i, strcspn, 1, __strcspn_sse2))
> +             IFUNC_IMPL_ADD (array, i, strcspn, 1, __strcspn_generic))
>
>    /* Support sysdeps/x86_64/multiarch/strncase_l.c.  */
>    IFUNC_IMPL (i, name, strncasecmp,
> @@ -580,7 +580,7 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
>                               __strncat_evex)
>               IFUNC_IMPL_ADD (array, i, strncat, 1,
>                               __strncat_sse2_unaligned)
> -             IFUNC_IMPL_ADD (array, i, strncat, 1, __strncat_sse2))
> +             IFUNC_IMPL_ADD (array, i, strncat, 1, __strncat_generic))
>
>    /* Support sysdeps/x86_64/multiarch/strncpy.c.  */
>    IFUNC_IMPL (i, name, strncpy,
> @@ -596,20 +596,20 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
>                               __strncpy_evex)
>               IFUNC_IMPL_ADD (array, i, strncpy, 1,
>                               __strncpy_sse2_unaligned)
> -             IFUNC_IMPL_ADD (array, i, strncpy, 1, __strncpy_sse2))
> +             IFUNC_IMPL_ADD (array, i, strncpy, 1, __strncpy_generic))
>
>    /* Support sysdeps/x86_64/multiarch/strpbrk.c.  */
>    IFUNC_IMPL (i, name, strpbrk,
>               IFUNC_IMPL_ADD (array, i, strpbrk, CPU_FEATURE_USABLE (SSE4_2),
>                               __strpbrk_sse42)
> -             IFUNC_IMPL_ADD (array, i, strpbrk, 1, __strpbrk_sse2))
> +             IFUNC_IMPL_ADD (array, i, strpbrk, 1, __strpbrk_generic))
>
>
>    /* Support sysdeps/x86_64/multiarch/strspn.c.  */
>    IFUNC_IMPL (i, name, strspn,
>               IFUNC_IMPL_ADD (array, i, strspn, CPU_FEATURE_USABLE (SSE4_2),
>                               __strspn_sse42)
> -             IFUNC_IMPL_ADD (array, i, strspn, 1, __strspn_sse2))
> +             IFUNC_IMPL_ADD (array, i, strspn, 1, __strspn_generic))
>
>    /* Support sysdeps/x86_64/multiarch/strstr.c.  */
>    IFUNC_IMPL (i, name, strstr,
> @@ -686,13 +686,13 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
>                                && CPU_FEATURE_USABLE (AVX512BW)
>                                && CPU_FEATURE_USABLE (BMI2)),
>                               __wcsncmp_evex)
> -             IFUNC_IMPL_ADD (array, i, wcsncmp, 1, __wcsncmp_sse2))
> +             IFUNC_IMPL_ADD (array, i, wcsncmp, 1, __wcsncmp_generic))
>
>    /* Support sysdeps/x86_64/multiarch/wcscpy.c.  */
>    IFUNC_IMPL (i, name, wcscpy,
>               IFUNC_IMPL_ADD (array, i, wcscpy, CPU_FEATURE_USABLE (SSSE3),
>                               __wcscpy_ssse3)
> -             IFUNC_IMPL_ADD (array, i, wcscpy, 1, __wcscpy_sse2))
> +             IFUNC_IMPL_ADD (array, i, wcscpy, 1, __wcscpy_generic))
>
>    /* Support sysdeps/x86_64/multiarch/wcslen.c.  */
>    IFUNC_IMPL (i, name, wcslen,
> @@ -744,7 +744,7 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
>               IFUNC_IMPL_ADD (array, i, wcsnlen,
>                               CPU_FEATURE_USABLE (SSE4_1),
>                               __wcsnlen_sse4_1)
> -             IFUNC_IMPL_ADD (array, i, wcsnlen, 1, __wcsnlen_sse2))
> +             IFUNC_IMPL_ADD (array, i, wcsnlen, 1, __wcsnlen_generic))
>
>    /* Support sysdeps/x86_64/multiarch/wmemchr.c.  */
>    IFUNC_IMPL (i, name, wmemchr,
> diff --git a/sysdeps/x86_64/multiarch/ifunc-sse4_2.h b/sysdeps/x86_64/multiarch/ifunc-sse4_2.h
> index b555ff2fac..ee36525bcf 100644
> --- a/sysdeps/x86_64/multiarch/ifunc-sse4_2.h
> +++ b/sysdeps/x86_64/multiarch/ifunc-sse4_2.h
> @@ -19,7 +19,7 @@
>
>  #include <init-arch.h>
>
> -extern __typeof (REDIRECT_NAME) OPTIMIZE (sse2) attribute_hidden;
> +extern __typeof (REDIRECT_NAME) OPTIMIZE (generic) attribute_hidden;
>  extern __typeof (REDIRECT_NAME) OPTIMIZE (sse42) attribute_hidden;
>
>  static inline void *
> @@ -30,5 +30,5 @@ IFUNC_SELECTOR (void)
>    if (CPU_FEATURE_USABLE_P (cpu_features, SSE4_2))
>      return OPTIMIZE (sse42);
>
> -  return OPTIMIZE (sse2);
> +  return OPTIMIZE (generic);
>  }
> diff --git a/sysdeps/x86_64/multiarch/ifunc-strcpy.h b/sysdeps/x86_64/multiarch/ifunc-strcpy.h
> index a15afa44e9..80529458d1 100644
> --- a/sysdeps/x86_64/multiarch/ifunc-strcpy.h
> +++ b/sysdeps/x86_64/multiarch/ifunc-strcpy.h
> @@ -20,7 +20,11 @@
>
>  #include <init-arch.h>
>
> -extern __typeof (REDIRECT_NAME) OPTIMIZE (sse2) attribute_hidden;
> +#ifndef GENERIC
> +# define GENERIC sse2
> +#endif
> +
> +extern __typeof (REDIRECT_NAME) OPTIMIZE (GENERIC) attribute_hidden;
>  extern __typeof (REDIRECT_NAME) OPTIMIZE (sse2_unaligned)
>    attribute_hidden;
>  extern __typeof (REDIRECT_NAME) OPTIMIZE (avx2) attribute_hidden;
> @@ -49,5 +53,5 @@ IFUNC_SELECTOR (void)
>    if (CPU_FEATURES_ARCH_P (cpu_features, Fast_Unaligned_Load))
>      return OPTIMIZE (sse2_unaligned);
>
> -  return OPTIMIZE (sse2);
> +  return OPTIMIZE (GENERIC);
>  }
> diff --git a/sysdeps/x86_64/multiarch/ifunc-wcslen.h b/sysdeps/x86_64/multiarch/ifunc-wcslen.h
> index 2b29e7608a..88c1c502af 100644
> --- a/sysdeps/x86_64/multiarch/ifunc-wcslen.h
> +++ b/sysdeps/x86_64/multiarch/ifunc-wcslen.h
> @@ -19,7 +19,11 @@
>
>  #include <init-arch.h>
>
> -extern __typeof (REDIRECT_NAME) OPTIMIZE (sse2) attribute_hidden;
> +#ifndef GENERIC
> +# define GENERIC sse2
> +#endif
> +
> +extern __typeof (REDIRECT_NAME) OPTIMIZE (GENERIC) attribute_hidden;
>  extern __typeof (REDIRECT_NAME) OPTIMIZE (sse4_1) attribute_hidden;
>  extern __typeof (REDIRECT_NAME) OPTIMIZE (avx2) attribute_hidden;
>  extern __typeof (REDIRECT_NAME) OPTIMIZE (avx2_rtm) attribute_hidden;
> @@ -48,5 +52,5 @@ IFUNC_SELECTOR (void)
>    if (CPU_FEATURE_USABLE_P (cpu_features, SSE4_1))
>      return OPTIMIZE (sse4_1);
>
> -  return OPTIMIZE (sse2);
> +  return OPTIMIZE (GENERIC);
>  }
> diff --git a/sysdeps/x86_64/multiarch/stpncpy-c.c b/sysdeps/x86_64/multiarch/stpncpy-c.c
> deleted file mode 100644
> index b016e487e1..0000000000
> --- a/sysdeps/x86_64/multiarch/stpncpy-c.c
> +++ /dev/null
> @@ -1,7 +0,0 @@
> -#define STPNCPY __stpncpy_sse2
> -#undef weak_alias
> -#define weak_alias(ignored1, ignored2)
> -#undef libc_hidden_def
> -#define libc_hidden_def(stpncpy)
> -
> -#include <string/stpncpy.c>
> diff --git a/sysdeps/x86_64/multiarch/stpncpy-generic.c b/sysdeps/x86_64/multiarch/stpncpy-generic.c
> new file mode 100644
> index 0000000000..87826845b0
> --- /dev/null
> +++ b/sysdeps/x86_64/multiarch/stpncpy-generic.c
> @@ -0,0 +1,26 @@
> +/* stpncpy.
> +   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 STPNCPY __stpncpy_generic
> +#undef weak_alias
> +#define weak_alias(ignored1, ignored2)
> +#undef libc_hidden_def
> +#define libc_hidden_def(stpncpy)
> +
> +#include <string/stpncpy.c>
> diff --git a/sysdeps/x86_64/multiarch/stpncpy.c b/sysdeps/x86_64/multiarch/stpncpy.c
> index 82fa53957d..879bc83f0b 100644
> --- a/sysdeps/x86_64/multiarch/stpncpy.c
> +++ b/sysdeps/x86_64/multiarch/stpncpy.c
> @@ -25,6 +25,7 @@
>  # undef stpncpy
>  # undef __stpncpy
>
> +# define GENERIC generic
>  # define SYMBOL_NAME stpncpy
>  # include "ifunc-strcpy.h"
>
> diff --git a/sysdeps/x86_64/multiarch/strcspn-sse2.c b/sysdeps/x86_64/multiarch/strcspn-generic.c
> similarity index 96%
> rename from sysdeps/x86_64/multiarch/strcspn-sse2.c
> rename to sysdeps/x86_64/multiarch/strcspn-generic.c
> index 3a04bb39fc..423de2e2b2 100644
> --- a/sysdeps/x86_64/multiarch/strcspn-sse2.c
> +++ b/sysdeps/x86_64/multiarch/strcspn-generic.c
> @@ -19,7 +19,7 @@
>  #if IS_IN (libc)
>
>  # include <sysdep.h>
> -# define STRCSPN __strcspn_sse2
> +# define STRCSPN __strcspn_generic
>
>  # undef libc_hidden_builtin_def
>  # define libc_hidden_builtin_def(STRCSPN)
> diff --git a/sysdeps/x86_64/multiarch/strcspn-c.c b/sysdeps/x86_64/multiarch/strcspn-sse4.c
> similarity index 96%
> rename from sysdeps/x86_64/multiarch/strcspn-c.c
> rename to sysdeps/x86_64/multiarch/strcspn-sse4.c
> index c312fab8b1..59f64f9fe8 100644
> --- a/sysdeps/x86_64/multiarch/strcspn-c.c
> +++ b/sysdeps/x86_64/multiarch/strcspn-sse4.c
> @@ -52,8 +52,8 @@
>     when either CFlag or ZFlag is 1.  If CFlag == 1, ECX has the offset
>     X for case 1.  */
>
> -#ifndef STRCSPN_SSE2
> -# define STRCSPN_SSE2 __strcspn_sse2
> +#ifndef STRCSPN_GENERIC
> +# define STRCSPN_GENERIC __strcspn_generic
>  # define STRCSPN_SSE42 __strcspn_sse42
>  #endif
>
> @@ -69,7 +69,7 @@ char *
>  #else
>  size_t
>  #endif
> -STRCSPN_SSE2 (const char *, const char *) attribute_hidden;
> +STRCSPN_GENERIC (const char *, const char *) attribute_hidden;
>
>
>  #ifdef USE_AS_STRPBRK
> @@ -119,7 +119,7 @@ STRCSPN_SSE42 (const char *s, const char *a)
>        /* There is no NULL terminator.  Don't use SSE4.2 if the length
>           of A > 16.  */
>        if (a[16] != 0)
> -        return STRCSPN_SSE2 (s, a);
> +        return STRCSPN_GENERIC (s, a);
>      }
>
>    aligned = s;
> diff --git a/sysdeps/x86_64/multiarch/strncat-c.c b/sysdeps/x86_64/multiarch/strncat-c.c
> deleted file mode 100644
> index 93a7fab7ea..0000000000
> --- a/sysdeps/x86_64/multiarch/strncat-c.c
> +++ /dev/null
> @@ -1,2 +0,0 @@
> -#define STRNCAT __strncat_sse2
> -#include <string/strncat.c>
> diff --git a/sysdeps/x86_64/multiarch/strncat-generic.c b/sysdeps/x86_64/multiarch/strncat-generic.c
> new file mode 100644
> index 0000000000..0090669cd1
> --- /dev/null
> +++ b/sysdeps/x86_64/multiarch/strncat-generic.c
> @@ -0,0 +1,21 @@
> +/* strncat.
> +   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 STRNCAT __strncat_generic
> +#include <string/strncat.c>
> diff --git a/sysdeps/x86_64/multiarch/strncat.c b/sysdeps/x86_64/multiarch/strncat.c
> index b649343a97..50fba8a41f 100644
> --- a/sysdeps/x86_64/multiarch/strncat.c
> +++ b/sysdeps/x86_64/multiarch/strncat.c
> @@ -24,6 +24,7 @@
>  # undef strncat
>
>  # define SYMBOL_NAME strncat
> +# define GENERIC generic
>  # include "ifunc-strcpy.h"
>
>  libc_ifunc_redirected (__redirect_strncat, strncat, IFUNC_SELECTOR ());
> diff --git a/sysdeps/x86_64/multiarch/strncpy-c.c b/sysdeps/x86_64/multiarch/strncpy-c.c
> deleted file mode 100644
> index 57c45ac7ab..0000000000
> --- a/sysdeps/x86_64/multiarch/strncpy-c.c
> +++ /dev/null
> @@ -1,5 +0,0 @@
> -#define STRNCPY __strncpy_sse2
> -#undef libc_hidden_builtin_def
> -#define libc_hidden_builtin_def(strncpy)
> -
> -#include <string/strncpy.c>
> diff --git a/sysdeps/x86_64/multiarch/strncpy-generic.c b/sysdeps/x86_64/multiarch/strncpy-generic.c
> new file mode 100644
> index 0000000000..9916153dd5
> --- /dev/null
> +++ b/sysdeps/x86_64/multiarch/strncpy-generic.c
> @@ -0,0 +1,24 @@
> +/* strncpy.
> +   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 STRNCPY __strncpy_generic
> +#undef libc_hidden_builtin_def
> +#define libc_hidden_builtin_def(strncpy)
> +
> +#include <string/strncpy.c>
> diff --git a/sysdeps/x86_64/multiarch/strncpy.c b/sysdeps/x86_64/multiarch/strncpy.c
> index 2a780a7e16..7fc7d72ec5 100644
> --- a/sysdeps/x86_64/multiarch/strncpy.c
> +++ b/sysdeps/x86_64/multiarch/strncpy.c
> @@ -24,6 +24,7 @@
>  # undef strncpy
>
>  # define SYMBOL_NAME strncpy
> +# define GENERIC generic
>  # include "ifunc-strcpy.h"
>
>  libc_ifunc_redirected (__redirect_strncpy, strncpy, IFUNC_SELECTOR ());
> diff --git a/sysdeps/x86_64/multiarch/strpbrk-sse2.c b/sysdeps/x86_64/multiarch/strpbrk-generic.c
> similarity index 96%
> rename from sysdeps/x86_64/multiarch/strpbrk-sse2.c
> rename to sysdeps/x86_64/multiarch/strpbrk-generic.c
> index d03214c4fb..d31acfe495 100644
> --- a/sysdeps/x86_64/multiarch/strpbrk-sse2.c
> +++ b/sysdeps/x86_64/multiarch/strpbrk-generic.c
> @@ -19,7 +19,7 @@
>  #if IS_IN (libc)
>
>  # include <sysdep.h>
> -# define STRPBRK __strpbrk_sse2
> +# define STRPBRK __strpbrk_generic
>
>  # undef libc_hidden_builtin_def
>  # define libc_hidden_builtin_def(STRPBRK)
> diff --git a/sysdeps/x86_64/multiarch/strpbrk-c.c b/sysdeps/x86_64/multiarch/strpbrk-sse4.c
> similarity index 92%
> rename from sysdeps/x86_64/multiarch/strpbrk-c.c
> rename to sysdeps/x86_64/multiarch/strpbrk-sse4.c
> index abf4ff7f1a..bf74d660d5 100644
> --- a/sysdeps/x86_64/multiarch/strpbrk-c.c
> +++ b/sysdeps/x86_64/multiarch/strpbrk-sse4.c
> @@ -17,6 +17,6 @@
>     <https://www.gnu.org/licenses/>.  */
>
>  #define USE_AS_STRPBRK
> -#define STRCSPN_SSE2 __strpbrk_sse2
> +#define STRCSPN_GENERIC __strpbrk_generic
>  #define STRCSPN_SSE42 __strpbrk_sse42
> -#include "strcspn-c.c"
> +#include "strcspn-sse4.c"
> diff --git a/sysdeps/x86_64/multiarch/strspn-sse2.c b/sysdeps/x86_64/multiarch/strspn-generic.c
> similarity index 96%
> rename from sysdeps/x86_64/multiarch/strspn-sse2.c
> rename to sysdeps/x86_64/multiarch/strspn-generic.c
> index 61cc6cb0a5..6b50c36432 100644
> --- a/sysdeps/x86_64/multiarch/strspn-sse2.c
> +++ b/sysdeps/x86_64/multiarch/strspn-generic.c
> @@ -19,7 +19,7 @@
>  #if IS_IN (libc)
>
>  # include <sysdep.h>
> -# define STRSPN __strspn_sse2
> +# define STRSPN __strspn_generic
>
>  # undef libc_hidden_builtin_def
>  # define libc_hidden_builtin_def(STRSPN)
> diff --git a/sysdeps/x86_64/multiarch/strspn-c.c b/sysdeps/x86_64/multiarch/strspn-sse4.c
> similarity index 97%
> rename from sysdeps/x86_64/multiarch/strspn-c.c
> rename to sysdeps/x86_64/multiarch/strspn-sse4.c
> index 6124033ceb..d044916688 100644
> --- a/sysdeps/x86_64/multiarch/strspn-c.c
> +++ b/sysdeps/x86_64/multiarch/strspn-sse4.c
> @@ -51,7 +51,7 @@
>
>     We exit from the loop for case 1.  */
>
> -extern size_t __strspn_sse2 (const char *, const char *) attribute_hidden;
> +extern size_t __strspn_generic (const char *, const char *) attribute_hidden;
>
>
>  size_t
> @@ -98,7 +98,7 @@ __strspn_sse42 (const char *s, const char *a)
>        /* There is no NULL terminator.  Don't use SSE4.2 if the length
>           of A > 16.  */
>        if (a[16] != 0)
> -        return __strspn_sse2 (s, a);
> +        return __strspn_generic (s, a);
>      }
>    aligned = s;
>    offset = (unsigned int) ((size_t) s & 15);
> diff --git a/sysdeps/x86_64/multiarch/wcscpy-c.c b/sysdeps/x86_64/multiarch/wcscpy-c.c
> deleted file mode 100644
> index 26d6984e9b..0000000000
> --- a/sysdeps/x86_64/multiarch/wcscpy-c.c
> +++ /dev/null
> @@ -1,5 +0,0 @@
> -#if IS_IN (libc)
> -# define WCSCPY  __wcscpy_sse2
> -#endif
> -
> -#include <wcsmbs/wcscpy.c>
> diff --git a/sysdeps/x86_64/multiarch/wcscpy-generic.c b/sysdeps/x86_64/multiarch/wcscpy-generic.c
> new file mode 100644
> index 0000000000..5ea905f33f
> --- /dev/null
> +++ b/sysdeps/x86_64/multiarch/wcscpy-generic.c
> @@ -0,0 +1,24 @@
> +/* wcscpy.
> +   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/>.  */
> +
> +
> +#if IS_IN (libc)
> +# define WCSCPY  __wcscpy_generic
> +#endif
> +
> +#include <wcsmbs/wcscpy.c>
> diff --git a/sysdeps/x86_64/multiarch/wcscpy.c b/sysdeps/x86_64/multiarch/wcscpy.c
> index 6a2d1421d9..53c3228dc2 100644
> --- a/sysdeps/x86_64/multiarch/wcscpy.c
> +++ b/sysdeps/x86_64/multiarch/wcscpy.c
> @@ -26,7 +26,7 @@
>  # define SYMBOL_NAME wcscpy
>  # include <init-arch.h>
>
> -extern __typeof (REDIRECT_NAME) OPTIMIZE (sse2) attribute_hidden;
> +extern __typeof (REDIRECT_NAME) OPTIMIZE (generic) attribute_hidden;
>  extern __typeof (REDIRECT_NAME) OPTIMIZE (ssse3) attribute_hidden;
>
>  static inline void *
> @@ -37,7 +37,7 @@ IFUNC_SELECTOR (void)
>    if (CPU_FEATURE_USABLE_P (cpu_features, SSSE3))
>      return OPTIMIZE (ssse3);
>
> -  return OPTIMIZE (sse2);
> +  return OPTIMIZE (generic);
>  }
>
>  libc_ifunc_redirected (__redirect_wcscpy, __wcscpy, IFUNC_SELECTOR ());
> diff --git a/sysdeps/x86_64/multiarch/wcsncmp-sse2.c b/sysdeps/x86_64/multiarch/wcsncmp-generic.c
> similarity index 92%
> rename from sysdeps/x86_64/multiarch/wcsncmp-sse2.c
> rename to sysdeps/x86_64/multiarch/wcsncmp-generic.c
> index 8d9cbbb900..658d541886 100644
> --- a/sysdeps/x86_64/multiarch/wcsncmp-sse2.c
> +++ b/sysdeps/x86_64/multiarch/wcsncmp-generic.c
> @@ -1,4 +1,4 @@
> -/* wcsncmp optimized with SSE2.
> +/* wcsncmp.
>     Copyright (C) 2018-2022 Free Software Foundation, Inc.
>     This file is part of the GNU C Library.
>
> @@ -16,5 +16,5 @@
>     License along with the GNU C Library; if not, see
>     <https://www.gnu.org/licenses/>.  */
>
> -#define WCSNCMP __wcsncmp_sse2
> +#define WCSNCMP __wcsncmp_generic
>  #include <wcsmbs/wcsncmp.c>
> diff --git a/sysdeps/x86_64/multiarch/wcsncmp.c b/sysdeps/x86_64/multiarch/wcsncmp.c
> index 5e00af2ca5..1836f794dd 100644
> --- a/sysdeps/x86_64/multiarch/wcsncmp.c
> +++ b/sysdeps/x86_64/multiarch/wcsncmp.c
> @@ -24,6 +24,8 @@
>  # undef wcsncmp
>  # undef __wcsncmp
>
> +# define GENERIC generic
> +
>  # define SYMBOL_NAME wcsncmp
>  # include "ifunc-avx2.h"
>
> diff --git a/sysdeps/x86_64/multiarch/wcsnlen-c.c b/sysdeps/x86_64/multiarch/wcsnlen-c.c
> deleted file mode 100644
> index e1ec7cfbb5..0000000000
> --- a/sysdeps/x86_64/multiarch/wcsnlen-c.c
> +++ /dev/null
> @@ -1,9 +0,0 @@
> -#if IS_IN (libc)
> -# include <wchar.h>
> -
> -# define WCSNLEN __wcsnlen_sse2
> -
> -extern __typeof (wcsnlen) __wcsnlen_sse2;
> -#endif
> -
> -#include "wcsmbs/wcsnlen.c"
> diff --git a/sysdeps/x86_64/multiarch/wcsnlen-generic.c b/sysdeps/x86_64/multiarch/wcsnlen-generic.c
> new file mode 100644
> index 0000000000..2d75da7709
> --- /dev/null
> +++ b/sysdeps/x86_64/multiarch/wcsnlen-generic.c
> @@ -0,0 +1,28 @@
> +/* wcsnlen.
> +   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/>.  */
> +
> +
> +#if IS_IN (libc)
> +# include <wchar.h>
> +
> +# define WCSNLEN __wcsnlen_generic
> +
> +extern __typeof (wcsnlen) __wcsnlen_generic;
> +#endif
> +
> +#include "wcsmbs/wcsnlen.c"
> diff --git a/sysdeps/x86_64/multiarch/wcsnlen.c b/sysdeps/x86_64/multiarch/wcsnlen.c
> index baa26666a8..05b7a211de 100644
> --- a/sysdeps/x86_64/multiarch/wcsnlen.c
> +++ b/sysdeps/x86_64/multiarch/wcsnlen.c
> @@ -24,6 +24,7 @@
>  # undef __wcsnlen
>
>  # define SYMBOL_NAME wcsnlen
> +# define GENERIC generic
>  # include "ifunc-wcslen.h"
>
>  libc_ifunc_redirected (__redirect_wcsnlen, __wcsnlen, IFUNC_SELECTOR ());
> --
> 2.34.1
>

LGTM.

Thanks.
  

Patch

diff --git a/sysdeps/x86_64/multiarch/Makefile b/sysdeps/x86_64/multiarch/Makefile
index 3d153cac35..666ee4d5d6 100644
--- a/sysdeps/x86_64/multiarch/Makefile
+++ b/sysdeps/x86_64/multiarch/Makefile
@@ -43,7 +43,7 @@  sysdep_routines += \
   stpcpy-sse2-unaligned \
   stpncpy-avx2 \
   stpncpy-avx2-rtm \
-  stpncpy-c \
+  stpncpy-generic \
   stpncpy-evex \
   stpncpy-sse2-unaligned \
   strcasecmp_l-avx2 \
@@ -76,8 +76,8 @@  sysdep_routines += \
   strcpy-evex \
   strcpy-sse2 \
   strcpy-sse2-unaligned \
-  strcspn-c \
-  strcspn-sse2 \
+  strcspn-generic \
+  strcspn-sse4 \
   strlen-avx2 \
   strlen-avx2-rtm \
   strlen-evex \
@@ -90,7 +90,7 @@  sysdep_routines += \
   strncase_l-sse4_2 \
   strncat-avx2 \
   strncat-avx2-rtm \
-  strncat-c \
+  strncat-generic \
   strncat-evex \
   strncat-sse2-unaligned \
   strncmp-avx2 \
@@ -100,7 +100,7 @@  sysdep_routines += \
   strncmp-sse4_2 \
   strncpy-avx2 \
   strncpy-avx2-rtm \
-  strncpy-c \
+  strncpy-generic \
   strncpy-evex \
   strncpy-sse2-unaligned \
   strnlen-avx2 \
@@ -108,22 +108,23 @@  sysdep_routines += \
   strnlen-evex \
   strnlen-evex512 \
   strnlen-sse2 \
-  strpbrk-c \
-  strpbrk-sse2 \
+  strpbrk-generic \
+  strpbrk-sse4 \
   strrchr-avx2 \
   strrchr-avx2-rtm \
   strrchr-evex \
   strrchr-sse2 \
-  strspn-c \
-  strspn-sse2 \
+  strspn-generic \
+  strspn-sse4 \
   strstr-avx512 \
   strstr-sse2-unaligned \
   varshift \
 # sysdep_routines
-CFLAGS-varshift.c += -msse4
-CFLAGS-strcspn-c.c += -msse4
-CFLAGS-strpbrk-c.c += -msse4
-CFLAGS-strspn-c.c += -msse4
+
+CFLAGS-strcspn-sse4.c += -msse4
+CFLAGS-strpbrk-sse4.c += -msse4
+CFLAGS-strspn-sse4.c += -msse4
+
 CFLAGS-strstr-avx512.c += -mavx512f -mavx512vl -mavx512dq -mavx512bw -mbmi -mbmi2 -O3
 endif
 
@@ -137,7 +138,7 @@  sysdep_routines += \
   wcscmp-avx2-rtm \
   wcscmp-evex \
   wcscmp-sse2 \
-  wcscpy-c \
+  wcscpy-generic \
   wcscpy-ssse3 \
   wcslen-avx2 \
   wcslen-avx2-rtm \
@@ -147,11 +148,11 @@  sysdep_routines += \
   wcslen-sse4_1 \
   wcsncmp-avx2 \
   wcsncmp-avx2-rtm \
+  wcsncmp-generic \
   wcsncmp-evex \
-  wcsncmp-sse2 \
   wcsnlen-avx2 \
   wcsnlen-avx2-rtm \
-  wcsnlen-c \
+  wcsnlen-generic \
   wcsnlen-evex \
   wcsnlen-evex512 \
   wcsnlen-sse4_1 \
diff --git a/sysdeps/x86_64/multiarch/ifunc-avx2.h b/sysdeps/x86_64/multiarch/ifunc-avx2.h
index 4289df29ec..1d9cdfcfec 100644
--- a/sysdeps/x86_64/multiarch/ifunc-avx2.h
+++ b/sysdeps/x86_64/multiarch/ifunc-avx2.h
@@ -19,7 +19,11 @@ 
 
 #include <init-arch.h>
 
-extern __typeof (REDIRECT_NAME) OPTIMIZE (sse2) attribute_hidden;
+#ifndef GENERIC
+# define GENERIC sse2
+#endif
+
+extern __typeof (REDIRECT_NAME) OPTIMIZE (GENERIC) attribute_hidden;
 extern __typeof (REDIRECT_NAME) OPTIMIZE (avx2) attribute_hidden;
 extern __typeof (REDIRECT_NAME) OPTIMIZE (avx2_rtm) attribute_hidden;
 extern __typeof (REDIRECT_NAME) OPTIMIZE (evex) attribute_hidden;
@@ -44,5 +48,5 @@  IFUNC_SELECTOR (void)
 	return OPTIMIZE (avx2);
     }
 
-  return OPTIMIZE (sse2);
+  return OPTIMIZE (GENERIC);
 }
diff --git a/sysdeps/x86_64/multiarch/ifunc-impl-list.c b/sysdeps/x86_64/multiarch/ifunc-impl-list.c
index dc595752e0..883362f63d 100644
--- a/sysdeps/x86_64/multiarch/ifunc-impl-list.c
+++ b/sysdeps/x86_64/multiarch/ifunc-impl-list.c
@@ -367,7 +367,7 @@  __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
 			      __stpncpy_evex)
 	      IFUNC_IMPL_ADD (array, i, stpncpy, 1,
 			      __stpncpy_sse2_unaligned)
-	      IFUNC_IMPL_ADD (array, i, stpncpy, 1, __stpncpy_sse2))
+	      IFUNC_IMPL_ADD (array, i, stpncpy, 1, __stpncpy_generic))
 
   /* Support sysdeps/x86_64/multiarch/stpcpy.c.  */
   IFUNC_IMPL (i, name, stpcpy,
@@ -526,7 +526,7 @@  __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
   IFUNC_IMPL (i, name, strcspn,
 	      IFUNC_IMPL_ADD (array, i, strcspn, CPU_FEATURE_USABLE (SSE4_2),
 			      __strcspn_sse42)
-	      IFUNC_IMPL_ADD (array, i, strcspn, 1, __strcspn_sse2))
+	      IFUNC_IMPL_ADD (array, i, strcspn, 1, __strcspn_generic))
 
   /* Support sysdeps/x86_64/multiarch/strncase_l.c.  */
   IFUNC_IMPL (i, name, strncasecmp,
@@ -580,7 +580,7 @@  __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
 			      __strncat_evex)
 	      IFUNC_IMPL_ADD (array, i, strncat, 1,
 			      __strncat_sse2_unaligned)
-	      IFUNC_IMPL_ADD (array, i, strncat, 1, __strncat_sse2))
+	      IFUNC_IMPL_ADD (array, i, strncat, 1, __strncat_generic))
 
   /* Support sysdeps/x86_64/multiarch/strncpy.c.  */
   IFUNC_IMPL (i, name, strncpy,
@@ -596,20 +596,20 @@  __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
 			      __strncpy_evex)
 	      IFUNC_IMPL_ADD (array, i, strncpy, 1,
 			      __strncpy_sse2_unaligned)
-	      IFUNC_IMPL_ADD (array, i, strncpy, 1, __strncpy_sse2))
+	      IFUNC_IMPL_ADD (array, i, strncpy, 1, __strncpy_generic))
 
   /* Support sysdeps/x86_64/multiarch/strpbrk.c.  */
   IFUNC_IMPL (i, name, strpbrk,
 	      IFUNC_IMPL_ADD (array, i, strpbrk, CPU_FEATURE_USABLE (SSE4_2),
 			      __strpbrk_sse42)
-	      IFUNC_IMPL_ADD (array, i, strpbrk, 1, __strpbrk_sse2))
+	      IFUNC_IMPL_ADD (array, i, strpbrk, 1, __strpbrk_generic))
 
 
   /* Support sysdeps/x86_64/multiarch/strspn.c.  */
   IFUNC_IMPL (i, name, strspn,
 	      IFUNC_IMPL_ADD (array, i, strspn, CPU_FEATURE_USABLE (SSE4_2),
 			      __strspn_sse42)
-	      IFUNC_IMPL_ADD (array, i, strspn, 1, __strspn_sse2))
+	      IFUNC_IMPL_ADD (array, i, strspn, 1, __strspn_generic))
 
   /* Support sysdeps/x86_64/multiarch/strstr.c.  */
   IFUNC_IMPL (i, name, strstr,
@@ -686,13 +686,13 @@  __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
 			       && CPU_FEATURE_USABLE (AVX512BW)
 			       && CPU_FEATURE_USABLE (BMI2)),
 			      __wcsncmp_evex)
-	      IFUNC_IMPL_ADD (array, i, wcsncmp, 1, __wcsncmp_sse2))
+	      IFUNC_IMPL_ADD (array, i, wcsncmp, 1, __wcsncmp_generic))
 
   /* Support sysdeps/x86_64/multiarch/wcscpy.c.  */
   IFUNC_IMPL (i, name, wcscpy,
 	      IFUNC_IMPL_ADD (array, i, wcscpy, CPU_FEATURE_USABLE (SSSE3),
 			      __wcscpy_ssse3)
-	      IFUNC_IMPL_ADD (array, i, wcscpy, 1, __wcscpy_sse2))
+	      IFUNC_IMPL_ADD (array, i, wcscpy, 1, __wcscpy_generic))
 
   /* Support sysdeps/x86_64/multiarch/wcslen.c.  */
   IFUNC_IMPL (i, name, wcslen,
@@ -744,7 +744,7 @@  __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
 	      IFUNC_IMPL_ADD (array, i, wcsnlen,
 			      CPU_FEATURE_USABLE (SSE4_1),
 			      __wcsnlen_sse4_1)
-	      IFUNC_IMPL_ADD (array, i, wcsnlen, 1, __wcsnlen_sse2))
+	      IFUNC_IMPL_ADD (array, i, wcsnlen, 1, __wcsnlen_generic))
 
   /* Support sysdeps/x86_64/multiarch/wmemchr.c.  */
   IFUNC_IMPL (i, name, wmemchr,
diff --git a/sysdeps/x86_64/multiarch/ifunc-sse4_2.h b/sysdeps/x86_64/multiarch/ifunc-sse4_2.h
index b555ff2fac..ee36525bcf 100644
--- a/sysdeps/x86_64/multiarch/ifunc-sse4_2.h
+++ b/sysdeps/x86_64/multiarch/ifunc-sse4_2.h
@@ -19,7 +19,7 @@ 
 
 #include <init-arch.h>
 
-extern __typeof (REDIRECT_NAME) OPTIMIZE (sse2) attribute_hidden;
+extern __typeof (REDIRECT_NAME) OPTIMIZE (generic) attribute_hidden;
 extern __typeof (REDIRECT_NAME) OPTIMIZE (sse42) attribute_hidden;
 
 static inline void *
@@ -30,5 +30,5 @@  IFUNC_SELECTOR (void)
   if (CPU_FEATURE_USABLE_P (cpu_features, SSE4_2))
     return OPTIMIZE (sse42);
 
-  return OPTIMIZE (sse2);
+  return OPTIMIZE (generic);
 }
diff --git a/sysdeps/x86_64/multiarch/ifunc-strcpy.h b/sysdeps/x86_64/multiarch/ifunc-strcpy.h
index a15afa44e9..80529458d1 100644
--- a/sysdeps/x86_64/multiarch/ifunc-strcpy.h
+++ b/sysdeps/x86_64/multiarch/ifunc-strcpy.h
@@ -20,7 +20,11 @@ 
 
 #include <init-arch.h>
 
-extern __typeof (REDIRECT_NAME) OPTIMIZE (sse2) attribute_hidden;
+#ifndef GENERIC
+# define GENERIC sse2
+#endif
+
+extern __typeof (REDIRECT_NAME) OPTIMIZE (GENERIC) attribute_hidden;
 extern __typeof (REDIRECT_NAME) OPTIMIZE (sse2_unaligned)
   attribute_hidden;
 extern __typeof (REDIRECT_NAME) OPTIMIZE (avx2) attribute_hidden;
@@ -49,5 +53,5 @@  IFUNC_SELECTOR (void)
   if (CPU_FEATURES_ARCH_P (cpu_features, Fast_Unaligned_Load))
     return OPTIMIZE (sse2_unaligned);
 
-  return OPTIMIZE (sse2);
+  return OPTIMIZE (GENERIC);
 }
diff --git a/sysdeps/x86_64/multiarch/ifunc-wcslen.h b/sysdeps/x86_64/multiarch/ifunc-wcslen.h
index 2b29e7608a..88c1c502af 100644
--- a/sysdeps/x86_64/multiarch/ifunc-wcslen.h
+++ b/sysdeps/x86_64/multiarch/ifunc-wcslen.h
@@ -19,7 +19,11 @@ 
 
 #include <init-arch.h>
 
-extern __typeof (REDIRECT_NAME) OPTIMIZE (sse2) attribute_hidden;
+#ifndef GENERIC
+# define GENERIC sse2
+#endif
+
+extern __typeof (REDIRECT_NAME) OPTIMIZE (GENERIC) attribute_hidden;
 extern __typeof (REDIRECT_NAME) OPTIMIZE (sse4_1) attribute_hidden;
 extern __typeof (REDIRECT_NAME) OPTIMIZE (avx2) attribute_hidden;
 extern __typeof (REDIRECT_NAME) OPTIMIZE (avx2_rtm) attribute_hidden;
@@ -48,5 +52,5 @@  IFUNC_SELECTOR (void)
   if (CPU_FEATURE_USABLE_P (cpu_features, SSE4_1))
     return OPTIMIZE (sse4_1);
 
-  return OPTIMIZE (sse2);
+  return OPTIMIZE (GENERIC);
 }
diff --git a/sysdeps/x86_64/multiarch/stpncpy-c.c b/sysdeps/x86_64/multiarch/stpncpy-c.c
deleted file mode 100644
index b016e487e1..0000000000
--- a/sysdeps/x86_64/multiarch/stpncpy-c.c
+++ /dev/null
@@ -1,7 +0,0 @@ 
-#define STPNCPY __stpncpy_sse2
-#undef weak_alias
-#define weak_alias(ignored1, ignored2)
-#undef libc_hidden_def
-#define libc_hidden_def(stpncpy)
-
-#include <string/stpncpy.c>
diff --git a/sysdeps/x86_64/multiarch/stpncpy-generic.c b/sysdeps/x86_64/multiarch/stpncpy-generic.c
new file mode 100644
index 0000000000..87826845b0
--- /dev/null
+++ b/sysdeps/x86_64/multiarch/stpncpy-generic.c
@@ -0,0 +1,26 @@ 
+/* stpncpy.
+   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 STPNCPY __stpncpy_generic
+#undef weak_alias
+#define weak_alias(ignored1, ignored2)
+#undef libc_hidden_def
+#define libc_hidden_def(stpncpy)
+
+#include <string/stpncpy.c>
diff --git a/sysdeps/x86_64/multiarch/stpncpy.c b/sysdeps/x86_64/multiarch/stpncpy.c
index 82fa53957d..879bc83f0b 100644
--- a/sysdeps/x86_64/multiarch/stpncpy.c
+++ b/sysdeps/x86_64/multiarch/stpncpy.c
@@ -25,6 +25,7 @@ 
 # undef stpncpy
 # undef __stpncpy
 
+# define GENERIC generic
 # define SYMBOL_NAME stpncpy
 # include "ifunc-strcpy.h"
 
diff --git a/sysdeps/x86_64/multiarch/strcspn-sse2.c b/sysdeps/x86_64/multiarch/strcspn-generic.c
similarity index 96%
rename from sysdeps/x86_64/multiarch/strcspn-sse2.c
rename to sysdeps/x86_64/multiarch/strcspn-generic.c
index 3a04bb39fc..423de2e2b2 100644
--- a/sysdeps/x86_64/multiarch/strcspn-sse2.c
+++ b/sysdeps/x86_64/multiarch/strcspn-generic.c
@@ -19,7 +19,7 @@ 
 #if IS_IN (libc)
 
 # include <sysdep.h>
-# define STRCSPN __strcspn_sse2
+# define STRCSPN __strcspn_generic
 
 # undef libc_hidden_builtin_def
 # define libc_hidden_builtin_def(STRCSPN)
diff --git a/sysdeps/x86_64/multiarch/strcspn-c.c b/sysdeps/x86_64/multiarch/strcspn-sse4.c
similarity index 96%
rename from sysdeps/x86_64/multiarch/strcspn-c.c
rename to sysdeps/x86_64/multiarch/strcspn-sse4.c
index c312fab8b1..59f64f9fe8 100644
--- a/sysdeps/x86_64/multiarch/strcspn-c.c
+++ b/sysdeps/x86_64/multiarch/strcspn-sse4.c
@@ -52,8 +52,8 @@ 
    when either CFlag or ZFlag is 1.  If CFlag == 1, ECX has the offset
    X for case 1.  */
 
-#ifndef STRCSPN_SSE2
-# define STRCSPN_SSE2 __strcspn_sse2
+#ifndef STRCSPN_GENERIC
+# define STRCSPN_GENERIC __strcspn_generic
 # define STRCSPN_SSE42 __strcspn_sse42
 #endif
 
@@ -69,7 +69,7 @@  char *
 #else
 size_t
 #endif
-STRCSPN_SSE2 (const char *, const char *) attribute_hidden;
+STRCSPN_GENERIC (const char *, const char *) attribute_hidden;
 
 
 #ifdef USE_AS_STRPBRK
@@ -119,7 +119,7 @@  STRCSPN_SSE42 (const char *s, const char *a)
       /* There is no NULL terminator.  Don't use SSE4.2 if the length
          of A > 16.  */
       if (a[16] != 0)
-        return STRCSPN_SSE2 (s, a);
+        return STRCSPN_GENERIC (s, a);
     }
 
   aligned = s;
diff --git a/sysdeps/x86_64/multiarch/strncat-c.c b/sysdeps/x86_64/multiarch/strncat-c.c
deleted file mode 100644
index 93a7fab7ea..0000000000
--- a/sysdeps/x86_64/multiarch/strncat-c.c
+++ /dev/null
@@ -1,2 +0,0 @@ 
-#define STRNCAT __strncat_sse2
-#include <string/strncat.c>
diff --git a/sysdeps/x86_64/multiarch/strncat-generic.c b/sysdeps/x86_64/multiarch/strncat-generic.c
new file mode 100644
index 0000000000..0090669cd1
--- /dev/null
+++ b/sysdeps/x86_64/multiarch/strncat-generic.c
@@ -0,0 +1,21 @@ 
+/* strncat.
+   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 STRNCAT __strncat_generic
+#include <string/strncat.c>
diff --git a/sysdeps/x86_64/multiarch/strncat.c b/sysdeps/x86_64/multiarch/strncat.c
index b649343a97..50fba8a41f 100644
--- a/sysdeps/x86_64/multiarch/strncat.c
+++ b/sysdeps/x86_64/multiarch/strncat.c
@@ -24,6 +24,7 @@ 
 # undef strncat
 
 # define SYMBOL_NAME strncat
+# define GENERIC generic
 # include "ifunc-strcpy.h"
 
 libc_ifunc_redirected (__redirect_strncat, strncat, IFUNC_SELECTOR ());
diff --git a/sysdeps/x86_64/multiarch/strncpy-c.c b/sysdeps/x86_64/multiarch/strncpy-c.c
deleted file mode 100644
index 57c45ac7ab..0000000000
--- a/sysdeps/x86_64/multiarch/strncpy-c.c
+++ /dev/null
@@ -1,5 +0,0 @@ 
-#define STRNCPY __strncpy_sse2
-#undef libc_hidden_builtin_def
-#define libc_hidden_builtin_def(strncpy)
-
-#include <string/strncpy.c>
diff --git a/sysdeps/x86_64/multiarch/strncpy-generic.c b/sysdeps/x86_64/multiarch/strncpy-generic.c
new file mode 100644
index 0000000000..9916153dd5
--- /dev/null
+++ b/sysdeps/x86_64/multiarch/strncpy-generic.c
@@ -0,0 +1,24 @@ 
+/* strncpy.
+   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 STRNCPY __strncpy_generic
+#undef libc_hidden_builtin_def
+#define libc_hidden_builtin_def(strncpy)
+
+#include <string/strncpy.c>
diff --git a/sysdeps/x86_64/multiarch/strncpy.c b/sysdeps/x86_64/multiarch/strncpy.c
index 2a780a7e16..7fc7d72ec5 100644
--- a/sysdeps/x86_64/multiarch/strncpy.c
+++ b/sysdeps/x86_64/multiarch/strncpy.c
@@ -24,6 +24,7 @@ 
 # undef strncpy
 
 # define SYMBOL_NAME strncpy
+# define GENERIC generic
 # include "ifunc-strcpy.h"
 
 libc_ifunc_redirected (__redirect_strncpy, strncpy, IFUNC_SELECTOR ());
diff --git a/sysdeps/x86_64/multiarch/strpbrk-sse2.c b/sysdeps/x86_64/multiarch/strpbrk-generic.c
similarity index 96%
rename from sysdeps/x86_64/multiarch/strpbrk-sse2.c
rename to sysdeps/x86_64/multiarch/strpbrk-generic.c
index d03214c4fb..d31acfe495 100644
--- a/sysdeps/x86_64/multiarch/strpbrk-sse2.c
+++ b/sysdeps/x86_64/multiarch/strpbrk-generic.c
@@ -19,7 +19,7 @@ 
 #if IS_IN (libc)
 
 # include <sysdep.h>
-# define STRPBRK __strpbrk_sse2
+# define STRPBRK __strpbrk_generic
 
 # undef libc_hidden_builtin_def
 # define libc_hidden_builtin_def(STRPBRK)
diff --git a/sysdeps/x86_64/multiarch/strpbrk-c.c b/sysdeps/x86_64/multiarch/strpbrk-sse4.c
similarity index 92%
rename from sysdeps/x86_64/multiarch/strpbrk-c.c
rename to sysdeps/x86_64/multiarch/strpbrk-sse4.c
index abf4ff7f1a..bf74d660d5 100644
--- a/sysdeps/x86_64/multiarch/strpbrk-c.c
+++ b/sysdeps/x86_64/multiarch/strpbrk-sse4.c
@@ -17,6 +17,6 @@ 
    <https://www.gnu.org/licenses/>.  */
 
 #define USE_AS_STRPBRK
-#define STRCSPN_SSE2 __strpbrk_sse2
+#define STRCSPN_GENERIC __strpbrk_generic
 #define STRCSPN_SSE42 __strpbrk_sse42
-#include "strcspn-c.c"
+#include "strcspn-sse4.c"
diff --git a/sysdeps/x86_64/multiarch/strspn-sse2.c b/sysdeps/x86_64/multiarch/strspn-generic.c
similarity index 96%
rename from sysdeps/x86_64/multiarch/strspn-sse2.c
rename to sysdeps/x86_64/multiarch/strspn-generic.c
index 61cc6cb0a5..6b50c36432 100644
--- a/sysdeps/x86_64/multiarch/strspn-sse2.c
+++ b/sysdeps/x86_64/multiarch/strspn-generic.c
@@ -19,7 +19,7 @@ 
 #if IS_IN (libc)
 
 # include <sysdep.h>
-# define STRSPN __strspn_sse2
+# define STRSPN __strspn_generic
 
 # undef libc_hidden_builtin_def
 # define libc_hidden_builtin_def(STRSPN)
diff --git a/sysdeps/x86_64/multiarch/strspn-c.c b/sysdeps/x86_64/multiarch/strspn-sse4.c
similarity index 97%
rename from sysdeps/x86_64/multiarch/strspn-c.c
rename to sysdeps/x86_64/multiarch/strspn-sse4.c
index 6124033ceb..d044916688 100644
--- a/sysdeps/x86_64/multiarch/strspn-c.c
+++ b/sysdeps/x86_64/multiarch/strspn-sse4.c
@@ -51,7 +51,7 @@ 
 
    We exit from the loop for case 1.  */
 
-extern size_t __strspn_sse2 (const char *, const char *) attribute_hidden;
+extern size_t __strspn_generic (const char *, const char *) attribute_hidden;
 
 
 size_t
@@ -98,7 +98,7 @@  __strspn_sse42 (const char *s, const char *a)
       /* There is no NULL terminator.  Don't use SSE4.2 if the length
          of A > 16.  */
       if (a[16] != 0)
-        return __strspn_sse2 (s, a);
+        return __strspn_generic (s, a);
     }
   aligned = s;
   offset = (unsigned int) ((size_t) s & 15);
diff --git a/sysdeps/x86_64/multiarch/wcscpy-c.c b/sysdeps/x86_64/multiarch/wcscpy-c.c
deleted file mode 100644
index 26d6984e9b..0000000000
--- a/sysdeps/x86_64/multiarch/wcscpy-c.c
+++ /dev/null
@@ -1,5 +0,0 @@ 
-#if IS_IN (libc)
-# define WCSCPY  __wcscpy_sse2
-#endif
-
-#include <wcsmbs/wcscpy.c>
diff --git a/sysdeps/x86_64/multiarch/wcscpy-generic.c b/sysdeps/x86_64/multiarch/wcscpy-generic.c
new file mode 100644
index 0000000000..5ea905f33f
--- /dev/null
+++ b/sysdeps/x86_64/multiarch/wcscpy-generic.c
@@ -0,0 +1,24 @@ 
+/* wcscpy.
+   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/>.  */
+
+
+#if IS_IN (libc)
+# define WCSCPY  __wcscpy_generic
+#endif
+
+#include <wcsmbs/wcscpy.c>
diff --git a/sysdeps/x86_64/multiarch/wcscpy.c b/sysdeps/x86_64/multiarch/wcscpy.c
index 6a2d1421d9..53c3228dc2 100644
--- a/sysdeps/x86_64/multiarch/wcscpy.c
+++ b/sysdeps/x86_64/multiarch/wcscpy.c
@@ -26,7 +26,7 @@ 
 # define SYMBOL_NAME wcscpy
 # include <init-arch.h>
 
-extern __typeof (REDIRECT_NAME) OPTIMIZE (sse2) attribute_hidden;
+extern __typeof (REDIRECT_NAME) OPTIMIZE (generic) attribute_hidden;
 extern __typeof (REDIRECT_NAME) OPTIMIZE (ssse3) attribute_hidden;
 
 static inline void *
@@ -37,7 +37,7 @@  IFUNC_SELECTOR (void)
   if (CPU_FEATURE_USABLE_P (cpu_features, SSSE3))
     return OPTIMIZE (ssse3);
 
-  return OPTIMIZE (sse2);
+  return OPTIMIZE (generic);
 }
 
 libc_ifunc_redirected (__redirect_wcscpy, __wcscpy, IFUNC_SELECTOR ());
diff --git a/sysdeps/x86_64/multiarch/wcsncmp-sse2.c b/sysdeps/x86_64/multiarch/wcsncmp-generic.c
similarity index 92%
rename from sysdeps/x86_64/multiarch/wcsncmp-sse2.c
rename to sysdeps/x86_64/multiarch/wcsncmp-generic.c
index 8d9cbbb900..658d541886 100644
--- a/sysdeps/x86_64/multiarch/wcsncmp-sse2.c
+++ b/sysdeps/x86_64/multiarch/wcsncmp-generic.c
@@ -1,4 +1,4 @@ 
-/* wcsncmp optimized with SSE2.
+/* wcsncmp.
    Copyright (C) 2018-2022 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -16,5 +16,5 @@ 
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#define WCSNCMP __wcsncmp_sse2
+#define WCSNCMP __wcsncmp_generic
 #include <wcsmbs/wcsncmp.c>
diff --git a/sysdeps/x86_64/multiarch/wcsncmp.c b/sysdeps/x86_64/multiarch/wcsncmp.c
index 5e00af2ca5..1836f794dd 100644
--- a/sysdeps/x86_64/multiarch/wcsncmp.c
+++ b/sysdeps/x86_64/multiarch/wcsncmp.c
@@ -24,6 +24,8 @@ 
 # undef wcsncmp
 # undef __wcsncmp
 
+# define GENERIC generic
+
 # define SYMBOL_NAME wcsncmp
 # include "ifunc-avx2.h"
 
diff --git a/sysdeps/x86_64/multiarch/wcsnlen-c.c b/sysdeps/x86_64/multiarch/wcsnlen-c.c
deleted file mode 100644
index e1ec7cfbb5..0000000000
--- a/sysdeps/x86_64/multiarch/wcsnlen-c.c
+++ /dev/null
@@ -1,9 +0,0 @@ 
-#if IS_IN (libc)
-# include <wchar.h>
-
-# define WCSNLEN __wcsnlen_sse2
-
-extern __typeof (wcsnlen) __wcsnlen_sse2;
-#endif
-
-#include "wcsmbs/wcsnlen.c"
diff --git a/sysdeps/x86_64/multiarch/wcsnlen-generic.c b/sysdeps/x86_64/multiarch/wcsnlen-generic.c
new file mode 100644
index 0000000000..2d75da7709
--- /dev/null
+++ b/sysdeps/x86_64/multiarch/wcsnlen-generic.c
@@ -0,0 +1,28 @@ 
+/* wcsnlen.
+   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/>.  */
+
+
+#if IS_IN (libc)
+# include <wchar.h>
+
+# define WCSNLEN __wcsnlen_generic
+
+extern __typeof (wcsnlen) __wcsnlen_generic;
+#endif
+
+#include "wcsmbs/wcsnlen.c"
diff --git a/sysdeps/x86_64/multiarch/wcsnlen.c b/sysdeps/x86_64/multiarch/wcsnlen.c
index baa26666a8..05b7a211de 100644
--- a/sysdeps/x86_64/multiarch/wcsnlen.c
+++ b/sysdeps/x86_64/multiarch/wcsnlen.c
@@ -24,6 +24,7 @@ 
 # undef __wcsnlen
 
 # define SYMBOL_NAME wcsnlen
+# define GENERIC generic
 # include "ifunc-wcslen.h"
 
 libc_ifunc_redirected (__redirect_wcsnlen, __wcsnlen, IFUNC_SELECTOR ());