Blame sysdeps/x86/cpu-features.h

Packit 6c4009
/* This file is part of the GNU C Library.
Packit 6c4009
   Copyright (C) 2008-2018 Free Software Foundation, Inc.
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public
Packit 6c4009
   License as published by the Free Software Foundation; either
Packit 6c4009
   version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library; if not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
#ifndef cpu_features_h
Packit 6c4009
#define cpu_features_h
Packit 6c4009
Packit 6c4009
#define bit_arch_Fast_Rep_String		(1 << 0)
Packit 6c4009
#define bit_arch_Fast_Copy_Backward		(1 << 1)
Packit 6c4009
#define bit_arch_Slow_BSF			(1 << 2)
Packit 6c4009
#define bit_arch_Fast_Unaligned_Load		(1 << 4)
Packit 6c4009
#define bit_arch_Prefer_PMINUB_for_stringop	(1 << 5)
Packit 6c4009
#define bit_arch_AVX_Usable			(1 << 6)
Packit 6c4009
#define bit_arch_FMA_Usable			(1 << 7)
Packit 6c4009
#define bit_arch_FMA4_Usable			(1 << 8)
Packit 6c4009
#define bit_arch_Slow_SSE4_2			(1 << 9)
Packit 6c4009
#define bit_arch_AVX2_Usable			(1 << 10)
Packit 6c4009
#define bit_arch_AVX_Fast_Unaligned_Load	(1 << 11)
Packit 6c4009
#define bit_arch_AVX512F_Usable			(1 << 12)
Packit 6c4009
#define bit_arch_AVX512DQ_Usable		(1 << 13)
Packit 6c4009
#define bit_arch_I586				(1 << 14)
Packit 6c4009
#define bit_arch_I686				(1 << 15)
Packit 6c4009
#define bit_arch_Prefer_MAP_32BIT_EXEC		(1 << 16)
Packit 6c4009
#define bit_arch_Prefer_No_VZEROUPPER		(1 << 17)
Packit 6c4009
#define bit_arch_Fast_Unaligned_Copy		(1 << 18)
Packit 6c4009
#define bit_arch_Prefer_ERMS			(1 << 19)
Packit 6c4009
#define bit_arch_Prefer_No_AVX512		(1 << 20)
Packit 6c4009
#define bit_arch_MathVec_Prefer_No_AVX512	(1 << 21)
Packit 6c4009
#define bit_arch_XSAVEC_Usable			(1 << 22)
Packit 6c4009
#define bit_arch_Prefer_FSRM			(1 << 23)
Packit 6c4009
Packit 6c4009
/* CPUID Feature flags.  */
Packit 6c4009
Packit 6c4009
/* COMMON_CPUID_INDEX_1.  */
Packit 6c4009
#define bit_cpu_CX8		(1 << 8)
Packit 6c4009
#define bit_cpu_CMOV		(1 << 15)
Packit 6c4009
#define bit_cpu_SSE		(1 << 25)
Packit 6c4009
#define bit_cpu_SSE2		(1 << 26)
Packit 6c4009
#define bit_cpu_SSSE3		(1 << 9)
Packit 6c4009
#define bit_cpu_SSE4_1		(1 << 19)
Packit 6c4009
#define bit_cpu_SSE4_2		(1 << 20)
Packit 6c4009
#define bit_cpu_OSXSAVE		(1 << 27)
Packit 6c4009
#define bit_cpu_AVX		(1 << 28)
Packit 6c4009
#define bit_cpu_POPCOUNT	(1 << 23)
Packit 6c4009
#define bit_cpu_FMA		(1 << 12)
Packit 6c4009
#define bit_cpu_FMA4		(1 << 16)
Packit 6c4009
#define bit_cpu_HTT		(1 << 28)
Packit 6c4009
#define bit_cpu_LZCNT		(1 << 5)
Packit 6c4009
#define bit_cpu_MOVBE		(1 << 22)
Packit 6c4009
#define bit_cpu_POPCNT		(1 << 23)
Packit 6c4009
Packit 6c4009
/* COMMON_CPUID_INDEX_7.  */
Packit 6c4009
#define bit_cpu_BMI1		(1 << 3)
Packit 6c4009
#define bit_cpu_BMI2		(1 << 8)
Packit 6c4009
#define bit_cpu_ERMS		(1 << 9)
Packit 6c4009
#define bit_cpu_RTM		(1 << 11)
Packit 6c4009
#define bit_cpu_AVX2		(1 << 5)
Packit 6c4009
#define bit_cpu_AVX512F		(1 << 16)
Packit 6c4009
#define bit_cpu_AVX512DQ	(1 << 17)
Packit 6c4009
#define bit_cpu_AVX512PF	(1 << 26)
Packit 6c4009
#define bit_cpu_AVX512ER	(1 << 27)
Packit 6c4009
#define bit_cpu_AVX512CD	(1 << 28)
Packit 6c4009
#define bit_cpu_AVX512BW	(1 << 30)
Packit 6c4009
#define bit_cpu_AVX512VL	(1u << 31)
Packit 6c4009
#define bit_cpu_IBT		(1u << 20)
Packit 6c4009
#define bit_cpu_SHSTK		(1u << 7)
Packit 6c4009
#define bit_cpu_FSRM		(1 << 4)
Packit 6c4009
Packit 6c4009
/* XCR0 Feature flags.  */
Packit 6c4009
#define bit_XMM_state		(1 << 1)
Packit 6c4009
#define bit_YMM_state		(1 << 2)
Packit 6c4009
#define bit_Opmask_state	(1 << 5)
Packit 6c4009
#define bit_ZMM0_15_state	(1 << 6)
Packit 6c4009
#define bit_ZMM16_31_state	(1 << 7)
Packit 6c4009
Packit 6c4009
/* The integer bit array index for the first set of internal feature bits.  */
Packit 6c4009
#define FEATURE_INDEX_1 0
Packit 6c4009
Packit 6c4009
/* The current maximum size of the feature integer bit array.  */
Packit 6c4009
#define FEATURE_INDEX_MAX 1
Packit 6c4009
Packit 6c4009
/* Offset for fxsave/xsave area used by _dl_runtime_resolve.  Also need
Packit 6c4009
   space to preserve RCX, RDX, RSI, RDI, R8, R9 and RAX.  It must be
Packit 6c4009
   aligned to 16 bytes for fxsave and 64 bytes for xsave.  */
Packit 6c4009
#define STATE_SAVE_OFFSET (8 * 7 + 8)
Packit 6c4009
Packit 6c4009
/* Save SSE, AVX, AVX512, mask and bound registers.  */
Packit 6c4009
#define STATE_SAVE_MASK \
Packit 6c4009
  ((1 << 1) | (1 << 2) | (1 << 3) | (1 << 5) | (1 << 6) | (1 << 7))
Packit 6c4009
Packit 6c4009
#ifdef	__ASSEMBLER__
Packit 6c4009
# include <cpu-features-offsets.h>
Packit 6c4009
#else	/* __ASSEMBLER__ */
Packit 6c4009
enum
Packit 6c4009
  {
Packit 6c4009
    COMMON_CPUID_INDEX_1 = 0,
Packit 6c4009
    COMMON_CPUID_INDEX_7,
Packit 6c4009
    COMMON_CPUID_INDEX_80000001,
Packit 6c4009
    /* Keep the following line at the end.  */
Packit 6c4009
    COMMON_CPUID_INDEX_MAX
Packit 6c4009
  };
Packit 6c4009
Packit 6c4009
struct cpu_features
Packit 6c4009
{
Packit 6c4009
  enum cpu_features_kind
Packit 6c4009
    {
Packit 6c4009
      arch_kind_unknown = 0,
Packit 6c4009
      arch_kind_intel,
Packit 6c4009
      arch_kind_amd,
Packit 6c4009
      arch_kind_other
Packit 6c4009
    } kind;
Packit 6c4009
  int max_cpuid;
Packit 6c4009
  struct cpuid_registers
Packit 6c4009
  {
Packit 6c4009
    unsigned int eax;
Packit 6c4009
    unsigned int ebx;
Packit 6c4009
    unsigned int ecx;
Packit 6c4009
    unsigned int edx;
Packit 6c4009
  } cpuid[COMMON_CPUID_INDEX_MAX];
Packit 6c4009
  unsigned int family;
Packit 6c4009
  unsigned int model;
Packit 6c4009
  /* The state size for XSAVEC or XSAVE.  The type must be unsigned long
Packit 6c4009
     int so that we use
Packit 6c4009
Packit 6c4009
	sub xsave_state_size_offset(%rip) %RSP_LP
Packit 6c4009
Packit 6c4009
     in _dl_runtime_resolve.  */
Packit 6c4009
  unsigned long int xsave_state_size;
Packit 6c4009
  /* The full state size for XSAVE when XSAVEC is disabled by
Packit 6c4009
Packit 6c4009
     GLIBC_TUNABLES=glibc.tune.hwcaps=-XSAVEC_Usable
Packit 6c4009
   */
Packit 6c4009
  unsigned int xsave_state_full_size;
Packit 6c4009
  unsigned int feature[FEATURE_INDEX_MAX];
Packit 6c4009
  /* Data cache size for use in memory and string routines, typically
Packit 6c4009
     L1 size.  */
Packit 6c4009
  unsigned long int data_cache_size;
Packit 6c4009
  /* Shared cache size for use in memory and string routines, typically
Packit 6c4009
     L2 or L3 size.  */
Packit 6c4009
  unsigned long int shared_cache_size;
Packit 6c4009
  /* Threshold to use non temporal store.  */
Packit 6c4009
  unsigned long int non_temporal_threshold;
Packit 6c4009
};
Packit 6c4009
Packit 6c4009
/* Used from outside of glibc to get access to the CPU features
Packit 6c4009
   structure.  */
Packit 6c4009
extern const struct cpu_features *__get_cpu_features (void)
Packit 6c4009
     __attribute__ ((const));
Packit 6c4009
Packit 6c4009
# if defined (_LIBC) && !IS_IN (nonlib)
Packit 6c4009
/* Unused for x86.  */
Packit 6c4009
#  define INIT_ARCH()
Packit 6c4009
#  define __get_cpu_features()	(&GLRO(dl_x86_cpu_features))
Packit 6c4009
# endif
Packit 6c4009
Packit 6c4009
Packit 6c4009
/* Only used directly in cpu-features.c.  */
Packit 6c4009
# define CPU_FEATURES_CPU_P(ptr, name) \
Packit 6c4009
  ((ptr->cpuid[index_cpu_##name].reg_##name & (bit_cpu_##name)) != 0)
Packit 6c4009
# define CPU_FEATURES_ARCH_P(ptr, name) \
Packit 6c4009
  ((ptr->feature[index_arch_##name] & (bit_arch_##name)) != 0)
Packit 6c4009
Packit 6c4009
/* HAS_* evaluates to true if we may use the feature at runtime.  */
Packit 6c4009
# define HAS_CPU_FEATURE(name) \
Packit 6c4009
   CPU_FEATURES_CPU_P (__get_cpu_features (), name)
Packit 6c4009
# define HAS_ARCH_FEATURE(name) \
Packit 6c4009
   CPU_FEATURES_ARCH_P (__get_cpu_features (), name)
Packit 6c4009
Packit 6c4009
# define index_cpu_CX8		COMMON_CPUID_INDEX_1
Packit 6c4009
# define index_cpu_CMOV		COMMON_CPUID_INDEX_1
Packit 6c4009
# define index_cpu_SSE		COMMON_CPUID_INDEX_1
Packit 6c4009
# define index_cpu_SSE2		COMMON_CPUID_INDEX_1
Packit 6c4009
# define index_cpu_SSSE3	COMMON_CPUID_INDEX_1
Packit 6c4009
# define index_cpu_SSE4_1	COMMON_CPUID_INDEX_1
Packit 6c4009
# define index_cpu_SSE4_2	COMMON_CPUID_INDEX_1
Packit 6c4009
# define index_cpu_AVX		COMMON_CPUID_INDEX_1
Packit 6c4009
# define index_cpu_AVX2		COMMON_CPUID_INDEX_7
Packit 6c4009
# define index_cpu_AVX512F	COMMON_CPUID_INDEX_7
Packit 6c4009
# define index_cpu_AVX512DQ	COMMON_CPUID_INDEX_7
Packit 6c4009
# define index_cpu_AVX512PF	COMMON_CPUID_INDEX_7
Packit 6c4009
# define index_cpu_AVX512ER	COMMON_CPUID_INDEX_7
Packit 6c4009
# define index_cpu_AVX512CD	COMMON_CPUID_INDEX_7
Packit 6c4009
# define index_cpu_AVX512BW	COMMON_CPUID_INDEX_7
Packit 6c4009
# define index_cpu_AVX512VL	COMMON_CPUID_INDEX_7
Packit 6c4009
# define index_cpu_ERMS		COMMON_CPUID_INDEX_7
Packit 6c4009
# define index_cpu_RTM		COMMON_CPUID_INDEX_7
Packit 6c4009
# define index_cpu_FMA		COMMON_CPUID_INDEX_1
Packit 6c4009
# define index_cpu_FMA4		COMMON_CPUID_INDEX_80000001
Packit 6c4009
# define index_cpu_POPCOUNT	COMMON_CPUID_INDEX_1
Packit 6c4009
# define index_cpu_OSXSAVE	COMMON_CPUID_INDEX_1
Packit 6c4009
# define index_cpu_HTT		COMMON_CPUID_INDEX_1
Packit 6c4009
# define index_cpu_BMI1		COMMON_CPUID_INDEX_7
Packit 6c4009
# define index_cpu_BMI2		COMMON_CPUID_INDEX_7
Packit 6c4009
# define index_cpu_LZCNT	COMMON_CPUID_INDEX_80000001
Packit 6c4009
# define index_cpu_MOVBE	COMMON_CPUID_INDEX_1
Packit 6c4009
# define index_cpu_POPCNT	COMMON_CPUID_INDEX_1
Packit 6c4009
# define index_cpu_IBT		COMMON_CPUID_INDEX_7
Packit 6c4009
# define index_cpu_SHSTK	COMMON_CPUID_INDEX_7
Packit 6c4009
# define index_cpu_FSRM		COMMON_CPUID_INDEX_7
Packit 6c4009
Packit 6c4009
# define reg_CX8		edx
Packit 6c4009
# define reg_CMOV		edx
Packit 6c4009
# define reg_SSE		edx
Packit 6c4009
# define reg_SSE2		edx
Packit 6c4009
# define reg_SSSE3		ecx
Packit 6c4009
# define reg_SSE4_1		ecx
Packit 6c4009
# define reg_SSE4_2		ecx
Packit 6c4009
# define reg_AVX		ecx
Packit 6c4009
# define reg_AVX2		ebx
Packit 6c4009
# define reg_AVX512F		ebx
Packit 6c4009
# define reg_AVX512DQ		ebx
Packit 6c4009
# define reg_AVX512PF		ebx
Packit 6c4009
# define reg_AVX512ER		ebx
Packit 6c4009
# define reg_AVX512CD		ebx
Packit 6c4009
# define reg_AVX512BW		ebx
Packit 6c4009
# define reg_AVX512VL		ebx
Packit 6c4009
# define reg_ERMS		ebx
Packit 6c4009
# define reg_RTM		ebx
Packit 6c4009
# define reg_FMA		ecx
Packit 6c4009
# define reg_FMA4		ecx
Packit 6c4009
# define reg_POPCOUNT		ecx
Packit 6c4009
# define reg_OSXSAVE		ecx
Packit 6c4009
# define reg_HTT		edx
Packit 6c4009
# define reg_BMI1		ebx
Packit 6c4009
# define reg_BMI2		ebx
Packit 6c4009
# define reg_LZCNT		ecx
Packit 6c4009
# define reg_MOVBE		ecx
Packit 6c4009
# define reg_POPCNT		ecx
Packit 6c4009
# define reg_IBT		edx
Packit 6c4009
# define reg_SHSTK		ecx
Packit 6c4009
# define reg_FSRM		edx
Packit 6c4009
Packit 6c4009
# define index_arch_Fast_Rep_String	FEATURE_INDEX_1
Packit 6c4009
# define index_arch_Fast_Copy_Backward	FEATURE_INDEX_1
Packit 6c4009
# define index_arch_Slow_BSF		FEATURE_INDEX_1
Packit 6c4009
# define index_arch_Fast_Unaligned_Load	FEATURE_INDEX_1
Packit 6c4009
# define index_arch_Prefer_PMINUB_for_stringop FEATURE_INDEX_1
Packit 6c4009
# define index_arch_AVX_Usable		FEATURE_INDEX_1
Packit 6c4009
# define index_arch_FMA_Usable		FEATURE_INDEX_1
Packit 6c4009
# define index_arch_FMA4_Usable		FEATURE_INDEX_1
Packit 6c4009
# define index_arch_Slow_SSE4_2		FEATURE_INDEX_1
Packit 6c4009
# define index_arch_AVX2_Usable		FEATURE_INDEX_1
Packit 6c4009
# define index_arch_AVX_Fast_Unaligned_Load FEATURE_INDEX_1
Packit 6c4009
# define index_arch_AVX512F_Usable	FEATURE_INDEX_1
Packit 6c4009
# define index_arch_AVX512DQ_Usable	FEATURE_INDEX_1
Packit 6c4009
# define index_arch_I586		FEATURE_INDEX_1
Packit 6c4009
# define index_arch_I686		FEATURE_INDEX_1
Packit 6c4009
# define index_arch_Prefer_MAP_32BIT_EXEC FEATURE_INDEX_1
Packit 6c4009
# define index_arch_Prefer_No_VZEROUPPER FEATURE_INDEX_1
Packit 6c4009
# define index_arch_Fast_Unaligned_Copy	FEATURE_INDEX_1
Packit 6c4009
# define index_arch_Prefer_ERMS		FEATURE_INDEX_1
Packit 6c4009
# define index_arch_Prefer_No_AVX512	FEATURE_INDEX_1
Packit 6c4009
# define index_arch_MathVec_Prefer_No_AVX512 FEATURE_INDEX_1
Packit 6c4009
# define index_arch_XSAVEC_Usable	FEATURE_INDEX_1
Packit 6c4009
# define index_arch_Prefer_FSRM		FEATURE_INDEX_1
Packit 6c4009
Packit 6c4009
#endif	/* !__ASSEMBLER__ */
Packit 6c4009
Packit 6c4009
#ifdef __x86_64__
Packit 6c4009
# define HAS_CPUID 1
Packit 6c4009
#elif defined __i586__ || defined __pentium__
Packit 6c4009
# define HAS_CPUID 1
Packit 6c4009
# define HAS_I586 1
Packit 6c4009
# define HAS_I686 HAS_ARCH_FEATURE (I686)
Packit 6c4009
#elif (defined __i686__ || defined __pentiumpro__		\
Packit 6c4009
       || defined __pentium4__ || defined __nocona__		\
Packit 6c4009
       || defined __atom__ || defined __core2__			\
Packit 6c4009
       || defined __corei7__ || defined __corei7_avx__		\
Packit 6c4009
       || defined __core_avx2__	|| defined __nehalem__		\
Packit 6c4009
       || defined __sandybridge__ || defined __haswell__	\
Packit 6c4009
       || defined __knl__ || defined __bonnell__		\
Packit 6c4009
       || defined __silvermont__				\
Packit 6c4009
       || defined __k6__ || defined __k8__			\
Packit 6c4009
       || defined __athlon__ || defined __amdfam10__		\
Packit 6c4009
       || defined __bdver1__ || defined __bdver2__		\
Packit 6c4009
       || defined __bdver3__ || defined __bdver4__		\
Packit 6c4009
       || defined __btver1__ || defined __btver2__)
Packit 6c4009
# define HAS_CPUID 1
Packit 6c4009
# define HAS_I586 1
Packit 6c4009
# define HAS_I686 1
Packit 6c4009
#else
Packit 6c4009
# define HAS_CPUID 0
Packit 6c4009
# define HAS_I586 HAS_ARCH_FEATURE (I586)
Packit 6c4009
# define HAS_I686 HAS_ARCH_FEATURE (I686)
Packit 6c4009
#endif
Packit 6c4009
Packit 6c4009
#endif  /* cpu_features_h */