aboutsummaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/i386/i686/multiarch/Makefile4
-rw-r--r--sysdeps/i386/i686/multiarch/test-multiarch.c1
-rw-r--r--sysdeps/unix/sysv/linux/i386/ld.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/64/ld.abilist1
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/x32/ld.abilist1
-rw-r--r--sysdeps/x86/Makefile4
-rw-r--r--sysdeps/x86/Versions4
-rw-r--r--sysdeps/x86/dl-get-cpu-features.c6
-rw-r--r--sysdeps/x86/include/cpu-features.h183
-rw-r--r--sysdeps/x86/sys/platform/x86.h (renamed from sysdeps/x86/cpu-features.h)150
-rw-r--r--sysdeps/x86/tst-cpu-features-cpuinfo.c250
-rw-r--r--sysdeps/x86/tst-cpu-features-supports.c192
-rw-r--r--sysdeps/x86/tst-get-cpu-features.c6
-rw-r--r--sysdeps/x86_64/fpu/math-tests-arch.h2
-rw-r--r--sysdeps/x86_64/multiarch/Makefile4
-rw-r--r--sysdeps/x86_64/multiarch/test-multiarch.c96
16 files changed, 658 insertions, 247 deletions
diff --git a/sysdeps/i386/i686/multiarch/Makefile b/sysdeps/i386/i686/multiarch/Makefile
index bf75a99..c489792 100644
--- a/sysdeps/i386/i686/multiarch/Makefile
+++ b/sysdeps/i386/i686/multiarch/Makefile
@@ -1,7 +1,3 @@
-ifeq ($(subdir),csu)
-tests += test-multiarch
-endif
-
ifeq ($(subdir),string)
gen-as-const-headers += locale-defines.sym
sysdep_routines += bzero-sse2 memset-sse2 memcpy-ssse3 mempcpy-ssse3 \
diff --git a/sysdeps/i386/i686/multiarch/test-multiarch.c b/sysdeps/i386/i686/multiarch/test-multiarch.c
deleted file mode 100644
index 593cfec..0000000
--- a/sysdeps/i386/i686/multiarch/test-multiarch.c
+++ /dev/null
@@ -1 +0,0 @@
-#include <sysdeps/x86_64/multiarch/test-multiarch.c>
diff --git a/sysdeps/unix/sysv/linux/i386/ld.abilist b/sysdeps/unix/sysv/linux/i386/ld.abilist
index 0478e22..0465565 100644
--- a/sysdeps/unix/sysv/linux/i386/ld.abilist
+++ b/sysdeps/unix/sysv/linux/i386/ld.abilist
@@ -3,3 +3,4 @@ GLIBC_2.1 __libc_stack_end D 0x4
GLIBC_2.1 _dl_mcount F
GLIBC_2.3 ___tls_get_addr F
GLIBC_2.3 __tls_get_addr F
+GLIBC_2.33 __x86_get_cpu_features F
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/ld.abilist b/sysdeps/unix/sysv/linux/x86_64/64/ld.abilist
index d3cdf76..e632c61 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/ld.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/ld.abilist
@@ -2,3 +2,4 @@ GLIBC_2.2.5 __libc_stack_end D 0x8
GLIBC_2.2.5 _dl_mcount F
GLIBC_2.2.5 _r_debug D 0x28
GLIBC_2.3 __tls_get_addr F
+GLIBC_2.33 __x86_get_cpu_features F
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/ld.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/ld.abilist
index c70bccf..9d9d0be 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/ld.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/ld.abilist
@@ -2,3 +2,4 @@ GLIBC_2.16 __libc_stack_end D 0x4
GLIBC_2.16 __tls_get_addr F
GLIBC_2.16 _dl_mcount F
GLIBC_2.16 _r_debug D 0x14
+GLIBC_2.33 __x86_get_cpu_features F
diff --git a/sysdeps/x86/Makefile b/sysdeps/x86/Makefile
index a6736ae..c369faf 100644
--- a/sysdeps/x86/Makefile
+++ b/sysdeps/x86/Makefile
@@ -4,8 +4,10 @@ endif
ifeq ($(subdir),elf)
sysdep-dl-routines += dl-get-cpu-features
+sysdep_headers += sys/platform/x86.h
-tests += tst-get-cpu-features tst-get-cpu-features-static
+tests += tst-get-cpu-features tst-get-cpu-features-static \
+ tst-cpu-features-cpuinfo tst-cpu-features-supports
tests-static += tst-get-cpu-features-static
endif
diff --git a/sysdeps/x86/Versions b/sysdeps/x86/Versions
index e029237..59db578 100644
--- a/sysdeps/x86/Versions
+++ b/sysdeps/x86/Versions
@@ -1,5 +1,5 @@
ld {
- GLIBC_PRIVATE {
- __get_cpu_features;
+ GLIBC_2.33 {
+ __x86_get_cpu_features;
}
}
diff --git a/sysdeps/x86/dl-get-cpu-features.c b/sysdeps/x86/dl-get-cpu-features.c
index 9d61cd5..5f9e46b 100644
--- a/sysdeps/x86/dl-get-cpu-features.c
+++ b/sysdeps/x86/dl-get-cpu-features.c
@@ -18,10 +18,12 @@
#include <ldsodefs.h>
-#undef __get_cpu_features
+#undef __x86_get_cpu_features
const struct cpu_features *
-__get_cpu_features (void)
+__x86_get_cpu_features (unsigned int max)
{
+ if (max > COMMON_CPUID_INDEX_MAX)
+ return NULL;
return &GLRO(dl_x86_cpu_features);
}
diff --git a/sysdeps/x86/include/cpu-features.h b/sysdeps/x86/include/cpu-features.h
new file mode 100644
index 0000000..dcf29b6
--- /dev/null
+++ b/sysdeps/x86/include/cpu-features.h
@@ -0,0 +1,183 @@
+/* Data structure for x86 CPU features.
+ Copyright (C) 2020 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/>. */
+
+#ifndef _PRIVATE_CPU_FEATURES_H
+#define _PRIVATE_CPU_FEATURES_H 1
+
+#ifdef _CPU_FEATURES_H
+# error this should be impossible
+#endif
+
+#ifndef _ISOMAC
+/* Get most of the contents from the public header, but we define a
+ different `struct cpu_features' type for private use. */
+# define cpu_features cpu_features_public
+# define __x86_get_cpu_features __x86_get_cpu_features_public
+#endif
+
+#include <sysdeps/x86/sys/platform/x86.h>
+
+#ifndef _ISOMAC
+
+# undef cpu_features
+# undef __x86_get_cpu_features
+# define __get_cpu_features() __x86_get_cpu_features (0)
+
+enum
+{
+ /* The integer bit array index for the first set of preferred feature
+ bits. */
+ PREFERRED_FEATURE_INDEX_1 = 0,
+ /* The current maximum size of the feature integer bit array. */
+ PREFERRED_FEATURE_INDEX_MAX
+};
+
+/* Only used directly in cpu-features.c. */
+# define CPU_FEATURE_SET(ptr, name) \
+ ptr->features[index_cpu_##name].usable.reg_##name |= bit_cpu_##name;
+# define CPU_FEATURE_UNSET(ptr, name) \
+ ptr->features[index_cpu_##name].usable.reg_##name &= ~bit_cpu_##name;
+# define CPU_FEATURE_SET_USABLE(ptr, name) \
+ ptr->features[index_cpu_##name].usable.reg_##name \
+ |= ptr->features[index_cpu_##name].cpuid.reg_##name & bit_cpu_##name;
+# define CPU_FEATURE_PREFERRED_P(ptr, name) \
+ ((ptr->preferred[index_arch_##name] & bit_arch_##name) != 0)
+# define CPU_FEATURE_CPU_P(ptr, name) \
+ CPU_FEATURE_CHECK_P (ptr, name, cpuid)
+
+/* HAS_CPU_FEATURE evaluates to true if CPU supports the feature. */
+# undef HAS_CPU_FEATURE
+# define HAS_CPU_FEATURE(name) \
+ CPU_FEATURE_CPU_P (__x86_get_cpu_features (0), name)
+/* CPU_FEATURE_USABLE evaluates to true if the feature is usable. */
+# undef CPU_FEATURE_USABLE
+# define CPU_FEATURE_USABLE(name) \
+ CPU_FEATURE_USABLE_P (__x86_get_cpu_features (0), name)
+/* CPU_FEATURE_PREFER evaluates to true if we prefer the feature at
+ runtime. */
+# define CPU_FEATURE_PREFERRED(name) \
+ CPU_FEATURE_PREFERRED_P(__get_cpu_features (), name)
+
+# define CPU_FEATURES_CPU_P(ptr, name) \
+ CPU_FEATURE_CPU_P (ptr, name)
+# define CPU_FEATURES_ARCH_P(ptr, name) \
+ CPU_FEATURE_PREFERRED_P (ptr, name)
+# define HAS_ARCH_FEATURE(name) \
+ CPU_FEATURE_PREFERRED (name)
+
+/* PREFERRED_FEATURE_INDEX_1. */
+# define bit_arch_I586 (1u << 0)
+# define bit_arch_I686 (1u << 1)
+# define bit_arch_Fast_Rep_String (1u << 2)
+# define bit_arch_Fast_Copy_Backward (1u << 3)
+# define bit_arch_Fast_Unaligned_Load (1u << 4)
+# define bit_arch_Fast_Unaligned_Copy (1u << 5)
+# define bit_arch_Slow_BSF (1u << 6)
+# define bit_arch_Slow_SSE4_2 (1u << 7)
+# define bit_arch_AVX_Fast_Unaligned_Load (1u << 8)
+# define bit_arch_Prefer_MAP_32BIT_EXEC (1u << 9)
+# define bit_arch_Prefer_PMINUB_for_stringop (1u << 10)
+# define bit_arch_Prefer_No_VZEROUPPER (1u << 11)
+# define bit_arch_Prefer_ERMS (1u << 12)
+# define bit_arch_Prefer_FSRM (1u << 13)
+# define bit_arch_Prefer_No_AVX512 (1u << 14)
+# define bit_arch_MathVec_Prefer_No_AVX512 (1u << 15)
+
+# define index_arch_Fast_Rep_String PREFERRED_FEATURE_INDEX_1
+# define index_arch_Fast_Copy_Backward PREFERRED_FEATURE_INDEX_1
+# define index_arch_Slow_BSF PREFERRED_FEATURE_INDEX_1
+# define index_arch_Fast_Unaligned_Load PREFERRED_FEATURE_INDEX_1
+# define index_arch_Prefer_PMINUB_for_stringop PREFERRED_FEATURE_INDEX_1
+# define index_arch_Fast_Unaligned_Copy PREFERRED_FEATURE_INDEX_1
+# define index_arch_I586 PREFERRED_FEATURE_INDEX_1
+# define index_arch_I686 PREFERRED_FEATURE_INDEX_1
+# define index_arch_Slow_SSE4_2 PREFERRED_FEATURE_INDEX_1
+# define index_arch_AVX_Fast_Unaligned_Load PREFERRED_FEATURE_INDEX_1
+# define index_arch_Prefer_MAP_32BIT_EXEC PREFERRED_FEATURE_INDEX_1
+# define index_arch_Prefer_No_VZEROUPPER PREFERRED_FEATURE_INDEX_1
+# define index_arch_Prefer_ERMS PREFERRED_FEATURE_INDEX_1
+# define index_arch_Prefer_No_AVX512 PREFERRED_FEATURE_INDEX_1
+# define index_arch_MathVec_Prefer_No_AVX512 PREFERRED_FEATURE_INDEX_1
+# define index_arch_Prefer_FSRM PREFERRED_FEATURE_INDEX_1
+
+/* XCR0 Feature flags. */
+# define bit_XMM_state (1u << 1)
+# define bit_YMM_state (1u << 2)
+# define bit_Opmask_state (1u << 5)
+# define bit_ZMM0_15_state (1u << 6)
+# define bit_ZMM16_31_state (1u << 7)
+# define bit_XTILECFG_state (1u << 17)
+# define bit_XTILEDATA_state (1u << 18)
+
+struct cpu_features
+{
+ struct cpu_features_basic basic;
+ struct cpuid_features features[COMMON_CPUID_INDEX_MAX];
+ unsigned int preferred[PREFERRED_FEATURE_INDEX_MAX];
+ /* The state size for XSAVEC or XSAVE. The type must be unsigned long
+ int so that we use
+
+ sub xsave_state_size_offset(%rip) %RSP_LP
+
+ in _dl_runtime_resolve. */
+ unsigned long int xsave_state_size;
+ /* The full state size for XSAVE when XSAVEC is disabled by
+
+ GLIBC_TUNABLES=glibc.cpu.hwcaps=-XSAVEC
+ */
+ unsigned int xsave_state_full_size;
+ /* Data cache size for use in memory and string routines, typically
+ L1 size. */
+ unsigned long int data_cache_size;
+ /* Shared cache size for use in memory and string routines, typically
+ L2 or L3 size. */
+ unsigned long int shared_cache_size;
+ /* Threshold to use non temporal store. */
+ unsigned long int non_temporal_threshold;
+ /* Threshold to use "rep movsb". */
+ unsigned long int rep_movsb_threshold;
+ /* Threshold to use "rep stosb". */
+ unsigned long int rep_stosb_threshold;
+};
+
+# if defined (_LIBC) && !IS_IN (nonlib)
+/* Unused for x86. */
+# define INIT_ARCH()
+# define __x86_get_cpu_features(max) (&GLRO(dl_x86_cpu_features))
+# endif
+
+# ifdef __x86_64__
+# define HAS_CPUID 1
+# elif (defined __i586__ || defined __pentium__ \
+ || defined __geode__ || defined __k6__)
+# define HAS_CPUID 1
+# define HAS_I586 1
+# define HAS_I686 HAS_ARCH_FEATURE (I686)
+# elif defined __i486__
+# define HAS_CPUID 0
+# define HAS_I586 HAS_ARCH_FEATURE (I586)
+# define HAS_I686 HAS_ARCH_FEATURE (I686)
+# else
+# define HAS_CPUID 1
+# define HAS_I586 1
+# define HAS_I686 1
+# endif
+
+#endif /* !_ISOMAC */
+
+#endif /* include/cpu-features.h */
diff --git a/sysdeps/x86/cpu-features.h b/sysdeps/x86/sys/platform/x86.h
index 78fcec2..bf3727e 100644
--- a/sysdeps/x86/cpu-features.h
+++ b/sysdeps/x86/sys/platform/x86.h
@@ -1,4 +1,5 @@
-/* This file is part of the GNU C Library.
+/* Data structure for x86 CPU features.
+ This file is part of the GNU C Library.
Copyright (C) 2008-2020 Free Software Foundation, Inc.
The GNU C Library is free software; you can redistribute it and/or
@@ -15,17 +16,8 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
-#ifndef cpu_features_h
-#define cpu_features_h
-
-enum
-{
- /* The integer bit array index for the first set of preferred feature
- bits. */
- PREFERRED_FEATURE_INDEX_1 = 0,
- /* The current maximum size of the feature integer bit array. */
- PREFERRED_FEATURE_INDEX_MAX
-};
+#ifndef _SYS_PLATFORM_X86_H
+#define _SYS_PLATFORM_X86_H
enum
{
@@ -76,73 +68,32 @@ struct cpu_features
{
struct cpu_features_basic basic;
struct cpuid_features features[COMMON_CPUID_INDEX_MAX];
- unsigned int preferred[PREFERRED_FEATURE_INDEX_MAX];
- /* The state size for XSAVEC or XSAVE. The type must be unsigned long
- int so that we use
-
- sub xsave_state_size_offset(%rip) %RSP_LP
-
- in _dl_runtime_resolve. */
- unsigned long int xsave_state_size;
- /* The full state size for XSAVE when XSAVEC is disabled by
-
- GLIBC_TUNABLES=glibc.cpu.hwcaps=-XSAVEC
- */
- unsigned int xsave_state_full_size;
- /* Data cache size for use in memory and string routines, typically
- L1 size. */
- unsigned long int data_cache_size;
- /* Shared cache size for use in memory and string routines, typically
- L2 or L3 size. */
- unsigned long int shared_cache_size;
- /* Threshold to use non temporal store. */
- unsigned long int non_temporal_threshold;
- /* Threshold to use "rep movsb". */
- unsigned long int rep_movsb_threshold;
- /* Threshold to use "rep stosb". */
- unsigned long int rep_stosb_threshold;
};
-/* Used from outside of glibc to get access to the CPU features
- structure. */
-extern const struct cpu_features *__get_cpu_features (void)
+/* Get a pointer to the CPU features structure. */
+extern const struct cpu_features *__x86_get_cpu_features (unsigned int)
__attribute__ ((const));
-/* Only used directly in cpu-features.c. */
#define CPU_FEATURE_CHECK_P(ptr, name, check) \
((ptr->features[index_cpu_##name].check.reg_##name \
& bit_cpu_##name) != 0)
-#define CPU_FEATURE_SET(ptr, name) \
- ptr->features[index_cpu_##name].usable.reg_##name |= bit_cpu_##name;
-#define CPU_FEATURE_UNSET(ptr, name) \
- ptr->features[index_cpu_##name].usable.reg_##name &= ~bit_cpu_##name;
-#define CPU_FEATURE_SET_USABLE(ptr, name) \
- ptr->features[index_cpu_##name].usable.reg_##name \
- |= ptr->features[index_cpu_##name].cpuid.reg_##name & bit_cpu_##name;
-#define CPU_FEATURE_PREFERRED_P(ptr, name) \
- ((ptr->preferred[index_arch_##name] & bit_arch_##name) != 0)
#define CPU_FEATURE_CPU_P(ptr, name) \
CPU_FEATURE_CHECK_P (ptr, name, cpuid)
#define CPU_FEATURE_USABLE_P(ptr, name) \
CPU_FEATURE_CHECK_P (ptr, name, usable)
/* HAS_CPU_FEATURE evaluates to true if CPU supports the feature. */
-#define HAS_CPU_FEATURE(name) \
- CPU_FEATURE_CPU_P (__get_cpu_features (), name)
+#define HAS_CPU_FEATURE(name) \
+ (__extension__ \
+ ({ const struct cpu_features *__ptr = \
+ __x86_get_cpu_features (COMMON_CPUID_INDEX_MAX); \
+ __ptr && CPU_FEATURE_CPU_P (__ptr, name); }))
/* CPU_FEATURE_USABLE evaluates to true if the feature is usable. */
-#define CPU_FEATURE_USABLE(name) \
- CPU_FEATURE_USABLE_P (__get_cpu_features (), name)
-/* CPU_FEATURE_PREFER evaluates to true if we prefer the feature at
- runtime. */
-#define CPU_FEATURE_PREFERRED(name) \
- CPU_FEATURE_PREFERRED_P(__get_cpu_features (), name)
-
-#define CPU_FEATURES_CPU_P(ptr, name) \
- CPU_FEATURE_CPU_P (ptr, name)
-#define CPU_FEATURES_ARCH_P(ptr, name) \
- CPU_FEATURE_PREFERRED_P (ptr, name)
-#define HAS_ARCH_FEATURE(name) \
- CPU_FEATURE_PREFERRED (name)
+#define CPU_FEATURE_USABLE(name) \
+ (__extension__ \
+ ({ const struct cpu_features *__ptr = \
+ __x86_get_cpu_features (COMMON_CPUID_INDEX_MAX); \
+ __ptr && CPU_FEATURE_USABLE_P (__ptr, name); }))
/* CPU features. */
@@ -787,71 +738,4 @@ extern const struct cpu_features *__get_cpu_features (void)
/* EAX. */
#define reg_AVX512_BF16 eax
-/* FEATURE_INDEX_2. */
-#define bit_arch_I586 (1u << 0)
-#define bit_arch_I686 (1u << 1)
-#define bit_arch_Fast_Rep_String (1u << 2)
-#define bit_arch_Fast_Copy_Backward (1u << 3)
-#define bit_arch_Fast_Unaligned_Load (1u << 4)
-#define bit_arch_Fast_Unaligned_Copy (1u << 5)
-#define bit_arch_Slow_BSF (1u << 6)
-#define bit_arch_Slow_SSE4_2 (1u << 7)
-#define bit_arch_AVX_Fast_Unaligned_Load (1u << 8)
-#define bit_arch_Prefer_MAP_32BIT_EXEC (1u << 9)
-#define bit_arch_Prefer_PMINUB_for_stringop (1u << 10)
-#define bit_arch_Prefer_No_VZEROUPPER (1u << 11)
-#define bit_arch_Prefer_ERMS (1u << 12)
-#define bit_arch_Prefer_FSRM (1u << 13)
-#define bit_arch_Prefer_No_AVX512 (1u << 14)
-#define bit_arch_MathVec_Prefer_No_AVX512 (1u << 15)
-
-#define index_arch_Fast_Rep_String PREFERRED_FEATURE_INDEX_1
-#define index_arch_Fast_Copy_Backward PREFERRED_FEATURE_INDEX_1
-#define index_arch_Slow_BSF PREFERRED_FEATURE_INDEX_1
-#define index_arch_Fast_Unaligned_Load PREFERRED_FEATURE_INDEX_1
-#define index_arch_Prefer_PMINUB_for_stringop PREFERRED_FEATURE_INDEX_1
-#define index_arch_Fast_Unaligned_Copy PREFERRED_FEATURE_INDEX_1
-#define index_arch_I586 PREFERRED_FEATURE_INDEX_1
-#define index_arch_I686 PREFERRED_FEATURE_INDEX_1
-#define index_arch_Slow_SSE4_2 PREFERRED_FEATURE_INDEX_1
-#define index_arch_AVX_Fast_Unaligned_Load PREFERRED_FEATURE_INDEX_1
-#define index_arch_Prefer_MAP_32BIT_EXEC PREFERRED_FEATURE_INDEX_1
-#define index_arch_Prefer_No_VZEROUPPER PREFERRED_FEATURE_INDEX_1
-#define index_arch_Prefer_ERMS PREFERRED_FEATURE_INDEX_1
-#define index_arch_Prefer_No_AVX512 PREFERRED_FEATURE_INDEX_1
-#define index_arch_MathVec_Prefer_No_AVX512 PREFERRED_FEATURE_INDEX_1
-#define index_arch_Prefer_FSRM PREFERRED_FEATURE_INDEX_1
-
-/* XCR0 Feature flags. */
-#define bit_XMM_state (1u << 1)
-#define bit_YMM_state (1u << 2)
-#define bit_Opmask_state (1u << 5)
-#define bit_ZMM0_15_state (1u << 6)
-#define bit_ZMM16_31_state (1u << 7)
-#define bit_XTILECFG_state (1u << 17)
-#define bit_XTILEDATA_state (1u << 18)
-
-# if defined (_LIBC) && !IS_IN (nonlib)
-/* Unused for x86. */
-# define INIT_ARCH()
-# define __get_cpu_features() (&GLRO(dl_x86_cpu_features))
-# endif
-
-#ifdef __x86_64__
-# define HAS_CPUID 1
-#elif (defined __i586__ || defined __pentium__ \
- || defined __geode__ || defined __k6__)
-# define HAS_CPUID 1
-# define HAS_I586 1
-# define HAS_I686 HAS_ARCH_FEATURE (I686)
-#elif defined __i486__
-# define HAS_CPUID 0
-# define HAS_I586 HAS_ARCH_FEATURE (I586)
-# define HAS_I686 HAS_ARCH_FEATURE (I686)
-#else
-# define HAS_CPUID 1
-# define HAS_I586 1
-# define HAS_I686 1
-#endif
-
-#endif /* cpu_features_h */
+#endif /* _SYS_PLATFORM_X86_H */
diff --git a/sysdeps/x86/tst-cpu-features-cpuinfo.c b/sysdeps/x86/tst-cpu-features-cpuinfo.c
new file mode 100644
index 0000000..9627728
--- /dev/null
+++ b/sysdeps/x86/tst-cpu-features-cpuinfo.c
@@ -0,0 +1,250 @@
+/* Test CPU feature data against /proc/cpuinfo.
+ This file is part of the GNU C Library.
+ Copyright (C) 2012-2020 Free Software Foundation, Inc.
+
+ 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 <sys/platform/x86.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+static char *cpu_flags;
+
+/* Search for flags in /proc/cpuinfo and store line
+ in cpu_flags. */
+void
+get_cpuinfo (void)
+{
+ FILE *f;
+ char *line = NULL;
+ size_t len = 0;
+ ssize_t read;
+
+ f = fopen ("/proc/cpuinfo", "r");
+ if (f == NULL)
+ {
+ printf ("cannot open /proc/cpuinfo\n");
+ exit (1);
+ }
+
+ while ((read = getline (&line, &len, f)) != -1)
+ {
+ if (strncmp (line, "flags", 5) == 0)
+ {
+ cpu_flags = strdup (line);
+ break;
+ }
+ }
+ fclose (f);
+ free (line);
+}
+
+int
+check_proc (const char *proc_name, int flag, int usable, const char *name)
+{
+ int found = 0;
+
+ printf ("Checking %s:\n", name);
+ if (!usable)
+ {
+ printf (" %s: insufficient usable info, skipped\n", name);
+ return 0;
+ }
+ printf (" %s: %d\n", name, flag);
+ if (strstr (cpu_flags, proc_name) != NULL)
+ found = 1;
+ printf (" cpuinfo (%s): %d\n", proc_name, found);
+
+ if (found != flag)
+ printf (" *** failure ***\n");
+
+ return (found != flag);
+}
+
+#define CHECK_PROC(str, name) \
+ check_proc (#str, HAS_CPU_FEATURE (name), CPU_FEATURE_USABLE (name), \
+ "HAS_CPU_FEATURE (" #name ")");
+
+static int
+do_test (int argc, char **argv)
+{
+ int fails = 0;
+
+ get_cpuinfo ();
+ fails += CHECK_PROC (acpi, ACPI);
+ fails += CHECK_PROC (adx, ADX);
+ fails += CHECK_PROC (apic, APIC);
+ fails += CHECK_PROC (aes, AES);
+ fails += CHECK_PROC (amx_bf16, AMX_BF16);
+ fails += CHECK_PROC (amx_int8, AMX_INT8);
+ fails += CHECK_PROC (amx_tile, AMX_TILE);
+ fails += CHECK_PROC (arch_capabilities, ARCH_CAPABILITIES);
+ fails += CHECK_PROC (avx, AVX);
+ fails += CHECK_PROC (avx2, AVX2);
+ fails += CHECK_PROC (avx512_4fmaps, AVX512_4FMAPS);
+ fails += CHECK_PROC (avx512_4vnniw, AVX512_4VNNIW);
+ fails += CHECK_PROC (avx512_bf16, AVX512_BF16);
+ fails += CHECK_PROC (avx512_bitalg, AVX512_BITALG);
+ fails += CHECK_PROC (avx512ifma, AVX512_IFMA);
+ fails += CHECK_PROC (avx512_vbmi, AVX512_VBMI);
+ fails += CHECK_PROC (avx512_vbmi2, AVX512_VBMI2);
+ fails += CHECK_PROC (avx512_vnni, AVX512_VNNI);
+ fails += CHECK_PROC (avx512_vp2intersect, AVX512_VP2INTERSECT);
+ fails += CHECK_PROC (avx512_vpopcntdq, AVX512_VPOPCNTDQ);
+ fails += CHECK_PROC (avx512bw, AVX512BW);
+ fails += CHECK_PROC (avx512cd, AVX512CD);
+ fails += CHECK_PROC (avx512er, AVX512ER);
+ fails += CHECK_PROC (avx512dq, AVX512DQ);
+ fails += CHECK_PROC (avx512f, AVX512F);
+ fails += CHECK_PROC (avx512pf, AVX512PF);
+ fails += CHECK_PROC (avx512vl, AVX512VL);
+ fails += CHECK_PROC (bmi1, BMI1);
+ fails += CHECK_PROC (bmi2, BMI2);
+ fails += CHECK_PROC (cldemote, CLDEMOTE);
+ fails += CHECK_PROC (clflushopt, CLFLUSHOPT);
+ fails += CHECK_PROC (clflush, CLFSH);
+ fails += CHECK_PROC (clwb, CLWB);
+ fails += CHECK_PROC (cmov, CMOV);
+ fails += CHECK_PROC (cx16, CMPXCHG16B);
+ fails += CHECK_PROC (cnxt_id, CNXT_ID);
+ fails += CHECK_PROC (core_capabilities, CORE_CAPABILITIES);
+ fails += CHECK_PROC (cx8, CX8);
+ fails += CHECK_PROC (dca, DCA);
+ fails += CHECK_PROC (de, DE);
+ fails += CHECK_PROC (zero_fcs_fds, DEPR_FPU_CS_DS);
+ fails += CHECK_PROC (ds, DS);
+ fails += CHECK_PROC (ds_cpl, DS_CPL);
+ fails += CHECK_PROC (dtes64, DTES64);
+ fails += CHECK_PROC (est, EIST);
+ fails += CHECK_PROC (enqcmd, ENQCMD);
+ fails += CHECK_PROC (erms, ERMS);
+ fails += CHECK_PROC (f16c, F16C);
+ fails += CHECK_PROC (fma, FMA);
+ fails += CHECK_PROC (fma4, FMA4);
+ fails += CHECK_PROC (fpu, FPU);
+ fails += CHECK_PROC (fsgsbase, FSGSBASE);
+ fails += CHECK_PROC (fsrm, FSRM);
+ fails += CHECK_PROC (fxsr, FXSR);
+ fails += CHECK_PROC (gfni, GFNI);
+ fails += CHECK_PROC (hle, HLE);
+ fails += CHECK_PROC (ht, HTT);
+ fails += CHECK_PROC (hybrid, HYBRID);
+ fails += CHECK_PROC (ibrs, IBRS_IBPB);
+ fails += CHECK_PROC (ibt, IBT);
+ fails += CHECK_PROC (invariant_tsc, INVARIANT_TSC);
+ fails += CHECK_PROC (invpcid, INVPCID);
+ fails += CHECK_PROC (flush_l1d, L1D_FLUSH);
+ fails += CHECK_PROC (lahf_lm, LAHF64_SAHF64);
+ fails += CHECK_PROC (lm, LM);
+ fails += CHECK_PROC (lwp, LWP);
+ fails += CHECK_PROC (abm, LZCNT);
+ fails += CHECK_PROC (mca, MCA);
+ fails += CHECK_PROC (mce, MCE);
+ fails += CHECK_PROC (md_clear, MD_CLEAR);
+ fails += CHECK_PROC (mmx, MMX);
+ fails += CHECK_PROC (monitor, MONITOR);
+ fails += CHECK_PROC (movbe, MOVBE);
+ fails += CHECK_PROC (movdiri, MOVDIRI);
+ fails += CHECK_PROC (movdir64b, MOVDIR64B);
+ fails += CHECK_PROC (mpx, MPX);
+ fails += CHECK_PROC (msr, MSR);
+ fails += CHECK_PROC (mtrr, MTRR);
+ fails += CHECK_PROC (nx, NX);
+ fails += CHECK_PROC (ospke, OSPKE);
+#if 0
+ /* NB: /proc/cpuinfo doesn't report this feature. */
+ fails += CHECK_PROC (osxsave, OSXSAVE);
+#endif
+ fails += CHECK_PROC (pae, PAE);
+ fails += CHECK_PROC (pdpe1gb, PAGE1GB);
+ fails += CHECK_PROC (pat, PAT);
+ fails += CHECK_PROC (pbe, PBE);
+ fails += CHECK_PROC (pcid, PCID);
+ fails += CHECK_PROC (pclmulqdq, PCLMULQDQ);
+ fails += CHECK_PROC (pconfig, PCONFIG);
+ fails += CHECK_PROC (pdcm, PDCM);
+ fails += CHECK_PROC (pge, PGE);
+ fails += CHECK_PROC (pks, PKS);
+ fails += CHECK_PROC (pku, PKU);
+ fails += CHECK_PROC (popcnt, POPCNT);
+ fails += CHECK_PROC (3dnowprefetch, PREFETCHW);
+ fails += CHECK_PROC (prefetchwt1, PREFETCHWT1);
+ fails += CHECK_PROC (pse, PSE);
+ fails += CHECK_PROC (pse36, PSE_36);
+ fails += CHECK_PROC (psn, PSN);
+ fails += CHECK_PROC (rdpid, RDPID);
+ fails += CHECK_PROC (rdrand, RDRAND);
+ fails += CHECK_PROC (rdseed, RDSEED);
+ fails += CHECK_PROC (rdt_a, RDT_A);
+ fails += CHECK_PROC (cqm, RDT_M);
+ fails += CHECK_PROC (rdtscp, RDTSCP);
+ fails += CHECK_PROC (rtm, RTM);
+ fails += CHECK_PROC (sdbg, SDBG);
+ fails += CHECK_PROC (sep, SEP);
+ fails += CHECK_PROC (serialize, SERIALIZE);
+ fails += CHECK_PROC (sgx, SGX);
+ fails += CHECK_PROC (sgx_lc, SGX_LC);
+ fails += CHECK_PROC (sha_ni, SHA);
+ fails += CHECK_PROC (shstk, SHSTK);
+ fails += CHECK_PROC (smap, SMAP);
+ fails += CHECK_PROC (smep, SMEP);
+ fails += CHECK_PROC (smx, SMX);
+ fails += CHECK_PROC (ss, SS);
+ fails += CHECK_PROC (ssbd, SSBD);
+ fails += CHECK_PROC (sse, SSE);
+ fails += CHECK_PROC (sse2, SSE2);
+ fails += CHECK_PROC (sse3, SSE3);
+ fails += CHECK_PROC (sse4_1, SSE4_1);
+ fails += CHECK_PROC (sse4_2, SSE4_2);
+ fails += CHECK_PROC (sse4a, SSE4A);
+ fails += CHECK_PROC (ssse3, SSSE3);
+ fails += CHECK_PROC (stibp, STIBP);
+ fails += CHECK_PROC (svm, SVM);
+#ifdef __x86_64__
+ /* NB: SYSCALL_SYSRET is 64-bit only. */
+ fails += CHECK_PROC (syscall, SYSCALL_SYSRET);
+#endif
+ fails += CHECK_PROC (tbm, TBM);
+ fails += CHECK_PROC (tm, TM);
+ fails += CHECK_PROC (tm2, TM2);
+ fails += CHECK_PROC (intel_pt, TRACE);
+ fails += CHECK_PROC (tsc, TSC);
+ fails += CHECK_PROC (tsc_adjust, TSC_ADJUST);
+ fails += CHECK_PROC (tsc_deadline, TSC_DEADLINE);
+ fails += CHECK_PROC (tsxldtrk, TSXLDTRK);
+ fails += CHECK_PROC (umip, UMIP);
+ fails += CHECK_PROC (vaes, VAES);
+ fails += CHECK_PROC (vme, VME);
+ fails += CHECK_PROC (vmx, VMX);
+ fails += CHECK_PROC (vpclmulqdq, VPCLMULQDQ);
+ fails += CHECK_PROC (waitpkg, WAITPKG);
+ fails += CHECK_PROC (wbnoinvd, WBNOINVD);
+ fails += CHECK_PROC (x2apic, X2APIC);
+ fails += CHECK_PROC (xfd, XFD);
+ fails += CHECK_PROC (xgetbv1, XGETBV_ECX_1);
+ fails += CHECK_PROC (xop, XOP);
+ fails += CHECK_PROC (xsave, XSAVE);
+ fails += CHECK_PROC (xsavec, XSAVEC);
+ fails += CHECK_PROC (xsaveopt, XSAVEOPT);
+ fails += CHECK_PROC (xsaves, XSAVES);
+ fails += CHECK_PROC (xtpr, XTPRUPDCTRL);
+
+ printf ("%d differences between /proc/cpuinfo and glibc code.\n", fails);
+
+ return (fails != 0);
+}
+
+#include "../../../test-skeleton.c"
diff --git a/sysdeps/x86/tst-cpu-features-supports.c b/sysdeps/x86/tst-cpu-features-supports.c
new file mode 100644
index 0000000..bf881b5
--- /dev/null
+++ b/sysdeps/x86/tst-cpu-features-supports.c
@@ -0,0 +1,192 @@
+/* Test CPU feature data against __builtin_cpu_supports.
+ This file is part of the GNU C Library.
+ Copyright (C) 2020 Free Software Foundation, Inc.
+
+ 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 <sys/platform/x86.h>
+#include <stdio.h>
+
+int
+check_supports (int supports, int usable, const char *supports_name,
+ const char *name)
+{
+ printf ("Checking %s:\n", name);
+ printf (" %s: %d\n", name, usable);
+ printf (" __builtin_cpu_supports (%s): %d\n",
+ supports_name, supports);
+
+ if ((supports != 0) != (usable != 0))
+ {
+ printf (" *** failure ***\n");
+ return 1;
+ }
+
+ return 0;
+}
+
+#define CHECK_SUPPORTS(str, name) \
+ check_supports (__builtin_cpu_supports (#str), \
+ CPU_FEATURE_USABLE (name), \
+ #str, "HAS_CPU_FEATURE (" #name ")");
+
+static int
+do_test (int argc, char **argv)
+{
+ int fails = 0;
+
+#if __GNUC_PREREQ (11, 0)
+ fails += CHECK_SUPPORTS (adx, ADX);
+#endif
+#if __GNUC_PREREQ (6, 0)
+ fails += CHECK_SUPPORTS (aes, AES);
+#endif
+#if __GNUC_PREREQ (11, 1)
+ fails += CHECK_SUPPORTS (amx_bf16, AMX_BF16);
+ fails += CHECK_SUPPORTS (amx_int8, AMX_INT8);
+ fails += CHECK_SUPPORTS (amx_tile, AMX_TILE);
+#endif
+ fails += CHECK_SUPPORTS (avx, AVX);
+ fails += CHECK_SUPPORTS (avx2, AVX2);
+#if __GNUC_PREREQ (7, 0)
+ fails += CHECK_SUPPORTS (avx5124fmaps, AVX512_4FMAPS);
+ fails += CHECK_SUPPORTS (avx5124vnniw, AVX512_4VNNIW);
+#endif
+#if __GNUC_PREREQ (10, 0)
+ fails += CHECK_SUPPORTS (avx512bf16, AVX512_BF16);
+#endif
+#if __GNUC_PREREQ (8, 0)
+ fails += CHECK_SUPPORTS (avx512bitalg, AVX512_BITALG);
+#endif
+#if __GNUC_PREREQ (6, 0)
+ fails += CHECK_SUPPORTS (avx512ifma, AVX512_IFMA);
+ fails += CHECK_SUPPORTS (avx512vbmi, AVX512_VBMI);
+#endif
+#if __GNUC_PREREQ (8, 0)
+ fails += CHECK_SUPPORTS (avx512vbmi2, AVX512_VBMI2);
+ fails += CHECK_SUPPORTS (avx512vnni, AVX512_VNNI);
+#endif
+#if __GNUC_PREREQ (10, 0)
+ fails += CHECK_SUPPORTS (avx512vp2intersect, AVX512_VP2INTERSECT);
+#endif
+#if __GNUC_PREREQ (7, 0)
+ fails += CHECK_SUPPORTS (avx512vpopcntdq, AVX512_VPOPCNTDQ);
+#endif
+#if __GNUC_PREREQ (6, 0)
+ fails += CHECK_SUPPORTS (avx512bw, AVX512BW);
+ fails += CHECK_SUPPORTS (avx512cd, AVX512CD);
+ fails += CHECK_SUPPORTS (avx512er, AVX512ER);
+ fails += CHECK_SUPPORTS (avx512dq, AVX512DQ);
+#endif
+#if __GNUC_PREREQ (5, 0)
+ fails += CHECK_SUPPORTS (avx512f, AVX512F);
+#endif
+#if __GNUC_PREREQ (6, 0)
+ fails += CHECK_SUPPORTS (avx512pf, AVX512PF);
+ fails += CHECK_SUPPORTS (avx512vl, AVX512VL);
+#endif
+#if __GNUC_PREREQ (5, 0)
+ fails += CHECK_SUPPORTS (bmi, BMI1);
+ fails += CHECK_SUPPORTS (bmi2, BMI2);
+#endif
+#if __GNUC_PREREQ (11, 0)
+ fails += CHECK_SUPPORTS (cldemote, CLDEMOTE);
+ fails += CHECK_SUPPORTS (clflushopt, CLFLUSHOPT);
+ fails += CHECK_SUPPORTS (clwb, CLWB);
+#endif
+ fails += CHECK_SUPPORTS (cmov, CMOV);
+#if __GNUC_PREREQ (11, 0)
+ fails += CHECK_SUPPORTS (cmpxchg16b, CMPXCHG16B);
+ fails += CHECK_SUPPORTS (cmpxchg8b, CX8);
+ fails += CHECK_SUPPORTS (enqcmd, ENQCMD);
+ fails += CHECK_SUPPORTS (f16c, F16C);
+#endif
+#if __GNUC_PREREQ (4, 9)
+ fails += CHECK_SUPPORTS (fma, FMA);
+ fails += CHECK_SUPPORTS (fma4, FMA4);
+#endif
+#if __GNUC_PREREQ (11, 0)
+ fails += CHECK_SUPPORTS (fsgsbase, FSGSBASE);
+ fails += CHECK_SUPPORTS (fxsave, FXSR);
+#endif
+#if __GNUC_PREREQ (8, 0)
+ fails += CHECK_SUPPORTS (gfni, GFNI);
+#endif
+#if __GNUC_PREREQ (11, 0)
+ fails += CHECK_SUPPORTS (hle, HLE);
+ fails += CHECK_SUPPORTS (ibt, IBT);
+ fails += CHECK_SUPPORTS (lahf_lm, LAHF64_SAHF64);
+ fails += CHECK_SUPPORTS (lm, LM);
+ fails += CHECK_SUPPORTS (lwp, LWP);
+ fails += CHECK_SUPPORTS (lzcnt, LZCNT);
+#endif
+ fails += CHECK_SUPPORTS (mmx, MMX);
+#if __GNUC_PREREQ (11, 0)
+ fails += CHECK_SUPPORTS (movbe, MOVBE);
+ fails += CHECK_SUPPORTS (movdiri, MOVDIRI);
+ fails += CHECK_SUPPORTS (movdir64b, MOVDIR64B);
+ fails += CHECK_SUPPORTS (osxsave, OSXSAVE);
+ fails += CHECK_SUPPORTS (pconfig, PCONFIG);
+ fails += CHECK_SUPPORTS (pku, PKU);
+#endif
+ fails += CHECK_SUPPORTS (popcnt, POPCNT);
+#if __GNUC_PREREQ (11, 0)
+ fails += CHECK_SUPPORTS (prefetchwt1, PREFETCHWT1);
+ fails += CHECK_SUPPORTS (rdpid, RDPID);
+ fails += CHECK_SUPPORTS (rdrnd, RDRAND);
+ fails += CHECK_SUPPORTS (rdseed, RDSEED);
+ fails += CHECK_SUPPORTS (rtm, RTM);
+ fails += CHECK_SUPPORTS (serialize, SERIALIZE);
+ fails += CHECK_SUPPORTS (sha, SHA);
+ fails += CHECK_SUPPORTS (shstk, SHSTK);
+#endif
+ fails += CHECK_SUPPORTS (sse, SSE);
+ fails += CHECK_SUPPORTS (sse2, SSE2);
+ fails += CHECK_SUPPORTS (sse3, SSE3);
+ fails += CHECK_SUPPORTS (sse4.1, SSE4_1);
+ fails += CHECK_SUPPORTS (sse4.2, SSE4_2);
+#if __GNUC_PREREQ (4, 9)
+ fails += CHECK_SUPPORTS (sse4a, SSE4A);
+#endif
+ fails += CHECK_SUPPORTS (ssse3, SSSE3);
+#if __GNUC_PREREQ (11, 0)
+ fails += CHECK_SUPPORTS (tbm, TBM);
+ fails += CHECK_SUPPORTS (tsxldtrk, TSXLDTRK);
+ fails += CHECK_SUPPORTS (vaes, VAES);
+#endif
+#if __GNUC_PREREQ (8, 0)
+ fails += CHECK_SUPPORTS (vpclmulqdq, VPCLMULQDQ);
+#endif
+#if __GNUC_PREREQ (11, 0)
+ fails += CHECK_SUPPORTS (waitpkg, WAITPKG);
+ fails += CHECK_SUPPORTS (wbnoinvd, WBNOINVD);
+#endif
+#if __GNUC_PREREQ (4, 9)
+ fails += CHECK_SUPPORTS (xop, XOP);
+#endif
+#if __GNUC_PREREQ (11, 0)
+ fails += CHECK_SUPPORTS (xsave, XSAVE);
+ fails += CHECK_SUPPORTS (xsavec, XSAVEC);
+ fails += CHECK_SUPPORTS (xsaveopt, XSAVEOPT);
+ fails += CHECK_SUPPORTS (xsaves, XSAVES);
+#endif
+
+ printf ("%d differences between __builtin_cpu_supports and glibc code.\n",
+ fails);
+
+ return (fails != 0);
+}
+
+#include "../../../test-skeleton.c"
diff --git a/sysdeps/x86/tst-get-cpu-features.c b/sysdeps/x86/tst-get-cpu-features.c
index 6bfdef0..3447d17 100644
--- a/sysdeps/x86/tst-get-cpu-features.c
+++ b/sysdeps/x86/tst-get-cpu-features.c
@@ -1,4 +1,4 @@
-/* Test case for x86 __get_cpu_features interface
+/* Test case for __x86_get_cpu_features interface
Copyright (C) 2015-2020 Free Software Foundation, Inc.
This file is part of the GNU C Library.
@@ -18,7 +18,7 @@
#include <stdlib.h>
#include <stdio.h>
-#include <cpu-features.h>
+#include <sys/platform/x86.h>
#include <support/check.h>
#define CHECK_CPU_FEATURE(name) \
@@ -45,7 +45,7 @@ static const char * const cpu_kinds[] =
static int
do_test (void)
{
- const struct cpu_features *cpu_features = __get_cpu_features ();
+ const struct cpu_features *cpu_features = __x86_get_cpu_features (0);
switch (cpu_features->basic.kind)
{
diff --git a/sysdeps/x86_64/fpu/math-tests-arch.h b/sysdeps/x86_64/fpu/math-tests-arch.h
index 33ea763..cc3c2b0 100644
--- a/sysdeps/x86_64/fpu/math-tests-arch.h
+++ b/sysdeps/x86_64/fpu/math-tests-arch.h
@@ -16,7 +16,7 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
-#include <cpu-features.h>
+#include <sys/platform/x86.h>
#if defined REQUIRE_AVX
diff --git a/sysdeps/x86_64/multiarch/Makefile b/sysdeps/x86_64/multiarch/Makefile
index 395e432..9477538 100644
--- a/sysdeps/x86_64/multiarch/Makefile
+++ b/sysdeps/x86_64/multiarch/Makefile
@@ -1,7 +1,3 @@
-ifeq ($(subdir),csu)
-tests += test-multiarch
-endif
-
ifeq ($(subdir),string)
sysdep_routines += strncat-c stpncpy-c strncpy-c \
diff --git a/sysdeps/x86_64/multiarch/test-multiarch.c b/sysdeps/x86_64/multiarch/test-multiarch.c
deleted file mode 100644
index 2782803..0000000
--- a/sysdeps/x86_64/multiarch/test-multiarch.c
+++ /dev/null
@@ -1,96 +0,0 @@
-/* Test CPU feature data.
- This file is part of the GNU C Library.
- Copyright (C) 2012-2020 Free Software Foundation, Inc.
-
- 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 <cpu-features.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-static char *cpu_flags;
-
-/* Search for flags in /proc/cpuinfo and store line
- in cpu_flags. */
-void
-get_cpuinfo (void)
-{
- FILE *f;
- char *line = NULL;
- size_t len = 0;
- ssize_t read;
-
- f = fopen ("/proc/cpuinfo", "r");
- if (f == NULL)
- {
- printf ("cannot open /proc/cpuinfo\n");
- exit (1);
- }
-
- while ((read = getline (&line, &len, f)) != -1)
- {
- if (strncmp (line, "flags", 5) == 0)
- {
- cpu_flags = strdup (line);
- break;
- }
- }
- fclose (f);
- free (line);
-}
-
-int
-check_proc (const char *proc_name, int flag, const char *name)
-{
- int found = 0;
-
- printf ("Checking %s:\n", name);
- printf (" init-arch %d\n", flag);
- if (strstr (cpu_flags, proc_name) != NULL)
- found = 1;
- printf (" cpuinfo (%s) %d\n", proc_name, found);
-
- if (found != flag)
- printf (" *** failure ***\n");
-
- return (found != flag);
-}
-
-static int
-do_test (int argc, char **argv)
-{
- int fails;
-
- get_cpuinfo ();
- fails = check_proc ("avx", CPU_FEATURE_USABLE (AVX),
- "CPU_FEATURE_USABLE (AVX)");
- fails += check_proc ("fma4", CPU_FEATURE_USABLE (FMA4),
- "CPU_FEATURE_USABLE (FMA4)");
- fails += check_proc ("sse4_2", CPU_FEATURE_USABLE (SSE4_2),
- "CPU_FEATURE_USABLE (SSE4_2)");
- fails += check_proc ("sse4_1", CPU_FEATURE_USABLE (SSE4_1)
- , "CPU_FEATURE_USABLE (SSE4_1)");
- fails += check_proc ("ssse3", CPU_FEATURE_USABLE (SSSE3),
- "CPU_FEATURE_USABLE (SSSE3)");
- fails += check_proc ("popcnt", CPU_FEATURE_USABLE (POPCNT),
- "CPU_FEATURE_USABLE (POPCNT)");
-
- printf ("%d differences between /proc/cpuinfo and glibc code.\n", fails);
-
- return (fails != 0);
-}
-
-#include "../../../test-skeleton.c"