about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--sysdeps/x86_64/Makefile9
-rw-r--r--sysdeps/x86_64/multiarch/ifunc-impl-list.c6
-rw-r--r--sysdeps/x86_64/multiarch/ifunc-sse4_2.h2
-rw-r--r--sysdeps/x86_64/multiarch/rtld-strcspn.c18
-rw-r--r--sysdeps/x86_64/multiarch/strcspn-generic.c6
-rw-r--r--sysdeps/x86_64/multiarch/strcspn-sse4.c9
-rw-r--r--sysdeps/x86_64/multiarch/strpbrk-generic.c5
-rw-r--r--sysdeps/x86_64/multiarch/strpbrk-sse4.c6
-rw-r--r--sysdeps/x86_64/multiarch/strspn-generic.c7
-rw-r--r--sysdeps/x86_64/multiarch/strspn-sse4.c5
-rw-r--r--sysdeps/x86_64/multiarch/varshift.c4
-rw-r--r--sysdeps/x86_64/strcspn-generic.c25
-rw-r--r--sysdeps/x86_64/strcspn.c27
-rw-r--r--sysdeps/x86_64/strpbrk-generic.c25
-rw-r--r--sysdeps/x86_64/strpbrk.c27
-rw-r--r--sysdeps/x86_64/strspn-generic.c26
-rw-r--r--sysdeps/x86_64/strspn.c27
-rw-r--r--sysdeps/x86_64/varshift.c26
18 files changed, 247 insertions, 13 deletions
diff --git a/sysdeps/x86_64/Makefile b/sysdeps/x86_64/Makefile
index 79365aff2a..e597a4855f 100644
--- a/sysdeps/x86_64/Makefile
+++ b/sysdeps/x86_64/Makefile
@@ -14,7 +14,14 @@ sysdep_noprof += _mcount
 endif
 
 ifeq ($(subdir),string)
-sysdep_routines += strcasecmp_l-nonascii strncase_l-nonascii
+sysdep_routines += \
+  strcasecmp_l-nonascii \
+  strcspn-generic \
+  strncase_l-nonascii \
+  strpbrk-generic \
+  strspn-generic \
+  varshift \
+# sysdep_routines
 gen-as-const-headers += locale-defines.sym
 tests += \
   tst-rsi-strlen
diff --git a/sysdeps/x86_64/multiarch/ifunc-impl-list.c b/sysdeps/x86_64/multiarch/ifunc-impl-list.c
index 9e07283f86..b84acfead2 100644
--- a/sysdeps/x86_64/multiarch/ifunc-impl-list.c
+++ b/sysdeps/x86_64/multiarch/ifunc-impl-list.c
@@ -533,6 +533,8 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
 
   /* Support sysdeps/x86_64/multiarch/strcspn.c.  */
   IFUNC_IMPL (i, name, strcspn,
+	      /* All implementations of strcspn are built at all ISA
+	         levels.  */
 	      IFUNC_IMPL_ADD (array, i, strcspn, CPU_FEATURE_USABLE (SSE4_2),
 			      __strcspn_sse42)
 	      IFUNC_IMPL_ADD (array, i, strcspn, 1, __strcspn_generic))
@@ -609,6 +611,8 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
 
   /* Support sysdeps/x86_64/multiarch/strpbrk.c.  */
   IFUNC_IMPL (i, name, strpbrk,
+	      /* All implementations of strpbrk are built at all ISA
+	         levels.  */
 	      IFUNC_IMPL_ADD (array, i, strpbrk, CPU_FEATURE_USABLE (SSE4_2),
 			      __strpbrk_sse42)
 	      IFUNC_IMPL_ADD (array, i, strpbrk, 1, __strpbrk_generic))
@@ -616,6 +620,8 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
 
   /* Support sysdeps/x86_64/multiarch/strspn.c.  */
   IFUNC_IMPL (i, name, strspn,
+	      /* All implementations of strspn are built at all ISA
+	         levels.  */
 	      IFUNC_IMPL_ADD (array, i, strspn, CPU_FEATURE_USABLE (SSE4_2),
 			      __strspn_sse42)
 	      IFUNC_IMPL_ADD (array, i, strspn, 1, __strspn_generic))
diff --git a/sysdeps/x86_64/multiarch/ifunc-sse4_2.h b/sysdeps/x86_64/multiarch/ifunc-sse4_2.h
index f8b56936ec..9a819ee1d2 100644
--- a/sysdeps/x86_64/multiarch/ifunc-sse4_2.h
+++ b/sysdeps/x86_64/multiarch/ifunc-sse4_2.h
@@ -33,7 +33,7 @@ IFUNC_SELECTOR (void)
      implementation its best to keep it regardless.  If an optimized
      fallback is added add a X86_ISA_CPU_FEATURE_ARCH_P (cpu_features,
      Slow_SSE4_2) check.  */
-  if (CPU_FEATURE_USABLE_P (cpu_features, SSE4_2))
+  if (X86_ISA_CPU_FEATURE_USABLE_P (cpu_features, SSE4_2))
     return OPTIMIZE (sse42);
 
   return OPTIMIZE (generic);
diff --git a/sysdeps/x86_64/multiarch/rtld-strcspn.c b/sysdeps/x86_64/multiarch/rtld-strcspn.c
new file mode 100644
index 0000000000..99e3c59e00
--- /dev/null
+++ b/sysdeps/x86_64/multiarch/rtld-strcspn.c
@@ -0,0 +1,18 @@
+/* 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 "../strcspn.c"
diff --git a/sysdeps/x86_64/multiarch/strcspn-generic.c b/sysdeps/x86_64/multiarch/strcspn-generic.c
index 423de2e2b2..86cda7b037 100644
--- a/sysdeps/x86_64/multiarch/strcspn-generic.c
+++ b/sysdeps/x86_64/multiarch/strcspn-generic.c
@@ -16,8 +16,10 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#if IS_IN (libc)
-
+/* We always need to build this implementation as strcspn-sse4 needs
+   to be able to fallback to it.  */
+#include <isa-level.h>
+#if IS_IN (libc) || MINIMUM_X86_ISA_LEVEL >= 2
 # include <sysdep.h>
 # define STRCSPN __strcspn_generic
 
diff --git a/sysdeps/x86_64/multiarch/strcspn-sse4.c b/sysdeps/x86_64/multiarch/strcspn-sse4.c
index d11e87ab6c..873a416cef 100644
--- a/sysdeps/x86_64/multiarch/strcspn-sse4.c
+++ b/sysdeps/x86_64/multiarch/strcspn-sse4.c
@@ -16,7 +16,8 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#if IS_IN (libc)
+#include <isa-level.h>
+#if IS_IN (libc) || MINIMUM_X86_ISA_LEVEL >= 2
 
 # include <nmmintrin.h>
 # include <string.h>
@@ -54,9 +55,11 @@
    when either CFlag or ZFlag is 1.  If CFlag == 1, ECX has the offset
    X for case 1.  */
 
+# ifndef STRCSPN
+#  define STRCSPN __strcspn_sse42
+# endif
 # ifndef STRCSPN_GENERIC
 #  define STRCSPN_GENERIC __strcspn_generic
-#  define STRCSPN_SSE42 __strcspn_sse42
 # endif
 
 # ifdef USE_AS_STRPBRK
@@ -80,7 +83,7 @@ char *
 size_t
 # endif
 __attribute__ ((section (".text.sse4.2")))
-STRCSPN_SSE42 (const char *s, const char *a)
+STRCSPN (const char *s, const char *a)
 {
   if (*a == 0)
     RETURN (NULL, strlen (s));
diff --git a/sysdeps/x86_64/multiarch/strpbrk-generic.c b/sysdeps/x86_64/multiarch/strpbrk-generic.c
index d31acfe495..058f635774 100644
--- a/sysdeps/x86_64/multiarch/strpbrk-generic.c
+++ b/sysdeps/x86_64/multiarch/strpbrk-generic.c
@@ -16,8 +16,11 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#if IS_IN (libc)
 
+/* We always need to build this implementation as strpbrk-sse4 needs
+   to be able to fallback to it.  */
+#include <isa-level.h>
+#if IS_IN (libc) || MINIMUM_X86_ISA_LEVEL >= 2
 # include <sysdep.h>
 # define STRPBRK __strpbrk_generic
 
diff --git a/sysdeps/x86_64/multiarch/strpbrk-sse4.c b/sysdeps/x86_64/multiarch/strpbrk-sse4.c
index bf74d660d5..0adb577955 100644
--- a/sysdeps/x86_64/multiarch/strpbrk-sse4.c
+++ b/sysdeps/x86_64/multiarch/strpbrk-sse4.c
@@ -16,7 +16,11 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
+#ifndef STRPBRK
+# define STRPBRK __strpbrk_sse42
+#endif
+
 #define USE_AS_STRPBRK
 #define STRCSPN_GENERIC __strpbrk_generic
-#define STRCSPN_SSE42 __strpbrk_sse42
+#define STRCSPN STRPBRK
 #include "strcspn-sse4.c"
diff --git a/sysdeps/x86_64/multiarch/strspn-generic.c b/sysdeps/x86_64/multiarch/strspn-generic.c
index 6b50c36432..0f485ab4da 100644
--- a/sysdeps/x86_64/multiarch/strspn-generic.c
+++ b/sysdeps/x86_64/multiarch/strspn-generic.c
@@ -16,13 +16,16 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#if IS_IN (libc)
-
+/* We always need to build this implementation as strspn-sse4 needs to
+   be able to fallback to it.  */
+#include <isa-level.h>
+#if IS_IN (libc) || MINIMUM_X86_ISA_LEVEL >= 2
 # include <sysdep.h>
 # define STRSPN __strspn_generic
 
 # undef libc_hidden_builtin_def
 # define libc_hidden_builtin_def(STRSPN)
+
 #endif
 
 #include <string/strspn.c>
diff --git a/sysdeps/x86_64/multiarch/strspn-sse4.c b/sysdeps/x86_64/multiarch/strspn-sse4.c
index d044916688..4d50507a0d 100644
--- a/sysdeps/x86_64/multiarch/strspn-sse4.c
+++ b/sysdeps/x86_64/multiarch/strspn-sse4.c
@@ -53,10 +53,13 @@
 
 extern size_t __strspn_generic (const char *, const char *) attribute_hidden;
 
+#ifndef STRSPN
+# define STRSPN	__strspn_sse42
+#endif
 
 size_t
 __attribute__ ((section (".text.sse4.2")))
-__strspn_sse42 (const char *s, const char *a)
+STRSPN (const char *s, const char *a)
 {
   if (*a == 0)
     return 0;
diff --git a/sysdeps/x86_64/multiarch/varshift.c b/sysdeps/x86_64/multiarch/varshift.c
index 5e2f2bdf51..a98311d749 100644
--- a/sysdeps/x86_64/multiarch/varshift.c
+++ b/sysdeps/x86_64/multiarch/varshift.c
@@ -16,7 +16,9 @@
    License along with the GNU C Library; if not, see
    <https://www.gnu.org/licenses/>.  */
 
-#if IS_IN (libc)
+#include <isa-level.h>
+#if IS_IN (libc) || MINIMUM_X86_ISA_LEVEL >= 2
+
 # include <stdint.h>
 
 const int8_t ___m128i_shift_right[31] attribute_hidden
diff --git a/sysdeps/x86_64/strcspn-generic.c b/sysdeps/x86_64/strcspn-generic.c
new file mode 100644
index 0000000000..51fd70b63d
--- /dev/null
+++ b/sysdeps/x86_64/strcspn-generic.c
@@ -0,0 +1,25 @@
+/* Hook for build strcspn-generic for non-multiarch build.  Needed for
+   the ISA level >= 2 because strcspn-sse4 has a dependency on
+   strcspn-generic.
+   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 <isa-level.h>
+
+#if MINIMUM_X86_ISA_LEVEL >= 2
+# include "multiarch/strcspn-generic.c"
+#endif
diff --git a/sysdeps/x86_64/strcspn.c b/sysdeps/x86_64/strcspn.c
new file mode 100644
index 0000000000..cd54eed869
--- /dev/null
+++ b/sysdeps/x86_64/strcspn.c
@@ -0,0 +1,27 @@
+/* strcspn hook for non-multiarch and RTLD 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/>.  */
+
+#include <isa-level.h>
+
+#if MINIMUM_X86_ISA_LEVEL == 1
+#include <string/strcspn.c>
+#else
+#define STRCSPN	strcspn
+#include "multiarch/strcspn-sse4.c"
+libc_hidden_builtin_def (strcspn)
+#endif
diff --git a/sysdeps/x86_64/strpbrk-generic.c b/sysdeps/x86_64/strpbrk-generic.c
new file mode 100644
index 0000000000..a7d8b11216
--- /dev/null
+++ b/sysdeps/x86_64/strpbrk-generic.c
@@ -0,0 +1,25 @@
+/* Hook for build strpbrk-generic for non-multiarch build.  Needed for
+   the ISA level >= 2 because strpbrk-sse4 has a dependency on
+   strpbrk-generic.
+   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 <isa-level.h>
+
+#if MINIMUM_X86_ISA_LEVEL >= 2
+# include "multiarch/strpbrk-generic.c"
+#endif
diff --git a/sysdeps/x86_64/strpbrk.c b/sysdeps/x86_64/strpbrk.c
new file mode 100644
index 0000000000..e7ea1b334a
--- /dev/null
+++ b/sysdeps/x86_64/strpbrk.c
@@ -0,0 +1,27 @@
+/* strpbrk hook for non-multiarch and RTLD 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/>.  */
+
+#include <isa-level.h>
+
+#if MINIMUM_X86_ISA_LEVEL == 1
+#include <string/strpbrk.c>
+#else
+#define STRPBRK	strpbrk
+#include "multiarch/strpbrk-sse4.c"
+libc_hidden_builtin_def (strpbrk)
+#endif
diff --git a/sysdeps/x86_64/strspn-generic.c b/sysdeps/x86_64/strspn-generic.c
new file mode 100644
index 0000000000..1a2a576e49
--- /dev/null
+++ b/sysdeps/x86_64/strspn-generic.c
@@ -0,0 +1,26 @@
+/* Hook for build strspn-generic for non-multiarch build.  Needed for
+   the ISA level >= 2 because strspn-sse4 has a dependency on
+   strspn-generic.
+   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 <isa-level.h>
+
+#if MINIMUM_X86_ISA_LEVEL >= 2
+# include "multiarch/strspn-generic.c"
+#endif
diff --git a/sysdeps/x86_64/strspn.c b/sysdeps/x86_64/strspn.c
new file mode 100644
index 0000000000..7b9ede26d9
--- /dev/null
+++ b/sysdeps/x86_64/strspn.c
@@ -0,0 +1,27 @@
+/* strspn hook for non-multiarch and RTLD 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/>.  */
+
+#include <isa-level.h>
+
+#if MINIMUM_X86_ISA_LEVEL == 1
+#include <string/strspn.c>
+#else
+#define STRSPN	strspn
+#include "multiarch/strspn-sse4.c"
+libc_hidden_builtin_def (strspn)
+#endif
diff --git a/sysdeps/x86_64/varshift.c b/sysdeps/x86_64/varshift.c
new file mode 100644
index 0000000000..8f9eb13547
--- /dev/null
+++ b/sysdeps/x86_64/varshift.c
@@ -0,0 +1,26 @@
+/* Hook for build varshift for non-multiarch build.  Needed for the
+   ISA level >= 2 because strspn-sse4, strcspn-sse4, and strpbrk-sse4
+   all have a dependency on varshift.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 <isa-level.h>
+
+#if MINIMUM_X86_ISA_LEVEL >= 2
+# include "multiarch/varshift.c"
+#endif