diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2015-08-17 10:19:05 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2015-08-20 15:22:47 -0700 |
commit | ab6c5fc76c1fc58916837c6227f3204bc17a89ad (patch) | |
tree | db4ba270f20dfae42bb0d59975f2308b923b4ace | |
parent | 8d9e08981e1ac5ee90209adb3042206e9fffd286 (diff) | |
download | glibc-ab6c5fc76c1fc58916837c6227f3204bc17a89ad.tar.gz glibc-ab6c5fc76c1fc58916837c6227f3204bc17a89ad.tar.xz glibc-ab6c5fc76c1fc58916837c6227f3204bc17a89ad.zip |
Detect i586 and i686 features at run-time
We detect i586 and i686 features at run-time by checking CX8 and CMOV CPUID features bits. We can use these information to select the best implementation in ix86 multiarch. HAS_I586 and HAS_I686 are changed run-time check. SUPPORT_I586 and SUPPORT_I686 are added for compile-time check. * 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): Renamed to ... (SUPPORT_I586): This. (HAS_I686): Renamed to ... (SUPPORT_I686): This. (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.
-rw-r--r-- | sysdeps/x86/cpu-features.c | 8 | ||||
-rw-r--r-- | sysdeps/x86/cpu-features.h | 26 |
2 files changed, 31 insertions, 3 deletions
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..2c0a3fd685 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,9 @@ 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) +# define SUPPORT_I586 1 +# define SUPPORT_I686 0 #elif (defined __i686__ || defined __pentiumpro__ \ || defined __pentium4__ || defined __nocona__ \ || defined __atom__ || defined __core2__ \ @@ -259,10 +275,14 @@ extern const struct cpu_features *__get_cpu_features (void) # define HAS_CPUID 1 # define HAS_I586 1 # define HAS_I686 1 +# define SUPPORT_I586 1 +# define SUPPORT_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) +# define SUPPORT_I586 0 +# define SUPPORT_I686 0 #endif #endif /* cpu_features_h */ |