21#include "llvm/Config/llvm-config.h"
44#include <mach/host_info.h>
46#include <mach/mach_host.h>
47#include <mach/machine.h>
49#include <sys/sysctl.h>
52#include <sys/systemcfg.h>
54#if defined(__sun__) && defined(__svr4__)
57#if defined(__GNUC__) || defined(__clang__)
58#if (defined(__i386__) || defined(__x86_64__)) && !defined(_MSC_VER)
63#define DEBUG_TYPE "host-detection"
73[[maybe_unused]]
static std::unique_ptr<llvm::MemoryBuffer>
75 const char *CPUInfoFile =
"/proc/cpuinfo";
76 if (
const char *CpuinfoIntercept = std::getenv(
"LLVM_CPUINFO"))
77 CPUInfoFile = CpuinfoIntercept;
81 if (std::error_code EC =
Text.getError()) {
82 llvm::errs() <<
"Can't read " << CPUInfoFile <<
": " << EC.message()
86 return std::move(*
Text);
93 const char *
generic =
"generic";
107 while (CIP < CPUInfoEnd && CPUStart ==
nullptr) {
108 if (CIP < CPUInfoEnd && *CIP ==
'\n')
111 if (CIP < CPUInfoEnd && *CIP ==
'c') {
113 if (CIP < CPUInfoEnd && *CIP ==
'p') {
115 if (CIP < CPUInfoEnd && *CIP ==
'u') {
117 while (CIP < CPUInfoEnd && (*CIP ==
' ' || *CIP ==
'\t'))
120 if (CIP < CPUInfoEnd && *CIP ==
':') {
122 while (CIP < CPUInfoEnd && (*CIP ==
' ' || *CIP ==
'\t'))
125 if (CIP < CPUInfoEnd) {
127 while (CIP < CPUInfoEnd && (*CIP !=
' ' && *CIP !=
'\t' &&
128 *CIP !=
',' && *CIP !=
'\n'))
130 CPULen = CIP - CPUStart;
137 if (CPUStart ==
nullptr)
138 while (CIP < CPUInfoEnd && *CIP !=
'\n')
142 if (CPUStart ==
nullptr)
146 .
Case(
"604e",
"604e")
148 .
Case(
"7400",
"7400")
149 .
Case(
"7410",
"7400")
150 .
Case(
"7447",
"7400")
151 .
Case(
"7455",
"7450")
153 .
Case(
"POWER4",
"970")
154 .
Case(
"PPC970FX",
"970")
155 .
Case(
"PPC970MP",
"970")
157 .
Case(
"POWER5",
"g5")
159 .
Case(
"POWER6",
"pwr6")
160 .
Case(
"POWER7",
"pwr7")
161 .
Case(
"POWER8",
"pwr8")
162 .
Case(
"POWER8E",
"pwr8")
163 .
Case(
"POWER8NVL",
"pwr8")
164 .
Case(
"POWER9",
"pwr9")
165 .
Case(
"POWER10",
"pwr10")
166 .
Case(
"POWER11",
"pwr11")
179 if (Parts.
size() == 2)
180 return (Parts[0] == Big && Parts[1] == Little) ||
181 (Parts[1] == Big && Parts[0] == Little);
185 if (Implementer ==
"0x41") {
192 if (MatchBigLittle(Parts,
"0xd85",
"0xd87"))
193 return "cortex-x925";
201 .
Case(
"0x926",
"arm926ej-s")
202 .
Case(
"0xb02",
"mpcore")
203 .
Case(
"0xb36",
"arm1136j-s")
204 .
Case(
"0xb56",
"arm1156t2-s")
205 .
Case(
"0xb76",
"arm1176jz-s")
206 .
Case(
"0xd8a",
"c1-nano")
207 .
Case(
"0xd90",
"c1-premium")
208 .
Case(
"0xd8b",
"c1-pro")
209 .
Case(
"0xd8c",
"c1-ultra")
210 .
Case(
"0xc05",
"cortex-a5")
211 .
Case(
"0xc07",
"cortex-a7")
212 .
Case(
"0xc08",
"cortex-a8")
213 .
Case(
"0xc09",
"cortex-a9")
214 .
Case(
"0xc0f",
"cortex-a15")
215 .
Case(
"0xc0e",
"cortex-a17")
216 .
Case(
"0xc20",
"cortex-m0")
217 .
Case(
"0xc23",
"cortex-m3")
218 .
Case(
"0xc24",
"cortex-m4")
219 .
Case(
"0xc27",
"cortex-m7")
220 .
Case(
"0xd20",
"cortex-m23")
221 .
Case(
"0xd21",
"cortex-m33")
222 .
Case(
"0xd24",
"cortex-m52")
223 .
Case(
"0xd22",
"cortex-m55")
224 .
Case(
"0xd23",
"cortex-m85")
225 .
Case(
"0xc18",
"cortex-r8")
226 .
Case(
"0xd13",
"cortex-r52")
227 .
Case(
"0xd16",
"cortex-r52plus")
228 .
Case(
"0xd15",
"cortex-r82")
229 .
Case(
"0xd14",
"cortex-r82ae")
230 .
Case(
"0xd02",
"cortex-a34")
231 .
Case(
"0xd04",
"cortex-a35")
232 .
Case(
"0xd8f",
"cortex-a320")
233 .
Case(
"0xd03",
"cortex-a53")
234 .
Case(
"0xd05",
"cortex-a55")
235 .
Case(
"0xd46",
"cortex-a510")
236 .
Case(
"0xd80",
"cortex-a520")
237 .
Case(
"0xd88",
"cortex-a520ae")
238 .
Case(
"0xd07",
"cortex-a57")
239 .
Case(
"0xd06",
"cortex-a65")
240 .
Case(
"0xd43",
"cortex-a65ae")
241 .
Case(
"0xd08",
"cortex-a72")
242 .
Case(
"0xd09",
"cortex-a73")
243 .
Case(
"0xd0a",
"cortex-a75")
244 .
Case(
"0xd0b",
"cortex-a76")
245 .
Case(
"0xd0e",
"cortex-a76ae")
246 .
Case(
"0xd0d",
"cortex-a77")
247 .
Case(
"0xd41",
"cortex-a78")
248 .
Case(
"0xd42",
"cortex-a78ae")
249 .
Case(
"0xd4b",
"cortex-a78c")
250 .
Case(
"0xd47",
"cortex-a710")
251 .
Case(
"0xd4d",
"cortex-a715")
252 .
Case(
"0xd81",
"cortex-a720")
253 .
Case(
"0xd89",
"cortex-a720ae")
254 .
Case(
"0xd87",
"cortex-a725")
255 .
Case(
"0xd44",
"cortex-x1")
256 .
Case(
"0xd4c",
"cortex-x1c")
257 .
Case(
"0xd48",
"cortex-x2")
258 .
Case(
"0xd4e",
"cortex-x3")
259 .
Case(
"0xd82",
"cortex-x4")
260 .
Case(
"0xd85",
"cortex-x925")
261 .
Case(
"0xd4a",
"neoverse-e1")
262 .
Case(
"0xd0c",
"neoverse-n1")
263 .
Case(
"0xd49",
"neoverse-n2")
264 .
Case(
"0xd8e",
"neoverse-n3")
265 .
Case(
"0xd40",
"neoverse-v1")
266 .
Case(
"0xd4f",
"neoverse-v2")
267 .
Case(
"0xd84",
"neoverse-v3")
268 .
Case(
"0xd83",
"neoverse-v3ae")
272 if (Implementer ==
"0x42" || Implementer ==
"0x43") {
274 .
Case(
"0x516",
"thunderx2t99")
275 .
Case(
"0x0516",
"thunderx2t99")
276 .
Case(
"0xaf",
"thunderx2t99")
277 .
Case(
"0x0af",
"thunderx2t99")
278 .
Case(
"0xa1",
"thunderxt88")
279 .
Case(
"0x0a1",
"thunderxt88")
283 if (Implementer ==
"0x46") {
285 .
Case(
"0x001",
"a64fx")
286 .
Case(
"0x003",
"fujitsu-monaka")
290 if (Implementer ==
"0x4e") {
292 .
Case(
"0x004",
"carmel")
293 .
Case(
"0x10",
"olympus")
294 .
Case(
"0x010",
"olympus")
295 .
Case(
"0x11",
"rigel")
296 .
Case(
"0x011",
"rigel")
300 if (Implementer ==
"0x48")
305 .
Case(
"0xd01",
"tsv110")
306 .
Case(
"0xd06",
"hip12")
309 if (Implementer ==
"0x51")
314 .
Case(
"0x06f",
"krait")
315 .
Case(
"0x201",
"kryo")
316 .
Case(
"0x205",
"kryo")
317 .
Case(
"0x211",
"kryo")
318 .
Case(
"0x800",
"cortex-a73")
319 .
Case(
"0x801",
"cortex-a73")
320 .
Case(
"0x802",
"cortex-a75")
321 .
Case(
"0x803",
"cortex-a75")
322 .
Case(
"0x804",
"cortex-a76")
323 .
Case(
"0x805",
"cortex-a76")
324 .
Case(
"0xc00",
"falkor")
325 .
Case(
"0xc01",
"saphira")
326 .
Case(
"0x001",
"oryon-1")
328 if (Implementer ==
"0x53") {
334 unsigned Variant = GetVariant();
341 unsigned Exynos = (Variant << 12) | PartAsInt;
353 if (Implementer ==
"0x61") {
355 .
Case(
"0x020",
"apple-m1")
356 .
Case(
"0x021",
"apple-m1")
357 .
Case(
"0x022",
"apple-m1")
358 .
Case(
"0x023",
"apple-m1")
359 .
Case(
"0x024",
"apple-m1")
360 .
Case(
"0x025",
"apple-m1")
361 .
Case(
"0x028",
"apple-m1")
362 .
Case(
"0x029",
"apple-m1")
363 .
Case(
"0x030",
"apple-m2")
364 .
Case(
"0x031",
"apple-m2")
365 .
Case(
"0x032",
"apple-m2")
366 .
Case(
"0x033",
"apple-m2")
367 .
Case(
"0x034",
"apple-m2")
368 .
Case(
"0x035",
"apple-m2")
369 .
Case(
"0x038",
"apple-m2")
370 .
Case(
"0x039",
"apple-m2")
371 .
Case(
"0x049",
"apple-m3")
372 .
Case(
"0x048",
"apple-m3")
376 if (Implementer ==
"0x63") {
378 .
Case(
"0x132",
"star-mc1")
379 .
Case(
"0xd25",
"star-mc3")
383 if (Implementer ==
"0x6d") {
386 .
Case(
"0xd49",
"neoverse-n2")
390 if (Implementer ==
"0xc0") {
392 .
Case(
"0xac3",
"ampere1")
393 .
Case(
"0xac4",
"ampere1a")
394 .
Case(
"0xac5",
"ampere1b")
395 .
Case(
"0xac7",
"ampere1c")
409 ProcCpuinfoContent.
split(Lines,
'\n');
417 if (Line.consume_front(
"CPU implementer"))
418 Implementer = Line.
ltrim(
"\t :");
419 else if (Line.consume_front(
"Hardware"))
420 Hardware = Line.
ltrim(
"\t :");
421 else if (Line.consume_front(
"CPU part"))
432 auto GetVariant = [&]() {
433 unsigned Variant = 0;
435 if (
I.consume_front(
"CPU variant"))
436 I.ltrim(
"\t :").getAsInteger(0, Variant);
453 for (
auto Info : UniqueCpuInfos)
460 for (
const auto &Part : PartsHolder)
475StringRef getCPUNameFromS390Model(
unsigned int Id,
bool HaveVectorSupport) {
495 return HaveVectorSupport?
"z13" :
"zEC12";
498 return HaveVectorSupport?
"z14" :
"zEC12";
501 return HaveVectorSupport?
"z15" :
"zEC12";
504 return HaveVectorSupport?
"z16" :
"zEC12";
508 return HaveVectorSupport?
"z17" :
"zEC12";
519 ProcCpuinfoContent.
split(Lines,
'\n');
524 if (Line.starts_with(
"features")) {
525 size_t Pos = Line.find(
':');
527 Line.drop_front(Pos + 1).split(CPUFeatures,
' ');
539 if (Line.starts_with(
"processor ")) {
540 size_t Pos = Line.find(
"machine = ");
542 Pos +=
sizeof(
"machine = ") - 1;
544 if (!Line.drop_front(Pos).getAsInteger(10, Id))
545 return getCPUNameFromS390Model(Id, HaveVectorSupport);
557 ProcCpuinfoContent.
split(Lines,
'\n');
562 if (Line.starts_with(
"uarch")) {
569 .
Case(
"eswin,eic770x",
"sifive-p550")
570 .
Case(
"sifive,u74-mc",
"sifive-u74")
571 .
Case(
"sifive,bullet0",
"sifive-u74")
572 .
Case(
"spacemit,x60",
"spacemit-x60")
573 .
Case(
"spacemit,x100",
"spacemit-x100")
574 .
Case(
"spacemit,a100",
"spacemit-a100")
579#if !defined(__linux__) || !defined(__x86_64__)
582 uint8_t v3_insns[40] __attribute__ ((aligned (8))) =
584 { 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
586 0xb7, 0x2, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0,
588 0xae, 0x20, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0,
590 0xb7, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0,
592 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
594 uint8_t v2_insns[40] __attribute__ ((aligned (8))) =
596 { 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
598 0xb7, 0x2, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0,
600 0xad, 0x20, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0,
602 0xb7, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0,
604 0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
606 struct bpf_prog_load_attr {
622 int fd = syscall(321 , 5 , &attr,
630 memset(&attr, 0,
sizeof(attr));
635 fd = syscall(321 , 5 , &attr,
sizeof(attr));
644#if (defined(__i386__) || defined(_M_IX86) || defined(__x86_64__) || \
645 defined(_M_X64)) && \
650static bool getX86CpuIDAndInfo(
unsigned value,
unsigned *rEAX,
unsigned *rEBX,
651 unsigned *rECX,
unsigned *rEDX) {
652#if (defined(__i386__) || defined(__x86_64__)) && !defined(_MSC_VER)
653 return !__get_cpuid(value, rEAX, rEBX, rECX, rEDX);
654#elif defined(_MSC_VER)
657 __cpuid(registers, value);
658 *rEAX = registers[0];
659 *rEBX = registers[1];
660 *rECX = registers[2];
661 *rEDX = registers[3];
673VendorSignatures getVendorSignature(
unsigned *MaxLeaf) {
674 unsigned EAX = 0, EBX = 0, ECX = 0, EDX = 0;
675 if (MaxLeaf ==
nullptr)
680 if (getX86CpuIDAndInfo(0, MaxLeaf, &EBX, &ECX, &EDX) || *MaxLeaf < 1)
681 return VendorSignatures::UNKNOWN;
684 if (EBX == 0x756e6547 && EDX == 0x49656e69 && ECX == 0x6c65746e)
685 return VendorSignatures::GENUINE_INTEL;
688 if (EBX == 0x68747541 && EDX == 0x69746e65 && ECX == 0x444d4163)
689 return VendorSignatures::AUTHENTIC_AMD;
692 if (EBX == 0x6f677948 && EDX == 0x6e65476e && ECX == 0x656e6975)
693 return VendorSignatures::HYGON_GENUINE;
695 return VendorSignatures::UNKNOWN;
708static bool getX86CpuIDAndInfoEx(
unsigned value,
unsigned subleaf,
709 unsigned *rEAX,
unsigned *rEBX,
unsigned *rECX,
715#if (defined(__i386__) || defined(__x86_64__)) && !defined(_MSC_VER)
716 return !__get_cpuid_count(value, subleaf, rEAX, rEBX, rECX, rEDX);
717#elif defined(_MSC_VER)
719 __cpuidex(registers, value, subleaf);
720 *rEAX = registers[0];
721 *rEBX = registers[1];
722 *rECX = registers[2];
723 *rEDX = registers[3];
731static bool getX86XCR0(
unsigned *rEAX,
unsigned *rEDX) {
735#if defined(__GNUC__) || defined(__clang__)
739 __asm__(
".byte 0x0f, 0x01, 0xd0" :
"=a"(*rEAX),
"=d"(*rEDX) :
"c"(0));
741#elif defined(_MSC_FULL_VER) && defined(_XCR_XFEATURE_ENABLED_MASK)
742 unsigned long long Result = _xgetbv(_XCR_XFEATURE_ENABLED_MASK);
751static void detectX86FamilyModel(
unsigned EAX,
unsigned *Family,
753 *Family = (
EAX >> 8) & 0xf;
754 *Model = (
EAX >> 4) & 0xf;
755 if (*Family == 6 || *Family == 0xf) {
758 *Family += (
EAX >> 20) & 0xff;
760 *Model += ((
EAX >> 16) & 0xf) << 4;
764#define testFeature(F) (Features[F / 32] & (1 << (F % 32))) != 0
766static StringRef getIntelProcessorTypeAndSubtype(
unsigned Family,
768 const unsigned *Features,
781 if (testFeature(X86::FEATURE_MMX)) {
797 *
Type = X86::INTEL_CORE2;
806 *
Type = X86::INTEL_CORE2;
815 *
Type = X86::INTEL_COREI7;
816 *Subtype = X86::INTEL_COREI7_NEHALEM;
823 *
Type = X86::INTEL_COREI7;
824 *Subtype = X86::INTEL_COREI7_WESTMERE;
830 *
Type = X86::INTEL_COREI7;
831 *Subtype = X86::INTEL_COREI7_SANDYBRIDGE;
836 *
Type = X86::INTEL_COREI7;
837 *Subtype = X86::INTEL_COREI7_IVYBRIDGE;
846 *
Type = X86::INTEL_COREI7;
847 *Subtype = X86::INTEL_COREI7_HASWELL;
856 *
Type = X86::INTEL_COREI7;
857 *Subtype = X86::INTEL_COREI7_BROADWELL;
868 *
Type = X86::INTEL_COREI7;
869 *Subtype = X86::INTEL_COREI7_SKYLAKE;
875 *
Type = X86::INTEL_COREI7;
876 *Subtype = X86::INTEL_COREI7_ROCKETLAKE;
881 *
Type = X86::INTEL_COREI7;
882 if (testFeature(X86::FEATURE_AVX512BF16)) {
884 *Subtype = X86::INTEL_COREI7_COOPERLAKE;
885 }
else if (testFeature(X86::FEATURE_AVX512VNNI)) {
887 *Subtype = X86::INTEL_COREI7_CASCADELAKE;
889 CPU =
"skylake-avx512";
890 *Subtype = X86::INTEL_COREI7_SKYLAKE_AVX512;
897 *
Type = X86::INTEL_COREI7;
898 *Subtype = X86::INTEL_COREI7_CANNONLAKE;
904 CPU =
"icelake-client";
905 *
Type = X86::INTEL_COREI7;
906 *Subtype = X86::INTEL_COREI7_ICELAKE_CLIENT;
913 *
Type = X86::INTEL_COREI7;
914 *Subtype = X86::INTEL_COREI7_TIGERLAKE;
921 *
Type = X86::INTEL_COREI7;
922 *Subtype = X86::INTEL_COREI7_ALDERLAKE;
928 *
Type = X86::INTEL_COREI7;
929 *Subtype = X86::INTEL_COREI7_ALDERLAKE;
937 *
Type = X86::INTEL_COREI7;
938 *Subtype = X86::INTEL_COREI7_ALDERLAKE;
945 *
Type = X86::INTEL_COREI7;
946 *Subtype = X86::INTEL_COREI7_ALDERLAKE;
954 *
Type = X86::INTEL_COREI7;
955 *Subtype = X86::INTEL_COREI7_ARROWLAKE;
961 *
Type = X86::INTEL_COREI7;
962 *Subtype = X86::INTEL_COREI7_ARROWLAKE_S;
968 *
Type = X86::INTEL_COREI7;
969 *Subtype = X86::INTEL_COREI7_ARROWLAKE_S;
975 *
Type = X86::INTEL_COREI7;
976 *Subtype = X86::INTEL_COREI7_PANTHERLAKE;
982 *
Type = X86::INTEL_COREI7;
983 *Subtype = X86::INTEL_COREI7_PANTHERLAKE;
988 CPU =
"graniterapids";
989 *
Type = X86::INTEL_COREI7;
990 *Subtype = X86::INTEL_COREI7_GRANITERAPIDS;
995 CPU =
"graniterapids-d";
996 *
Type = X86::INTEL_COREI7;
997 *Subtype = X86::INTEL_COREI7_GRANITERAPIDS_D;
1003 CPU =
"icelake-server";
1004 *
Type = X86::INTEL_COREI7;
1005 *Subtype = X86::INTEL_COREI7_ICELAKE_SERVER;
1010 CPU =
"emeraldrapids";
1011 *
Type = X86::INTEL_COREI7;
1012 *Subtype = X86::INTEL_COREI7_SAPPHIRERAPIDS;
1017 CPU =
"sapphirerapids";
1018 *
Type = X86::INTEL_COREI7;
1019 *Subtype = X86::INTEL_COREI7_SAPPHIRERAPIDS;
1028 *
Type = X86::INTEL_BONNELL;
1039 *
Type = X86::INTEL_SILVERMONT;
1045 *
Type = X86::INTEL_GOLDMONT;
1048 CPU =
"goldmont-plus";
1049 *
Type = X86::INTEL_GOLDMONT_PLUS;
1056 *
Type = X86::INTEL_TREMONT;
1061 CPU =
"sierraforest";
1062 *
Type = X86::INTEL_SIERRAFOREST;
1068 *
Type = X86::INTEL_GRANDRIDGE;
1073 CPU =
"clearwaterforest";
1074 *
Type = X86::INTEL_CLEARWATERFOREST;
1080 *
Type = X86::INTEL_KNL;
1084 *
Type = X86::INTEL_KNM;
1091 if (testFeature(X86::FEATURE_AVX512VP2INTERSECT)) {
1093 }
else if (testFeature(X86::FEATURE_AVX512VBMI2)) {
1094 CPU =
"icelake-client";
1095 }
else if (testFeature(X86::FEATURE_AVX512VBMI)) {
1097 }
else if (testFeature(X86::FEATURE_AVX512BF16)) {
1099 }
else if (testFeature(X86::FEATURE_AVX512VNNI)) {
1100 CPU =
"cascadelake";
1101 }
else if (testFeature(X86::FEATURE_AVX512VL)) {
1102 CPU =
"skylake-avx512";
1103 }
else if (testFeature(X86::FEATURE_CLFLUSHOPT)) {
1104 if (testFeature(X86::FEATURE_SHA))
1108 }
else if (testFeature(X86::FEATURE_ADX)) {
1110 }
else if (testFeature(X86::FEATURE_AVX2)) {
1112 }
else if (testFeature(X86::FEATURE_AVX)) {
1113 CPU =
"sandybridge";
1114 }
else if (testFeature(X86::FEATURE_SSE4_2)) {
1115 if (testFeature(X86::FEATURE_MOVBE))
1119 }
else if (testFeature(X86::FEATURE_SSE4_1)) {
1121 }
else if (testFeature(X86::FEATURE_SSSE3)) {
1122 if (testFeature(X86::FEATURE_MOVBE))
1126 }
else if (testFeature(X86::FEATURE_64BIT)) {
1128 }
else if (testFeature(X86::FEATURE_SSE3)) {
1130 }
else if (testFeature(X86::FEATURE_SSE2)) {
1132 }
else if (testFeature(X86::FEATURE_SSE)) {
1134 }
else if (testFeature(X86::FEATURE_MMX)) {
1143 if (testFeature(X86::FEATURE_64BIT)) {
1147 if (testFeature(X86::FEATURE_SSE3)) {
1158 CPU =
"diamondrapids";
1159 *
Type = X86::INTEL_COREI7;
1160 *Subtype = X86::INTEL_COREI7_DIAMONDRAPIDS;
1173 *
Type = X86::INTEL_COREI7;
1174 *Subtype = X86::INTEL_COREI7_NOVALAKE;
1188static const char *getAMDProcessorTypeAndSubtype(
unsigned Family,
1190 const unsigned *Features,
1192 unsigned *Subtype) {
1193 const char *CPU =
nullptr;
1219 if (testFeature(X86::FEATURE_SSE)) {
1226 if (testFeature(X86::FEATURE_SSE3)) {
1235 *
Type = X86::AMDFAM10H;
1238 *Subtype = X86::AMDFAM10H_BARCELONA;
1241 *Subtype = X86::AMDFAM10H_SHANGHAI;
1244 *Subtype = X86::AMDFAM10H_ISTANBUL;
1250 *
Type = X86::AMD_BTVER1;
1254 *
Type = X86::AMDFAM15H;
1255 if (Model >= 0x60 && Model <= 0x7f) {
1257 *Subtype = X86::AMDFAM15H_BDVER4;
1260 if (Model >= 0x30 && Model <= 0x3f) {
1262 *Subtype = X86::AMDFAM15H_BDVER3;
1265 if ((Model >= 0x10 && Model <= 0x1f) || Model == 0x02) {
1267 *Subtype = X86::AMDFAM15H_BDVER2;
1270 if (Model <= 0x0f) {
1271 *Subtype = X86::AMDFAM15H_BDVER1;
1277 *
Type = X86::AMD_BTVER2;
1281 *
Type = X86::AMDFAM17H;
1282 if ((Model >= 0x30 && Model <= 0x3f) || (Model == 0x47) ||
1283 (Model >= 0x60 && Model <= 0x67) || (Model >= 0x68 && Model <= 0x6f) ||
1284 (Model >= 0x70 && Model <= 0x7f) || (Model >= 0x84 && Model <= 0x87) ||
1285 (Model >= 0x90 && Model <= 0x97) || (Model >= 0x98 && Model <= 0x9f) ||
1286 (Model >= 0xa0 && Model <= 0xaf)) {
1297 *Subtype = X86::AMDFAM17H_ZNVER2;
1300 if ((Model >= 0x10 && Model <= 0x1f) || (Model >= 0x20 && Model <= 0x2f)) {
1304 *Subtype = X86::AMDFAM17H_ZNVER1;
1310 *
Type = X86::AMDFAM19H;
1311 if (Model <= 0x0f || (Model >= 0x20 && Model <= 0x2f) ||
1312 (Model >= 0x30 && Model <= 0x3f) || (Model >= 0x40 && Model <= 0x4f) ||
1313 (Model >= 0x50 && Model <= 0x5f)) {
1319 *Subtype = X86::AMDFAM19H_ZNVER3;
1322 if ((Model >= 0x10 && Model <= 0x1f) || (Model >= 0x60 && Model <= 0x6f) ||
1323 (Model >= 0x70 && Model <= 0x77) || (Model >= 0x78 && Model <= 0x7f) ||
1324 (Model >= 0xa0 && Model <= 0xaf)) {
1331 *Subtype = X86::AMDFAM19H_ZNVER4;
1337 *
Type = X86::AMDFAM1AH;
1338 if (Model <= 0x4f || (Model >= 0x60 && Model <= 0x77) ||
1339 (Model >= 0xd0 && Model <= 0xd7)) {
1350 *Subtype = X86::AMDFAM1AH_ZNVER5;
1353 if ((Model >= 0x50 && Model <= 0x5f) || (Model >= 0x80 && Model <= 0xcf) ||
1354 (Model >= 0xd8 && Model <= 0xe7)) {
1356 *Subtype = X86::AMDFAM1AH_ZNVER6;
1368static StringRef getHygonProcessorTypeAndSubtype(
unsigned Family,
1370 const unsigned *Features,
1372 unsigned *Subtype) {
1380 *
Type = X86::HYGONFAM18H;
1381 *Subtype = X86::HYGONFAM18H_C86_4G_M4;
1385 *
Type = X86::HYGONFAM18H;
1386 *Subtype = X86::HYGONFAM18H_C86_4G_M6;
1390 *
Type = X86::HYGONFAM18H;
1391 *Subtype = X86::HYGONFAM18H_C86_4G_M7;
1395 *
Type = X86::HYGONFAM18H;
1396 *Subtype = X86::HYGONFAM18H_C86_4G_M8;
1409static void getAvailableFeatures(
unsigned ECX,
unsigned EDX,
unsigned MaxLeaf,
1410 unsigned *Features) {
1413 auto setFeature = [&](
unsigned F) {
1414 Features[
F / 32] |= 1U << (
F % 32);
1417 if ((EDX >> 15) & 1)
1418 setFeature(X86::FEATURE_CMOV);
1419 if ((EDX >> 23) & 1)
1420 setFeature(X86::FEATURE_MMX);
1421 if ((EDX >> 25) & 1)
1422 setFeature(X86::FEATURE_SSE);
1423 if ((EDX >> 26) & 1)
1424 setFeature(X86::FEATURE_SSE2);
1427 setFeature(X86::FEATURE_SSE3);
1429 setFeature(X86::FEATURE_PCLMUL);
1431 setFeature(X86::FEATURE_SSSE3);
1432 if ((ECX >> 12) & 1)
1433 setFeature(X86::FEATURE_FMA);
1434 if ((ECX >> 19) & 1)
1435 setFeature(X86::FEATURE_SSE4_1);
1436 if ((ECX >> 20) & 1) {
1437 setFeature(X86::FEATURE_SSE4_2);
1438 setFeature(X86::FEATURE_CRC32);
1440 if ((ECX >> 23) & 1)
1441 setFeature(X86::FEATURE_POPCNT);
1442 if ((ECX >> 25) & 1)
1443 setFeature(X86::FEATURE_AES);
1445 if ((ECX >> 22) & 1)
1446 setFeature(X86::FEATURE_MOVBE);
1451 const unsigned AVXBits = (1 << 27) | (1 << 28);
1452 bool HasAVX = ((
ECX & AVXBits) == AVXBits) && !getX86XCR0(&EAX, &EDX) &&
1453 ((
EAX & 0x6) == 0x6);
1454#if defined(__APPLE__)
1458 bool HasAVX512Save =
true;
1461 bool HasAVX512Save = HasAVX && ((
EAX & 0xe0) == 0xe0);
1465 setFeature(X86::FEATURE_AVX);
1468 MaxLeaf >= 0x7 && !getX86CpuIDAndInfoEx(0x7, 0x0, &EAX, &EBX, &ECX, &EDX);
1470 if (HasLeaf7 && ((EBX >> 3) & 1))
1471 setFeature(X86::FEATURE_BMI);
1472 if (HasLeaf7 && ((EBX >> 5) & 1) && HasAVX)
1473 setFeature(X86::FEATURE_AVX2);
1474 if (HasLeaf7 && ((EBX >> 8) & 1))
1475 setFeature(X86::FEATURE_BMI2);
1476 if (HasLeaf7 && ((EBX >> 16) & 1) && HasAVX512Save) {
1477 setFeature(X86::FEATURE_AVX512F);
1479 if (HasLeaf7 && ((EBX >> 17) & 1) && HasAVX512Save)
1480 setFeature(X86::FEATURE_AVX512DQ);
1481 if (HasLeaf7 && ((EBX >> 19) & 1))
1482 setFeature(X86::FEATURE_ADX);
1483 if (HasLeaf7 && ((EBX >> 21) & 1) && HasAVX512Save)
1484 setFeature(X86::FEATURE_AVX512IFMA);
1485 if (HasLeaf7 && ((EBX >> 23) & 1))
1486 setFeature(X86::FEATURE_CLFLUSHOPT);
1487 if (HasLeaf7 && ((EBX >> 28) & 1) && HasAVX512Save)
1488 setFeature(X86::FEATURE_AVX512CD);
1489 if (HasLeaf7 && ((EBX >> 29) & 1))
1490 setFeature(X86::FEATURE_SHA);
1491 if (HasLeaf7 && ((EBX >> 30) & 1) && HasAVX512Save)
1492 setFeature(X86::FEATURE_AVX512BW);
1493 if (HasLeaf7 && ((EBX >> 31) & 1) && HasAVX512Save)
1494 setFeature(X86::FEATURE_AVX512VL);
1496 if (HasLeaf7 && ((ECX >> 1) & 1) && HasAVX512Save)
1497 setFeature(X86::FEATURE_AVX512VBMI);
1498 if (HasLeaf7 && ((ECX >> 6) & 1) && HasAVX512Save)
1499 setFeature(X86::FEATURE_AVX512VBMI2);
1500 if (HasLeaf7 && ((ECX >> 8) & 1))
1501 setFeature(X86::FEATURE_GFNI);
1502 if (HasLeaf7 && ((ECX >> 10) & 1) && HasAVX)
1503 setFeature(X86::FEATURE_VPCLMULQDQ);
1504 if (HasLeaf7 && ((ECX >> 11) & 1) && HasAVX512Save)
1505 setFeature(X86::FEATURE_AVX512VNNI);
1506 if (HasLeaf7 && ((ECX >> 12) & 1) && HasAVX512Save)
1507 setFeature(X86::FEATURE_AVX512BITALG);
1508 if (HasLeaf7 && ((ECX >> 14) & 1) && HasAVX512Save)
1509 setFeature(X86::FEATURE_AVX512VPOPCNTDQ);
1511 if (HasLeaf7 && ((EDX >> 2) & 1) && HasAVX512Save)
1512 setFeature(X86::FEATURE_AVX5124VNNIW);
1513 if (HasLeaf7 && ((EDX >> 3) & 1) && HasAVX512Save)
1514 setFeature(X86::FEATURE_AVX5124FMAPS);
1515 if (HasLeaf7 && ((EDX >> 8) & 1) && HasAVX512Save)
1516 setFeature(X86::FEATURE_AVX512VP2INTERSECT);
1520 bool HasLeaf7Subleaf1 =
1521 HasLeaf7 &&
EAX >= 1 &&
1522 !getX86CpuIDAndInfoEx(0x7, 0x1, &EAX, &EBX, &ECX, &EDX);
1523 if (HasLeaf7Subleaf1 && ((EAX >> 5) & 1) && HasAVX512Save)
1524 setFeature(X86::FEATURE_AVX512BF16);
1526 unsigned MaxExtLevel;
1527 getX86CpuIDAndInfo(0x80000000, &MaxExtLevel, &EBX, &ECX, &EDX);
1529 bool HasExtLeaf1 = MaxExtLevel >= 0x80000001 &&
1530 !getX86CpuIDAndInfo(0x80000001, &EAX, &EBX, &ECX, &EDX);
1531 if (HasExtLeaf1 && ((ECX >> 6) & 1))
1532 setFeature(X86::FEATURE_SSE4_A);
1533 if (HasExtLeaf1 && ((ECX >> 11) & 1))
1534 setFeature(X86::FEATURE_XOP);
1535 if (HasExtLeaf1 && ((ECX >> 16) & 1))
1536 setFeature(X86::FEATURE_FMA4);
1538 if (HasExtLeaf1 && ((EDX >> 29) & 1))
1539 setFeature(X86::FEATURE_64BIT);
1543 unsigned MaxLeaf = 0;
1549 getX86CpuIDAndInfo(0x1, &EAX, &EBX, &ECX, &EDX);
1551 unsigned Family = 0, Model = 0;
1553 detectX86FamilyModel(EAX, &Family, &Model);
1554 getAvailableFeatures(ECX, EDX, MaxLeaf, Features);
1559 unsigned Subtype = 0;
1564 CPU = getIntelProcessorTypeAndSubtype(Family, Model, Features, &
Type,
1567 CPU = getAMDProcessorTypeAndSubtype(Family, Model, Features, &
Type,
1570 CPU = getHygonProcessorTypeAndSubtype(Family, Model, Features, &
Type,
1580#elif defined(_M_ARM64) || defined(_M_ARM64EC)
1583 constexpr char CentralProcessorKeyName[] =
1584 "HARDWARE\\DESCRIPTION\\System\\CentralProcessor";
1587 constexpr size_t SubKeyNameMaxSize = ARRAYSIZE(CentralProcessorKeyName) + 10;
1591 char PrimaryPartKeyName[SubKeyNameMaxSize];
1592 DWORD PrimaryPartKeyNameSize = 0;
1593 HKEY CentralProcessorKey;
1594 if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, CentralProcessorKeyName, 0, KEY_READ,
1595 &CentralProcessorKey) == ERROR_SUCCESS) {
1596 for (
unsigned Index = 0; Index < UINT32_MAX; ++Index) {
1597 char SubKeyName[SubKeyNameMaxSize];
1598 DWORD SubKeySize = SubKeyNameMaxSize;
1600 if ((RegEnumKeyExA(CentralProcessorKey, Index, SubKeyName, &SubKeySize,
1601 nullptr,
nullptr,
nullptr,
1602 nullptr) == ERROR_SUCCESS) &&
1603 (RegOpenKeyExA(CentralProcessorKey, SubKeyName, 0, KEY_READ,
1604 &SubKey) == ERROR_SUCCESS)) {
1609 DWORD RegValueSize =
sizeof(RegValue);
1610 if ((RegQueryValueExA(SubKey,
"CP 4000",
nullptr, &ActualType,
1612 &RegValueSize) == ERROR_SUCCESS) &&
1613 (ActualType == REG_QWORD) && RegValueSize ==
sizeof(RegValue)) {
1618 if (PrimaryPartKeyNameSize < SubKeySize ||
1619 (PrimaryPartKeyNameSize == SubKeySize &&
1620 ::memcmp(SubKeyName, PrimaryPartKeyName, SubKeySize) > 0)) {
1621 PrimaryCpuInfo = RegValue;
1622 ::memcpy(PrimaryPartKeyName, SubKeyName, SubKeySize + 1);
1623 PrimaryPartKeyNameSize = SubKeySize;
1626 Values.push_back(RegValue);
1629 RegCloseKey(SubKey);
1635 RegCloseKey(CentralProcessorKey);
1649#elif defined(__APPLE__) && defined(__powerpc__)
1651 host_basic_info_data_t hostInfo;
1652 mach_msg_type_number_t infoCount;
1654 infoCount = HOST_BASIC_INFO_COUNT;
1655 mach_port_t hostPort = mach_host_self();
1656 host_info(hostPort, HOST_BASIC_INFO, (host_info_t)&hostInfo,
1658 mach_port_deallocate(mach_task_self(), hostPort);
1660 if (hostInfo.cpu_type != CPU_TYPE_POWERPC)
1663 switch (hostInfo.cpu_subtype) {
1693#elif defined(__linux__) && defined(__powerpc__)
1699#elif defined(__linux__) && (defined(__arm__) || defined(__aarch64__))
1705#elif defined(__linux__) && defined(__s390x__)
1711#elif defined(__MVS__)
1716 int *StartToCVTOffset =
reinterpret_cast<int *
>(0x10);
1719 int ReadValue = *StartToCVTOffset;
1721 ReadValue = (ReadValue & 0x7FFFFFFF);
1722 char *CVT =
reinterpret_cast<char *
>(ReadValue);
1731 bool HaveVectorSupport = CVT[244] & 0x80;
1732 return getCPUNameFromS390Model(Id, HaveVectorSupport);
1734#elif defined(__APPLE__) && (defined(__arm__) || defined(__aarch64__))
1739#define CPUFAMILY_UNKNOWN 0
1740#define CPUFAMILY_ARM_9 0xe73283ae
1741#define CPUFAMILY_ARM_11 0x8ff620d8
1742#define CPUFAMILY_ARM_XSCALE 0x53b005f5
1743#define CPUFAMILY_ARM_12 0xbd1b0ae9
1744#define CPUFAMILY_ARM_13 0x0cc90e64
1745#define CPUFAMILY_ARM_14 0x96077ef1
1746#define CPUFAMILY_ARM_15 0xa8511bca
1747#define CPUFAMILY_ARM_SWIFT 0x1e2d6381
1748#define CPUFAMILY_ARM_CYCLONE 0x37a09642
1749#define CPUFAMILY_ARM_TYPHOON 0x2c91a47e
1750#define CPUFAMILY_ARM_TWISTER 0x92fb37c8
1751#define CPUFAMILY_ARM_HURRICANE 0x67ceee93
1752#define CPUFAMILY_ARM_MONSOON_MISTRAL 0xe81e7ef6
1753#define CPUFAMILY_ARM_VORTEX_TEMPEST 0x07d34b9f
1754#define CPUFAMILY_ARM_LIGHTNING_THUNDER 0x462504d2
1755#define CPUFAMILY_ARM_FIRESTORM_ICESTORM 0x1b588bb3
1756#define CPUFAMILY_ARM_BLIZZARD_AVALANCHE 0xda33d83d
1757#define CPUFAMILY_ARM_EVEREST_SAWTOOTH 0x8765edea
1758#define CPUFAMILY_ARM_IBIZA 0xfa33415e
1759#define CPUFAMILY_ARM_PALMA 0x72015832
1760#define CPUFAMILY_ARM_COLL 0x2876f5b5
1761#define CPUFAMILY_ARM_LOBOS 0x5f4dea93
1762#define CPUFAMILY_ARM_DONAN 0x6f5129ac
1763#define CPUFAMILY_ARM_BRAVA 0x17d5b93a
1764#define CPUFAMILY_ARM_TAHITI 0x75d4acb9
1765#define CPUFAMILY_ARM_TUPAI 0x204526d0
1766#define CPUFAMILY_ARM_HIDRA 0x1d5a87e8
1767#define CPUFAMILY_ARM_SOTRA 0xf76c5b1a
1768#define CPUFAMILY_ARM_THERA 0xab345f09
1769#define CPUFAMILY_ARM_TILOS 0x01d7a72b
1773 size_t Length =
sizeof(Family);
1774 sysctlbyname(
"hw.cpufamily", &Family, &
Length, NULL, 0);
1786 case CPUFAMILY_UNKNOWN:
1788 case CPUFAMILY_ARM_9:
1790 case CPUFAMILY_ARM_11:
1791 return "arm1136jf-s";
1792 case CPUFAMILY_ARM_XSCALE:
1794 case CPUFAMILY_ARM_12:
1796 case CPUFAMILY_ARM_13:
1798 case CPUFAMILY_ARM_14:
1800 case CPUFAMILY_ARM_15:
1802 case CPUFAMILY_ARM_SWIFT:
1804 case CPUFAMILY_ARM_CYCLONE:
1806 case CPUFAMILY_ARM_TYPHOON:
1808 case CPUFAMILY_ARM_TWISTER:
1810 case CPUFAMILY_ARM_HURRICANE:
1812 case CPUFAMILY_ARM_MONSOON_MISTRAL:
1814 case CPUFAMILY_ARM_VORTEX_TEMPEST:
1816 case CPUFAMILY_ARM_LIGHTNING_THUNDER:
1818 case CPUFAMILY_ARM_FIRESTORM_ICESTORM:
1820 case CPUFAMILY_ARM_BLIZZARD_AVALANCHE:
1822 case CPUFAMILY_ARM_EVEREST_SAWTOOTH:
1823 case CPUFAMILY_ARM_IBIZA:
1824 case CPUFAMILY_ARM_PALMA:
1825 case CPUFAMILY_ARM_LOBOS:
1827 case CPUFAMILY_ARM_COLL:
1829 case CPUFAMILY_ARM_DONAN:
1830 case CPUFAMILY_ARM_BRAVA:
1831 case CPUFAMILY_ARM_TAHITI:
1832 case CPUFAMILY_ARM_TUPAI:
1834 case CPUFAMILY_ARM_HIDRA:
1835 case CPUFAMILY_ARM_SOTRA:
1836 case CPUFAMILY_ARM_THERA:
1837 case CPUFAMILY_ARM_TILOS:
1846 switch (_system_configuration.implementation) {
1848 if (_system_configuration.version == PV_4_3)
1852 if (_system_configuration.version == PV_5)
1856 if (_system_configuration.version == PV_6_Compat)
1882#elif defined(__loongarch__)
1886 __asm__(
"cpucfg %[prid], $zero\n\t" : [prid]
"=r"(processor_id));
1888 switch (processor_id & 0xf000) {
1899#elif defined(__riscv)
1900#if defined(__linux__)
1902struct RISCVHwProbe {
1909#if defined(__linux__)
1911 RISCVHwProbe Query[]{{0, 0},
1914 int Ret = syscall(258, Query,
1915 std::size(Query), 0,
1932#if __riscv_xlen == 64
1933 return "generic-rv64";
1934#elif __riscv_xlen == 32
1935 return "generic-rv32";
1937#error "Unhandled value of __riscv_xlen"
1940#elif defined(__sparc__)
1941#if defined(__linux__)
1944 ProcCpuinfoContent.
split(Lines,
'\n');
1948 for (
unsigned I = 0,
E =
Lines.size();
I !=
E; ++
I) {
1950 Cpu =
Lines[
I].substr(5).ltrim(
"\t :");
1982#if defined(__linux__)
1986#elif defined(__sun__) && defined(__svr4__)
1990 kstat_named_t *brand = NULL;
1994 ksp = kstat_lookup(kc,
const_cast<char *
>(
"cpu_info"), -1, NULL);
1995 if (ksp != NULL && kstat_read(kc, ksp, NULL) != -1 &&
1996 ksp->ks_type == KSTAT_TYPE_NAMED)
1998 (kstat_named_t *)kstat_data_lookup(ksp,
const_cast<char *
>(
"brand"));
1999 if (brand != NULL && brand->data_type == KSTAT_DATA_STRING)
2000 buf = KSTAT_NAMED_STR_PTR(brand);
2005 .
Case(
"TMS390S10",
"supersparc")
2006 .
Case(
"TMS390Z50",
"supersparc")
2009 .
Case(
"MB86904",
"supersparc")
2010 .
Case(
"MB86907",
"supersparc")
2011 .
Case(
"RT623",
"hypersparc")
2012 .
Case(
"RT625",
"hypersparc")
2013 .
Case(
"RT626",
"hypersparc")
2014 .
Case(
"UltraSPARC-I",
"ultrasparc")
2015 .
Case(
"UltraSPARC-II",
"ultrasparc")
2016 .
Case(
"UltraSPARC-IIe",
"ultrasparc")
2017 .
Case(
"UltraSPARC-IIi",
"ultrasparc")
2018 .
Case(
"SPARC64-III",
"ultrasparc")
2019 .
Case(
"SPARC64-IV",
"ultrasparc")
2020 .
Case(
"UltraSPARC-III",
"ultrasparc3")
2021 .
Case(
"UltraSPARC-III+",
"ultrasparc3")
2022 .
Case(
"UltraSPARC-IIIi",
"ultrasparc3")
2023 .
Case(
"UltraSPARC-IIIi+",
"ultrasparc3")
2024 .
Case(
"UltraSPARC-IV",
"ultrasparc3")
2025 .
Case(
"UltraSPARC-IV+",
"ultrasparc3")
2026 .
Case(
"SPARC64-V",
"ultrasparc3")
2027 .
Case(
"SPARC64-VI",
"ultrasparc3")
2028 .
Case(
"SPARC64-VII",
"ultrasparc3")
2029 .
Case(
"UltraSPARC-T1",
"niagara")
2030 .
Case(
"UltraSPARC-T2",
"niagara2")
2031 .
Case(
"UltraSPARC-T2",
"niagara2")
2032 .
Case(
"UltraSPARC-T2+",
"niagara2")
2033 .
Case(
"SPARC-T3",
"niagara3")
2034 .
Case(
"SPARC-T4",
"niagara4")
2035 .
Case(
"SPARC-T5",
"niagara4")
2037 .
Case(
"SPARC-M7",
"niagara4" )
2038 .
Case(
"SPARC-S7",
"niagara4" )
2039 .
Case(
"SPARC-M8",
"niagara4" )
2062#if (defined(__i386__) || defined(_M_IX86) || defined(__x86_64__) || \
2063 defined(_M_X64)) && \
2064 !defined(_M_ARM64EC)
2070 if (getX86CpuIDAndInfo(0, &MaxLevel, &EBX, &ECX, &EDX) || MaxLevel < 1)
2073 getX86CpuIDAndInfo(1, &EAX, &EBX, &ECX, &EDX);
2075 Features[
"cx8"] = (
EDX >> 8) & 1;
2076 Features[
"cmov"] = (
EDX >> 15) & 1;
2077 Features[
"mmx"] = (
EDX >> 23) & 1;
2078 Features[
"fxsr"] = (
EDX >> 24) & 1;
2079 Features[
"sse"] = (
EDX >> 25) & 1;
2080 Features[
"sse2"] = (
EDX >> 26) & 1;
2082 Features[
"sse3"] = (
ECX >> 0) & 1;
2083 Features[
"pclmul"] = (
ECX >> 1) & 1;
2084 Features[
"ssse3"] = (
ECX >> 9) & 1;
2085 Features[
"cx16"] = (
ECX >> 13) & 1;
2086 Features[
"sse4.1"] = (
ECX >> 19) & 1;
2087 Features[
"sse4.2"] = (
ECX >> 20) & 1;
2088 Features[
"crc32"] = Features[
"sse4.2"];
2089 Features[
"movbe"] = (
ECX >> 22) & 1;
2090 Features[
"popcnt"] = (
ECX >> 23) & 1;
2091 Features[
"aes"] = (
ECX >> 25) & 1;
2092 Features[
"rdrnd"] = (
ECX >> 30) & 1;
2097 bool HasXSave = ((
ECX >> 27) & 1) && !getX86XCR0(&EAX, &EDX);
2098 bool HasAVXSave = HasXSave && ((
ECX >> 28) & 1) && ((EAX & 0x6) == 0x6);
2099#if defined(__APPLE__)
2103 bool HasAVX512Save =
true;
2106 bool HasAVX512Save = HasAVXSave && ((
EAX & 0xe0) == 0xe0);
2109 const unsigned AMXBits = (1 << 17) | (1 << 18);
2110 bool HasAMXSave = HasXSave && ((
EAX & AMXBits) == AMXBits);
2112 bool HasAPXSave = HasXSave && ((
EAX >> 19) & 1);
2114 Features[
"avx"] = HasAVXSave;
2115 Features[
"fma"] = ((
ECX >> 12) & 1) && HasAVXSave;
2117 Features[
"xsave"] = ((
ECX >> 26) & 1) && HasAVXSave;
2118 Features[
"f16c"] = ((
ECX >> 29) & 1) && HasAVXSave;
2120 unsigned MaxExtLevel;
2121 getX86CpuIDAndInfo(0x80000000, &MaxExtLevel, &EBX, &ECX, &EDX);
2123 bool HasExtLeaf1 = MaxExtLevel >= 0x80000001 &&
2124 !getX86CpuIDAndInfo(0x80000001, &EAX, &EBX, &ECX, &EDX);
2125 Features[
"sahf"] = HasExtLeaf1 && ((
ECX >> 0) & 1);
2126 Features[
"lzcnt"] = HasExtLeaf1 && ((
ECX >> 5) & 1);
2127 Features[
"sse4a"] = HasExtLeaf1 && ((
ECX >> 6) & 1);
2128 Features[
"prfchw"] = HasExtLeaf1 && ((
ECX >> 8) & 1);
2129 Features[
"xop"] = HasExtLeaf1 && ((
ECX >> 11) & 1) && HasAVXSave;
2130 Features[
"lwp"] = HasExtLeaf1 && ((
ECX >> 15) & 1);
2131 Features[
"fma4"] = HasExtLeaf1 && ((
ECX >> 16) & 1) && HasAVXSave;
2132 Features[
"tbm"] = HasExtLeaf1 && ((
ECX >> 21) & 1);
2133 Features[
"mwaitx"] = HasExtLeaf1 && ((
ECX >> 29) & 1);
2135 Features[
"64bit"] = HasExtLeaf1 && ((
EDX >> 29) & 1);
2139 bool HasExtLeaf8 = MaxExtLevel >= 0x80000008 &&
2140 !getX86CpuIDAndInfo(0x80000008, &EAX, &EBX, &ECX, &EDX);
2141 Features[
"clzero"] = HasExtLeaf8 && ((
EBX >> 0) & 1);
2142 Features[
"rdpru"] = HasExtLeaf8 && ((
EBX >> 4) & 1);
2143 Features[
"wbnoinvd"] = HasExtLeaf8 && ((
EBX >> 9) & 1);
2145 bool HasExtLeaf21 = MaxExtLevel >= 0x80000021 &&
2146 !getX86CpuIDAndInfo(0x80000021, &EAX, &EBX, &ECX, &EDX);
2148 Features[
"prefetchi"] = HasExtLeaf21 && ((
EAX >> 20) & 1);
2149 Features[
"avx512bmm"] = HasExtLeaf21 && ((
EAX >> 23) & 1) && HasAVX512Save;
2152 MaxLevel >= 7 && !getX86CpuIDAndInfoEx(0x7, 0x0, &EAX, &EBX, &ECX, &EDX);
2154 Features[
"fsgsbase"] = HasLeaf7 && ((
EBX >> 0) & 1);
2155 Features[
"sgx"] = HasLeaf7 && ((
EBX >> 2) & 1);
2156 Features[
"bmi"] = HasLeaf7 && ((
EBX >> 3) & 1);
2158 Features[
"avx2"] = HasLeaf7 && ((
EBX >> 5) & 1) && HasAVXSave;
2159 Features[
"bmi2"] = HasLeaf7 && ((
EBX >> 8) & 1);
2160 Features[
"invpcid"] = HasLeaf7 && ((
EBX >> 10) & 1);
2161 Features[
"rtm"] = HasLeaf7 && ((
EBX >> 11) & 1);
2163 Features[
"avx512f"] = HasLeaf7 && ((
EBX >> 16) & 1) && HasAVX512Save;
2164 Features[
"avx512dq"] = HasLeaf7 && ((
EBX >> 17) & 1) && HasAVX512Save;
2165 Features[
"rdseed"] = HasLeaf7 && ((
EBX >> 18) & 1);
2166 Features[
"adx"] = HasLeaf7 && ((
EBX >> 19) & 1);
2167 Features[
"avx512ifma"] = HasLeaf7 && ((
EBX >> 21) & 1) && HasAVX512Save;
2168 Features[
"clflushopt"] = HasLeaf7 && ((
EBX >> 23) & 1);
2169 Features[
"clwb"] = HasLeaf7 && ((
EBX >> 24) & 1);
2170 Features[
"avx512cd"] = HasLeaf7 && ((
EBX >> 28) & 1) && HasAVX512Save;
2171 Features[
"sha"] = HasLeaf7 && ((
EBX >> 29) & 1);
2172 Features[
"avx512bw"] = HasLeaf7 && ((
EBX >> 30) & 1) && HasAVX512Save;
2173 Features[
"avx512vl"] = HasLeaf7 && ((
EBX >> 31) & 1) && HasAVX512Save;
2175 Features[
"avx512vbmi"] = HasLeaf7 && ((
ECX >> 1) & 1) && HasAVX512Save;
2176 Features[
"pku"] = HasLeaf7 && ((
ECX >> 4) & 1);
2177 Features[
"waitpkg"] = HasLeaf7 && ((
ECX >> 5) & 1);
2178 Features[
"avx512vbmi2"] = HasLeaf7 && ((
ECX >> 6) & 1) && HasAVX512Save;
2179 Features[
"shstk"] = HasLeaf7 && ((
ECX >> 7) & 1);
2180 Features[
"gfni"] = HasLeaf7 && ((
ECX >> 8) & 1);
2181 Features[
"vaes"] = HasLeaf7 && ((
ECX >> 9) & 1) && HasAVXSave;
2182 Features[
"vpclmulqdq"] = HasLeaf7 && ((
ECX >> 10) & 1) && HasAVXSave;
2183 Features[
"avx512vnni"] = HasLeaf7 && ((
ECX >> 11) & 1) && HasAVX512Save;
2184 Features[
"avx512bitalg"] = HasLeaf7 && ((
ECX >> 12) & 1) && HasAVX512Save;
2185 Features[
"avx512vpopcntdq"] = HasLeaf7 && ((
ECX >> 14) & 1) && HasAVX512Save;
2186 Features[
"rdpid"] = HasLeaf7 && ((
ECX >> 22) & 1);
2187 Features[
"kl"] = HasLeaf7 && ((
ECX >> 23) & 1);
2188 Features[
"cldemote"] = HasLeaf7 && ((
ECX >> 25) & 1);
2189 Features[
"movdiri"] = HasLeaf7 && ((
ECX >> 27) & 1);
2190 Features[
"movdir64b"] = HasLeaf7 && ((
ECX >> 28) & 1);
2191 Features[
"enqcmd"] = HasLeaf7 && ((
ECX >> 29) & 1);
2193 Features[
"uintr"] = HasLeaf7 && ((
EDX >> 5) & 1);
2194 Features[
"avx512vp2intersect"] =
2195 HasLeaf7 && ((
EDX >> 8) & 1) && HasAVX512Save;
2196 Features[
"serialize"] = HasLeaf7 && ((
EDX >> 14) & 1);
2197 Features[
"tsxldtrk"] = HasLeaf7 && ((
EDX >> 16) & 1);
2208 Features[
"pconfig"] = HasLeaf7 && ((
EDX >> 18) & 1);
2209 Features[
"amx-bf16"] = HasLeaf7 && ((
EDX >> 22) & 1) && HasAMXSave;
2210 Features[
"avx512fp16"] = HasLeaf7 && ((
EDX >> 23) & 1) && HasAVX512Save;
2211 Features[
"amx-tile"] = HasLeaf7 && ((
EDX >> 24) & 1) && HasAMXSave;
2212 Features[
"amx-int8"] = HasLeaf7 && ((
EDX >> 25) & 1) && HasAMXSave;
2215 bool HasLeaf7Subleaf1 =
2216 HasLeaf7 &&
EAX >= 1 &&
2217 !getX86CpuIDAndInfoEx(0x7, 0x1, &EAX, &EBX, &ECX, &EDX);
2218 Features[
"sha512"] = HasLeaf7Subleaf1 && ((
EAX >> 0) & 1);
2219 Features[
"sm3"] = HasLeaf7Subleaf1 && ((
EAX >> 1) & 1);
2220 Features[
"sm4"] = HasLeaf7Subleaf1 && ((
EAX >> 2) & 1);
2221 Features[
"raoint"] = HasLeaf7Subleaf1 && ((
EAX >> 3) & 1);
2222 Features[
"avxvnni"] = HasLeaf7Subleaf1 && ((
EAX >> 4) & 1) && HasAVXSave;
2223 Features[
"avx512bf16"] = HasLeaf7Subleaf1 && ((
EAX >> 5) & 1) && HasAVX512Save;
2224 Features[
"amx-fp16"] = HasLeaf7Subleaf1 && ((
EAX >> 21) & 1) && HasAMXSave;
2225 Features[
"cmpccxadd"] = HasLeaf7Subleaf1 && ((
EAX >> 7) & 1);
2226 Features[
"hreset"] = HasLeaf7Subleaf1 && ((
EAX >> 22) & 1);
2227 Features[
"avxifma"] = HasLeaf7Subleaf1 && ((
EAX >> 23) & 1) && HasAVXSave;
2228 Features[
"movrs"] = HasLeaf7Subleaf1 && ((
EAX >> 31) & 1);
2229 Features[
"avxvnniint8"] = HasLeaf7Subleaf1 && ((
EDX >> 4) & 1) && HasAVXSave;
2230 Features[
"avxneconvert"] = HasLeaf7Subleaf1 && ((
EDX >> 5) & 1) && HasAVXSave;
2231 Features[
"amx-complex"] = HasLeaf7Subleaf1 && ((
EDX >> 8) & 1) && HasAMXSave;
2232 Features[
"avxvnniint16"] = HasLeaf7Subleaf1 && ((
EDX >> 10) & 1) && HasAVXSave;
2233 Features[
"prefetchi"] |= HasLeaf7Subleaf1 && ((
EDX >> 14) & 1);
2234 Features[
"usermsr"] = HasLeaf7Subleaf1 && ((
EDX >> 15) & 1);
2235 bool HasAVX10 = HasLeaf7Subleaf1 && ((
EDX >> 19) & 1);
2236 bool HasAPXF = HasLeaf7Subleaf1 && ((
EDX >> 21) & 1) && HasAPXSave;
2237 Features[
"egpr"] = HasAPXF;
2240 Features[
"push2pop2"] = HasAPXF;
2241 Features[
"ppx"] = HasAPXF;
2242 Features[
"ndd"] = HasAPXF;
2243 Features[
"ccmp"] = HasAPXF;
2244 Features[
"nf"] = HasAPXF;
2245 Features[
"cf"] = HasAPXF;
2246 Features[
"zu"] = HasAPXF;
2247 Features[
"jmpabs"] = HasAPXF;
2249 bool HasLeafD = MaxLevel >= 0xd &&
2250 !getX86CpuIDAndInfoEx(0xd, 0x1, &EAX, &EBX, &ECX, &EDX);
2253 Features[
"xsaveopt"] = HasLeafD && ((
EAX >> 0) & 1) && HasAVXSave;
2254 Features[
"xsavec"] = HasLeafD && ((
EAX >> 1) & 1) && HasAVXSave;
2255 Features[
"xsaves"] = HasLeafD && ((
EAX >> 3) & 1) && HasAVXSave;
2257 bool HasLeaf14 = MaxLevel >= 0x14 &&
2258 !getX86CpuIDAndInfoEx(0x14, 0x0, &EAX, &EBX, &ECX, &EDX);
2260 Features[
"ptwrite"] = HasLeaf14 && ((
EBX >> 4) & 1);
2263 MaxLevel >= 0x19 && !getX86CpuIDAndInfo(0x19, &EAX, &EBX, &ECX, &EDX);
2264 Features[
"widekl"] = HasLeaf7 && HasLeaf19 && ((
EBX >> 2) & 1);
2266 bool HasLeaf1E = MaxLevel >= 0x1e &&
2267 !getX86CpuIDAndInfoEx(0x1e, 0x1, &EAX, &EBX, &ECX, &EDX);
2268 Features[
"amx-fp8"] = HasLeaf1E && ((
EAX >> 4) & 1) && HasAMXSave;
2269 Features[
"amx-avx512"] = HasLeaf1E && ((
EAX >> 7) & 1) && HasAMXSave;
2270 Features[
"amx-movrs"] = HasLeaf1E && ((
EAX >> 8) & 1) && HasAMXSave;
2272 bool HasLeaf24 = MaxLevel >= 0x24 &&
2273 !getX86CpuIDAndInfoEx(0x24, 0x0, &EAX, &EBX, &ECX, &EDX);
2275 int AVX10Ver = HasLeaf24 ? (
EBX & 0xff) : 0;
2276 Features[
"avx10.1"] = HasAVX10 && AVX10Ver >= 1;
2277 Features[
"avx10.2"] = HasAVX10 && AVX10Ver >= 2;
2281#elif defined(__linux__) && (defined(__arm__) || defined(__aarch64__))
2289 P->getBuffer().split(Lines,
'\n');
2294 for (
unsigned I = 0,
E =
Lines.size();
I !=
E; ++
I)
2296 Lines[
I].split(CPUFeatures,
' ');
2300#if defined(__aarch64__)
2303 enum { CAP_AES = 0x1, CAP_PMULL = 0x2, CAP_SHA1 = 0x4, CAP_SHA2 = 0x8 };
2309#if defined(__aarch64__)
2310 .
Case(
"asimd",
"neon")
2311 .
Case(
"fp",
"fp-armv8")
2312 .
Case(
"crc32",
"crc")
2313 .
Case(
"atomics",
"lse")
2314 .
Case(
"rng",
"rand")
2315 .
Case(
"sha3",
"sha3")
2318 .
Case(
"sve2",
"sve2")
2319 .
Case(
"sveaes",
"sve-aes")
2320 .
Case(
"svesha3",
"sve-sha3")
2321 .
Case(
"svesm4",
"sve-sm4")
2323 .
Case(
"half",
"fp16")
2324 .
Case(
"neon",
"neon")
2325 .
Case(
"vfpv3",
"vfp3")
2326 .
Case(
"vfpv3d16",
"vfp3d16")
2327 .
Case(
"vfpv4",
"vfp4")
2328 .
Case(
"idiva",
"hwdiv-arm")
2329 .
Case(
"idivt",
"hwdiv")
2333#if defined(__aarch64__)
2336 if (CPUFeatures[
I] ==
"aes")
2338 else if (CPUFeatures[
I] ==
"pmull")
2339 crypto |= CAP_PMULL;
2340 else if (CPUFeatures[
I] ==
"sha1")
2342 else if (CPUFeatures[
I] ==
"sha2")
2346 if (LLVMFeatureStr !=
"")
2347 Features[LLVMFeatureStr] =
true;
2350#if defined(__aarch64__)
2354 uint32_t Aes = CAP_AES | CAP_PMULL;
2355 uint32_t Sha2 = CAP_SHA1 | CAP_SHA2;
2356 Features[
"aes"] = (crypto & Aes) == Aes;
2357 Features[
"sha2"] = (crypto & Sha2) == Sha2;
2363 Features[
"sve"] =
false;
2367 Features[
"rand"] =
false;
2372#elif defined(_WIN32) && (defined(__aarch64__) || defined(_M_ARM64) || \
2373 defined(__arm64ec__) || defined(_M_ARM64EC))
2374#ifndef PF_ARM_V82_DP_INSTRUCTIONS_AVAILABLE
2375#define PF_ARM_V82_DP_INSTRUCTIONS_AVAILABLE 43
2377#ifndef PF_ARM_V83_JSCVT_INSTRUCTIONS_AVAILABLE
2378#define PF_ARM_V83_JSCVT_INSTRUCTIONS_AVAILABLE 44
2380#ifndef PF_ARM_V83_LRCPC_INSTRUCTIONS_AVAILABLE
2381#define PF_ARM_V83_LRCPC_INSTRUCTIONS_AVAILABLE 45
2383#ifndef PF_ARM_SVE_INSTRUCTIONS_AVAILABLE
2384#define PF_ARM_SVE_INSTRUCTIONS_AVAILABLE 46
2386#ifndef PF_ARM_SVE2_INSTRUCTIONS_AVAILABLE
2387#define PF_ARM_SVE2_INSTRUCTIONS_AVAILABLE 47
2389#ifndef PF_ARM_SVE2_1_INSTRUCTIONS_AVAILABLE
2390#define PF_ARM_SVE2_1_INSTRUCTIONS_AVAILABLE 48
2392#ifndef PF_ARM_SVE_PMULL128_INSTRUCTIONS_AVAILABLE
2393#define PF_ARM_SVE_PMULL128_INSTRUCTIONS_AVAILABLE 50
2395#ifndef PF_ARM_SVE_BITPERM_INSTRUCTIONS_AVAILABLE
2396#define PF_ARM_SVE_BITPERM_INSTRUCTIONS_AVAILABLE 51
2398#ifndef PF_ARM_SVE_SHA3_INSTRUCTIONS_AVAILABLE
2399#define PF_ARM_SVE_SHA3_INSTRUCTIONS_AVAILABLE 55
2401#ifndef PF_ARM_SVE_SM4_INSTRUCTIONS_AVAILABLE
2402#define PF_ARM_SVE_SM4_INSTRUCTIONS_AVAILABLE 56
2404#ifndef PF_ARM_SVE_F32MM_INSTRUCTIONS_AVAILABLE
2405#define PF_ARM_SVE_F32MM_INSTRUCTIONS_AVAILABLE 58
2407#ifndef PF_ARM_SVE_F64MM_INSTRUCTIONS_AVAILABLE
2408#define PF_ARM_SVE_F64MM_INSTRUCTIONS_AVAILABLE 59
2410#ifndef PF_ARM_V82_I8MM_INSTRUCTIONS_AVAILABLE
2411#define PF_ARM_V82_I8MM_INSTRUCTIONS_AVAILABLE 66
2413#ifndef PF_ARM_V82_FP16_INSTRUCTIONS_AVAILABLE
2414#define PF_ARM_V82_FP16_INSTRUCTIONS_AVAILABLE 67
2416#ifndef PF_ARM_V86_BF16_INSTRUCTIONS_AVAILABLE
2417#define PF_ARM_V86_BF16_INSTRUCTIONS_AVAILABLE 68
2419#ifndef PF_ARM_SME_INSTRUCTIONS_AVAILABLE
2420#define PF_ARM_SME_INSTRUCTIONS_AVAILABLE 70
2422#ifndef PF_ARM_SME2_INSTRUCTIONS_AVAILABLE
2423#define PF_ARM_SME2_INSTRUCTIONS_AVAILABLE 71
2425#ifndef PF_ARM_SME_F64F64_INSTRUCTIONS_AVAILABLE
2426#define PF_ARM_SME_F64F64_INSTRUCTIONS_AVAILABLE 85
2428#ifndef PF_ARM_SME_I16I64_INSTRUCTIONS_AVAILABLE
2429#define PF_ARM_SME_I16I64_INSTRUCTIONS_AVAILABLE 86
2437 IsProcessorFeaturePresent(PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE);
2439 IsProcessorFeaturePresent(PF_ARM_V81_ATOMIC_INSTRUCTIONS_AVAILABLE);
2440 Features[
"dotprod"] =
2441 IsProcessorFeaturePresent(PF_ARM_V82_DP_INSTRUCTIONS_AVAILABLE);
2442 Features[
"jsconv"] =
2443 IsProcessorFeaturePresent(PF_ARM_V83_JSCVT_INSTRUCTIONS_AVAILABLE);
2445 IsProcessorFeaturePresent(PF_ARM_V83_LRCPC_INSTRUCTIONS_AVAILABLE);
2447 IsProcessorFeaturePresent(PF_ARM_SVE_INSTRUCTIONS_AVAILABLE);
2449 IsProcessorFeaturePresent(PF_ARM_SVE2_INSTRUCTIONS_AVAILABLE);
2450 Features[
"sve2p1"] =
2451 IsProcessorFeaturePresent(PF_ARM_SVE2_1_INSTRUCTIONS_AVAILABLE);
2452 Features[
"sve-aes"] =
2453 IsProcessorFeaturePresent(PF_ARM_SVE_PMULL128_INSTRUCTIONS_AVAILABLE);
2454 Features[
"sve-bitperm"] =
2455 IsProcessorFeaturePresent(PF_ARM_SVE_BITPERM_INSTRUCTIONS_AVAILABLE);
2456 Features[
"sve-sha3"] =
2457 IsProcessorFeaturePresent(PF_ARM_SVE_SHA3_INSTRUCTIONS_AVAILABLE);
2458 Features[
"sve-sm4"] =
2459 IsProcessorFeaturePresent(PF_ARM_SVE_SM4_INSTRUCTIONS_AVAILABLE);
2461 IsProcessorFeaturePresent(PF_ARM_SVE_F32MM_INSTRUCTIONS_AVAILABLE);
2463 IsProcessorFeaturePresent(PF_ARM_SVE_F64MM_INSTRUCTIONS_AVAILABLE);
2465 IsProcessorFeaturePresent(PF_ARM_V82_I8MM_INSTRUCTIONS_AVAILABLE);
2466 Features[
"fullfp16"] =
2467 IsProcessorFeaturePresent(PF_ARM_V82_FP16_INSTRUCTIONS_AVAILABLE);
2469 IsProcessorFeaturePresent(PF_ARM_V86_BF16_INSTRUCTIONS_AVAILABLE);
2471 IsProcessorFeaturePresent(PF_ARM_SME_INSTRUCTIONS_AVAILABLE);
2473 IsProcessorFeaturePresent(PF_ARM_SME2_INSTRUCTIONS_AVAILABLE);
2474 Features[
"sme-i16i64"] =
2475 IsProcessorFeaturePresent(PF_ARM_SME_I16I64_INSTRUCTIONS_AVAILABLE);
2476 Features[
"sme-f64f64"] =
2477 IsProcessorFeaturePresent(PF_ARM_SME_F64F64_INSTRUCTIONS_AVAILABLE);
2481 IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE);
2482 Features[
"aes"] = TradCrypto;
2483 Features[
"sha2"] = TradCrypto;
2487#elif defined(__linux__) && defined(__loongarch__)
2488#include <sys/auxv.h>
2490 unsigned long hwcap = getauxval(AT_HWCAP);
2491 bool HasFPU = hwcap & (1UL << 3);
2492 uint32_t cpucfg2 = 0x2, cpucfg3 = 0x3;
2493 __asm__(
"cpucfg %[cpucfg2], %[cpucfg2]\n\t" : [cpucfg2]
"+r"(cpucfg2));
2494 __asm__(
"cpucfg %[cpucfg3], %[cpucfg3]\n\t" : [cpucfg3]
"+r"(cpucfg3));
2498 Features[
"f"] = HasFPU && (cpucfg2 & (1U << 1));
2499 Features[
"d"] = HasFPU && (cpucfg2 & (1U << 2));
2501 Features[
"lsx"] = hwcap & (1UL << 4);
2502 Features[
"lasx"] = hwcap & (1UL << 5);
2503 Features[
"lvz"] = hwcap & (1UL << 9);
2505 Features[
"frecipe"] = cpucfg2 & (1U << 25);
2506 Features[
"div32"] = cpucfg2 & (1U << 26);
2507 Features[
"lam-bh"] = cpucfg2 & (1U << 27);
2508 Features[
"lamcas"] = cpucfg2 & (1U << 28);
2509 Features[
"scq"] = cpucfg2 & (1U << 30);
2511 Features[
"ld-seq-sa"] = cpucfg3 & (1U << 23);
2517#elif defined(__linux__) && defined(__riscv)
2519 RISCVHwProbe Query[]{{3, 0},
2523 int Ret = syscall(258, Query,
2524 std::size(Query), 0,
2530 uint64_t BaseMask = Query[0].Value;
2533 Features[
"i"] =
true;
2534 Features[
"m"] =
true;
2535 Features[
"a"] =
true;
2539 Features[
"f"] = ExtMask & (1 << 0);
2540 Features[
"d"] = ExtMask & (1 << 0);
2541 Features[
"c"] = ExtMask & (1 << 1);
2542 Features[
"v"] = ExtMask & (1 << 2);
2543 Features[
"zba"] = ExtMask & (1 << 3);
2544 Features[
"zbb"] = ExtMask & (1 << 4);
2545 Features[
"zbs"] = ExtMask & (1 << 5);
2546 Features[
"zicboz"] = ExtMask & (1 << 6);
2547 Features[
"zbc"] = ExtMask & (1 << 7);
2548 Features[
"zbkb"] = ExtMask & (1 << 8);
2549 Features[
"zbkc"] = ExtMask & (1 << 9);
2550 Features[
"zbkx"] = ExtMask & (1 << 10);
2551 Features[
"zknd"] = ExtMask & (1 << 11);
2552 Features[
"zkne"] = ExtMask & (1 << 12);
2553 Features[
"zknh"] = ExtMask & (1 << 13);
2554 Features[
"zksed"] = ExtMask & (1 << 14);
2555 Features[
"zksh"] = ExtMask & (1 << 15);
2556 Features[
"zkt"] = ExtMask & (1 << 16);
2557 Features[
"zvbb"] = ExtMask & (1 << 17);
2558 Features[
"zvbc"] = ExtMask & (1 << 18);
2559 Features[
"zvkb"] = ExtMask & (1 << 19);
2560 Features[
"zvkg"] = ExtMask & (1 << 20);
2561 Features[
"zvkned"] = ExtMask & (1 << 21);
2562 Features[
"zvknha"] = ExtMask & (1 << 22);
2563 Features[
"zvknhb"] = ExtMask & (1 << 23);
2564 Features[
"zvksed"] = ExtMask & (1 << 24);
2565 Features[
"zvksh"] = ExtMask & (1 << 25);
2566 Features[
"zvkt"] = ExtMask & (1 << 26);
2567 Features[
"zfh"] = ExtMask & (1 << 27);
2568 Features[
"zfhmin"] = ExtMask & (1 << 28);
2569 Features[
"zihintntl"] = ExtMask & (1 << 29);
2570 Features[
"zvfh"] = ExtMask & (1 << 30);
2571 Features[
"zvfhmin"] = ExtMask & (1ULL << 31);
2572 Features[
"zfa"] = ExtMask & (1ULL << 32);
2573 Features[
"ztso"] = ExtMask & (1ULL << 33);
2574 Features[
"zacas"] = ExtMask & (1ULL << 34);
2575 Features[
"zicond"] = ExtMask & (1ULL << 35);
2576 Features[
"zihintpause"] =
2577 ExtMask & (1ULL << 36);
2578 Features[
"zve32x"] = ExtMask & (1ULL << 37);
2579 Features[
"zve32f"] = ExtMask & (1ULL << 38);
2580 Features[
"zve64x"] = ExtMask & (1ULL << 39);
2581 Features[
"zve64f"] = ExtMask & (1ULL << 40);
2582 Features[
"zve64d"] = ExtMask & (1ULL << 41);
2583 Features[
"zimop"] = ExtMask & (1ULL << 42);
2584 Features[
"zca"] = ExtMask & (1ULL << 43);
2585 Features[
"zcb"] = ExtMask & (1ULL << 44);
2586 Features[
"zcd"] = ExtMask & (1ULL << 45);
2587 Features[
"zcf"] = ExtMask & (1ULL << 46);
2588 Features[
"zcmop"] = ExtMask & (1ULL << 47);
2589 Features[
"zawrs"] = ExtMask & (1ULL << 48);
2590 Features[
"supm"] = ExtMask & (1ULL << 49);
2591 Features[
"zicntr"] = ExtMask & (1ULL << 50);
2592 Features[
"zihpm"] = ExtMask & (1ULL << 51);
2593 Features[
"zfbfmin"] = ExtMask & (1ULL << 52);
2594 Features[
"zvfbfmin"] = ExtMask & (1ULL << 53);
2595 Features[
"zvfbfwma"] = ExtMask & (1ULL << 54);
2596 Features[
"zicbom"] = ExtMask & (1ULL << 55);
2597 Features[
"zaamo"] = ExtMask & (1ULL << 56);
2598 Features[
"zalrsc"] = ExtMask & (1ULL << 57);
2599 Features[
"zabha"] = ExtMask & (1ULL << 58);
2600 Features[
"zalasr"] = ExtMask & (1ULL << 59);
2601 Features[
"zicbop"] = ExtMask & (1ULL << 60);
2602 Features[
"zilsd"] = ExtMask & (1ULL << 61);
2603 Features[
"zclsd"] = ExtMask & (1ULL << 62);
2605 uint64_t Ext1Mask = Query[3].Value;
2606 Features[
"zicfiss"] = Ext1Mask & (1ULL << 0);
2612 if (Query[2].
Key != -1 &&
2613 Query[2].
Value == 3)
2614 Features[
"unaligned-scalar-mem"] =
true;
2627 T.setArchName(
"arm");
2628#elif defined(__arm64e__)
2630 T.setArchName(
"arm64e");
2631#elif defined(__aarch64__)
2633 T.setArchName(
"arm64");
2634#elif defined(__x86_64h__)
2636 T.setArchName(
"x86_64h");
2637#elif defined(__x86_64__)
2639 T.setArchName(
"x86_64");
2640#elif defined(__i386__)
2642 T.setArchName(
"i386");
2643#elif defined(__powerpc__)
2645 T.setArchName(
"powerpc");
2647# error "Unimplemented host arch fixup"
2654 std::string TargetTripleString = updateTripleOSVersion(LLVM_HOST_TRIPLE);
2660 PT = withHostArch(PT);
2672#if LLVM_VERSION_PRINTER_SHOW_HOST_TARGET_INFO
2674 if (CPU ==
"generic")
2677 <<
" Host CPU: " << CPU <<
'\n';
This file defines the StringMap class.
This file implements methods to test, set and extract typed bits from packed unsigned integers.
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
StringRef getHostCPUNameForARMFromComponents(StringRef Implementer, StringRef Hardware, StringRef Part, ArrayRef< StringRef > Parts, function_ref< unsigned()> GetVariant)
static std::unique_ptr< llvm::MemoryBuffer > getProcCpuinfoContent()
This file defines the SmallVector class.
This file implements the StringSwitch template, which mimics a switch() statement whose cases are str...
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
Represents either an error or a value T.
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFileAsStream(const Twine &Filename)
Read all of the specified file into a MemoryBuffer as a stream (i.e.
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
iterator erase(const_iterator CI)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
bool contains(StringRef Key) const
contains - Return true if the element is in the map, false otherwise.
Represent a constant reference to a string, i.e.
std::pair< StringRef, StringRef > split(char Separator) const
Split into two substrings around the first occurrence of a separator character.
static constexpr size_t npos
bool getAsInteger(unsigned Radix, T &Result) const
Parse the current string as an integer of the specified radix.
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
const char * const_iterator
StringRef ltrim(char Char) const
Return string with consecutive Char characters starting from the the left removed.
bool ends_with(StringRef Suffix) const
Check if this string ends with the given Suffix.
A switch()-like statement whose cases are string literals.
StringSwitch & Case(StringLiteral S, T Value)
StringSwitch & StartsWith(StringLiteral S, T Value)
Triple - Helper class for working with autoconf configuration names.
LLVM_ABI llvm::Triple get32BitArchVariant() const
Form a triple with a 32-bit variant of the current architecture.
LLVM_ABI llvm::Triple get64BitArchVariant() const
Form a triple with a 64-bit variant of the current architecture.
static LLVM_ABI std::string normalize(StringRef Str, CanonicalForm Form=CanonicalForm::ANY)
Turn an arbitrary machine specification into the canonical triple form (or something sensible that th...
const std::string & str() const
LLVM_ABI bool isArch64Bit() const
Test whether the architecture is 64-bit.
LLVM_ABI bool isArch32Bit() const
Test whether the architecture is 32-bit.
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM Value Representation.
An efficient, type-erasing, non-owning reference to a callable.
This class implements an extremely fast bulk output stream that can only output to a stream.
@ CPU_SUBTYPE_POWERPC_970
@ CPU_SUBTYPE_POWERPC_604e
@ CPU_SUBTYPE_POWERPC_603e
@ CPU_SUBTYPE_POWERPC_7400
@ CPU_SUBTYPE_POWERPC_604
@ CPU_SUBTYPE_POWERPC_750
@ CPU_SUBTYPE_POWERPC_601
@ CPU_SUBTYPE_POWERPC_620
@ CPU_SUBTYPE_POWERPC_603ev
@ CPU_SUBTYPE_POWERPC_603
@ CPU_SUBTYPE_POWERPC_7450
@ CPU_SUBTYPE_POWERPC_602
LLVM_ABI StringRef getCPUNameFromCPUModel(const CPUModel &Model)
Helper functions to extract CPU details from CPUID on x86.
LLVM_ABI VendorSignatures getVendorSignature(unsigned *MaxLeaf=nullptr)
Returns the host CPU's vendor.
LLVM_ABI StringRef getHostCPUNameForSPARC(StringRef ProcCpuinfoContent)
LLVM_ABI StringRef getHostCPUNameForS390x(StringRef ProcCpuinfoContent)
LLVM_ABI StringRef getHostCPUNameForPowerPC(StringRef ProcCpuinfoContent)
Helper functions to extract HostCPUName from /proc/cpuinfo on linux.
LLVM_ABI StringRef getHostCPUNameForBPF()
LLVM_ABI StringRef getHostCPUNameForARM(StringRef ProcCpuinfoContent)
LLVM_ABI StringRef getHostCPUNameForRISCV(StringRef ProcCpuinfoContent)
LLVM_ABI StringMap< bool, MallocAllocator > getHostCPUFeatures()
getHostCPUFeatures - Get the LLVM names for the host CPU features.
LLVM_ABI StringRef getHostCPUName()
getHostCPUName - Get the LLVM name for the host CPU.
LLVM_ABI void printDefaultTargetAndDetectedCPU(raw_ostream &OS)
This is a function compatible with cl::AddExtraVersionPrinter, which adds info about the current targ...
LLVM_ABI std::string getDefaultTargetTriple()
getDefaultTargetTriple() - Return the default target triple the compiler has been configured to produ...
LLVM_ABI std::string getProcessTriple()
getProcessTriple() - Return an appropriate target triple for generating code to be loaded into the cu...
This is an optimization pass for GlobalISel generic memory operations.
RelativeUniformCounterPtr Values
std::string utohexstr(uint64_t X, bool LowerCase=false, unsigned Width=0)
int64_t decodePackedBCD(const uint8_t *Ptr, size_t ByteLen, bool IsSigned=true)
auto unique(Range &&R, Predicate P)
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
void sort(IteratorTy Start, IteratorTy End)
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Describes an element of a Bitfield.
static Bitfield::Type get(StorageType Packed)
Unpacks the field from the Packed value.