package freenet.support.CPUInformation; /** * Moved out of CPUID.java * * Ref: http://en.wikipedia.org/wiki/List_of_AMD_CPU_microarchitectures * * @since 0.8.7 */ class AMDInfoImpl extends CPUIDCPUInfo implements AMDCPUInfo { private static boolean isK6Compatible; private static boolean isK6_2_Compatible; private static boolean isK6_3_Compatible; private static boolean isGeodeCompatible; private static boolean isAthlonCompatible; private static boolean isAthlon64Compatible; private static boolean isK10Compatible; private static boolean isBobcatCompatible; private static boolean isJaguarCompatible; private static boolean isBulldozerCompatible; private static boolean isPiledriverCompatible; private static boolean isSteamrollerCompatible; private static boolean isExcavatorCompatible; public boolean IsK6Compatible(){ return isK6Compatible; } public boolean IsK6_2_Compatible(){ return isK6_2_Compatible; } public boolean IsK6_3_Compatible(){ return isK6_3_Compatible; } public boolean IsGeodeCompatible(){ return isGeodeCompatible; } public boolean IsAthlonCompatible(){ return isAthlonCompatible; } public boolean IsAthlon64Compatible(){ return isAthlon64Compatible; } public boolean IsK10Compatible(){ return isK10Compatible; } public boolean IsBobcatCompatible(){ return isBobcatCompatible; } public boolean IsJaguarCompatible(){ return isJaguarCompatible; } public boolean IsBulldozerCompatible(){ return isBulldozerCompatible; } public boolean IsPiledriverCompatible(){ return isPiledriverCompatible; } public boolean IsSteamrollerCompatible(){ return isSteamrollerCompatible; } public boolean IsExcavatorCompatible(){ return isExcavatorCompatible; } public String getCPUModelString() throws UnknownCPUException { String smodel = identifyCPU(); if (smodel != null) return smodel; throw new UnknownCPUException("Unknown AMD CPU; Family="+CPUID.getCPUFamily() + '/' + CPUID.getCPUExtendedFamily()+ ", Model="+CPUID.getCPUModel() + '/' + CPUID.getCPUExtendedModel()); } private String identifyCPU() { // http://en.wikipedia.org/wiki/Cpuid // #include "llvm/Support/Host.h", http://llvm.org/docs/doxygen/html/Host_8cpp_source.html String modelString = null; int family = CPUID.getCPUFamily(); int model = CPUID.getCPUModel(); if (family == 15) { family += CPUID.getCPUExtendedFamily(); model += CPUID.getCPUExtendedModel() << 4; } switch (family) { //i486 class (Am486, 5x86) case 4: { switch (model) { case 3: modelString = "486 DX/2"; break; case 7: modelString = "486 DX/2-WB"; break; case 8: modelString = "486 DX/4"; break; case 9: modelString = "486 DX/4-WB"; break; case 14: modelString = "Am5x86-WT"; break; case 15: modelString = "Am5x86-WB"; break; default: modelString = "AMD 486/586 model " + model; break; } } break; //i586 class (K5/K6/K6-2/K6-III) // ref: http://support.amd.com/TechDocs/20734.pdf case 5: { isK6Compatible = true; switch (model) { case 0: modelString = "K5/SSA5"; break; case 1: case 2: case 3: modelString = "K5"; break; case 4: isK6Compatible = false; isGeodeCompatible = true; modelString = "Geode GX1/GXLV/GXm"; break; case 5: isK6Compatible = false; isGeodeCompatible = true; modelString = "Geode GX2/LX"; break; case 6: case 7: modelString = "K6"; break; case 8: isK6_2_Compatible = true; modelString = "K6-2"; break; case 9: isK6_2_Compatible = true; isK6_3_Compatible = true; modelString = "K6-3"; break; case 13: isK6_2_Compatible = true; modelString = "K6-2+ or K6-III+"; break; default: modelString = "AMD K5/K6 model " + model; break; } } break; //i686 class (Athlon/Athlon XP/Duron/K7 Sempron) // ref: http://support.amd.com/TechDocs/20734.pdf case 6: { isK6Compatible = true; isK6_2_Compatible = true; isK6_3_Compatible = true; isAthlonCompatible = true; switch (model) { case 0: case 1: modelString = "Athlon (250 nm)"; break; case 2: modelString = "Athlon (180 nm)"; break; case 3: modelString = "Duron"; break; case 4: modelString = "Athlon (Thunderbird)"; break; case 6: modelString = "Athlon (Palamino)"; break; case 7: modelString = "Duron (Morgan)"; break; case 8: modelString = "Athlon (Thoroughbred)"; break; case 10: modelString = "Athlon (Barton)"; break; default: modelString = "AMD Athlon/Duron model " + model; break; } } break; //AMD64 class (A64/Opteron/A64 X2/K8 Sempron/Turion/Second-Generation Opteron/Athlon Neo) // ref: http://support.amd.com/TechDocs/33610.PDF case 15: { isK6Compatible = true; isK6_2_Compatible = true; isK6_3_Compatible = true; isAthlonCompatible = true; isAthlon64Compatible = true; switch (model) { case 4: modelString = "Athlon 64/Mobile XP-M"; break; case 5: modelString = "Athlon 64 FX Opteron"; break; case 7: modelString = "Athlon 64 FX (Sledgehammer S939, 130 nm)"; break; case 8: modelString = "Mobile A64/Sempron/XP-M"; break; case 11: modelString = "Athlon 64 (Clawhammer S939, 130 nm)"; break; case 12: case 14: modelString = "Athlon 64/Sempron (Newcastle S754, 130 nm)"; break; case 15: modelString = "Athlon 64/Sempron (Clawhammer S939, 130 nm)"; break; // everything below here was broken prior to 0.9.16 case 18: modelString = "Sempron (Palermo, 90 nm)"; break; case 20: modelString = "Athlon 64 (Winchester S754, 90 nm)"; break; case 23: modelString = "Athlon 64 (Winchester S939, 90 nm)"; break; case 24: modelString = "Mobile A64/Sempron/XP-M (Winchester S754, 90 nm)"; break; case 26: modelString = "Athlon 64 (Winchester S939, 90 nm)"; break; case 27: modelString = "Athlon 64/Sempron (Winchester/Palermo 90 nm)"; break; case 28: modelString = "Sempron (Palermo, 90 nm)"; break; case 31: modelString = "Athlon 64/Sempron (Winchester/Palermo, 90 nm)"; break; case 33: modelString = "Dual-Core Opteron (Italy-Egypt S940, 90 nm)"; break; case 35: modelString = "Athlon 64 X2/A64 FX/Opteron (Toledo/Denmark S939, 90 nm)"; break; case 36: modelString = "Mobile A64/Turion (Lancaster/Richmond/Newark, 90 nm)"; break; case 37: modelString = "Opteron (Troy/Athens S940, 90 nm)"; break; case 39: modelString = "Athlon 64 (San Diego, 90 nm)"; break; case 43: modelString = "Athlon 64 X2 (Manchester, 90 nm)"; break; case 44: modelString = "Sempron/mobile Sempron (Palermo/Albany/Roma S754, 90 nm)"; break; case 47: modelString = "Athlon 64/Sempron (Venice/Palermo S939, 90 nm)"; break; case 65: modelString = "Second-Generaton Opteron (Santa Rosa S1207, 90 nm)"; break; case 67: modelString = "Athlon 64 X2/2nd-gen Opteron (Windsor/Santa Rosa, 90 nm)"; break; case 72: modelString = "Athlon 64 X2/Turion 64 X2 (Windsor/Taylor/Trinidad, 90 nm)"; break; case 75: modelString = "Athlon 64 X2 (Windsor, 90 nm)"; break; case 76: modelString = "Mobile A64/mobile Sempron/Turion (Keene/Trinidad/Taylor, 90 nm)"; break; case 79: modelString = "Athlon 64/Sempron (Orleans/Manila AM2, 90 nm)"; break; case 93: modelString = "Opteron Gen 2 (Santa Rosa, 90 nm)"; break; case 95: modelString = "A64/Sempron/mobile Sempron (Orleans/Manila/Keene, 90 nm)"; break; case 104: modelString = "Turion 64 X2 (Tyler S1, 65 nm)"; break; case 107: modelString = "Athlon 64 X2/Sempron X2/Athlon Neo X2 (Brisbane/Huron, 65 nm)"; break; case 108: modelString = "A64/Athlon Neo/Sempron/Mobile Sempron (Lima/Huron/Sparta/Sherman, 65 nm)"; break; case 111: modelString = "Neo/Sempron/mobile Sempron (Huron/Sparta/Sherman, 65 nm)"; break; case 124: modelString = "Athlon/Sempron/mobile Sempron (Lima/Sparta/Sherman, 65 nm)"; break; case 127: modelString = "A64/Athlon Neo/Sempron/mobile Sempron (Lima/Huron/Sparta/Sherman, 65 nm)"; break; case 193: modelString = "Athlon 64 FX (Windsor S1207 90 nm)"; break; default: modelString = "AMD Athlon/Duron/Sempron model " + model; break; } } break; //Stars (Phenom II/Athlon II/Third-Generation Opteron/Opteron 4100 & 6100/Sempron 1xx) case 16: { isK6Compatible = true; isK6_2_Compatible = true; isK6_3_Compatible = true; isAthlonCompatible = true; isAthlon64Compatible = true; isK10Compatible = true; switch (model) { case 2: modelString = "Phenom / Athlon / Opteron Gen 3 (Barcelona/Agena/Toliman/Kuma, 65 nm)"; break; case 4: modelString = "Phenom II / Opteron Gen 3 (Shanghai/Deneb/Heka/Callisto, 45 nm)"; break; case 5: modelString = "Athlon II X2/X3/X4 (Regor/Rana/Propus AM3, 45 nm)"; break; case 6: modelString = "Mobile Athlon II/Turion II/Phenom II/Sempron/V-series (Regor/Caspian/Champlain, 45 nm)"; break; case 8: modelString = "Six-Core Opteron/Opteron 4100 series (Istanbul/Lisbon, 45 nm)"; break; case 9: modelString = "Opteron 6100 series (Magny-Cours G34, 45 nm)"; break; case 10: modelString = "Phenom II X4/X6 (Zosma/Thuban AM3, 45 nm)"; break; default: modelString = "AMD Athlon/Opteron model " + model; break; } } break; //K8 mobile+HT3 (Turion X2/Athlon X2/Sempron) case 17: { isK6Compatible = true; isK6_2_Compatible = true; isK6_3_Compatible = true; isAthlonCompatible = true; isAthlon64Compatible = true; switch (model) { case 3: modelString = "AMD Turion X2/Athlon X2/Sempron (Lion/Sable, 65 nm)"; break; default: modelString = "AMD Athlon/Turion/Sempron model " + model; break; } } break; // APUs // http://en.wikipedia.org/wiki/List_of_AMD_Accelerated_Processing_Unit_microprocessors // 1st gen Llano high perf / Brazos low power // 2nd gen Trinity high perf / Brazos 2 low power // 3rd gen Kaveri high perf / Kabini/Temash low power case 18: { isK6Compatible = true; isK6_2_Compatible = true; isK6_3_Compatible = true; isAthlonCompatible = true; isAthlon64Compatible = true; modelString = "AMD APU model " + model; } break; //Bobcat case 20: { isK6Compatible = true; isK6_2_Compatible = true; isK6_3_Compatible = true; isAthlonCompatible = true; isAthlon64Compatible = true; isBobcatCompatible = true; switch (model) { case 1: // Case 3 is uncertain but most likely a Bobcat APU case 3: modelString = "AMD Bobcat APU"; break; default: modelString = "AMD Bobcat APU model " + model; break; } } break; //Bulldozer case 21: { isK6Compatible = true; isK6_2_Compatible = true; isK6_3_Compatible = true; isAthlonCompatible = true; isAthlon64Compatible = true; isBulldozerCompatible = true; if (!this.hasAVX()) { modelString = "Bulldozer"; break; } if (model >= 0x50 && model <= 0x5F) { isPiledriverCompatible = true; isSteamrollerCompatible = true; isExcavatorCompatible = true; modelString = "Excavator"; } else if (model >= 0x30 && model <= 0x3F) { isPiledriverCompatible = true; isSteamrollerCompatible = true; modelString = "Steamroller"; } else if ((model >= 0x10 && model <= 0x1F) || hasTBM()) { isPiledriverCompatible = true; modelString = "Piledriver"; } else { modelString = "Bulldozer"; } } break; //Jaguar case 22: { isK6Compatible = true; isK6_2_Compatible = true; isK6_3_Compatible = true; isAthlonCompatible = true; isAthlon64Compatible = true; isBobcatCompatible = true; isJaguarCompatible = true; modelString = "Jaguar"; } break; //Ryzen 7 (model 1), Ryzen 5 TBD // untested case 23: { // Quote wikipedia: // Zen is a clean sheet design that differs from the long-standing Bulldozer architecture. // All models support: x87, MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AES, CLMUL, // AVX, AVX2, FMA, CVT16/F16C, ABM, BMI1, BMI2, SHA. isK6Compatible = true; isK6_2_Compatible = true; isK6_3_Compatible = true; isAthlonCompatible = true; isAthlon64Compatible = true; // Pending testing of the bulldozer jbigi //isPiledriverCompatible = true; //isSteamrollerCompatible = true; //isExcavatorCompatible = true; //isBulldozerCompatible = true; if (model == 1) modelString = "Ryzen 7"; else modelString = "Ryzen model " + model; } break; } return modelString; } }