19 #include "llvm/Config/config.h"
35 #if defined(__APPLE__) && (defined(__ppc__) || defined(__powerpc__))
36 #include <mach/mach.h>
37 #include <mach/mach_host.h>
38 #include <mach/host_info.h>
39 #include <mach/machine.h>
50 #if defined(i386) || defined(__i386__) || defined(__x86__) || defined(_M_IX86)\
51 || defined(__x86_64__) || defined(_M_AMD64) || defined (_M_X64)
55 static bool GetX86CpuIDAndInfo(
unsigned value,
unsigned *rEAX,
unsigned *rEBX,
56 unsigned *rECX,
unsigned *rEDX) {
57 #if defined(__GNUC__) || defined(__clang__)
58 #if defined(__x86_64__) || defined(_M_AMD64) || defined (_M_X64)
60 asm (
"movq\t%%rbx, %%rsi\n\t"
62 "xchgq\t%%rbx, %%rsi\n\t"
69 #elif defined(i386) || defined(__i386__) || defined(__x86__) || defined(_M_IX86)
70 asm (
"movl\t%%ebx, %%esi\n\t"
72 "xchgl\t%%ebx, %%esi\n\t"
84 #elif defined(_MSC_VER)
87 __cpuid(registers, value);
101 bool GetX86CpuIDAndInfoEx(
unsigned value,
unsigned subleaf,
unsigned *rEAX,
102 unsigned *rEBX,
unsigned *rECX,
unsigned *rEDX) {
103 #if defined(__x86_64__) || defined(_M_AMD64) || defined (_M_X64)
104 #if defined(__GNUC__)
106 asm (
"movq\t%%rbx, %%rsi\n\t"
108 "xchgq\t%%rbx, %%rsi\n\t"
116 #elif defined(_MSC_VER)
118 #if (_MSC_VER > 1500) || (_MSC_VER == 1500 && _MSC_FULL_VER >= 150030729)
120 __cpuidex(registers, value, subleaf);
121 *rEAX = registers[0];
122 *rEBX = registers[1];
123 *rECX = registers[2];
124 *rEDX = registers[3];
132 #elif defined(i386) || defined(__i386__) || defined(__x86__) || defined(_M_IX86)
133 #if defined(__GNUC__)
134 asm (
"movl\t%%ebx, %%esi\n\t"
136 "xchgl\t%%ebx, %%esi\n\t"
144 #elif defined(_MSC_VER)
150 mov dword ptr [esi],eax
152 mov dword ptr [esi],ebx
154 mov dword ptr [esi],ecx
156 mov dword ptr [esi],edx
168 #if defined(__GNUC__)
173 __asm__ (
".byte 0x0f, 0x01, 0xd0" :
"=a" (rEAX),
"=d" (rEDX) :
"c" (0));
174 #elif defined(_MSC_FULL_VER) && defined(_XCR_XFEATURE_ENABLED_MASK)
175 unsigned long long rEAX = _xgetbv(_XCR_XFEATURE_ENABLED_MASK);
179 return (rEAX & 6) == 6;
182 static void DetectX86FamilyModel(
unsigned EAX,
unsigned &Family,
184 Family = (EAX >> 8) & 0xf;
185 Model = (EAX >> 4) & 0xf;
186 if (Family == 6 || Family == 0xf) {
189 Family += (EAX >> 20) & 0xff;
191 Model += ((EAX >> 16) & 0xf) << 4;
196 unsigned EAX = 0,
EBX = 0,
ECX = 0,
EDX = 0;
197 if (GetX86CpuIDAndInfo(0x1, &EAX, &
EBX, &
ECX, &
EDX))
201 DetectX86FamilyModel(EAX, Family, Model);
208 GetX86CpuIDAndInfo(0, &EAX, text.u+0, text.u+2, text.u+1);
210 unsigned MaxLeaf =
EAX;
211 bool HasSSE3 = (
ECX & 0x1);
212 bool HasSSE41 = (
ECX & 0x80000);
216 const unsigned AVXBits = (1 << 27) | (1 << 28);
218 bool HasAVX2 = HasAVX && MaxLeaf >= 0x7 &&
219 !GetX86CpuIDAndInfoEx(0x7, 0x0, &EAX, &
EBX, &
ECX, &
EDX) &&
221 GetX86CpuIDAndInfo(0x80000001, &EAX, &
EBX, &
ECX, &
EDX);
222 bool Em64T = (
EDX >> 29) & 0x1;
224 if (
memcmp(text.c,
"GenuineIntel", 12) == 0) {
239 default:
return "i486";
255 return "pentium-mmx";
257 default:
return "pentium";
306 return HasSSE41 ?
"penryn" :
"core2";
327 return HasAVX ?
"corei7-avx" :
"corei7";
334 return HasAVX ?
"core-avx-i" :
"corei7";
343 return HasAVX2 ?
"core-avx2" :
"corei7";
358 default:
return (Em64T) ?
"x86-64" :
"i686";
371 return (Em64T) ?
"x86-64" :
"pentium4";
384 return (Em64T) ?
"nocona" :
"prescott";
387 return (Em64T) ?
"x86-64" :
"pentium4";
394 }
else if (
memcmp(text.c,
"AuthenticAMD", 12) == 0) {
405 case 8:
return "k6-2";
407 case 13:
return "k6-3";
408 case 10:
return "geode";
409 default:
return "pentium";
413 case 4:
return "athlon-tbird";
416 case 8:
return "athlon-mp";
417 case 10:
return "athlon-xp";
418 default:
return "athlon";
424 case 1:
return "opteron";
425 case 5:
return "athlon-fx";
426 default:
return "athlon64";
450 #elif defined(__APPLE__) && (defined(__ppc__) || defined(__powerpc__))
452 host_basic_info_data_t hostInfo;
453 mach_msg_type_number_t infoCount;
455 infoCount = HOST_BASIC_INFO_COUNT;
456 host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&hostInfo,
461 switch(hostInfo.cpu_subtype) {
479 #elif defined(__linux__) && (defined(__ppc__) || defined(__powerpc__))
484 const char *
generic =
"generic";
493 DEBUG(
dbgs() <<
"Unable to open /proc/cpuinfo: " << Err <<
"\n");
500 size_t CPUInfoSize = DS->
GetBytes((
unsigned char*) buffer,
sizeof(buffer));
503 const char *CPUInfoStart = buffer;
504 const char *CPUInfoEnd = buffer + CPUInfoSize;
506 const char *CIP = CPUInfoStart;
508 const char *CPUStart = 0;
513 while (CIP < CPUInfoEnd && CPUStart == 0) {
514 if (CIP < CPUInfoEnd && *CIP ==
'\n')
517 if (CIP < CPUInfoEnd && *CIP ==
'c') {
519 if (CIP < CPUInfoEnd && *CIP ==
'p') {
521 if (CIP < CPUInfoEnd && *CIP ==
'u') {
523 while (CIP < CPUInfoEnd && (*CIP ==
' ' || *CIP ==
'\t'))
526 if (CIP < CPUInfoEnd && *CIP ==
':') {
528 while (CIP < CPUInfoEnd && (*CIP ==
' ' || *CIP ==
'\t'))
531 if (CIP < CPUInfoEnd) {
533 while (CIP < CPUInfoEnd && (*CIP !=
' ' && *CIP !=
'\t' &&
534 *CIP !=
',' && *CIP !=
'\n'))
536 CPULen = CIP - CPUStart;
544 while (CIP < CPUInfoEnd && *CIP !=
'\n')
552 .Case(
"604e",
"604e")
554 .
Case(
"7400",
"7400")
555 .
Case(
"7410",
"7400")
556 .
Case(
"7447",
"7400")
557 .
Case(
"7455",
"7450")
559 .
Case(
"POWER4",
"970")
560 .
Case(
"PPC970FX",
"970")
561 .
Case(
"PPC970MP",
"970")
563 .
Case(
"POWER5",
"g5")
565 .
Case(
"POWER6",
"pwr6")
566 .
Case(
"POWER7",
"pwr7")
569 #elif defined(__linux__) && defined(__arm__)
580 DEBUG(
dbgs() <<
"Unable to open /proc/cpuinfo: " << Err <<
"\n");
587 size_t CPUInfoSize = DS->
GetBytes((
unsigned char*) buffer,
sizeof(buffer));
593 Str.split(Lines,
"\n");
597 for (
unsigned I = 0, E = Lines.
size();
I != E; ++
I)
598 if (Lines[
I].startswith(
"CPU implementer"))
599 Implementer = Lines[
I].substr(15).ltrim(
"\t :");
601 if (Implementer ==
"0x41")
603 for (
unsigned I = 0, E = Lines.
size();
I != E; ++
I)
604 if (Lines[
I].startswith(
"CPU part"))
609 .Case(
"0x926",
"arm926ej-s")
610 .
Case(
"0xb02",
"mpcore")
611 .
Case(
"0xb36",
"arm1136j-s")
612 .
Case(
"0xb56",
"arm1156t2-s")
613 .
Case(
"0xb76",
"arm1176jz-s")
614 .
Case(
"0xc08",
"cortex-a8")
615 .
Case(
"0xc09",
"cortex-a9")
616 .
Case(
"0xc0f",
"cortex-a15")
617 .
Case(
"0xc20",
"cortex-m0")
618 .
Case(
"0xc23",
"cortex-m3")
619 .
Case(
"0xc24",
"cortex-m4")
624 #elif defined(__linux__) && defined(__s390x__)
634 DEBUG(
dbgs() <<
"Unable to open /proc/cpuinfo: " << Err <<
"\n");
641 size_t CPUInfoSize = DS->
GetBytes((
unsigned char*) buffer,
sizeof(buffer));
646 Str.split(Lines,
"\n");
647 for (
unsigned I = 0, E = Lines.
size();
I != E; ++
I) {
648 if (Lines[
I].startswith(
"processor ")) {
649 size_t Pos = Lines[
I].find(
"machine = ");
651 Pos +=
sizeof(
"machine = ") - 1;
653 if (!Lines[
I].drop_front(Pos).getAsInteger(10, Id)) {
672 #if defined(__linux__) && defined(__arm__)
677 DEBUG(
dbgs() <<
"Unable to open /proc/cpuinfo: " << Err <<
"\n");
684 size_t CPUInfoSize = DS->
GetBytes((
unsigned char*) buffer,
sizeof(buffer));
690 Str.split(Lines,
"\n");
695 for (
unsigned I = 0, E = Lines.
size();
I != E; ++
I)
696 if (Lines[
I].startswith(
"Features")) {
697 Lines[
I].split(CPUFeatures,
" ");
701 for (
unsigned I = 0, E = CPUFeatures.
size();
I != E; ++
I) {
703 .Case(
"half",
"fp16")
704 .
Case(
"neon",
"neon")
705 .
Case(
"vfpv3",
"vfp3")
706 .
Case(
"vfpv3d16",
"d16")
707 .
Case(
"vfpv4",
"vfp4")
708 .
Case(
"idiva",
"hwdiv-arm")
709 .
Case(
"idivt",
"hwdiv")
712 if (LLVMFeatureStr !=
"")
static std::string normalize(StringRef Str)
void setValue(const ValueTy &V)
const std::string & str() const
StringSwitch & Case(const char(&S)[N], const T &Value)
bool isArch64Bit() const
Test whether the architecture is 64-bit.
virtual size_t GetBytes(unsigned char *buf, size_t len)=0
static bool OSHasAVXSupport()
llvm::Triple get32BitArchVariant() const
Form a triple with a 32-bit variant of the current architecture.
int memcmp(const void *s1, const void *s2, size_t n);
A switch()-like statement whose cases are string literals.
std::string getHostCPUName()
std::string getProcessTriple()
R Default(const T &Value) const
raw_ostream & dbgs()
dbgs - Return a circular-buffered debug stream.
DataStreamer * getDataFileStreamer(const std::string &Filename, std::string *Err)
MapEntryTy & GetOrCreateValue(StringRef Key, InitTy Val)
llvm::Triple get64BitArchVariant() const
Form a triple with a 64-bit variant of the current architecture.
bool getHostCPUFeatures(StringMap< bool > &Features)
bool isArch32Bit() const
Test whether the architecture is 32-bit.