• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- Host.cpp - Implement OS Host Concept --------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 //  This file implements the operating system Host concept.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "llvm/Support/Host.h"
14 #include "llvm/Support/TargetParser.h"
15 #include "llvm/ADT/SmallSet.h"
16 #include "llvm/ADT/SmallVector.h"
17 #include "llvm/ADT/StringRef.h"
18 #include "llvm/ADT/StringSwitch.h"
19 #include "llvm/ADT/Triple.h"
20 #include "llvm/Config/llvm-config.h"
21 #include "llvm/Support/Debug.h"
22 #include "llvm/Support/FileSystem.h"
23 #include "llvm/Support/MemoryBuffer.h"
24 #include "llvm/Support/raw_ostream.h"
25 #include <assert.h>
26 #include <string.h>
27 
28 // Include the platform-specific parts of this class.
29 #ifdef LLVM_ON_UNIX
30 #include "Unix/Host.inc"
31 #endif
32 #ifdef _WIN32
33 #include "Windows/Host.inc"
34 #endif
35 #ifdef _MSC_VER
36 #include <intrin.h>
37 #endif
38 #if defined(__APPLE__) && (!defined(__x86_64__))
39 #include <mach/host_info.h>
40 #include <mach/mach.h>
41 #include <mach/mach_host.h>
42 #include <mach/machine.h>
43 #endif
44 
45 #define DEBUG_TYPE "host-detection"
46 
47 //===----------------------------------------------------------------------===//
48 //
49 //  Implementations of the CPU detection routines
50 //
51 //===----------------------------------------------------------------------===//
52 
53 using namespace llvm;
54 
55 static std::unique_ptr<llvm::MemoryBuffer>
getProcCpuinfoContent()56     LLVM_ATTRIBUTE_UNUSED getProcCpuinfoContent() {
57   llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Text =
58       llvm::MemoryBuffer::getFileAsStream("/proc/cpuinfo");
59   if (std::error_code EC = Text.getError()) {
60     llvm::errs() << "Can't read "
61                  << "/proc/cpuinfo: " << EC.message() << "\n";
62     return nullptr;
63   }
64   return std::move(*Text);
65 }
66 
getHostCPUNameForPowerPC(StringRef ProcCpuinfoContent)67 StringRef sys::detail::getHostCPUNameForPowerPC(StringRef ProcCpuinfoContent) {
68   // Access to the Processor Version Register (PVR) on PowerPC is privileged,
69   // and so we must use an operating-system interface to determine the current
70   // processor type. On Linux, this is exposed through the /proc/cpuinfo file.
71   const char *generic = "generic";
72 
73   // The cpu line is second (after the 'processor: 0' line), so if this
74   // buffer is too small then something has changed (or is wrong).
75   StringRef::const_iterator CPUInfoStart = ProcCpuinfoContent.begin();
76   StringRef::const_iterator CPUInfoEnd = ProcCpuinfoContent.end();
77 
78   StringRef::const_iterator CIP = CPUInfoStart;
79 
80   StringRef::const_iterator CPUStart = 0;
81   size_t CPULen = 0;
82 
83   // We need to find the first line which starts with cpu, spaces, and a colon.
84   // After the colon, there may be some additional spaces and then the cpu type.
85   while (CIP < CPUInfoEnd && CPUStart == 0) {
86     if (CIP < CPUInfoEnd && *CIP == '\n')
87       ++CIP;
88 
89     if (CIP < CPUInfoEnd && *CIP == 'c') {
90       ++CIP;
91       if (CIP < CPUInfoEnd && *CIP == 'p') {
92         ++CIP;
93         if (CIP < CPUInfoEnd && *CIP == 'u') {
94           ++CIP;
95           while (CIP < CPUInfoEnd && (*CIP == ' ' || *CIP == '\t'))
96             ++CIP;
97 
98           if (CIP < CPUInfoEnd && *CIP == ':') {
99             ++CIP;
100             while (CIP < CPUInfoEnd && (*CIP == ' ' || *CIP == '\t'))
101               ++CIP;
102 
103             if (CIP < CPUInfoEnd) {
104               CPUStart = CIP;
105               while (CIP < CPUInfoEnd && (*CIP != ' ' && *CIP != '\t' &&
106                                           *CIP != ',' && *CIP != '\n'))
107                 ++CIP;
108               CPULen = CIP - CPUStart;
109             }
110           }
111         }
112       }
113     }
114 
115     if (CPUStart == 0)
116       while (CIP < CPUInfoEnd && *CIP != '\n')
117         ++CIP;
118   }
119 
120   if (CPUStart == 0)
121     return generic;
122 
123   return StringSwitch<const char *>(StringRef(CPUStart, CPULen))
124       .Case("604e", "604e")
125       .Case("604", "604")
126       .Case("7400", "7400")
127       .Case("7410", "7400")
128       .Case("7447", "7400")
129       .Case("7455", "7450")
130       .Case("G4", "g4")
131       .Case("POWER4", "970")
132       .Case("PPC970FX", "970")
133       .Case("PPC970MP", "970")
134       .Case("G5", "g5")
135       .Case("POWER5", "g5")
136       .Case("A2", "a2")
137       .Case("POWER6", "pwr6")
138       .Case("POWER7", "pwr7")
139       .Case("POWER8", "pwr8")
140       .Case("POWER8E", "pwr8")
141       .Case("POWER8NVL", "pwr8")
142       .Case("POWER9", "pwr9")
143       // FIXME: If we get a simulator or machine with the capabilities of
144       // mcpu=future, we should revisit this and add the name reported by the
145       // simulator/machine.
146       .Default(generic);
147 }
148 
getHostCPUNameForARM(StringRef ProcCpuinfoContent)149 StringRef sys::detail::getHostCPUNameForARM(StringRef ProcCpuinfoContent) {
150   // The cpuid register on arm is not accessible from user space. On Linux,
151   // it is exposed through the /proc/cpuinfo file.
152 
153   // Read 32 lines from /proc/cpuinfo, which should contain the CPU part line
154   // in all cases.
155   SmallVector<StringRef, 32> Lines;
156   ProcCpuinfoContent.split(Lines, "\n");
157 
158   // Look for the CPU implementer line.
159   StringRef Implementer;
160   StringRef Hardware;
161   for (unsigned I = 0, E = Lines.size(); I != E; ++I) {
162     if (Lines[I].startswith("CPU implementer"))
163       Implementer = Lines[I].substr(15).ltrim("\t :");
164     if (Lines[I].startswith("Hardware"))
165       Hardware = Lines[I].substr(8).ltrim("\t :");
166   }
167 
168   if (Implementer == "0x41") { // ARM Ltd.
169     // MSM8992/8994 may give cpu part for the core that the kernel is running on,
170     // which is undeterministic and wrong. Always return cortex-a53 for these SoC.
171     if (Hardware.endswith("MSM8994") || Hardware.endswith("MSM8996"))
172       return "cortex-a53";
173 
174 
175     // Look for the CPU part line.
176     for (unsigned I = 0, E = Lines.size(); I != E; ++I)
177       if (Lines[I].startswith("CPU part"))
178         // The CPU part is a 3 digit hexadecimal number with a 0x prefix. The
179         // values correspond to the "Part number" in the CP15/c0 register. The
180         // contents are specified in the various processor manuals.
181         return StringSwitch<const char *>(Lines[I].substr(8).ltrim("\t :"))
182             .Case("0x926", "arm926ej-s")
183             .Case("0xb02", "mpcore")
184             .Case("0xb36", "arm1136j-s")
185             .Case("0xb56", "arm1156t2-s")
186             .Case("0xb76", "arm1176jz-s")
187             .Case("0xc08", "cortex-a8")
188             .Case("0xc09", "cortex-a9")
189             .Case("0xc0f", "cortex-a15")
190             .Case("0xc20", "cortex-m0")
191             .Case("0xc23", "cortex-m3")
192             .Case("0xc24", "cortex-m4")
193             .Case("0xd04", "cortex-a35")
194             .Case("0xd03", "cortex-a53")
195             .Case("0xd07", "cortex-a57")
196             .Case("0xd08", "cortex-a72")
197             .Case("0xd09", "cortex-a73")
198             .Case("0xd0a", "cortex-a75")
199             .Case("0xd0b", "cortex-a76")
200             .Default("generic");
201   }
202 
203   if (Implementer == "0x42" || Implementer == "0x43") { // Broadcom | Cavium.
204     for (unsigned I = 0, E = Lines.size(); I != E; ++I) {
205       if (Lines[I].startswith("CPU part")) {
206         return StringSwitch<const char *>(Lines[I].substr(8).ltrim("\t :"))
207           .Case("0x516", "thunderx2t99")
208           .Case("0x0516", "thunderx2t99")
209           .Case("0xaf", "thunderx2t99")
210           .Case("0x0af", "thunderx2t99")
211           .Case("0xa1", "thunderxt88")
212           .Case("0x0a1", "thunderxt88")
213           .Default("generic");
214       }
215     }
216   }
217 
218   if (Implementer == "0x48") // HiSilicon Technologies, Inc.
219     // Look for the CPU part line.
220     for (unsigned I = 0, E = Lines.size(); I != E; ++I)
221       if (Lines[I].startswith("CPU part"))
222         // The CPU part is a 3 digit hexadecimal number with a 0x prefix. The
223         // values correspond to the "Part number" in the CP15/c0 register. The
224         // contents are specified in the various processor manuals.
225         return StringSwitch<const char *>(Lines[I].substr(8).ltrim("\t :"))
226           .Case("0xd01", "tsv110")
227           .Default("generic");
228 
229   if (Implementer == "0x51") // Qualcomm Technologies, Inc.
230     // Look for the CPU part line.
231     for (unsigned I = 0, E = Lines.size(); I != E; ++I)
232       if (Lines[I].startswith("CPU part"))
233         // The CPU part is a 3 digit hexadecimal number with a 0x prefix. The
234         // values correspond to the "Part number" in the CP15/c0 register. The
235         // contents are specified in the various processor manuals.
236         return StringSwitch<const char *>(Lines[I].substr(8).ltrim("\t :"))
237             .Case("0x06f", "krait") // APQ8064
238             .Case("0x201", "kryo")
239             .Case("0x205", "kryo")
240             .Case("0x211", "kryo")
241             .Case("0x800", "cortex-a73")
242             .Case("0x801", "cortex-a73")
243             .Case("0x802", "cortex-a73")
244             .Case("0x803", "cortex-a73")
245             .Case("0x804", "cortex-a73")
246             .Case("0x805", "cortex-a73")
247             .Case("0xc00", "falkor")
248             .Case("0xc01", "saphira")
249             .Default("generic");
250 
251   if (Implementer == "0x53") { // Samsung Electronics Co., Ltd.
252     // The Exynos chips have a convoluted ID scheme that doesn't seem to follow
253     // any predictive pattern across variants and parts.
254     unsigned Variant = 0, Part = 0;
255 
256     // Look for the CPU variant line, whose value is a 1 digit hexadecimal
257     // number, corresponding to the Variant bits in the CP15/C0 register.
258     for (auto I : Lines)
259       if (I.consume_front("CPU variant"))
260         I.ltrim("\t :").getAsInteger(0, Variant);
261 
262     // Look for the CPU part line, whose value is a 3 digit hexadecimal
263     // number, corresponding to the PartNum bits in the CP15/C0 register.
264     for (auto I : Lines)
265       if (I.consume_front("CPU part"))
266         I.ltrim("\t :").getAsInteger(0, Part);
267 
268     unsigned Exynos = (Variant << 12) | Part;
269     switch (Exynos) {
270     default:
271       // Default by falling through to Exynos M3.
272       LLVM_FALLTHROUGH;
273     case 0x1002:
274       return "exynos-m3";
275     case 0x1003:
276       return "exynos-m4";
277     }
278   }
279 
280   return "generic";
281 }
282 
getHostCPUNameForS390x(StringRef ProcCpuinfoContent)283 StringRef sys::detail::getHostCPUNameForS390x(StringRef ProcCpuinfoContent) {
284   // STIDP is a privileged operation, so use /proc/cpuinfo instead.
285 
286   // The "processor 0:" line comes after a fair amount of other information,
287   // including a cache breakdown, but this should be plenty.
288   SmallVector<StringRef, 32> Lines;
289   ProcCpuinfoContent.split(Lines, "\n");
290 
291   // Look for the CPU features.
292   SmallVector<StringRef, 32> CPUFeatures;
293   for (unsigned I = 0, E = Lines.size(); I != E; ++I)
294     if (Lines[I].startswith("features")) {
295       size_t Pos = Lines[I].find(":");
296       if (Pos != StringRef::npos) {
297         Lines[I].drop_front(Pos + 1).split(CPUFeatures, ' ');
298         break;
299       }
300     }
301 
302   // We need to check for the presence of vector support independently of
303   // the machine type, since we may only use the vector register set when
304   // supported by the kernel (and hypervisor).
305   bool HaveVectorSupport = false;
306   for (unsigned I = 0, E = CPUFeatures.size(); I != E; ++I) {
307     if (CPUFeatures[I] == "vx")
308       HaveVectorSupport = true;
309   }
310 
311   // Now check the processor machine type.
312   for (unsigned I = 0, E = Lines.size(); I != E; ++I) {
313     if (Lines[I].startswith("processor ")) {
314       size_t Pos = Lines[I].find("machine = ");
315       if (Pos != StringRef::npos) {
316         Pos += sizeof("machine = ") - 1;
317         unsigned int Id;
318         if (!Lines[I].drop_front(Pos).getAsInteger(10, Id)) {
319           if (Id >= 8561 && HaveVectorSupport)
320             return "z15";
321           if (Id >= 3906 && HaveVectorSupport)
322             return "z14";
323           if (Id >= 2964 && HaveVectorSupport)
324             return "z13";
325           if (Id >= 2827)
326             return "zEC12";
327           if (Id >= 2817)
328             return "z196";
329         }
330       }
331       break;
332     }
333   }
334 
335   return "generic";
336 }
337 
getHostCPUNameForBPF()338 StringRef sys::detail::getHostCPUNameForBPF() {
339 #if !defined(__linux__) || !defined(__x86_64__)
340   return "generic";
341 #else
342   uint8_t v3_insns[40] __attribute__ ((aligned (8))) =
343       /* BPF_MOV64_IMM(BPF_REG_0, 0) */
344     { 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
345       /* BPF_MOV64_IMM(BPF_REG_2, 1) */
346       0xb7, 0x2, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0,
347       /* BPF_JMP32_REG(BPF_JLT, BPF_REG_0, BPF_REG_2, 1) */
348       0xae, 0x20, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0,
349       /* BPF_MOV64_IMM(BPF_REG_0, 1) */
350       0xb7, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0,
351       /* BPF_EXIT_INSN() */
352       0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
353 
354   uint8_t v2_insns[40] __attribute__ ((aligned (8))) =
355       /* BPF_MOV64_IMM(BPF_REG_0, 0) */
356     { 0xb7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
357       /* BPF_MOV64_IMM(BPF_REG_2, 1) */
358       0xb7, 0x2, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0,
359       /* BPF_JMP_REG(BPF_JLT, BPF_REG_0, BPF_REG_2, 1) */
360       0xad, 0x20, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0,
361       /* BPF_MOV64_IMM(BPF_REG_0, 1) */
362       0xb7, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0,
363       /* BPF_EXIT_INSN() */
364       0x95, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 };
365 
366   struct bpf_prog_load_attr {
367     uint32_t prog_type;
368     uint32_t insn_cnt;
369     uint64_t insns;
370     uint64_t license;
371     uint32_t log_level;
372     uint32_t log_size;
373     uint64_t log_buf;
374     uint32_t kern_version;
375     uint32_t prog_flags;
376   } attr = {};
377   attr.prog_type = 1; /* BPF_PROG_TYPE_SOCKET_FILTER */
378   attr.insn_cnt = 5;
379   attr.insns = (uint64_t)v3_insns;
380   attr.license = (uint64_t)"DUMMY";
381 
382   int fd = syscall(321 /* __NR_bpf */, 5 /* BPF_PROG_LOAD */, &attr,
383                    sizeof(attr));
384   if (fd >= 0) {
385     close(fd);
386     return "v3";
387   }
388 
389   /* Clear the whole attr in case its content changed by syscall. */
390   memset(&attr, 0, sizeof(attr));
391   attr.prog_type = 1; /* BPF_PROG_TYPE_SOCKET_FILTER */
392   attr.insn_cnt = 5;
393   attr.insns = (uint64_t)v2_insns;
394   attr.license = (uint64_t)"DUMMY";
395   fd = syscall(321 /* __NR_bpf */, 5 /* BPF_PROG_LOAD */, &attr, sizeof(attr));
396   if (fd >= 0) {
397     close(fd);
398     return "v2";
399   }
400   return "v1";
401 #endif
402 }
403 
404 #if defined(__i386__) || defined(_M_IX86) || \
405     defined(__x86_64__) || defined(_M_X64)
406 
407 enum VendorSignatures {
408   SIG_INTEL = 0x756e6547 /* Genu */,
409   SIG_AMD = 0x68747541 /* Auth */
410 };
411 
412 // The check below for i386 was copied from clang's cpuid.h (__get_cpuid_max).
413 // Check motivated by bug reports for OpenSSL crashing on CPUs without CPUID
414 // support. Consequently, for i386, the presence of CPUID is checked first
415 // via the corresponding eflags bit.
416 // Removal of cpuid.h header motivated by PR30384
417 // Header cpuid.h and method __get_cpuid_max are not used in llvm, clang, openmp
418 // or test-suite, but are used in external projects e.g. libstdcxx
isCpuIdSupported()419 static bool isCpuIdSupported() {
420 #if defined(__GNUC__) || defined(__clang__)
421 #if defined(__i386__)
422   int __cpuid_supported;
423   __asm__("  pushfl\n"
424           "  popl   %%eax\n"
425           "  movl   %%eax,%%ecx\n"
426           "  xorl   $0x00200000,%%eax\n"
427           "  pushl  %%eax\n"
428           "  popfl\n"
429           "  pushfl\n"
430           "  popl   %%eax\n"
431           "  movl   $0,%0\n"
432           "  cmpl   %%eax,%%ecx\n"
433           "  je     1f\n"
434           "  movl   $1,%0\n"
435           "1:"
436           : "=r"(__cpuid_supported)
437           :
438           : "eax", "ecx");
439   if (!__cpuid_supported)
440     return false;
441 #endif
442   return true;
443 #endif
444   return true;
445 }
446 
447 /// getX86CpuIDAndInfo - Execute the specified cpuid and return the 4 values in
448 /// the specified arguments.  If we can't run cpuid on the host, return true.
getX86CpuIDAndInfo(unsigned value,unsigned * rEAX,unsigned * rEBX,unsigned * rECX,unsigned * rEDX)449 static bool getX86CpuIDAndInfo(unsigned value, unsigned *rEAX, unsigned *rEBX,
450                                unsigned *rECX, unsigned *rEDX) {
451 #if defined(__GNUC__) || defined(__clang__)
452 #if defined(__x86_64__)
453   // gcc doesn't know cpuid would clobber ebx/rbx. Preserve it manually.
454   // FIXME: should we save this for Clang?
455   __asm__("movq\t%%rbx, %%rsi\n\t"
456           "cpuid\n\t"
457           "xchgq\t%%rbx, %%rsi\n\t"
458           : "=a"(*rEAX), "=S"(*rEBX), "=c"(*rECX), "=d"(*rEDX)
459           : "a"(value));
460   return false;
461 #elif defined(__i386__)
462   __asm__("movl\t%%ebx, %%esi\n\t"
463           "cpuid\n\t"
464           "xchgl\t%%ebx, %%esi\n\t"
465           : "=a"(*rEAX), "=S"(*rEBX), "=c"(*rECX), "=d"(*rEDX)
466           : "a"(value));
467   return false;
468 #else
469   return true;
470 #endif
471 #elif defined(_MSC_VER)
472   // The MSVC intrinsic is portable across x86 and x64.
473   int registers[4];
474   __cpuid(registers, value);
475   *rEAX = registers[0];
476   *rEBX = registers[1];
477   *rECX = registers[2];
478   *rEDX = registers[3];
479   return false;
480 #else
481   return true;
482 #endif
483 }
484 
485 /// getX86CpuIDAndInfoEx - Execute the specified cpuid with subleaf and return
486 /// the 4 values in the specified arguments.  If we can't run cpuid on the host,
487 /// return true.
getX86CpuIDAndInfoEx(unsigned value,unsigned subleaf,unsigned * rEAX,unsigned * rEBX,unsigned * rECX,unsigned * rEDX)488 static bool getX86CpuIDAndInfoEx(unsigned value, unsigned subleaf,
489                                  unsigned *rEAX, unsigned *rEBX, unsigned *rECX,
490                                  unsigned *rEDX) {
491 #if defined(__GNUC__) || defined(__clang__)
492 #if defined(__x86_64__)
493   // gcc doesn't know cpuid would clobber ebx/rbx. Preserve it manually.
494   // FIXME: should we save this for Clang?
495   __asm__("movq\t%%rbx, %%rsi\n\t"
496           "cpuid\n\t"
497           "xchgq\t%%rbx, %%rsi\n\t"
498           : "=a"(*rEAX), "=S"(*rEBX), "=c"(*rECX), "=d"(*rEDX)
499           : "a"(value), "c"(subleaf));
500   return false;
501 #elif defined(__i386__)
502   __asm__("movl\t%%ebx, %%esi\n\t"
503           "cpuid\n\t"
504           "xchgl\t%%ebx, %%esi\n\t"
505           : "=a"(*rEAX), "=S"(*rEBX), "=c"(*rECX), "=d"(*rEDX)
506           : "a"(value), "c"(subleaf));
507   return false;
508 #else
509   return true;
510 #endif
511 #elif defined(_MSC_VER)
512   int registers[4];
513   __cpuidex(registers, value, subleaf);
514   *rEAX = registers[0];
515   *rEBX = registers[1];
516   *rECX = registers[2];
517   *rEDX = registers[3];
518   return false;
519 #else
520   return true;
521 #endif
522 }
523 
524 // Read control register 0 (XCR0). Used to detect features such as AVX.
getX86XCR0(unsigned * rEAX,unsigned * rEDX)525 static bool getX86XCR0(unsigned *rEAX, unsigned *rEDX) {
526 #if defined(__GNUC__) || defined(__clang__)
527   // Check xgetbv; this uses a .byte sequence instead of the instruction
528   // directly because older assemblers do not include support for xgetbv and
529   // there is no easy way to conditionally compile based on the assembler used.
530   __asm__(".byte 0x0f, 0x01, 0xd0" : "=a"(*rEAX), "=d"(*rEDX) : "c"(0));
531   return false;
532 #elif defined(_MSC_FULL_VER) && defined(_XCR_XFEATURE_ENABLED_MASK)
533   unsigned long long Result = _xgetbv(_XCR_XFEATURE_ENABLED_MASK);
534   *rEAX = Result;
535   *rEDX = Result >> 32;
536   return false;
537 #else
538   return true;
539 #endif
540 }
541 
detectX86FamilyModel(unsigned EAX,unsigned * Family,unsigned * Model)542 static void detectX86FamilyModel(unsigned EAX, unsigned *Family,
543                                  unsigned *Model) {
544   *Family = (EAX >> 8) & 0xf; // Bits 8 - 11
545   *Model = (EAX >> 4) & 0xf;  // Bits 4 - 7
546   if (*Family == 6 || *Family == 0xf) {
547     if (*Family == 0xf)
548       // Examine extended family ID if family ID is F.
549       *Family += (EAX >> 20) & 0xff; // Bits 20 - 27
550     // Examine extended model ID if family ID is 6 or F.
551     *Model += ((EAX >> 16) & 0xf) << 4; // Bits 16 - 19
552   }
553 }
554 
555 static void
getIntelProcessorTypeAndSubtype(unsigned Family,unsigned Model,unsigned Brand_id,unsigned Features,unsigned Features2,unsigned Features3,unsigned * Type,unsigned * Subtype)556 getIntelProcessorTypeAndSubtype(unsigned Family, unsigned Model,
557                                 unsigned Brand_id, unsigned Features,
558                                 unsigned Features2, unsigned Features3,
559                                 unsigned *Type, unsigned *Subtype) {
560   if (Brand_id != 0)
561     return;
562   switch (Family) {
563   case 3:
564     *Type = X86::INTEL_i386;
565     break;
566   case 4:
567     *Type = X86::INTEL_i486;
568     break;
569   case 5:
570     if (Features & (1 << X86::FEATURE_MMX)) {
571       *Type = X86::INTEL_PENTIUM_MMX;
572       break;
573     }
574     *Type = X86::INTEL_PENTIUM;
575     break;
576   case 6:
577     switch (Model) {
578     case 0x01: // Pentium Pro processor
579       *Type = X86::INTEL_PENTIUM_PRO;
580       break;
581     case 0x03: // Intel Pentium II OverDrive processor, Pentium II processor,
582                // model 03
583     case 0x05: // Pentium II processor, model 05, Pentium II Xeon processor,
584                // model 05, and Intel Celeron processor, model 05
585     case 0x06: // Celeron processor, model 06
586       *Type = X86::INTEL_PENTIUM_II;
587       break;
588     case 0x07: // Pentium III processor, model 07, and Pentium III Xeon
589                // processor, model 07
590     case 0x08: // Pentium III processor, model 08, Pentium III Xeon processor,
591                // model 08, and Celeron processor, model 08
592     case 0x0a: // Pentium III Xeon processor, model 0Ah
593     case 0x0b: // Pentium III processor, model 0Bh
594       *Type = X86::INTEL_PENTIUM_III;
595       break;
596     case 0x09: // Intel Pentium M processor, Intel Celeron M processor model 09.
597     case 0x0d: // Intel Pentium M processor, Intel Celeron M processor, model
598                // 0Dh. All processors are manufactured using the 90 nm process.
599     case 0x15: // Intel EP80579 Integrated Processor and Intel EP80579
600                // Integrated Processor with Intel QuickAssist Technology
601       *Type = X86::INTEL_PENTIUM_M;
602       break;
603     case 0x0e: // Intel Core Duo processor, Intel Core Solo processor, model
604                // 0Eh. All processors are manufactured using the 65 nm process.
605       *Type = X86::INTEL_CORE_DUO;
606       break;   // yonah
607     case 0x0f: // Intel Core 2 Duo processor, Intel Core 2 Duo mobile
608                // processor, Intel Core 2 Quad processor, Intel Core 2 Quad
609                // mobile processor, Intel Core 2 Extreme processor, Intel
610                // Pentium Dual-Core processor, Intel Xeon processor, model
611                // 0Fh. All processors are manufactured using the 65 nm process.
612     case 0x16: // Intel Celeron processor model 16h. All processors are
613                // manufactured using the 65 nm process
614       *Type = X86::INTEL_CORE2; // "core2"
615       *Subtype = X86::INTEL_CORE2_65;
616       break;
617     case 0x17: // Intel Core 2 Extreme processor, Intel Xeon processor, model
618                // 17h. All processors are manufactured using the 45 nm process.
619                //
620                // 45nm: Penryn , Wolfdale, Yorkfield (XE)
621     case 0x1d: // Intel Xeon processor MP. All processors are manufactured using
622                // the 45 nm process.
623       *Type = X86::INTEL_CORE2; // "penryn"
624       *Subtype = X86::INTEL_CORE2_45;
625       break;
626     case 0x1a: // Intel Core i7 processor and Intel Xeon processor. All
627                // processors are manufactured using the 45 nm process.
628     case 0x1e: // Intel(R) Core(TM) i7 CPU         870  @ 2.93GHz.
629                // As found in a Summer 2010 model iMac.
630     case 0x1f:
631     case 0x2e:             // Nehalem EX
632       *Type = X86::INTEL_COREI7; // "nehalem"
633       *Subtype = X86::INTEL_COREI7_NEHALEM;
634       break;
635     case 0x25: // Intel Core i7, laptop version.
636     case 0x2c: // Intel Core i7 processor and Intel Xeon processor. All
637                // processors are manufactured using the 32 nm process.
638     case 0x2f: // Westmere EX
639       *Type = X86::INTEL_COREI7; // "westmere"
640       *Subtype = X86::INTEL_COREI7_WESTMERE;
641       break;
642     case 0x2a: // Intel Core i7 processor. All processors are manufactured
643                // using the 32 nm process.
644     case 0x2d:
645       *Type = X86::INTEL_COREI7; //"sandybridge"
646       *Subtype = X86::INTEL_COREI7_SANDYBRIDGE;
647       break;
648     case 0x3a:
649     case 0x3e:             // Ivy Bridge EP
650       *Type = X86::INTEL_COREI7; // "ivybridge"
651       *Subtype = X86::INTEL_COREI7_IVYBRIDGE;
652       break;
653 
654     // Haswell:
655     case 0x3c:
656     case 0x3f:
657     case 0x45:
658     case 0x46:
659       *Type = X86::INTEL_COREI7; // "haswell"
660       *Subtype = X86::INTEL_COREI7_HASWELL;
661       break;
662 
663     // Broadwell:
664     case 0x3d:
665     case 0x47:
666     case 0x4f:
667     case 0x56:
668       *Type = X86::INTEL_COREI7; // "broadwell"
669       *Subtype = X86::INTEL_COREI7_BROADWELL;
670       break;
671 
672     // Skylake:
673     case 0x4e:              // Skylake mobile
674     case 0x5e:              // Skylake desktop
675     case 0x8e:              // Kaby Lake mobile
676     case 0x9e:              // Kaby Lake desktop
677       *Type = X86::INTEL_COREI7; // "skylake"
678       *Subtype = X86::INTEL_COREI7_SKYLAKE;
679       break;
680 
681     // Skylake Xeon:
682     case 0x55:
683       *Type = X86::INTEL_COREI7;
684       if (Features2 & (1 << (X86::FEATURE_AVX512BF16 - 32)))
685         *Subtype = X86::INTEL_COREI7_COOPERLAKE; // "cooperlake"
686       else if (Features2 & (1 << (X86::FEATURE_AVX512VNNI - 32)))
687         *Subtype = X86::INTEL_COREI7_CASCADELAKE; // "cascadelake"
688       else
689         *Subtype = X86::INTEL_COREI7_SKYLAKE_AVX512; // "skylake-avx512"
690       break;
691 
692     // Cannonlake:
693     case 0x66:
694       *Type = X86::INTEL_COREI7;
695       *Subtype = X86::INTEL_COREI7_CANNONLAKE; // "cannonlake"
696       break;
697 
698     // Icelake:
699     case 0x7d:
700     case 0x7e:
701       *Type = X86::INTEL_COREI7;
702       *Subtype = X86::INTEL_COREI7_ICELAKE_CLIENT; // "icelake-client"
703       break;
704 
705     // Icelake Xeon:
706     case 0x6a:
707     case 0x6c:
708       *Type = X86::INTEL_COREI7;
709       *Subtype = X86::INTEL_COREI7_ICELAKE_SERVER; // "icelake-server"
710       break;
711 
712     case 0x1c: // Most 45 nm Intel Atom processors
713     case 0x26: // 45 nm Atom Lincroft
714     case 0x27: // 32 nm Atom Medfield
715     case 0x35: // 32 nm Atom Midview
716     case 0x36: // 32 nm Atom Midview
717       *Type = X86::INTEL_BONNELL;
718       break; // "bonnell"
719 
720     // Atom Silvermont codes from the Intel software optimization guide.
721     case 0x37:
722     case 0x4a:
723     case 0x4d:
724     case 0x5a:
725     case 0x5d:
726     case 0x4c: // really airmont
727       *Type = X86::INTEL_SILVERMONT;
728       break; // "silvermont"
729     // Goldmont:
730     case 0x5c: // Apollo Lake
731     case 0x5f: // Denverton
732       *Type = X86::INTEL_GOLDMONT;
733       break; // "goldmont"
734     case 0x7a:
735       *Type = X86::INTEL_GOLDMONT_PLUS;
736       break;
737     case 0x86:
738       *Type = X86::INTEL_TREMONT;
739       break;
740 
741     case 0x57:
742       *Type = X86::INTEL_KNL; // knl
743       break;
744 
745     case 0x85:
746       *Type = X86::INTEL_KNM; // knm
747       break;
748 
749     default: // Unknown family 6 CPU, try to guess.
750       // TODO detect tigerlake host
751       if (Features3 & (1 << (X86::FEATURE_AVX512VP2INTERSECT - 64))) {
752         *Type = X86::INTEL_COREI7;
753         *Subtype = X86::INTEL_COREI7_TIGERLAKE;
754         break;
755       }
756 
757       if (Features & (1 << X86::FEATURE_AVX512VBMI2)) {
758         *Type = X86::INTEL_COREI7;
759         *Subtype = X86::INTEL_COREI7_ICELAKE_CLIENT;
760         break;
761       }
762 
763       if (Features & (1 << X86::FEATURE_AVX512VBMI)) {
764         *Type = X86::INTEL_COREI7;
765         *Subtype = X86::INTEL_COREI7_CANNONLAKE;
766         break;
767       }
768 
769       if (Features2 & (1 << (X86::FEATURE_AVX512BF16 - 32))) {
770         *Type = X86::INTEL_COREI7;
771         *Subtype = X86::INTEL_COREI7_COOPERLAKE;
772         break;
773       }
774 
775       if (Features2 & (1 << (X86::FEATURE_AVX512VNNI - 32))) {
776         *Type = X86::INTEL_COREI7;
777         *Subtype = X86::INTEL_COREI7_CASCADELAKE;
778         break;
779       }
780 
781       if (Features & (1 << X86::FEATURE_AVX512VL)) {
782         *Type = X86::INTEL_COREI7;
783         *Subtype = X86::INTEL_COREI7_SKYLAKE_AVX512;
784         break;
785       }
786 
787       if (Features & (1 << X86::FEATURE_AVX512ER)) {
788         *Type = X86::INTEL_KNL; // knl
789         break;
790       }
791 
792       if (Features3 & (1 << (X86::FEATURE_CLFLUSHOPT - 64))) {
793         if (Features3 & (1 << (X86::FEATURE_SHA - 64))) {
794           *Type = X86::INTEL_GOLDMONT;
795         } else {
796           *Type = X86::INTEL_COREI7;
797           *Subtype = X86::INTEL_COREI7_SKYLAKE;
798         }
799         break;
800       }
801       if (Features3 & (1 << (X86::FEATURE_ADX - 64))) {
802         *Type = X86::INTEL_COREI7;
803         *Subtype = X86::INTEL_COREI7_BROADWELL;
804         break;
805       }
806       if (Features & (1 << X86::FEATURE_AVX2)) {
807         *Type = X86::INTEL_COREI7;
808         *Subtype = X86::INTEL_COREI7_HASWELL;
809         break;
810       }
811       if (Features & (1 << X86::FEATURE_AVX)) {
812         *Type = X86::INTEL_COREI7;
813         *Subtype = X86::INTEL_COREI7_SANDYBRIDGE;
814         break;
815       }
816       if (Features & (1 << X86::FEATURE_SSE4_2)) {
817         if (Features3 & (1 << (X86::FEATURE_MOVBE - 64))) {
818           *Type = X86::INTEL_SILVERMONT;
819         } else {
820           *Type = X86::INTEL_COREI7;
821           *Subtype = X86::INTEL_COREI7_NEHALEM;
822         }
823         break;
824       }
825       if (Features & (1 << X86::FEATURE_SSE4_1)) {
826         *Type = X86::INTEL_CORE2; // "penryn"
827         *Subtype = X86::INTEL_CORE2_45;
828         break;
829       }
830       if (Features & (1 << X86::FEATURE_SSSE3)) {
831         if (Features3 & (1 << (X86::FEATURE_MOVBE - 64))) {
832           *Type = X86::INTEL_BONNELL; // "bonnell"
833         } else {
834           *Type = X86::INTEL_CORE2; // "core2"
835           *Subtype = X86::INTEL_CORE2_65;
836         }
837         break;
838       }
839       if (Features3 & (1 << (X86::FEATURE_EM64T - 64))) {
840         *Type = X86::INTEL_CORE2; // "core2"
841         *Subtype = X86::INTEL_CORE2_65;
842         break;
843       }
844       if (Features & (1 << X86::FEATURE_SSE3)) {
845         *Type = X86::INTEL_CORE_DUO;
846         break;
847       }
848       if (Features & (1 << X86::FEATURE_SSE2)) {
849         *Type = X86::INTEL_PENTIUM_M;
850         break;
851       }
852       if (Features & (1 << X86::FEATURE_SSE)) {
853         *Type = X86::INTEL_PENTIUM_III;
854         break;
855       }
856       if (Features & (1 << X86::FEATURE_MMX)) {
857         *Type = X86::INTEL_PENTIUM_II;
858         break;
859       }
860       *Type = X86::INTEL_PENTIUM_PRO;
861       break;
862     }
863     break;
864   case 15: {
865     if (Features3 & (1 << (X86::FEATURE_EM64T - 64))) {
866       *Type = X86::INTEL_NOCONA;
867       break;
868     }
869     if (Features & (1 << X86::FEATURE_SSE3)) {
870       *Type = X86::INTEL_PRESCOTT;
871       break;
872     }
873     *Type = X86::INTEL_PENTIUM_IV;
874     break;
875   }
876   default:
877     break; /*"generic"*/
878   }
879 }
880 
getAMDProcessorTypeAndSubtype(unsigned Family,unsigned Model,unsigned Features,unsigned * Type,unsigned * Subtype)881 static void getAMDProcessorTypeAndSubtype(unsigned Family, unsigned Model,
882                                           unsigned Features, unsigned *Type,
883                                           unsigned *Subtype) {
884   // FIXME: this poorly matches the generated SubtargetFeatureKV table.  There
885   // appears to be no way to generate the wide variety of AMD-specific targets
886   // from the information returned from CPUID.
887   switch (Family) {
888   case 4:
889     *Type = X86::AMD_i486;
890     break;
891   case 5:
892     *Type = X86::AMDPENTIUM;
893     switch (Model) {
894     case 6:
895     case 7:
896       *Subtype = X86::AMDPENTIUM_K6;
897       break; // "k6"
898     case 8:
899       *Subtype = X86::AMDPENTIUM_K62;
900       break; // "k6-2"
901     case 9:
902     case 13:
903       *Subtype = X86::AMDPENTIUM_K63;
904       break; // "k6-3"
905     case 10:
906       *Subtype = X86::AMDPENTIUM_GEODE;
907       break; // "geode"
908     }
909     break;
910   case 6:
911     if (Features & (1 << X86::FEATURE_SSE)) {
912       *Type = X86::AMD_ATHLON_XP;
913       break; // "athlon-xp"
914     }
915     *Type = X86::AMD_ATHLON;
916     break; // "athlon"
917   case 15:
918     if (Features & (1 << X86::FEATURE_SSE3)) {
919       *Type = X86::AMD_K8SSE3;
920       break; // "k8-sse3"
921     }
922     *Type = X86::AMD_K8;
923     break; // "k8"
924   case 16:
925     *Type = X86::AMDFAM10H; // "amdfam10"
926     switch (Model) {
927     case 2:
928       *Subtype = X86::AMDFAM10H_BARCELONA;
929       break;
930     case 4:
931       *Subtype = X86::AMDFAM10H_SHANGHAI;
932       break;
933     case 8:
934       *Subtype = X86::AMDFAM10H_ISTANBUL;
935       break;
936     }
937     break;
938   case 20:
939     *Type = X86::AMD_BTVER1;
940     break; // "btver1";
941   case 21:
942     *Type = X86::AMDFAM15H;
943     if (Model >= 0x60 && Model <= 0x7f) {
944       *Subtype = X86::AMDFAM15H_BDVER4;
945       break; // "bdver4"; 60h-7Fh: Excavator
946     }
947     if (Model >= 0x30 && Model <= 0x3f) {
948       *Subtype = X86::AMDFAM15H_BDVER3;
949       break; // "bdver3"; 30h-3Fh: Steamroller
950     }
951     if ((Model >= 0x10 && Model <= 0x1f) || Model == 0x02) {
952       *Subtype = X86::AMDFAM15H_BDVER2;
953       break; // "bdver2"; 02h, 10h-1Fh: Piledriver
954     }
955     if (Model <= 0x0f) {
956       *Subtype = X86::AMDFAM15H_BDVER1;
957       break; // "bdver1"; 00h-0Fh: Bulldozer
958     }
959     break;
960   case 22:
961     *Type = X86::AMD_BTVER2;
962     break; // "btver2"
963   case 23:
964     *Type = X86::AMDFAM17H;
965     if ((Model >= 0x30 && Model <= 0x3f) || Model == 0x71) {
966       *Subtype = X86::AMDFAM17H_ZNVER2;
967       break; // "znver2"; 30h-3fh, 71h: Zen2
968     }
969     if (Model <= 0x0f) {
970       *Subtype = X86::AMDFAM17H_ZNVER1;
971       break; // "znver1"; 00h-0Fh: Zen1
972     }
973     break;
974   default:
975     break; // "generic"
976   }
977 }
978 
getAvailableFeatures(unsigned ECX,unsigned EDX,unsigned MaxLeaf,unsigned * FeaturesOut,unsigned * Features2Out,unsigned * Features3Out)979 static void getAvailableFeatures(unsigned ECX, unsigned EDX, unsigned MaxLeaf,
980                                  unsigned *FeaturesOut, unsigned *Features2Out,
981                                  unsigned *Features3Out) {
982   unsigned Features = 0;
983   unsigned Features2 = 0;
984   unsigned Features3 = 0;
985   unsigned EAX, EBX;
986 
987   auto setFeature = [&](unsigned F) {
988     if (F < 32)
989       Features |= 1U << (F & 0x1f);
990     else if (F < 64)
991       Features2 |= 1U << ((F - 32) & 0x1f);
992     else if (F < 96)
993       Features3 |= 1U << ((F - 64) & 0x1f);
994     else
995       llvm_unreachable("Unexpected FeatureBit");
996   };
997 
998   if ((EDX >> 15) & 1)
999     setFeature(X86::FEATURE_CMOV);
1000   if ((EDX >> 23) & 1)
1001     setFeature(X86::FEATURE_MMX);
1002   if ((EDX >> 25) & 1)
1003     setFeature(X86::FEATURE_SSE);
1004   if ((EDX >> 26) & 1)
1005     setFeature(X86::FEATURE_SSE2);
1006 
1007   if ((ECX >> 0) & 1)
1008     setFeature(X86::FEATURE_SSE3);
1009   if ((ECX >> 1) & 1)
1010     setFeature(X86::FEATURE_PCLMUL);
1011   if ((ECX >> 9) & 1)
1012     setFeature(X86::FEATURE_SSSE3);
1013   if ((ECX >> 12) & 1)
1014     setFeature(X86::FEATURE_FMA);
1015   if ((ECX >> 19) & 1)
1016     setFeature(X86::FEATURE_SSE4_1);
1017   if ((ECX >> 20) & 1)
1018     setFeature(X86::FEATURE_SSE4_2);
1019   if ((ECX >> 23) & 1)
1020     setFeature(X86::FEATURE_POPCNT);
1021   if ((ECX >> 25) & 1)
1022     setFeature(X86::FEATURE_AES);
1023 
1024   if ((ECX >> 22) & 1)
1025     setFeature(X86::FEATURE_MOVBE);
1026 
1027   // If CPUID indicates support for XSAVE, XRESTORE and AVX, and XGETBV
1028   // indicates that the AVX registers will be saved and restored on context
1029   // switch, then we have full AVX support.
1030   const unsigned AVXBits = (1 << 27) | (1 << 28);
1031   bool HasAVX = ((ECX & AVXBits) == AVXBits) && !getX86XCR0(&EAX, &EDX) &&
1032                 ((EAX & 0x6) == 0x6);
1033 #if defined(__APPLE__)
1034   // Darwin lazily saves the AVX512 context on first use: trust that the OS will
1035   // save the AVX512 context if we use AVX512 instructions, even the bit is not
1036   // set right now.
1037   bool HasAVX512Save = true;
1038 #else
1039   // AVX512 requires additional context to be saved by the OS.
1040   bool HasAVX512Save = HasAVX && ((EAX & 0xe0) == 0xe0);
1041 #endif
1042 
1043   if (HasAVX)
1044     setFeature(X86::FEATURE_AVX);
1045 
1046   bool HasLeaf7 =
1047       MaxLeaf >= 0x7 && !getX86CpuIDAndInfoEx(0x7, 0x0, &EAX, &EBX, &ECX, &EDX);
1048 
1049   if (HasLeaf7 && ((EBX >> 3) & 1))
1050     setFeature(X86::FEATURE_BMI);
1051   if (HasLeaf7 && ((EBX >> 5) & 1) && HasAVX)
1052     setFeature(X86::FEATURE_AVX2);
1053   if (HasLeaf7 && ((EBX >> 8) & 1))
1054     setFeature(X86::FEATURE_BMI2);
1055   if (HasLeaf7 && ((EBX >> 16) & 1) && HasAVX512Save)
1056     setFeature(X86::FEATURE_AVX512F);
1057   if (HasLeaf7 && ((EBX >> 17) & 1) && HasAVX512Save)
1058     setFeature(X86::FEATURE_AVX512DQ);
1059   if (HasLeaf7 && ((EBX >> 19) & 1))
1060     setFeature(X86::FEATURE_ADX);
1061   if (HasLeaf7 && ((EBX >> 21) & 1) && HasAVX512Save)
1062     setFeature(X86::FEATURE_AVX512IFMA);
1063   if (HasLeaf7 && ((EBX >> 23) & 1))
1064     setFeature(X86::FEATURE_CLFLUSHOPT);
1065   if (HasLeaf7 && ((EBX >> 26) & 1) && HasAVX512Save)
1066     setFeature(X86::FEATURE_AVX512PF);
1067   if (HasLeaf7 && ((EBX >> 27) & 1) && HasAVX512Save)
1068     setFeature(X86::FEATURE_AVX512ER);
1069   if (HasLeaf7 && ((EBX >> 28) & 1) && HasAVX512Save)
1070     setFeature(X86::FEATURE_AVX512CD);
1071   if (HasLeaf7 && ((EBX >> 29) & 1))
1072     setFeature(X86::FEATURE_SHA);
1073   if (HasLeaf7 && ((EBX >> 30) & 1) && HasAVX512Save)
1074     setFeature(X86::FEATURE_AVX512BW);
1075   if (HasLeaf7 && ((EBX >> 31) & 1) && HasAVX512Save)
1076     setFeature(X86::FEATURE_AVX512VL);
1077 
1078   if (HasLeaf7 && ((ECX >> 1) & 1) && HasAVX512Save)
1079     setFeature(X86::FEATURE_AVX512VBMI);
1080   if (HasLeaf7 && ((ECX >> 6) & 1) && HasAVX512Save)
1081     setFeature(X86::FEATURE_AVX512VBMI2);
1082   if (HasLeaf7 && ((ECX >> 8) & 1))
1083     setFeature(X86::FEATURE_GFNI);
1084   if (HasLeaf7 && ((ECX >> 10) & 1) && HasAVX)
1085     setFeature(X86::FEATURE_VPCLMULQDQ);
1086   if (HasLeaf7 && ((ECX >> 11) & 1) && HasAVX512Save)
1087     setFeature(X86::FEATURE_AVX512VNNI);
1088   if (HasLeaf7 && ((ECX >> 12) & 1) && HasAVX512Save)
1089     setFeature(X86::FEATURE_AVX512BITALG);
1090   if (HasLeaf7 && ((ECX >> 14) & 1) && HasAVX512Save)
1091     setFeature(X86::FEATURE_AVX512VPOPCNTDQ);
1092 
1093   if (HasLeaf7 && ((EDX >> 2) & 1) && HasAVX512Save)
1094     setFeature(X86::FEATURE_AVX5124VNNIW);
1095   if (HasLeaf7 && ((EDX >> 3) & 1) && HasAVX512Save)
1096     setFeature(X86::FEATURE_AVX5124FMAPS);
1097   if (HasLeaf7 && ((EDX >> 8) & 1) && HasAVX512Save)
1098     setFeature(X86::FEATURE_AVX512VP2INTERSECT);
1099 
1100   bool HasLeaf7Subleaf1 =
1101       MaxLeaf >= 7 && !getX86CpuIDAndInfoEx(0x7, 0x1, &EAX, &EBX, &ECX, &EDX);
1102   if (HasLeaf7Subleaf1 && ((EAX >> 5) & 1) && HasAVX512Save)
1103     setFeature(X86::FEATURE_AVX512BF16);
1104 
1105   unsigned MaxExtLevel;
1106   getX86CpuIDAndInfo(0x80000000, &MaxExtLevel, &EBX, &ECX, &EDX);
1107 
1108   bool HasExtLeaf1 = MaxExtLevel >= 0x80000001 &&
1109                      !getX86CpuIDAndInfo(0x80000001, &EAX, &EBX, &ECX, &EDX);
1110   if (HasExtLeaf1 && ((ECX >> 6) & 1))
1111     setFeature(X86::FEATURE_SSE4_A);
1112   if (HasExtLeaf1 && ((ECX >> 11) & 1))
1113     setFeature(X86::FEATURE_XOP);
1114   if (HasExtLeaf1 && ((ECX >> 16) & 1))
1115     setFeature(X86::FEATURE_FMA4);
1116 
1117   if (HasExtLeaf1 && ((EDX >> 29) & 1))
1118     setFeature(X86::FEATURE_EM64T);
1119 
1120   *FeaturesOut  = Features;
1121   *Features2Out = Features2;
1122   *Features3Out = Features3;
1123 }
1124 
getHostCPUName()1125 StringRef sys::getHostCPUName() {
1126   unsigned EAX = 0, EBX = 0, ECX = 0, EDX = 0;
1127   unsigned MaxLeaf, Vendor;
1128 
1129 #if defined(__GNUC__) || defined(__clang__)
1130   //FIXME: include cpuid.h from clang or copy __get_cpuid_max here
1131   // and simplify it to not invoke __cpuid (like cpu_model.c in
1132   // compiler-rt/lib/builtins/cpu_model.c?
1133   // Opting for the second option.
1134   if(!isCpuIdSupported())
1135     return "generic";
1136 #endif
1137   if (getX86CpuIDAndInfo(0, &MaxLeaf, &Vendor, &ECX, &EDX) || MaxLeaf < 1)
1138     return "generic";
1139   getX86CpuIDAndInfo(0x1, &EAX, &EBX, &ECX, &EDX);
1140 
1141   unsigned Brand_id = EBX & 0xff;
1142   unsigned Family = 0, Model = 0;
1143   unsigned Features = 0, Features2 = 0, Features3 = 0;
1144   detectX86FamilyModel(EAX, &Family, &Model);
1145   getAvailableFeatures(ECX, EDX, MaxLeaf, &Features, &Features2, &Features3);
1146 
1147   unsigned Type = 0;
1148   unsigned Subtype = 0;
1149 
1150   if (Vendor == SIG_INTEL) {
1151     getIntelProcessorTypeAndSubtype(Family, Model, Brand_id, Features,
1152                                     Features2, Features3, &Type, &Subtype);
1153   } else if (Vendor == SIG_AMD) {
1154     getAMDProcessorTypeAndSubtype(Family, Model, Features, &Type, &Subtype);
1155   }
1156 
1157   // Check subtypes first since those are more specific.
1158 #define X86_CPU_SUBTYPE(ARCHNAME, ENUM) \
1159   if (Subtype == X86::ENUM) \
1160     return ARCHNAME;
1161 #include "llvm/Support/X86TargetParser.def"
1162 
1163   // Now check types.
1164 #define X86_CPU_TYPE(ARCHNAME, ENUM) \
1165   if (Type == X86::ENUM) \
1166     return ARCHNAME;
1167 #include "llvm/Support/X86TargetParser.def"
1168 
1169   return "generic";
1170 }
1171 
1172 #elif defined(__APPLE__) && (defined(__ppc__) || defined(__powerpc__))
getHostCPUName()1173 StringRef sys::getHostCPUName() {
1174   host_basic_info_data_t hostInfo;
1175   mach_msg_type_number_t infoCount;
1176 
1177   infoCount = HOST_BASIC_INFO_COUNT;
1178   mach_port_t hostPort = mach_host_self();
1179   host_info(hostPort, HOST_BASIC_INFO, (host_info_t)&hostInfo,
1180             &infoCount);
1181   mach_port_deallocate(mach_task_self(), hostPort);
1182 
1183   if (hostInfo.cpu_type != CPU_TYPE_POWERPC)
1184     return "generic";
1185 
1186   switch (hostInfo.cpu_subtype) {
1187   case CPU_SUBTYPE_POWERPC_601:
1188     return "601";
1189   case CPU_SUBTYPE_POWERPC_602:
1190     return "602";
1191   case CPU_SUBTYPE_POWERPC_603:
1192     return "603";
1193   case CPU_SUBTYPE_POWERPC_603e:
1194     return "603e";
1195   case CPU_SUBTYPE_POWERPC_603ev:
1196     return "603ev";
1197   case CPU_SUBTYPE_POWERPC_604:
1198     return "604";
1199   case CPU_SUBTYPE_POWERPC_604e:
1200     return "604e";
1201   case CPU_SUBTYPE_POWERPC_620:
1202     return "620";
1203   case CPU_SUBTYPE_POWERPC_750:
1204     return "750";
1205   case CPU_SUBTYPE_POWERPC_7400:
1206     return "7400";
1207   case CPU_SUBTYPE_POWERPC_7450:
1208     return "7450";
1209   case CPU_SUBTYPE_POWERPC_970:
1210     return "970";
1211   default:;
1212   }
1213 
1214   return "generic";
1215 }
1216 #elif defined(__linux__) && (defined(__ppc__) || defined(__powerpc__))
getHostCPUName()1217 StringRef sys::getHostCPUName() {
1218   std::unique_ptr<llvm::MemoryBuffer> P = getProcCpuinfoContent();
1219   StringRef Content = P ? P->getBuffer() : "";
1220   return detail::getHostCPUNameForPowerPC(Content);
1221 }
1222 #elif defined(__linux__) && (defined(__arm__) || defined(__aarch64__))
getHostCPUName()1223 StringRef sys::getHostCPUName() {
1224   std::unique_ptr<llvm::MemoryBuffer> P = getProcCpuinfoContent();
1225   StringRef Content = P ? P->getBuffer() : "";
1226   return detail::getHostCPUNameForARM(Content);
1227 }
1228 #elif defined(__linux__) && defined(__s390x__)
getHostCPUName()1229 StringRef sys::getHostCPUName() {
1230   std::unique_ptr<llvm::MemoryBuffer> P = getProcCpuinfoContent();
1231   StringRef Content = P ? P->getBuffer() : "";
1232   return detail::getHostCPUNameForS390x(Content);
1233 }
1234 #elif defined(__APPLE__) && defined(__aarch64__)
getHostCPUName()1235 StringRef sys::getHostCPUName() {
1236   return "cyclone";
1237 }
1238 #elif defined(__APPLE__) && defined(__arm__)
getHostCPUName()1239 StringRef sys::getHostCPUName() {
1240   host_basic_info_data_t hostInfo;
1241   mach_msg_type_number_t infoCount;
1242 
1243   infoCount = HOST_BASIC_INFO_COUNT;
1244   mach_port_t hostPort = mach_host_self();
1245   host_info(hostPort, HOST_BASIC_INFO, (host_info_t)&hostInfo,
1246             &infoCount);
1247   mach_port_deallocate(mach_task_self(), hostPort);
1248 
1249   if (hostInfo.cpu_type != CPU_TYPE_ARM) {
1250     assert(false && "CPUType not equal to ARM should not be possible on ARM");
1251     return "generic";
1252   }
1253   switch (hostInfo.cpu_subtype) {
1254     case CPU_SUBTYPE_ARM_V7S:
1255       return "swift";
1256     default:;
1257     }
1258 
1259   return "generic";
1260 }
1261 #else
getHostCPUName()1262 StringRef sys::getHostCPUName() { return "generic"; }
1263 #endif
1264 
1265 #if defined(__linux__) && defined(__x86_64__)
1266 // On Linux, the number of physical cores can be computed from /proc/cpuinfo,
1267 // using the number of unique physical/core id pairs. The following
1268 // implementation reads the /proc/cpuinfo format on an x86_64 system.
computeHostNumPhysicalCores()1269 static int computeHostNumPhysicalCores() {
1270   // Read /proc/cpuinfo as a stream (until EOF reached). It cannot be
1271   // mmapped because it appears to have 0 size.
1272   llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Text =
1273       llvm::MemoryBuffer::getFileAsStream("/proc/cpuinfo");
1274   if (std::error_code EC = Text.getError()) {
1275     llvm::errs() << "Can't read "
1276                  << "/proc/cpuinfo: " << EC.message() << "\n";
1277     return -1;
1278   }
1279   SmallVector<StringRef, 8> strs;
1280   (*Text)->getBuffer().split(strs, "\n", /*MaxSplit=*/-1,
1281                              /*KeepEmpty=*/false);
1282   int CurPhysicalId = -1;
1283   int CurCoreId = -1;
1284   SmallSet<std::pair<int, int>, 32> UniqueItems;
1285   for (auto &Line : strs) {
1286     Line = Line.trim();
1287     if (!Line.startswith("physical id") && !Line.startswith("core id"))
1288       continue;
1289     std::pair<StringRef, StringRef> Data = Line.split(':');
1290     auto Name = Data.first.trim();
1291     auto Val = Data.second.trim();
1292     if (Name == "physical id") {
1293       assert(CurPhysicalId == -1 &&
1294              "Expected a core id before seeing another physical id");
1295       Val.getAsInteger(10, CurPhysicalId);
1296     }
1297     if (Name == "core id") {
1298       assert(CurCoreId == -1 &&
1299              "Expected a physical id before seeing another core id");
1300       Val.getAsInteger(10, CurCoreId);
1301     }
1302     if (CurPhysicalId != -1 && CurCoreId != -1) {
1303       UniqueItems.insert(std::make_pair(CurPhysicalId, CurCoreId));
1304       CurPhysicalId = -1;
1305       CurCoreId = -1;
1306     }
1307   }
1308   return UniqueItems.size();
1309 }
1310 #elif defined(__APPLE__) && defined(__x86_64__)
1311 #include <sys/param.h>
1312 #include <sys/sysctl.h>
1313 
1314 // Gets the number of *physical cores* on the machine.
computeHostNumPhysicalCores()1315 static int computeHostNumPhysicalCores() {
1316   uint32_t count;
1317   size_t len = sizeof(count);
1318   sysctlbyname("hw.physicalcpu", &count, &len, NULL, 0);
1319   if (count < 1) {
1320     int nm[2];
1321     nm[0] = CTL_HW;
1322     nm[1] = HW_AVAILCPU;
1323     sysctl(nm, 2, &count, &len, NULL, 0);
1324     if (count < 1)
1325       return -1;
1326   }
1327   return count;
1328 }
1329 #else
1330 // On other systems, return -1 to indicate unknown.
computeHostNumPhysicalCores()1331 static int computeHostNumPhysicalCores() { return -1; }
1332 #endif
1333 
getHostNumPhysicalCores()1334 int sys::getHostNumPhysicalCores() {
1335   static int NumCores = computeHostNumPhysicalCores();
1336   return NumCores;
1337 }
1338 
1339 #if defined(__i386__) || defined(_M_IX86) || \
1340     defined(__x86_64__) || defined(_M_X64)
getHostCPUFeatures(StringMap<bool> & Features)1341 bool sys::getHostCPUFeatures(StringMap<bool> &Features) {
1342   unsigned EAX = 0, EBX = 0, ECX = 0, EDX = 0;
1343   unsigned MaxLevel;
1344   union {
1345     unsigned u[3];
1346     char c[12];
1347   } text;
1348 
1349   if (getX86CpuIDAndInfo(0, &MaxLevel, text.u + 0, text.u + 2, text.u + 1) ||
1350       MaxLevel < 1)
1351     return false;
1352 
1353   getX86CpuIDAndInfo(1, &EAX, &EBX, &ECX, &EDX);
1354 
1355   Features["cx8"]    = (EDX >>  8) & 1;
1356   Features["cmov"]   = (EDX >> 15) & 1;
1357   Features["mmx"]    = (EDX >> 23) & 1;
1358   Features["fxsr"]   = (EDX >> 24) & 1;
1359   Features["sse"]    = (EDX >> 25) & 1;
1360   Features["sse2"]   = (EDX >> 26) & 1;
1361 
1362   Features["sse3"]   = (ECX >>  0) & 1;
1363   Features["pclmul"] = (ECX >>  1) & 1;
1364   Features["ssse3"]  = (ECX >>  9) & 1;
1365   Features["cx16"]   = (ECX >> 13) & 1;
1366   Features["sse4.1"] = (ECX >> 19) & 1;
1367   Features["sse4.2"] = (ECX >> 20) & 1;
1368   Features["movbe"]  = (ECX >> 22) & 1;
1369   Features["popcnt"] = (ECX >> 23) & 1;
1370   Features["aes"]    = (ECX >> 25) & 1;
1371   Features["rdrnd"]  = (ECX >> 30) & 1;
1372 
1373   // If CPUID indicates support for XSAVE, XRESTORE and AVX, and XGETBV
1374   // indicates that the AVX registers will be saved and restored on context
1375   // switch, then we have full AVX support.
1376   bool HasAVXSave = ((ECX >> 27) & 1) && ((ECX >> 28) & 1) &&
1377                     !getX86XCR0(&EAX, &EDX) && ((EAX & 0x6) == 0x6);
1378 #if defined(__APPLE__)
1379   // Darwin lazily saves the AVX512 context on first use: trust that the OS will
1380   // save the AVX512 context if we use AVX512 instructions, even the bit is not
1381   // set right now.
1382   bool HasAVX512Save = true;
1383 #else
1384   // AVX512 requires additional context to be saved by the OS.
1385   bool HasAVX512Save = HasAVXSave && ((EAX & 0xe0) == 0xe0);
1386 #endif
1387 
1388   Features["avx"]   = HasAVXSave;
1389   Features["fma"]   = ((ECX >> 12) & 1) && HasAVXSave;
1390   // Only enable XSAVE if OS has enabled support for saving YMM state.
1391   Features["xsave"] = ((ECX >> 26) & 1) && HasAVXSave;
1392   Features["f16c"]  = ((ECX >> 29) & 1) && HasAVXSave;
1393 
1394   unsigned MaxExtLevel;
1395   getX86CpuIDAndInfo(0x80000000, &MaxExtLevel, &EBX, &ECX, &EDX);
1396 
1397   bool HasExtLeaf1 = MaxExtLevel >= 0x80000001 &&
1398                      !getX86CpuIDAndInfo(0x80000001, &EAX, &EBX, &ECX, &EDX);
1399   Features["sahf"]   = HasExtLeaf1 && ((ECX >>  0) & 1);
1400   Features["lzcnt"]  = HasExtLeaf1 && ((ECX >>  5) & 1);
1401   Features["sse4a"]  = HasExtLeaf1 && ((ECX >>  6) & 1);
1402   Features["prfchw"] = HasExtLeaf1 && ((ECX >>  8) & 1);
1403   Features["xop"]    = HasExtLeaf1 && ((ECX >> 11) & 1) && HasAVXSave;
1404   Features["lwp"]    = HasExtLeaf1 && ((ECX >> 15) & 1);
1405   Features["fma4"]   = HasExtLeaf1 && ((ECX >> 16) & 1) && HasAVXSave;
1406   Features["tbm"]    = HasExtLeaf1 && ((ECX >> 21) & 1);
1407   Features["mwaitx"] = HasExtLeaf1 && ((ECX >> 29) & 1);
1408 
1409   Features["64bit"]  = HasExtLeaf1 && ((EDX >> 29) & 1);
1410 
1411   // Miscellaneous memory related features, detected by
1412   // using the 0x80000008 leaf of the CPUID instruction
1413   bool HasExtLeaf8 = MaxExtLevel >= 0x80000008 &&
1414                      !getX86CpuIDAndInfo(0x80000008, &EAX, &EBX, &ECX, &EDX);
1415   Features["clzero"]   = HasExtLeaf8 && ((EBX >> 0) & 1);
1416   Features["wbnoinvd"] = HasExtLeaf8 && ((EBX >> 9) & 1);
1417 
1418   bool HasLeaf7 =
1419       MaxLevel >= 7 && !getX86CpuIDAndInfoEx(0x7, 0x0, &EAX, &EBX, &ECX, &EDX);
1420 
1421   Features["fsgsbase"]   = HasLeaf7 && ((EBX >>  0) & 1);
1422   Features["sgx"]        = HasLeaf7 && ((EBX >>  2) & 1);
1423   Features["bmi"]        = HasLeaf7 && ((EBX >>  3) & 1);
1424   // AVX2 is only supported if we have the OS save support from AVX.
1425   Features["avx2"]       = HasLeaf7 && ((EBX >>  5) & 1) && HasAVXSave;
1426   Features["bmi2"]       = HasLeaf7 && ((EBX >>  8) & 1);
1427   Features["invpcid"]    = HasLeaf7 && ((EBX >> 10) & 1);
1428   Features["rtm"]        = HasLeaf7 && ((EBX >> 11) & 1);
1429   // AVX512 is only supported if the OS supports the context save for it.
1430   Features["avx512f"]    = HasLeaf7 && ((EBX >> 16) & 1) && HasAVX512Save;
1431   Features["avx512dq"]   = HasLeaf7 && ((EBX >> 17) & 1) && HasAVX512Save;
1432   Features["rdseed"]     = HasLeaf7 && ((EBX >> 18) & 1);
1433   Features["adx"]        = HasLeaf7 && ((EBX >> 19) & 1);
1434   Features["avx512ifma"] = HasLeaf7 && ((EBX >> 21) & 1) && HasAVX512Save;
1435   Features["clflushopt"] = HasLeaf7 && ((EBX >> 23) & 1);
1436   Features["clwb"]       = HasLeaf7 && ((EBX >> 24) & 1);
1437   Features["avx512pf"]   = HasLeaf7 && ((EBX >> 26) & 1) && HasAVX512Save;
1438   Features["avx512er"]   = HasLeaf7 && ((EBX >> 27) & 1) && HasAVX512Save;
1439   Features["avx512cd"]   = HasLeaf7 && ((EBX >> 28) & 1) && HasAVX512Save;
1440   Features["sha"]        = HasLeaf7 && ((EBX >> 29) & 1);
1441   Features["avx512bw"]   = HasLeaf7 && ((EBX >> 30) & 1) && HasAVX512Save;
1442   Features["avx512vl"]   = HasLeaf7 && ((EBX >> 31) & 1) && HasAVX512Save;
1443 
1444   Features["prefetchwt1"]     = HasLeaf7 && ((ECX >>  0) & 1);
1445   Features["avx512vbmi"]      = HasLeaf7 && ((ECX >>  1) & 1) && HasAVX512Save;
1446   Features["pku"]             = HasLeaf7 && ((ECX >>  4) & 1);
1447   Features["waitpkg"]         = HasLeaf7 && ((ECX >>  5) & 1);
1448   Features["avx512vbmi2"]     = HasLeaf7 && ((ECX >>  6) & 1) && HasAVX512Save;
1449   Features["shstk"]           = HasLeaf7 && ((ECX >>  7) & 1);
1450   Features["gfni"]            = HasLeaf7 && ((ECX >>  8) & 1);
1451   Features["vaes"]            = HasLeaf7 && ((ECX >>  9) & 1) && HasAVXSave;
1452   Features["vpclmulqdq"]      = HasLeaf7 && ((ECX >> 10) & 1) && HasAVXSave;
1453   Features["avx512vnni"]      = HasLeaf7 && ((ECX >> 11) & 1) && HasAVX512Save;
1454   Features["avx512bitalg"]    = HasLeaf7 && ((ECX >> 12) & 1) && HasAVX512Save;
1455   Features["avx512vpopcntdq"] = HasLeaf7 && ((ECX >> 14) & 1) && HasAVX512Save;
1456   Features["rdpid"]           = HasLeaf7 && ((ECX >> 22) & 1);
1457   Features["cldemote"]        = HasLeaf7 && ((ECX >> 25) & 1);
1458   Features["movdiri"]         = HasLeaf7 && ((ECX >> 27) & 1);
1459   Features["movdir64b"]       = HasLeaf7 && ((ECX >> 28) & 1);
1460   Features["enqcmd"]          = HasLeaf7 && ((ECX >> 29) & 1);
1461 
1462   // There are two CPUID leafs which information associated with the pconfig
1463   // instruction:
1464   // EAX=0x7, ECX=0x0 indicates the availability of the instruction (via the 18th
1465   // bit of EDX), while the EAX=0x1b leaf returns information on the
1466   // availability of specific pconfig leafs.
1467   // The target feature here only refers to the the first of these two.
1468   // Users might need to check for the availability of specific pconfig
1469   // leaves using cpuid, since that information is ignored while
1470   // detecting features using the "-march=native" flag.
1471   // For more info, see X86 ISA docs.
1472   Features["pconfig"] = HasLeaf7 && ((EDX >> 18) & 1);
1473   bool HasLeaf7Subleaf1 =
1474       MaxLevel >= 7 && !getX86CpuIDAndInfoEx(0x7, 0x1, &EAX, &EBX, &ECX, &EDX);
1475   Features["avx512bf16"] = HasLeaf7Subleaf1 && ((EAX >> 5) & 1) && HasAVX512Save;
1476 
1477   bool HasLeafD = MaxLevel >= 0xd &&
1478                   !getX86CpuIDAndInfoEx(0xd, 0x1, &EAX, &EBX, &ECX, &EDX);
1479 
1480   // Only enable XSAVE if OS has enabled support for saving YMM state.
1481   Features["xsaveopt"] = HasLeafD && ((EAX >> 0) & 1) && HasAVXSave;
1482   Features["xsavec"]   = HasLeafD && ((EAX >> 1) & 1) && HasAVXSave;
1483   Features["xsaves"]   = HasLeafD && ((EAX >> 3) & 1) && HasAVXSave;
1484 
1485   bool HasLeaf14 = MaxLevel >= 0x14 &&
1486                   !getX86CpuIDAndInfoEx(0x14, 0x0, &EAX, &EBX, &ECX, &EDX);
1487 
1488   Features["ptwrite"] = HasLeaf14 && ((EBX >> 4) & 1);
1489 
1490   return true;
1491 }
1492 #elif defined(__linux__) && (defined(__arm__) || defined(__aarch64__))
getHostCPUFeatures(StringMap<bool> & Features)1493 bool sys::getHostCPUFeatures(StringMap<bool> &Features) {
1494   std::unique_ptr<llvm::MemoryBuffer> P = getProcCpuinfoContent();
1495   if (!P)
1496     return false;
1497 
1498   SmallVector<StringRef, 32> Lines;
1499   P->getBuffer().split(Lines, "\n");
1500 
1501   SmallVector<StringRef, 32> CPUFeatures;
1502 
1503   // Look for the CPU features.
1504   for (unsigned I = 0, E = Lines.size(); I != E; ++I)
1505     if (Lines[I].startswith("Features")) {
1506       Lines[I].split(CPUFeatures, ' ');
1507       break;
1508     }
1509 
1510 #if defined(__aarch64__)
1511   // Keep track of which crypto features we have seen
1512   enum { CAP_AES = 0x1, CAP_PMULL = 0x2, CAP_SHA1 = 0x4, CAP_SHA2 = 0x8 };
1513   uint32_t crypto = 0;
1514 #endif
1515 
1516   for (unsigned I = 0, E = CPUFeatures.size(); I != E; ++I) {
1517     StringRef LLVMFeatureStr = StringSwitch<StringRef>(CPUFeatures[I])
1518 #if defined(__aarch64__)
1519                                    .Case("asimd", "neon")
1520                                    .Case("fp", "fp-armv8")
1521                                    .Case("crc32", "crc")
1522 #else
1523                                    .Case("half", "fp16")
1524                                    .Case("neon", "neon")
1525                                    .Case("vfpv3", "vfp3")
1526                                    .Case("vfpv3d16", "d16")
1527                                    .Case("vfpv4", "vfp4")
1528                                    .Case("idiva", "hwdiv-arm")
1529                                    .Case("idivt", "hwdiv")
1530 #endif
1531                                    .Default("");
1532 
1533 #if defined(__aarch64__)
1534     // We need to check crypto separately since we need all of the crypto
1535     // extensions to enable the subtarget feature
1536     if (CPUFeatures[I] == "aes")
1537       crypto |= CAP_AES;
1538     else if (CPUFeatures[I] == "pmull")
1539       crypto |= CAP_PMULL;
1540     else if (CPUFeatures[I] == "sha1")
1541       crypto |= CAP_SHA1;
1542     else if (CPUFeatures[I] == "sha2")
1543       crypto |= CAP_SHA2;
1544 #endif
1545 
1546     if (LLVMFeatureStr != "")
1547       Features[LLVMFeatureStr] = true;
1548   }
1549 
1550 #if defined(__aarch64__)
1551   // If we have all crypto bits we can add the feature
1552   if (crypto == (CAP_AES | CAP_PMULL | CAP_SHA1 | CAP_SHA2))
1553     Features["crypto"] = true;
1554 #endif
1555 
1556   return true;
1557 }
1558 #elif defined(_WIN32) && (defined(__aarch64__) || defined(_M_ARM64))
getHostCPUFeatures(StringMap<bool> & Features)1559 bool sys::getHostCPUFeatures(StringMap<bool> &Features) {
1560   if (IsProcessorFeaturePresent(PF_ARM_NEON_INSTRUCTIONS_AVAILABLE))
1561     Features["neon"] = true;
1562   if (IsProcessorFeaturePresent(PF_ARM_V8_CRC32_INSTRUCTIONS_AVAILABLE))
1563     Features["crc"] = true;
1564   if (IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE))
1565     Features["crypto"] = true;
1566 
1567   return true;
1568 }
1569 #else
getHostCPUFeatures(StringMap<bool> & Features)1570 bool sys::getHostCPUFeatures(StringMap<bool> &Features) { return false; }
1571 #endif
1572 
getProcessTriple()1573 std::string sys::getProcessTriple() {
1574   std::string TargetTripleString = updateTripleOSVersion(LLVM_HOST_TRIPLE);
1575   Triple PT(Triple::normalize(TargetTripleString));
1576 
1577   if (sizeof(void *) == 8 && PT.isArch32Bit())
1578     PT = PT.get64BitArchVariant();
1579   if (sizeof(void *) == 4 && PT.isArch64Bit())
1580     PT = PT.get32BitArchVariant();
1581 
1582   return PT.str();
1583 }
1584