forked from I2P_Developers/i2p.i2p
Added AVX/AVX2/AVX512/TBM feature detection
This commit is contained in:
@ -23,9 +23,6 @@ class AMDInfoImpl extends CPUIDCPUInfo implements AMDCPUInfo
|
|||||||
private static boolean isExcavatorCompatible;
|
private static boolean isExcavatorCompatible;
|
||||||
|
|
||||||
|
|
||||||
// If modelString != null, the cpu is considered correctly identified.
|
|
||||||
private static final String smodel = identifyCPU();
|
|
||||||
|
|
||||||
public boolean IsK6Compatible(){ return isK6Compatible; }
|
public boolean IsK6Compatible(){ return isK6Compatible; }
|
||||||
|
|
||||||
public boolean IsK6_2_Compatible(){ return isK6_2_Compatible; }
|
public boolean IsK6_2_Compatible(){ return isK6_2_Compatible; }
|
||||||
@ -53,14 +50,14 @@ class AMDInfoImpl extends CPUIDCPUInfo implements AMDCPUInfo
|
|||||||
|
|
||||||
public String getCPUModelString() throws UnknownCPUException
|
public String getCPUModelString() throws UnknownCPUException
|
||||||
{
|
{
|
||||||
|
String smodel = identifyCPU();
|
||||||
if (smodel != null)
|
if (smodel != null)
|
||||||
return smodel;
|
return smodel;
|
||||||
throw new UnknownCPUException("Unknown AMD CPU; Family="+CPUID.getCPUFamily() + '/' + CPUID.getCPUExtendedFamily()+
|
throw new UnknownCPUException("Unknown AMD CPU; Family="+CPUID.getCPUFamily() + '/' + CPUID.getCPUExtendedFamily()+
|
||||||
", Model="+CPUID.getCPUModel() + '/' + CPUID.getCPUExtendedModel());
|
", Model="+CPUID.getCPUModel() + '/' + CPUID.getCPUExtendedModel());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String identifyCPU()
|
||||||
private static String identifyCPU()
|
|
||||||
{
|
{
|
||||||
// http://en.wikipedia.org/wiki/Cpuid
|
// http://en.wikipedia.org/wiki/Cpuid
|
||||||
// #include "llvm/Support/Host.h", http://llvm.org/docs/doxygen/html/Host_8cpp_source.html
|
// #include "llvm/Support/Host.h", http://llvm.org/docs/doxygen/html/Host_8cpp_source.html
|
||||||
@ -196,7 +193,6 @@ class AMDInfoImpl extends CPUIDCPUInfo implements AMDCPUInfo
|
|||||||
isK6_3_Compatible = true;
|
isK6_3_Compatible = true;
|
||||||
isAthlonCompatible = true;
|
isAthlonCompatible = true;
|
||||||
isAthlon64Compatible = true;
|
isAthlon64Compatible = true;
|
||||||
isX64 = true;
|
|
||||||
switch (model) {
|
switch (model) {
|
||||||
case 4:
|
case 4:
|
||||||
modelString = "Athlon 64/Mobile XP-M";
|
modelString = "Athlon 64/Mobile XP-M";
|
||||||
@ -328,7 +324,6 @@ class AMDInfoImpl extends CPUIDCPUInfo implements AMDCPUInfo
|
|||||||
isK6_3_Compatible = true;
|
isK6_3_Compatible = true;
|
||||||
isAthlonCompatible = true;
|
isAthlonCompatible = true;
|
||||||
isAthlon64Compatible = true;
|
isAthlon64Compatible = true;
|
||||||
isX64 = true;
|
|
||||||
switch (model) {
|
switch (model) {
|
||||||
case 2:
|
case 2:
|
||||||
modelString = "Phenom / Athlon / Opteron Gen 3 (Barcelona/Agena/Toliman/Kuma, 65 nm)";
|
modelString = "Phenom / Athlon / Opteron Gen 3 (Barcelona/Agena/Toliman/Kuma, 65 nm)";
|
||||||
@ -365,7 +360,6 @@ class AMDInfoImpl extends CPUIDCPUInfo implements AMDCPUInfo
|
|||||||
isK6_3_Compatible = true;
|
isK6_3_Compatible = true;
|
||||||
isAthlonCompatible = true;
|
isAthlonCompatible = true;
|
||||||
isAthlon64Compatible = true;
|
isAthlon64Compatible = true;
|
||||||
isX64 = true;
|
|
||||||
switch (model) {
|
switch (model) {
|
||||||
case 3:
|
case 3:
|
||||||
modelString = "AMD Turion X2/Athlon X2/Sempron (Lion/Sable, 65 nm)";
|
modelString = "AMD Turion X2/Athlon X2/Sempron (Lion/Sable, 65 nm)";
|
||||||
@ -388,7 +382,6 @@ class AMDInfoImpl extends CPUIDCPUInfo implements AMDCPUInfo
|
|||||||
isK6_3_Compatible = true;
|
isK6_3_Compatible = true;
|
||||||
isAthlonCompatible = true;
|
isAthlonCompatible = true;
|
||||||
isAthlon64Compatible = true;
|
isAthlon64Compatible = true;
|
||||||
isX64 = true;
|
|
||||||
modelString = "AMD APU model " + model;
|
modelString = "AMD APU model " + model;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -401,7 +394,6 @@ class AMDInfoImpl extends CPUIDCPUInfo implements AMDCPUInfo
|
|||||||
isAthlonCompatible = true;
|
isAthlonCompatible = true;
|
||||||
isAthlon64Compatible = true;
|
isAthlon64Compatible = true;
|
||||||
isBobcatCompatible = true;
|
isBobcatCompatible = true;
|
||||||
isX64 = true;
|
|
||||||
switch (model) {
|
switch (model) {
|
||||||
case 1:
|
case 1:
|
||||||
// Case 3 is uncertain but most likely a Bobcat APU
|
// Case 3 is uncertain but most likely a Bobcat APU
|
||||||
@ -423,7 +415,10 @@ class AMDInfoImpl extends CPUIDCPUInfo implements AMDCPUInfo
|
|||||||
isAthlonCompatible = true;
|
isAthlonCompatible = true;
|
||||||
isAthlon64Compatible = true;
|
isAthlon64Compatible = true;
|
||||||
isBulldozerCompatible = true;
|
isBulldozerCompatible = true;
|
||||||
isX64 = true;
|
if (!this.hasAVX()) {
|
||||||
|
modelString = "Bulldozer";
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (model >= 0x50 && model <= 0x5F) {
|
if (model >= 0x50 && model <= 0x5F) {
|
||||||
isPiledriverCompatible = true;
|
isPiledriverCompatible = true;
|
||||||
isSteamrollerCompatible = true;
|
isSteamrollerCompatible = true;
|
||||||
@ -433,7 +428,7 @@ class AMDInfoImpl extends CPUIDCPUInfo implements AMDCPUInfo
|
|||||||
isPiledriverCompatible = true;
|
isPiledriverCompatible = true;
|
||||||
isSteamrollerCompatible = true;
|
isSteamrollerCompatible = true;
|
||||||
modelString = "Steamroller";
|
modelString = "Steamroller";
|
||||||
} else if (model >= 0x10 && model <= 0x1F) {
|
} else if ((model >= 0x10 && model <= 0x1F) || hasTBM()) {
|
||||||
isPiledriverCompatible = true;
|
isPiledriverCompatible = true;
|
||||||
modelString = "Piledriver";
|
modelString = "Piledriver";
|
||||||
} else {
|
} else {
|
||||||
@ -451,17 +446,10 @@ class AMDInfoImpl extends CPUIDCPUInfo implements AMDCPUInfo
|
|||||||
isAthlon64Compatible = true;
|
isAthlon64Compatible = true;
|
||||||
isBobcatCompatible = true;
|
isBobcatCompatible = true;
|
||||||
isJaguarCompatible = true;
|
isJaguarCompatible = true;
|
||||||
isX64 = true;
|
|
||||||
modelString = "Jaguar";
|
modelString = "Jaguar";
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return modelString;
|
return modelString;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasX64()
|
|
||||||
{
|
|
||||||
return isX64;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -7,8 +7,6 @@ package freenet.support.CPUInformation;
|
|||||||
*/
|
*/
|
||||||
abstract class CPUIDCPUInfo implements CPUInfo
|
abstract class CPUIDCPUInfo implements CPUInfo
|
||||||
{
|
{
|
||||||
protected static boolean isX64 = false;
|
|
||||||
|
|
||||||
public String getVendor()
|
public String getVendor()
|
||||||
{
|
{
|
||||||
return CPUID.getCPUVendorID();
|
return CPUID.getCPUVendorID();
|
||||||
@ -16,45 +14,100 @@ abstract class CPUIDCPUInfo implements CPUInfo
|
|||||||
|
|
||||||
public boolean hasMMX()
|
public boolean hasMMX()
|
||||||
{
|
{
|
||||||
return (CPUID.getEDXCPUFlags() & 0x800000) != 0; //EDX Bit 23
|
return (CPUID.getEDXCPUFlags() & (1 << 23)) != 0; //EDX Bit 23
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasSSE(){
|
public boolean hasSSE(){
|
||||||
return (CPUID.getEDXCPUFlags() & 0x2000000) != 0; //EDX Bit 25
|
return (CPUID.getEDXCPUFlags() & (1 << 25)) != 0; //EDX Bit 25
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasSSE2()
|
public boolean hasSSE2()
|
||||||
{
|
{
|
||||||
return (CPUID.getEDXCPUFlags() & 0x4000000) != 0; //EDX Bit 26
|
return (CPUID.getEDXCPUFlags() & (1 << 26)) != 0; //EDX Bit 26
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasSSE3()
|
public boolean hasSSE3()
|
||||||
{
|
{
|
||||||
return (CPUID.getECXCPUFlags() & 0x1) != 0; //ECX Bit 0
|
return (CPUID.getECXCPUFlags() & (1 << 0)) != 0; //ECX Bit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasSSE41()
|
public boolean hasSSE41()
|
||||||
{
|
{
|
||||||
return (CPUID.getECXCPUFlags() & 0x80000) != 0; //ECX Bit 19
|
return (CPUID.getECXCPUFlags() & (1 << 19)) != 0; //ECX Bit 19
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasSSE42()
|
public boolean hasSSE42()
|
||||||
{
|
{
|
||||||
return (CPUID.getECXCPUFlags() & 0x100000) != 0; //ECX Bit 20
|
return (CPUID.getECXCPUFlags() & (1 << 20)) != 0; //ECX Bit 20
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasSSE4A()
|
public boolean hasSSE4A()
|
||||||
{
|
{
|
||||||
return (CPUID.getExtendedECXCPUFlags() & 0x40) != 0; //Extended ECX Bit 6
|
return (CPUID.getExtendedECXCPUFlags() & (1 << 6)) != 0; //Extended ECX Bit 6
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true iff the CPU supports the AVX instruction set.
|
||||||
|
* @since 0.9.21
|
||||||
|
*/
|
||||||
|
public boolean hasAVX()
|
||||||
|
{
|
||||||
|
return (CPUID.getECXCPUFlags() & (1 << 28)) != 0 && //AVX: ECX Bit 28
|
||||||
|
(CPUID.getECXCPUFlags() & (1 << 27)) != 0; //XSAVE enabled by OS: ECX Bit 27
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true iff the CPU supports the AVX2 instruction set.
|
||||||
|
* @since 0.9.21
|
||||||
|
*/
|
||||||
|
public boolean hasAVX2()
|
||||||
|
{
|
||||||
|
return hasAVX() &&
|
||||||
|
(CPUID.getExtendedEBXCPUFlags() & (1 << 5)) != 0; //Extended EBX Bit 5
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true iff the CPU supports the AVX512 instruction set.
|
||||||
|
* @since 0.9.21
|
||||||
|
*/
|
||||||
|
public boolean hasAVX512()
|
||||||
|
{
|
||||||
|
return hasAVX() &&
|
||||||
|
(CPUID.getExtendedEBXCPUFlags() & (1 << 5)) != 0; //Extended EBX Bit 5
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true iff the CPU supports the ADX instruction set.
|
||||||
|
* @since 0.9.21
|
||||||
|
*/
|
||||||
|
public boolean hasADX()
|
||||||
|
{
|
||||||
|
return hasAVX() &&
|
||||||
|
(CPUID.getExtendedEBXCPUFlags() & (1 << 19)) != 0; //Extended EBX Bit 19
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true iff the CPU supports TBM.
|
||||||
|
* @since 0.9.21
|
||||||
|
*/
|
||||||
|
public boolean hasTBM()
|
||||||
|
{
|
||||||
|
return (CPUID.getECXCPUFlags() & (1 << 21)) != 0; //ECX Bit 21
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return true iff the CPU supports the AES-NI instruction set.
|
* @return true iff the CPU supports the AES-NI instruction set.
|
||||||
* @since 0.9.14
|
* @since 0.9.14
|
||||||
*/
|
*/
|
||||||
public boolean hasAES() {
|
public boolean hasAES() {
|
||||||
return (CPUID.getECXCPUFlags() & 0x2000000) != 0; //ECX Bit 25
|
return (CPUID.getECXCPUFlags() & (1 << 25)) != 0; //ECX Bit 25
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract boolean hasX64();
|
/**
|
||||||
|
* @return true iff the CPU supports the 64-bit support
|
||||||
|
* @since 0.9.21
|
||||||
|
*/
|
||||||
|
public boolean hasX64() {
|
||||||
|
return (CPUID.getExtendedEDXCPUFlags() & (1 << 29)) != 0; //Extended EDX Bit 29
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -62,10 +62,39 @@ public interface CPUInfo
|
|||||||
* @return true iff the CPU support the SSE4A instruction set.
|
* @return true iff the CPU support the SSE4A instruction set.
|
||||||
*/
|
*/
|
||||||
public boolean hasSSE4A();
|
public boolean hasSSE4A();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true iff the CPU supports the AVX instruction set.
|
||||||
|
* @since 0.9.21
|
||||||
|
*/
|
||||||
|
public boolean hasAVX();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true iff the CPU supports the AVX2 instruction set.
|
||||||
|
* @since 0.9.21
|
||||||
|
*/
|
||||||
|
public boolean hasAVX2();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true iff the CPU supports the full AVX512 instruction set.
|
||||||
|
* @since 0.9.21
|
||||||
|
*/
|
||||||
|
public boolean hasAVX512();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true iff the CPU supports TBM.
|
||||||
|
* @since 0.9.21
|
||||||
|
*/
|
||||||
|
public boolean hasTBM();
|
||||||
/**
|
/**
|
||||||
* @return true iff the CPU supports the AES-NI instruction set.
|
* @return true iff the CPU supports the AES-NI instruction set.
|
||||||
* @since 0.9.14
|
* @since 0.9.14
|
||||||
*/
|
*/
|
||||||
public boolean hasAES();
|
public boolean hasAES();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return true iff the CPU supports the 64-bit support
|
||||||
|
* @since 0.9.21
|
||||||
|
*/
|
||||||
|
public boolean hasX64();
|
||||||
}
|
}
|
||||||
|
@ -45,7 +45,8 @@ class IntelInfoImpl extends CPUIDCPUInfo implements IntelCPUInfo
|
|||||||
if (smodel != null)
|
if (smodel != null)
|
||||||
return smodel;
|
return smodel;
|
||||||
throw new UnknownCPUException("Unknown Intel CPU; Family="+CPUID.getCPUFamily() + '/' + CPUID.getCPUExtendedFamily()+
|
throw new UnknownCPUException("Unknown Intel CPU; Family="+CPUID.getCPUFamily() + '/' + CPUID.getCPUExtendedFamily()+
|
||||||
", Model="+CPUID.getCPUModel() + '/' + CPUID.getCPUExtendedModel());
|
", Model="+CPUID.getCPUModel() + '/' + CPUID.getCPUExtendedModel()); //
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String identifyCPU()
|
private static String identifyCPU()
|
||||||
@ -148,7 +149,6 @@ class IntelInfoImpl extends CPUIDCPUInfo implements IntelCPUInfo
|
|||||||
isPentium4Compatible = true;
|
isPentium4Compatible = true;
|
||||||
isPentiumMCompatible = true;
|
isPentiumMCompatible = true;
|
||||||
isCore2Compatible = true;
|
isCore2Compatible = true;
|
||||||
isX64 = true;
|
|
||||||
if (extmodel >= 2)
|
if (extmodel >= 2)
|
||||||
isCoreiCompatible = true;
|
isCoreiCompatible = true;
|
||||||
}
|
}
|
||||||
@ -204,7 +204,6 @@ class IntelInfoImpl extends CPUIDCPUInfo implements IntelCPUInfo
|
|||||||
isPentium2Compatible = true;
|
isPentium2Compatible = true;
|
||||||
isPentium3Compatible = true;
|
isPentium3Compatible = true;
|
||||||
isPentiumMCompatible = true;
|
isPentiumMCompatible = true;
|
||||||
isX64 = true;
|
|
||||||
modelString = "Pentium M (Banias)";
|
modelString = "Pentium M (Banias)";
|
||||||
break;
|
break;
|
||||||
case 10:
|
case 10:
|
||||||
@ -221,7 +220,6 @@ class IntelInfoImpl extends CPUIDCPUInfo implements IntelCPUInfo
|
|||||||
isPentium2Compatible = true;
|
isPentium2Compatible = true;
|
||||||
isPentium3Compatible = true;
|
isPentium3Compatible = true;
|
||||||
isPentiumMCompatible = true;
|
isPentiumMCompatible = true;
|
||||||
isX64 = true;
|
|
||||||
modelString = "Core (Yonah)";
|
modelString = "Core (Yonah)";
|
||||||
break;
|
break;
|
||||||
case 14:
|
case 14:
|
||||||
@ -230,7 +228,6 @@ class IntelInfoImpl extends CPUIDCPUInfo implements IntelCPUInfo
|
|||||||
isPentium3Compatible = true;
|
isPentium3Compatible = true;
|
||||||
isPentiumMCompatible = true;
|
isPentiumMCompatible = true;
|
||||||
isCore2Compatible = true;
|
isCore2Compatible = true;
|
||||||
isX64 = true;
|
|
||||||
modelString = "Penryn";
|
modelString = "Penryn";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -256,7 +253,6 @@ class IntelInfoImpl extends CPUIDCPUInfo implements IntelCPUInfo
|
|||||||
// Some support SSE3? true for Pineview? TBD...
|
// Some support SSE3? true for Pineview? TBD...
|
||||||
isCore2Compatible = false;
|
isCore2Compatible = false;
|
||||||
isPentium4Compatible = false;
|
isPentium4Compatible = false;
|
||||||
isX64 = true;
|
|
||||||
modelString = "Atom";
|
modelString = "Atom";
|
||||||
break;
|
break;
|
||||||
// Penryn 45 nm
|
// Penryn 45 nm
|
||||||
@ -345,6 +341,19 @@ class IntelInfoImpl extends CPUIDCPUInfo implements IntelCPUInfo
|
|||||||
isBroadwellCompatible = true;
|
isBroadwellCompatible = true;
|
||||||
modelString = "Broadwell";
|
modelString = "Broadwell";
|
||||||
break;
|
break;
|
||||||
|
// Ivy Bridge 22 nm
|
||||||
|
case 0x3e:
|
||||||
|
isSandyCompatible = true;
|
||||||
|
isIvyCompatible = true;
|
||||||
|
modelString = "Ivy Bridge";
|
||||||
|
break;
|
||||||
|
// Haswell 22 nm
|
||||||
|
case 0x3f:
|
||||||
|
isSandyCompatible = true;
|
||||||
|
isIvyCompatible = true;
|
||||||
|
isHaswellCompatible = true;
|
||||||
|
modelString = "Haswell";
|
||||||
|
break;
|
||||||
|
|
||||||
// following are for extended model == 4
|
// following are for extended model == 4
|
||||||
// most flags are set above
|
// most flags are set above
|
||||||
@ -410,11 +419,9 @@ class IntelInfoImpl extends CPUIDCPUInfo implements IntelCPUInfo
|
|||||||
modelString = "Pentium IV (90 nm)";
|
modelString = "Pentium IV (90 nm)";
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
isX64 = true;
|
|
||||||
modelString = "Pentium IV (90 nm)";
|
modelString = "Pentium IV (90 nm)";
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
isX64 = true;
|
|
||||||
modelString = "Pentium IV (65 nm)";
|
modelString = "Pentium IV (65 nm)";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -432,8 +439,4 @@ class IntelInfoImpl extends CPUIDCPUInfo implements IntelCPUInfo
|
|||||||
}
|
}
|
||||||
return modelString;
|
return modelString;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasX64() {
|
|
||||||
return isX64;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user