static void getAMDProcessorTypeAndSubtype()

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"
  }
}