Blame sysdeps/x86/cpu-features.h

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