+2009-10-06 Roland McGrath <roland@redhat.com>
+
+ * sysdeps/x86_64/multiarch/init-arch.h
+ [NOT_IN_libc] (__get_cpu_features): Define it as a macro.
+ (HAS_CPU_FEATURE): New macro.
+ (HAS_SSE2, HAS_POPCOUNT, HAS_SSE4_2, HAS_FMA): Use it.
+ * sysdeps/x86_64/multiarch/init-arch.c
+ (__get_cpu_features): #undef it before definition.
+
2009-10-05 Andreas Schwab <schwab@redhat.com>
* locale/C-time.c: Revert week-1stday back to 19971130 and set
extern const struct cpu_features *__get_cpu_features (void)
__attribute__ ((const));
-/* Following are the feature tests used throughout libc. */
-
#ifndef NOT_IN_libc
-# define HAS_SSE2 \
- ((__cpu_features.cpuid[COMMON_CPUID_INDEX_1].edx & (1 << 26)) != 0)
-
-# define HAS_POPCOUNT \
- ((__cpu_features.cpuid[COMMON_CPUID_INDEX_1].ecx & (1 << 23)) != 0)
-
-# define HAS_SSE4_2 \
- ((__cpu_features.cpuid[COMMON_CPUID_INDEX_1].ecx & (1 << 20)) != 0)
-
-# define HAS_FMA \
- ((__cpu_features.cpuid[COMMON_CPUID_INDEX_1].ecx & (1 << 12)) != 0)
-#else
-# define HAS_SSE2 \
- ((__get_cpu_features ()->cpuid[COMMON_CPUID_INDEX_1].edx & (1 << 26)) != 0)
+# define __get_cpu_features() (&__cpu_features)
+#endif
-# define HAS_POPCOUNT \
- ((__get_cpu_features ()->cpuid[COMMON_CPUID_INDEX_1].ecx & (1 << 23)) != 0)
+#define HAS_CPU_FEATURE(idx, reg, bit) \
+ ((__get_cpu_features ()->cpuid[idx].reg & (1 << (bit))) != 0)
-# define HAS_SSE4_2 \
- ((__get_cpu_features ()->cpuid[COMMON_CPUID_INDEX_1].ecx & (1 << 20)) != 0)
+/* Following are the feature tests used throughout libc. */
-# define HAS_FMA \
- ((__get_cpu_features ()->cpuid[COMMON_CPUID_INDEX_1].ecx & (1 << 12)) != 0)
-#endif
+#define HAS_SSE2 HAS_CPU_FEATURE (COMMON_CPUID_INDEX_1, edx, 26)
+#define HAS_POPCOUNT HAS_CPU_FEATURE (COMMON_CPUID_INDEX_1, ecx, 23)
+#define HAS_SSE4_2 HAS_CPU_FEATURE (COMMON_CPUID_INDEX_1, ecx, 20)
+#define HAS_FMA HAS_CPU_FEATURE (COMMON_CPUID_INDEX_1, ecx, 12)