Blame sysdeps/x86/cpu-features.h

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