This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] Define HAS_CPUID/HAS_I586/HAS_I686 from -march=
- From: "H.J. Lu" <hongjiu dot lu at intel dot com>
- To: GNU C Library <libc-alpha at sourceware dot org>
- Date: Mon, 17 Aug 2015 16:10:05 -0700
- Subject: [PATCH] Define HAS_CPUID/HAS_I586/HAS_I686 from -march=
- Authentication-results: sourceware.org; auth=none
- Reply-to: "H.J. Lu" <hjl dot tools at gmail dot com>
cpuid, i586 and i686 instructions are available if the processor
specified by -march= supports them. We can use this information
to determine whether those instructions can be used safely.
OK for master?
H.J.
---
* sysdeps/x86/cpu-features.c (init_cpu_features): Check
whether cpuid is available only if HAS_CPUID is 0.
* sysdeps/x86/cpu-features.h (HAS_CPUID): New.
(HAS_I586): Likewise.
(HAS_I686): Likewise.
---
sysdeps/x86/cpu-features.c | 4 ++--
sysdeps/x86/cpu-features.h | 27 +++++++++++++++++++++++++++
2 files changed, 29 insertions(+), 2 deletions(-)
diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c
index 2d744ac..16d78c5 100644
--- a/sysdeps/x86/cpu-features.c
+++ b/sysdeps/x86/cpu-features.c
@@ -40,7 +40,7 @@ init_cpu_features (struct cpu_features *cpu_features)
unsigned int model = 0;
enum cpu_features_kind kind;
-#if !defined __i586__ && !defined __i686__ && !defined __x86_64__
+#if !HAS_CPUID
if (__get_cpuid_max (0, 0) == 0)
{
kind = arch_kind_other;
@@ -212,7 +212,7 @@ init_cpu_features (struct cpu_features *cpu_features)
}
}
-#if !defined __i586__ && !defined __i686__ && !defined __x86_64__
+#if !HAS_CPUID
no_cpuid:
#endif
diff --git a/sysdeps/x86/cpu-features.h b/sysdeps/x86/cpu-features.h
index fce30c3..795d653 100644
--- a/sysdeps/x86/cpu-features.h
+++ b/sysdeps/x86/cpu-features.h
@@ -251,4 +251,31 @@ extern const struct cpu_features *__get_cpu_features (void)
#endif /* !__ASSEMBLER__ */
+#ifdef __x86_64__
+# define HAS_CPUID 1
+#elif defined __pentium__
+# define HAS_CPUID 1
+# define HAS_I586 1
+# define HAS_I686 0
+#elif (defined __pentiumpro__ || defined __pentium4__ \
+ || defined __nocona__ || defined __atom__ \
+ || defined __core2__ || defined __corei7__ \
+ || defined __corei7_avx__ || defined __core_avx2__ \
+ || defined __nehalem__ || defined __sandybridge__ \
+ || defined __haswell__ || defined __knl__ \
+ || defined __bonnell__ || defined __silvermont__ \
+ || defined __k6__ || defined __k8__ \
+ || defined __athlon__ || defined __amdfam10__ \
+ || defined __bdver1__ || defined __bdver2__ \
+ || defined __bdver3__ || defined __bdver4__ \
+ || defined __btver1__ || defined __btver2__)
+# define HAS_CPUID 1
+# define HAS_I586 1
+# define HAS_I686 1
+#else
+# define HAS_CPUID 0
+# define HAS_I586 0
+# define HAS_I686 0
+#endif
+
#endif /* cpu_features_h */
--
2.4.3