diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2015-08-27 09:06:26 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2015-08-27 09:06:44 -0700 |
commit | 75dd0a8f3db2813196db08928b1b6bb200230695 (patch) | |
tree | a7e7c109a7929ab4f48d593c6ed88a71ed89e111 /sysdeps/x86/init-arch.h | |
parent | d226114b9bfce2ea729f9c7b736aa5d509b2a73c (diff) | |
download | glibc-75dd0a8f3db2813196db08928b1b6bb200230695.tar.gz glibc-75dd0a8f3db2813196db08928b1b6bb200230695.tar.xz glibc-75dd0a8f3db2813196db08928b1b6bb200230695.zip |
Detect and select i586/i686 implementation at run-time fedora/master
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/HAS_I686 is true if i586/i686 instructions are available on the processor. 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. USE_I586/USE_I686 is true if i586/i686 implementation should be used for the processor. USE_I586 is true only if i686 instructions aren't available. If i686 instructions are available, we always choose i686 or i486 implementation, in that order, and we never choose i586 implementation for i686-class processors. * 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.
Diffstat (limited to 'sysdeps/x86/init-arch.h')
-rw-r--r-- | sysdeps/x86/init-arch.h | 13 |
1 files changed, 13 insertions, 0 deletions
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 |