summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog24
-rw-r--r--sysdeps/i386/i586/init-arch.h19
-rw-r--r--sysdeps/i386/i686/init-arch.h19
-rw-r--r--sysdeps/i386/init-arch.h19
-rw-r--r--sysdeps/x86/cpu-features.c8
-rw-r--r--sysdeps/x86/cpu-features.h20
-rw-r--r--sysdeps/x86/init-arch.h13
7 files changed, 119 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index df391c2a78..844bbf7eef 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,29 @@
2015-08-27 H.J. Lu <hongjiu.lu@intel.com>
+ * sysdeps/i386/init-arch.h: New file.
+ * sysdeps/i386/i586/init-arch.h: Likewise.
+ * sysdeps/i386/i686/init-arch.h: Likewise.
+ * sysdeps/x86/cpu-features.c (init_cpu_features): Set bit_I586
+ bit if CX8 is available. Set bit_I686 bit if CMOV is available.
+ * sysdeps/x86/cpu-features.h (bit_I586): New.
+ (bit_I686): Likewise.
+ (bit_CX8): Likewise.
+ (bit_CMOV): Likewise.
+ (index_CX8): Likewise.
+ (index_CMOV): Likewise.
+ (index_I586): Likewise.
+ (index_I686): Likewise.
+ (reg_CX8): Likewise.
+ (reg_CMOV): Likewise.
+ (HAS_I586): Defined as HAS_ARCH_FEATURE (I586) if i586 isn't
+ available at compile-time.
+ (HAS_I686): Defined as HAS_ARCH_FEATURE (I686) if i686 isn't
+ available at compile-time.
+ * sysdeps/x86/init-arch.h (USE_I586): New macro.
+ (USE_I686): Likewise.
+
+2015-08-27 H.J. Lu <hongjiu.lu@intel.com>
+
* sysdeps/i386/bcopy.S: New file.
* sysdeps/i386/bzero.S: Likewise.
* sysdeps/i386/memcpy.S: Likewise.
diff --git a/sysdeps/i386/i586/init-arch.h b/sysdeps/i386/i586/init-arch.h
new file mode 100644
index 0000000000..50c43a232e
--- /dev/null
+++ b/sysdeps/i386/i586/init-arch.h
@@ -0,0 +1,19 @@
+/* Copyright (C) 2015 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
+ <http://www.gnu.org/licenses/>. */
+
+#define MINIMUM_ISA 586
+#include <sysdeps/x86/init-arch.h>
diff --git a/sysdeps/i386/i686/init-arch.h b/sysdeps/i386/i686/init-arch.h
new file mode 100644
index 0000000000..b4a27351ca
--- /dev/null
+++ b/sysdeps/i386/i686/init-arch.h
@@ -0,0 +1,19 @@
+/* Copyright (C) 2015 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
+ <http://www.gnu.org/licenses/>. */
+
+#define MINIMUM_ISA 686
+#include <sysdeps/x86/init-arch.h>
diff --git a/sysdeps/i386/init-arch.h b/sysdeps/i386/init-arch.h
new file mode 100644
index 0000000000..0c74ddcf41
--- /dev/null
+++ b/sysdeps/i386/init-arch.h
@@ -0,0 +1,19 @@
+/* Copyright (C) 2015 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
+ <http://www.gnu.org/licenses/>. */
+
+#define MINIMUM_ISA 486
+#include <sysdeps/x86/init-arch.h>
diff --git a/sysdeps/x86/cpu-features.c b/sysdeps/x86/cpu-features.c
index 40575de611..b03451dde1 100644
--- a/sysdeps/x86/cpu-features.c
+++ b/sysdeps/x86/cpu-features.c
@@ -150,6 +150,14 @@ init_cpu_features (struct cpu_features *cpu_features)
else
kind = arch_kind_other;
+ /* Support i586 if CX8 is available. */
+ if (HAS_CPU_FEATURE (CX8))
+ cpu_features->feature[index_I586] |= bit_I586;
+
+ /* Support i686 if CMOV is available. */
+ if (HAS_CPU_FEATURE (CMOV))
+ cpu_features->feature[index_I686] |= bit_I686;
+
if (cpu_features->max_cpuid >= 7)
__cpuid_count (7, 0,
cpu_features->cpuid[COMMON_CPUID_INDEX_7].eax,
diff --git a/sysdeps/x86/cpu-features.h b/sysdeps/x86/cpu-features.h
index 6e706241ad..80edbee75c 100644
--- a/sysdeps/x86/cpu-features.h
+++ b/sysdeps/x86/cpu-features.h
@@ -31,10 +31,14 @@
#define bit_AVX_Fast_Unaligned_Load (1 << 11)
#define bit_AVX512F_Usable (1 << 12)
#define bit_AVX512DQ_Usable (1 << 13)
+#define bit_I586 (1 << 14)
+#define bit_I686 (1 << 15)
/* CPUID Feature flags. */
/* COMMON_CPUID_INDEX_1. */
+#define bit_CX8 (1 << 8)
+#define bit_CMOV (1 << 15)
#define bit_SSE2 (1 << 26)
#define bit_SSSE3 (1 << 9)
#define bit_SSE4_1 (1 << 19)
@@ -69,6 +73,8 @@
# include <ifunc-defines.h>
# include <rtld-global-offsets.h>
+# define index_CX8 COMMON_CPUID_INDEX_1*CPUID_SIZE+CPUID_EDX_OFFSET
+# define index_CMOV COMMON_CPUID_INDEX_1*CPUID_SIZE+CPUID_EDX_OFFSET
# define index_SSE2 COMMON_CPUID_INDEX_1*CPUID_SIZE+CPUID_EDX_OFFSET
# define index_SSSE3 COMMON_CPUID_INDEX_1*CPUID_SIZE+CPUID_ECX_OFFSET
# define index_SSE4_1 COMMON_CPUID_INDEX_1*CPUID_SIZE+CPUID_ECX_OFFSET
@@ -89,6 +95,8 @@
# define index_AVX_Fast_Unaligned_Load FEATURE_INDEX_1*FEATURE_SIZE
# define index_AVX512F_Usable FEATURE_INDEX_1*FEATURE_SIZE
# define index_AVX512DQ_Usable FEATURE_INDEX_1*FEATURE_SIZE
+# define index_I586 FEATURE_INDEX_1*FEATURE_SIZE
+# define index_I686 FEATURE_INDEX_1*FEATURE_SIZE
# if defined (_LIBC) && !IS_IN (nonlib)
# ifdef __x86_64__
@@ -193,6 +201,8 @@ extern const struct cpu_features *__get_cpu_features (void)
# define HAS_ARCH_FEATURE(name) \
((__get_cpu_features ()->feature[index_##name] & (bit_##name)) != 0)
+# define index_CX8 COMMON_CPUID_INDEX_1
+# define index_CMOV COMMON_CPUID_INDEX_1
# define index_SSE2 COMMON_CPUID_INDEX_1
# define index_SSSE3 COMMON_CPUID_INDEX_1
# define index_SSE4_1 COMMON_CPUID_INDEX_1
@@ -207,6 +217,8 @@ extern const struct cpu_features *__get_cpu_features (void)
# define index_POPCOUNT COMMON_CPUID_INDEX_1
# define index_OSXSAVE COMMON_CPUID_INDEX_1
+# define reg_CX8 edx
+# define reg_CMOV edx
# define reg_SSE2 edx
# define reg_SSSE3 ecx
# define reg_SSE4_1 ecx
@@ -234,6 +246,8 @@ extern const struct cpu_features *__get_cpu_features (void)
# define index_AVX_Fast_Unaligned_Load FEATURE_INDEX_1
# define index_AVX512F_Usable FEATURE_INDEX_1
# define index_AVX512DQ_Usable FEATURE_INDEX_1
+# define index_I586 FEATURE_INDEX_1
+# define index_I686 FEATURE_INDEX_1
#endif /* !__ASSEMBLER__ */
@@ -242,7 +256,7 @@ extern const struct cpu_features *__get_cpu_features (void)
#elif defined __i586__ || defined __pentium__
# define HAS_CPUID 1
# define HAS_I586 1
-# define HAS_I686 0
+# define HAS_I686 HAS_ARCH_FEATURE (I686)
#elif (defined __i686__ || defined __pentiumpro__ \
|| defined __pentium4__ || defined __nocona__ \
|| defined __atom__ || defined __core2__ \
@@ -261,8 +275,8 @@ extern const struct cpu_features *__get_cpu_features (void)
# define HAS_I686 1
#else
# define HAS_CPUID 0
-# define HAS_I586 0
-# define HAS_I686 0
+# define HAS_I586 HAS_ARCH_FEATURE (I586)
+# define HAS_I686 HAS_ARCH_FEATURE (I686)
#endif
#endif /* cpu_features_h */
diff --git a/sysdeps/x86/init-arch.h b/sysdeps/x86/init-arch.h
index 2b9988ebc3..55897fabf2 100644
--- a/sysdeps/x86/init-arch.h
+++ b/sysdeps/x86/init-arch.h
@@ -20,3 +20,16 @@
#else
# include <ldsodefs.h>
#endif
+
+#ifndef __x86_64__
+/* Due to the reordering and the other nifty extensions in i686, it is
+ not really good to use heavily i586 optimized code on an i686. It's
+ better to use i486 code if it isn't an i586. */
+# if MINIMUM_ISA == 686
+# define USE_I586 0
+# define USE_I686 1
+# else
+# define USE_I586 (HAS_ARCH_FEATURE (I586) && !HAS_ARCH_FEATURE (I686))
+# define USE_I686 HAS_ARCH_FEATURE (I686)
+# endif
+#endif