mirror of
https://sourceware.org/git/glibc.git
synced 2024-12-02 09:40:13 +00:00
9620398097
Install <sys/platform/x86.h> so that programmers can do #if __has_include(<sys/platform/x86.h>) #include <sys/platform/x86.h> #endif ... if (CPU_FEATURE_USABLE (SSE2)) ... if (CPU_FEATURE_USABLE (AVX2)) ... <sys/platform/x86.h> exports only: enum { COMMON_CPUID_INDEX_1 = 0, COMMON_CPUID_INDEX_7, COMMON_CPUID_INDEX_80000001, COMMON_CPUID_INDEX_D_ECX_1, COMMON_CPUID_INDEX_80000007, COMMON_CPUID_INDEX_80000008, COMMON_CPUID_INDEX_7_ECX_1, /* Keep the following line at the end. */ COMMON_CPUID_INDEX_MAX }; struct cpuid_features { struct cpuid_registers cpuid; struct cpuid_registers usable; }; struct cpu_features { struct cpu_features_basic basic; struct cpuid_features features[COMMON_CPUID_INDEX_MAX]; }; /* Get a pointer to the CPU features structure. */ extern const struct cpu_features *__x86_get_cpu_features (unsigned int max) __attribute__ ((const)); Since all feature checks are done through macros, programs compiled with a newer <sys/platform/x86.h> are compatible with the older glibc binaries as long as the layout of struct cpu_features is identical. The features array can be expanded with backward binary compatibility for both .o and .so files. When COMMON_CPUID_INDEX_MAX is increased to support new processor features, __x86_get_cpu_features in the older glibc binaries returns NULL and HAS_CPU_FEATURE/CPU_FEATURE_USABLE return false on the new processor feature. No new symbol version is neeeded. Both CPU_FEATURE_USABLE and HAS_CPU_FEATURE are provided. HAS_CPU_FEATURE can be used to identify processor features. Note: Although GCC has __builtin_cpu_supports, it only supports a subset of <sys/platform/x86.h> and it is equivalent to CPU_FEATURE_USABLE. It doesn't support HAS_CPU_FEATURE.
52 lines
2.0 KiB
Makefile
52 lines
2.0 KiB
Makefile
ifeq ($(subdir),string)
|
|
gen-as-const-headers += locale-defines.sym
|
|
sysdep_routines += bzero-sse2 memset-sse2 memcpy-ssse3 mempcpy-ssse3 \
|
|
memmove-ssse3 memcpy-ssse3-rep mempcpy-ssse3-rep \
|
|
memmove-ssse3-rep bcopy-ssse3 bcopy-ssse3-rep \
|
|
memset-sse2-rep bzero-sse2-rep strcmp-ssse3 \
|
|
strcmp-sse4 strncmp-c strncmp-ssse3 strncmp-sse4 \
|
|
memcmp-ssse3 memcmp-sse4 varshift \
|
|
strlen-sse2 strlen-sse2-bsf strncpy-c strcpy-ssse3 \
|
|
strncpy-ssse3 stpcpy-ssse3 stpncpy-ssse3 strcpy-sse2 \
|
|
strncpy-sse2 stpcpy-sse2 stpncpy-sse2 strcat-ssse3 \
|
|
strcat-sse2 strncat-ssse3 strncat-sse2 strncat-c \
|
|
strchr-sse2 strrchr-sse2 strchr-sse2-bsf strrchr-sse2-bsf \
|
|
memchr-sse2 memchr-sse2-bsf \
|
|
memrchr-sse2 memrchr-sse2-bsf memrchr-c \
|
|
rawmemchr-sse2 rawmemchr-sse2-bsf \
|
|
strnlen-sse2 strnlen-c \
|
|
strcasecmp_l-c strcasecmp-c strcasecmp_l-ssse3 \
|
|
strncase_l-c strncase-c strncase_l-ssse3 \
|
|
strcasecmp_l-sse4 strncase_l-sse4 \
|
|
bcopy-sse2-unaligned memcpy-sse2-unaligned \
|
|
mempcpy-sse2-unaligned memmove-sse2-unaligned \
|
|
strcspn-c strpbrk-c strspn-c \
|
|
bcopy-ia32 bzero-ia32 rawmemchr-ia32 \
|
|
memchr-ia32 memcmp-ia32 memcpy-ia32 memmove-ia32 \
|
|
mempcpy-ia32 memset-ia32 strcat-ia32 strchr-ia32 \
|
|
strrchr-ia32 strcpy-ia32 strcmp-ia32 strcspn-ia32 \
|
|
strpbrk-ia32 strspn-ia32 strlen-ia32 stpcpy-ia32 \
|
|
stpncpy-ia32
|
|
CFLAGS-varshift.c += -msse4
|
|
CFLAGS-strcspn-c.c += -msse4
|
|
CFLAGS-strpbrk-c.c += -msse4
|
|
CFLAGS-strspn-c.c += -msse4
|
|
endif
|
|
|
|
ifeq ($(subdir),wcsmbs)
|
|
sysdep_routines += wcscmp-sse2 wcscmp-c wcslen-sse2 wcslen-c \
|
|
wmemcmp-sse4 wmemcmp-ssse3 wmemcmp-c wcschr-sse2 \
|
|
wcschr-c wcsrchr-sse2 wcsrchr-c wcscpy-ssse3 wcscpy-c
|
|
endif
|
|
|
|
ifeq ($(subdir),math)
|
|
libm-sysdep_routines += s_fma-fma s_fmaf-fma
|
|
CFLAGS-s_fma-fma.c += -mavx -mfpmath=sse
|
|
CFLAGS-s_fmaf-fma.c += -mavx -mfpmath=sse
|
|
endif
|
|
|
|
ifeq ($(subdir),debug)
|
|
sysdep_routines += memcpy_chk-nonshared mempcpy_chk-nonshared \
|
|
memmove_chk-nonshared memset_chk-nonshared
|
|
endif
|