in lib/LLVMSupport/Support/Host.cpp [835:931]
static void getAMDProcessorTypeAndSubtype(unsigned Family, unsigned Model,
unsigned Features, unsigned *Type,
unsigned *Subtype) {
// FIXME: this poorly matches the generated SubtargetFeatureKV table. There
// appears to be no way to generate the wide variety of AMD-specific targets
// from the information returned from CPUID.
switch (Family) {
case 4:
*Type = X86::AMD_i486;
break;
case 5:
*Type = X86::AMDPENTIUM;
switch (Model) {
case 6:
case 7:
*Subtype = X86::AMDPENTIUM_K6;
break; // "k6"
case 8:
*Subtype = X86::AMDPENTIUM_K62;
break; // "k6-2"
case 9:
case 13:
*Subtype = X86::AMDPENTIUM_K63;
break; // "k6-3"
case 10:
*Subtype = X86::AMDPENTIUM_GEODE;
break; // "geode"
}
break;
case 6:
if (Features & (1 << X86::FEATURE_SSE)) {
*Type = X86::AMD_ATHLON_XP;
break; // "athlon-xp"
}
*Type = X86::AMD_ATHLON;
break; // "athlon"
case 15:
if (Features & (1 << X86::FEATURE_SSE3)) {
*Type = X86::AMD_K8SSE3;
break; // "k8-sse3"
}
*Type = X86::AMD_K8;
break; // "k8"
case 16:
*Type = X86::AMDFAM10H; // "amdfam10"
switch (Model) {
case 2:
*Subtype = X86::AMDFAM10H_BARCELONA;
break;
case 4:
*Subtype = X86::AMDFAM10H_SHANGHAI;
break;
case 8:
*Subtype = X86::AMDFAM10H_ISTANBUL;
break;
}
break;
case 20:
*Type = X86::AMD_BTVER1;
break; // "btver1";
case 21:
*Type = X86::AMDFAM15H;
if (Model >= 0x60 && Model <= 0x7f) {
*Subtype = X86::AMDFAM15H_BDVER4;
break; // "bdver4"; 60h-7Fh: Excavator
}
if (Model >= 0x30 && Model <= 0x3f) {
*Subtype = X86::AMDFAM15H_BDVER3;
break; // "bdver3"; 30h-3Fh: Steamroller
}
if ((Model >= 0x10 && Model <= 0x1f) || Model == 0x02) {
*Subtype = X86::AMDFAM15H_BDVER2;
break; // "bdver2"; 02h, 10h-1Fh: Piledriver
}
if (Model <= 0x0f) {
*Subtype = X86::AMDFAM15H_BDVER1;
break; // "bdver1"; 00h-0Fh: Bulldozer
}
break;
case 22:
*Type = X86::AMD_BTVER2;
break; // "btver2"
case 23:
*Type = X86::AMDFAM17H;
if (Model >= 0x30 && Model <= 0x3f) {
*Subtype = X86::AMDFAM17H_ZNVER2;
break; // "znver2"; 30h-3fh: Zen2
}
if (Model <= 0x0f) {
*Subtype = X86::AMDFAM17H_ZNVER1;
break; // "znver1"; 00h-0Fh: Zen1
}
break;
default:
break; // "generic"
}
}