1*eca53ba6SRoland Levillain // Copyright 2017 Google LLC 2*eca53ba6SRoland Levillain // Copyright 2020 Intel Corporation 3*eca53ba6SRoland Levillain // 4*eca53ba6SRoland Levillain // Licensed under the Apache License, Version 2.0 (the "License"); 5*eca53ba6SRoland Levillain // you may not use this file except in compliance with the License. 6*eca53ba6SRoland Levillain // You may obtain a copy of the License at 7*eca53ba6SRoland Levillain // 8*eca53ba6SRoland Levillain // http://www.apache.org/licenses/LICENSE-2.0 9*eca53ba6SRoland Levillain // 10*eca53ba6SRoland Levillain // Unless required by applicable law or agreed to in writing, software 11*eca53ba6SRoland Levillain // distributed under the License is distributed on an "AS IS" BASIS, 12*eca53ba6SRoland Levillain // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*eca53ba6SRoland Levillain // See the License for the specific language governing permissions and 14*eca53ba6SRoland Levillain // limitations under the License. 15*eca53ba6SRoland Levillain 16*eca53ba6SRoland Levillain #ifndef CPU_FEATURES_INCLUDE_CPUINFO_X86_H_ 17*eca53ba6SRoland Levillain #define CPU_FEATURES_INCLUDE_CPUINFO_X86_H_ 18*eca53ba6SRoland Levillain 19*eca53ba6SRoland Levillain #include "cpu_features_cache_info.h" 20*eca53ba6SRoland Levillain #include "cpu_features_macros.h" 21*eca53ba6SRoland Levillain 22*eca53ba6SRoland Levillain CPU_FEATURES_START_CPP_NAMESPACE 23*eca53ba6SRoland Levillain 24*eca53ba6SRoland Levillain // CPUID Vendors 25*eca53ba6SRoland Levillain #define CPU_FEATURES_VENDOR_GENUINE_INTEL "GenuineIntel" 26*eca53ba6SRoland Levillain #define CPU_FEATURES_VENDOR_AUTHENTIC_AMD "AuthenticAMD" 27*eca53ba6SRoland Levillain #define CPU_FEATURES_VENDOR_HYGON_GENUINE "HygonGenuine" 28*eca53ba6SRoland Levillain #define CPU_FEATURES_VENDOR_CENTAUR_HAULS "CentaurHauls" 29*eca53ba6SRoland Levillain #define CPU_FEATURES_VENDOR_SHANGHAI " Shanghai " 30*eca53ba6SRoland Levillain 31*eca53ba6SRoland Levillain // See https://en.wikipedia.org/wiki/CPUID for a list of x86 cpu features. 32*eca53ba6SRoland Levillain // The field names are based on the short name provided in the wikipedia tables. 33*eca53ba6SRoland Levillain typedef struct { 34*eca53ba6SRoland Levillain int fpu : 1; 35*eca53ba6SRoland Levillain int tsc : 1; 36*eca53ba6SRoland Levillain int cx8 : 1; 37*eca53ba6SRoland Levillain int clfsh : 1; 38*eca53ba6SRoland Levillain int mmx : 1; 39*eca53ba6SRoland Levillain int aes : 1; 40*eca53ba6SRoland Levillain int erms : 1; 41*eca53ba6SRoland Levillain int f16c : 1; 42*eca53ba6SRoland Levillain int fma4 : 1; 43*eca53ba6SRoland Levillain int fma3 : 1; 44*eca53ba6SRoland Levillain int vaes : 1; 45*eca53ba6SRoland Levillain int vpclmulqdq : 1; 46*eca53ba6SRoland Levillain int bmi1 : 1; 47*eca53ba6SRoland Levillain int hle : 1; 48*eca53ba6SRoland Levillain int bmi2 : 1; 49*eca53ba6SRoland Levillain int rtm : 1; 50*eca53ba6SRoland Levillain int rdseed : 1; 51*eca53ba6SRoland Levillain int clflushopt : 1; 52*eca53ba6SRoland Levillain int clwb : 1; 53*eca53ba6SRoland Levillain 54*eca53ba6SRoland Levillain int sse : 1; 55*eca53ba6SRoland Levillain int sse2 : 1; 56*eca53ba6SRoland Levillain int sse3 : 1; 57*eca53ba6SRoland Levillain int ssse3 : 1; 58*eca53ba6SRoland Levillain int sse4_1 : 1; 59*eca53ba6SRoland Levillain int sse4_2 : 1; 60*eca53ba6SRoland Levillain int sse4a : 1; 61*eca53ba6SRoland Levillain 62*eca53ba6SRoland Levillain int avx : 1; 63*eca53ba6SRoland Levillain int avx_vnni : 1; 64*eca53ba6SRoland Levillain int avx2 : 1; 65*eca53ba6SRoland Levillain 66*eca53ba6SRoland Levillain int avx512f : 1; 67*eca53ba6SRoland Levillain int avx512cd : 1; 68*eca53ba6SRoland Levillain int avx512er : 1; 69*eca53ba6SRoland Levillain int avx512pf : 1; 70*eca53ba6SRoland Levillain int avx512bw : 1; 71*eca53ba6SRoland Levillain int avx512dq : 1; 72*eca53ba6SRoland Levillain int avx512vl : 1; 73*eca53ba6SRoland Levillain int avx512ifma : 1; 74*eca53ba6SRoland Levillain int avx512vbmi : 1; 75*eca53ba6SRoland Levillain int avx512vbmi2 : 1; 76*eca53ba6SRoland Levillain int avx512vnni : 1; 77*eca53ba6SRoland Levillain int avx512bitalg : 1; 78*eca53ba6SRoland Levillain int avx512vpopcntdq : 1; 79*eca53ba6SRoland Levillain int avx512_4vnniw : 1; 80*eca53ba6SRoland Levillain int avx512_4vbmi2 : 1; // Note: this is an alias to avx512_4fmaps. 81*eca53ba6SRoland Levillain int avx512_second_fma : 1; 82*eca53ba6SRoland Levillain int avx512_4fmaps : 1; 83*eca53ba6SRoland Levillain int avx512_bf16 : 1; 84*eca53ba6SRoland Levillain int avx512_vp2intersect : 1; 85*eca53ba6SRoland Levillain int avx512_fp16 : 1; 86*eca53ba6SRoland Levillain int amx_bf16 : 1; 87*eca53ba6SRoland Levillain int amx_tile : 1; 88*eca53ba6SRoland Levillain int amx_int8 : 1; 89*eca53ba6SRoland Levillain int amx_fp16 : 1; 90*eca53ba6SRoland Levillain 91*eca53ba6SRoland Levillain int pclmulqdq : 1; 92*eca53ba6SRoland Levillain int smx : 1; 93*eca53ba6SRoland Levillain int sgx : 1; 94*eca53ba6SRoland Levillain int cx16 : 1; // aka. CMPXCHG16B 95*eca53ba6SRoland Levillain int sha : 1; 96*eca53ba6SRoland Levillain int popcnt : 1; 97*eca53ba6SRoland Levillain int movbe : 1; 98*eca53ba6SRoland Levillain int rdrnd : 1; 99*eca53ba6SRoland Levillain 100*eca53ba6SRoland Levillain int dca : 1; 101*eca53ba6SRoland Levillain int ss : 1; 102*eca53ba6SRoland Levillain int adx : 1; 103*eca53ba6SRoland Levillain int lzcnt : 1; // Note: this flag is called ABM for AMD, LZCNT for Intel. 104*eca53ba6SRoland Levillain int gfni : 1; 105*eca53ba6SRoland Levillain int movdiri : 1; 106*eca53ba6SRoland Levillain int movdir64b : 1; 107*eca53ba6SRoland Levillain int fs_rep_mov : 1; // Fast short REP MOV 108*eca53ba6SRoland Levillain int fz_rep_movsb : 1; // Fast zero-length REP MOVSB 109*eca53ba6SRoland Levillain int fs_rep_stosb : 1; // Fast short REP STOSB 110*eca53ba6SRoland Levillain int fs_rep_cmpsb_scasb : 1; // Fast short REP CMPSB/SCASB 111*eca53ba6SRoland Levillain 112*eca53ba6SRoland Levillain int lam: 1; // Intel Linear Address Mask 113*eca53ba6SRoland Levillain int uai: 1; // AMD Upper Address Ignore 114*eca53ba6SRoland Levillain // Make sure to update X86FeaturesEnum below if you add a field here. 115*eca53ba6SRoland Levillain } X86Features; 116*eca53ba6SRoland Levillain 117*eca53ba6SRoland Levillain typedef struct { 118*eca53ba6SRoland Levillain X86Features features; 119*eca53ba6SRoland Levillain int family; 120*eca53ba6SRoland Levillain int model; 121*eca53ba6SRoland Levillain int stepping; 122*eca53ba6SRoland Levillain char vendor[13]; // 0 terminated string 123*eca53ba6SRoland Levillain char brand_string[49]; // 0 terminated string 124*eca53ba6SRoland Levillain } X86Info; 125*eca53ba6SRoland Levillain 126*eca53ba6SRoland Levillain // Calls cpuid and returns an initialized X86info. 127*eca53ba6SRoland Levillain X86Info GetX86Info(void); 128*eca53ba6SRoland Levillain 129*eca53ba6SRoland Levillain // Returns cache hierarchy informations. 130*eca53ba6SRoland Levillain // Can call cpuid multiple times. 131*eca53ba6SRoland Levillain CacheInfo GetX86CacheInfo(void); 132*eca53ba6SRoland Levillain 133*eca53ba6SRoland Levillain typedef enum { 134*eca53ba6SRoland Levillain X86_UNKNOWN, 135*eca53ba6SRoland Levillain ZHAOXIN_ZHANGJIANG, // ZhangJiang 136*eca53ba6SRoland Levillain ZHAOXIN_WUDAOKOU, // WuDaoKou 137*eca53ba6SRoland Levillain ZHAOXIN_LUJIAZUI, // LuJiaZui 138*eca53ba6SRoland Levillain ZHAOXIN_YONGFENG, // YongFeng 139*eca53ba6SRoland Levillain INTEL_80486, // 80486 140*eca53ba6SRoland Levillain INTEL_P5, // P5 141*eca53ba6SRoland Levillain INTEL_LAKEMONT, // LAKEMONT 142*eca53ba6SRoland Levillain INTEL_CORE, // CORE 143*eca53ba6SRoland Levillain INTEL_PNR, // PENRYN 144*eca53ba6SRoland Levillain INTEL_NHM, // NEHALEM 145*eca53ba6SRoland Levillain INTEL_ATOM_BNL, // BONNELL 146*eca53ba6SRoland Levillain INTEL_WSM, // WESTMERE 147*eca53ba6SRoland Levillain INTEL_SNB, // SANDYBRIDGE 148*eca53ba6SRoland Levillain INTEL_IVB, // IVYBRIDGE 149*eca53ba6SRoland Levillain INTEL_ATOM_SMT, // SILVERMONT 150*eca53ba6SRoland Levillain INTEL_HSW, // HASWELL 151*eca53ba6SRoland Levillain INTEL_BDW, // BROADWELL 152*eca53ba6SRoland Levillain INTEL_SKL, // SKYLAKE 153*eca53ba6SRoland Levillain INTEL_CCL, // CASCADELAKE 154*eca53ba6SRoland Levillain INTEL_ATOM_GMT, // GOLDMONT 155*eca53ba6SRoland Levillain INTEL_ATOM_GMT_PLUS, // GOLDMONT+ 156*eca53ba6SRoland Levillain INTEL_ATOM_TMT, // TREMONT 157*eca53ba6SRoland Levillain INTEL_KBL, // KABY LAKE 158*eca53ba6SRoland Levillain INTEL_CFL, // COFFEE LAKE 159*eca53ba6SRoland Levillain INTEL_WHL, // WHISKEY LAKE 160*eca53ba6SRoland Levillain INTEL_CML, // COMET LAKE 161*eca53ba6SRoland Levillain INTEL_CNL, // CANNON LAKE 162*eca53ba6SRoland Levillain INTEL_ICL, // ICE LAKE 163*eca53ba6SRoland Levillain INTEL_TGL, // TIGER LAKE 164*eca53ba6SRoland Levillain INTEL_SPR, // SAPPHIRE RAPIDS 165*eca53ba6SRoland Levillain INTEL_ADL, // ALDER LAKE 166*eca53ba6SRoland Levillain INTEL_RCL, // ROCKET LAKE 167*eca53ba6SRoland Levillain INTEL_RPL, // RAPTOR LAKE 168*eca53ba6SRoland Levillain INTEL_KNIGHTS_M, // KNIGHTS MILL 169*eca53ba6SRoland Levillain INTEL_KNIGHTS_L, // KNIGHTS LANDING 170*eca53ba6SRoland Levillain INTEL_KNIGHTS_F, // KNIGHTS FERRY 171*eca53ba6SRoland Levillain INTEL_KNIGHTS_C, // KNIGHTS CORNER 172*eca53ba6SRoland Levillain INTEL_NETBURST, // NETBURST 173*eca53ba6SRoland Levillain AMD_HAMMER, // K8 HAMMER 174*eca53ba6SRoland Levillain AMD_K10, // K10 175*eca53ba6SRoland Levillain AMD_K11, // K11 176*eca53ba6SRoland Levillain AMD_K12, // K12 LLANO 177*eca53ba6SRoland Levillain AMD_BOBCAT, // K14 BOBCAT 178*eca53ba6SRoland Levillain AMD_PILEDRIVER, // K15 PILEDRIVER 179*eca53ba6SRoland Levillain AMD_STREAMROLLER, // K15 STREAMROLLER 180*eca53ba6SRoland Levillain AMD_EXCAVATOR, // K15 EXCAVATOR 181*eca53ba6SRoland Levillain AMD_BULLDOZER, // K15 BULLDOZER 182*eca53ba6SRoland Levillain AMD_JAGUAR, // K16 JAGUAR 183*eca53ba6SRoland Levillain AMD_PUMA, // K16 PUMA 184*eca53ba6SRoland Levillain AMD_ZEN, // K17 ZEN 185*eca53ba6SRoland Levillain AMD_ZEN_PLUS, // K17 ZEN+ 186*eca53ba6SRoland Levillain AMD_ZEN2, // K17 ZEN 2 187*eca53ba6SRoland Levillain AMD_ZEN3, // K19 ZEN 3 188*eca53ba6SRoland Levillain AMD_ZEN4, // K19 ZEN 4 189*eca53ba6SRoland Levillain X86_MICROARCHITECTURE_LAST_, 190*eca53ba6SRoland Levillain } X86Microarchitecture; 191*eca53ba6SRoland Levillain 192*eca53ba6SRoland Levillain // Returns the underlying microarchitecture by looking at X86Info's vendor, 193*eca53ba6SRoland Levillain // family and model. 194*eca53ba6SRoland Levillain X86Microarchitecture GetX86Microarchitecture(const X86Info* info); 195*eca53ba6SRoland Levillain 196*eca53ba6SRoland Levillain // Calls cpuid and fills the brand_string. 197*eca53ba6SRoland Levillain // - brand_string *must* be of size 49 (beware of array decaying). 198*eca53ba6SRoland Levillain // - brand_string will be zero terminated. 199*eca53ba6SRoland Levillain CPU_FEATURES_DEPRECATED("brand_string is now embedded in X86Info by default") 200*eca53ba6SRoland Levillain void FillX86BrandString(char brand_string[49]); 201*eca53ba6SRoland Levillain 202*eca53ba6SRoland Levillain //////////////////////////////////////////////////////////////////////////////// 203*eca53ba6SRoland Levillain // Introspection functions 204*eca53ba6SRoland Levillain 205*eca53ba6SRoland Levillain typedef enum { 206*eca53ba6SRoland Levillain X86_FPU, 207*eca53ba6SRoland Levillain X86_TSC, 208*eca53ba6SRoland Levillain X86_CX8, 209*eca53ba6SRoland Levillain X86_CLFSH, 210*eca53ba6SRoland Levillain X86_MMX, 211*eca53ba6SRoland Levillain X86_AES, 212*eca53ba6SRoland Levillain X86_ERMS, 213*eca53ba6SRoland Levillain X86_F16C, 214*eca53ba6SRoland Levillain X86_FMA4, 215*eca53ba6SRoland Levillain X86_FMA3, 216*eca53ba6SRoland Levillain X86_VAES, 217*eca53ba6SRoland Levillain X86_VPCLMULQDQ, 218*eca53ba6SRoland Levillain X86_BMI1, 219*eca53ba6SRoland Levillain X86_HLE, 220*eca53ba6SRoland Levillain X86_BMI2, 221*eca53ba6SRoland Levillain X86_RTM, 222*eca53ba6SRoland Levillain X86_RDSEED, 223*eca53ba6SRoland Levillain X86_CLFLUSHOPT, 224*eca53ba6SRoland Levillain X86_CLWB, 225*eca53ba6SRoland Levillain X86_SSE, 226*eca53ba6SRoland Levillain X86_SSE2, 227*eca53ba6SRoland Levillain X86_SSE3, 228*eca53ba6SRoland Levillain X86_SSSE3, 229*eca53ba6SRoland Levillain X86_SSE4_1, 230*eca53ba6SRoland Levillain X86_SSE4_2, 231*eca53ba6SRoland Levillain X86_SSE4A, 232*eca53ba6SRoland Levillain X86_AVX, 233*eca53ba6SRoland Levillain X86_AVX_VNNI, 234*eca53ba6SRoland Levillain X86_AVX2, 235*eca53ba6SRoland Levillain X86_AVX512F, 236*eca53ba6SRoland Levillain X86_AVX512CD, 237*eca53ba6SRoland Levillain X86_AVX512ER, 238*eca53ba6SRoland Levillain X86_AVX512PF, 239*eca53ba6SRoland Levillain X86_AVX512BW, 240*eca53ba6SRoland Levillain X86_AVX512DQ, 241*eca53ba6SRoland Levillain X86_AVX512VL, 242*eca53ba6SRoland Levillain X86_AVX512IFMA, 243*eca53ba6SRoland Levillain X86_AVX512VBMI, 244*eca53ba6SRoland Levillain X86_AVX512VBMI2, 245*eca53ba6SRoland Levillain X86_AVX512VNNI, 246*eca53ba6SRoland Levillain X86_AVX512BITALG, 247*eca53ba6SRoland Levillain X86_AVX512VPOPCNTDQ, 248*eca53ba6SRoland Levillain X86_AVX512_4VNNIW, 249*eca53ba6SRoland Levillain X86_AVX512_4VBMI2, // Note: this is an alias to X86_AVX512_4FMAPS. 250*eca53ba6SRoland Levillain X86_AVX512_SECOND_FMA, 251*eca53ba6SRoland Levillain X86_AVX512_4FMAPS, 252*eca53ba6SRoland Levillain X86_AVX512_BF16, 253*eca53ba6SRoland Levillain X86_AVX512_VP2INTERSECT, 254*eca53ba6SRoland Levillain X86_AVX512_FP16, 255*eca53ba6SRoland Levillain X86_AMX_BF16, 256*eca53ba6SRoland Levillain X86_AMX_TILE, 257*eca53ba6SRoland Levillain X86_AMX_INT8, 258*eca53ba6SRoland Levillain X86_AMX_FP16, 259*eca53ba6SRoland Levillain X86_PCLMULQDQ, 260*eca53ba6SRoland Levillain X86_SMX, 261*eca53ba6SRoland Levillain X86_SGX, 262*eca53ba6SRoland Levillain X86_CX16, 263*eca53ba6SRoland Levillain X86_SHA, 264*eca53ba6SRoland Levillain X86_POPCNT, 265*eca53ba6SRoland Levillain X86_MOVBE, 266*eca53ba6SRoland Levillain X86_RDRND, 267*eca53ba6SRoland Levillain X86_DCA, 268*eca53ba6SRoland Levillain X86_SS, 269*eca53ba6SRoland Levillain X86_ADX, 270*eca53ba6SRoland Levillain X86_LZCNT, 271*eca53ba6SRoland Levillain X86_GFNI, 272*eca53ba6SRoland Levillain X86_MOVDIRI, 273*eca53ba6SRoland Levillain X86_MOVDIR64B, 274*eca53ba6SRoland Levillain X86_FS_REP_MOV, 275*eca53ba6SRoland Levillain X86_FZ_REP_MOVSB, 276*eca53ba6SRoland Levillain X86_FS_REP_STOSB, 277*eca53ba6SRoland Levillain X86_FS_REP_CMPSB_SCASB, 278*eca53ba6SRoland Levillain X86_LAM, 279*eca53ba6SRoland Levillain X86_UAI, 280*eca53ba6SRoland Levillain X86_LAST_, 281*eca53ba6SRoland Levillain } X86FeaturesEnum; 282*eca53ba6SRoland Levillain 283*eca53ba6SRoland Levillain int GetX86FeaturesEnumValue(const X86Features* features, X86FeaturesEnum value); 284*eca53ba6SRoland Levillain 285*eca53ba6SRoland Levillain const char* GetX86FeaturesEnumName(X86FeaturesEnum); 286*eca53ba6SRoland Levillain 287*eca53ba6SRoland Levillain const char* GetX86MicroarchitectureName(X86Microarchitecture); 288*eca53ba6SRoland Levillain 289*eca53ba6SRoland Levillain CPU_FEATURES_END_CPP_NAMESPACE 290*eca53ba6SRoland Levillain 291*eca53ba6SRoland Levillain #if !defined(CPU_FEATURES_ARCH_X86) 292*eca53ba6SRoland Levillain #error "Including cpuinfo_x86.h from a non-x86 target." 293*eca53ba6SRoland Levillain #endif 294*eca53ba6SRoland Levillain 295*eca53ba6SRoland Levillain #endif // CPU_FEATURES_INCLUDE_CPUINFO_X86_H_ 296