package freenet.support.CPUInformation;
/**
* Moved out of CPUID.java
* Ref: http://en.wikipedia.org/wiki/CPUID
* @since 0.8.7
*/
class CPUIDCPUInfo implements CPUInfo
{
public String getVendor()
{
return CPUID.getCPUVendorID();
}
public boolean hasMMX()
{
return (CPUID.getEDXCPUFlags() & (1 << 23)) != 0; //EDX Bit 23
}
public boolean hasSSE(){
return (CPUID.getEDXCPUFlags() & (1 << 25)) != 0; //EDX Bit 25
}
public boolean hasSSE2()
{
return (CPUID.getEDXCPUFlags() & (1 << 26)) != 0; //EDX Bit 26
}
public boolean hasSSE3()
{
return (CPUID.getECXCPUFlags() & (1 << 0)) != 0; //ECX Bit 0
}
public boolean hasSSE41()
{
return (CPUID.getECXCPUFlags() & (1 << 19)) != 0; //ECX Bit 19
}
public boolean hasSSE42()
{
return (CPUID.getECXCPUFlags() & (1 << 20)) != 0; //ECX Bit 20
}
public boolean hasSSE4A()
{
return (CPUID.getExtendedECXCPUFlags() & (1 << 6)) != 0; //Extended ECX Bit 6
}
/**
* @return true iff the CPU supports the AVX instruction set.
* @since 0.9.26
*/
public boolean hasAVX()
{
int ecx = CPUID.getECXCPUFlags();
return (ecx & (1 << 28)) != 0 && //AVX: ECX Bit 28
(ecx & (1 << 27)) != 0; //XSAVE enabled by OS: ECX Bit 27
}
/**
* @return true iff the CPU supports the AVX2 instruction set.
* @since 0.9.26
*/
public boolean hasAVX2() {
return (CPUID.getExtendedEBXFeatureFlags() & (1 << 5)) != 0; //Extended EBX Feature Bit 5
}
/**
* Does the CPU supports the AVX-512 Foundation instruction set?
*
* Quote wikipedia:
*
* AVX-512 consists of multiple extensions not all meant to be supported
* by all processors implementing them. Only the core extension AVX-512F
* (AVX-512 Foundation) is required by all implementations.
*
* ref: https://en.wikipedia.org/wiki/AVX-512
*
* @return true iff the CPU supports the AVX-512 Foundation instruction set.
* @since 0.9.26
*/
public boolean hasAVX512()
{
return (CPUID.getExtendedEBXFeatureFlags() & (1 << 16)) != 0; //Extended EBX Bit 16
}
/**
*
* Intel Multi-Precision Add-Carry Instruction Extensions
* Available in Broadwell.
* Unused until GMP 6.1.
*
* @return true iff the CPU supports the ADX instruction set.
* @since 0.9.26
*/
public boolean hasADX()
{
return (CPUID.getExtendedEBXFeatureFlags() & (1 << 19)) != 0; //Extended EBX Bit 19
}
/**
* @return true iff the CPU supports TBM.
* @since 0.9.26
*/
public boolean hasTBM()
{
return (CPUID.getECXCPUFlags() & (1 << 21)) != 0; //ECX Bit 21
}
/**
* @return true iff the CPU supports the AES-NI instruction set.
* @since 0.9.14
*/
public boolean hasAES() {
return (CPUID.getECXCPUFlags() & (1 << 25)) != 0; //ECX Bit 25
}
/**
* @return true iff the CPU supports the 64-bit support
* @since 0.9.26
*/
public boolean hasX64() {
return (CPUID.getExtendedEDXCPUFlags() & (1 << 29)) != 0; //Extended EDX Bit 29
}
/**
* @return true iff the CPU supports the BMI1 instruction set.
* @since 0.9.26
*/
public boolean hasBMI1() {
return (CPUID.getExtendedEBXFeatureFlags() & (1 << 3)) != 0; // Extended EBX Feature Bit 3
}
/**
* @return true iff the CPU supports the BMI2 instruction set.
* @since 0.9.26
*/
public boolean hasBMI2() {
return (CPUID.getExtendedEBXFeatureFlags() & (1 << 8)) != 0; // Extended EBX Feature Bit 8
}
/**
* @return true iff the CPU supports the FMA3 instruction set.
* @since 0.9.26
*/
public boolean hasFMA3() {
return (CPUID.getECXCPUFlags() & (1 << 12)) != 0; // ECX Bit 12
}
/**
* @return true iff the CPU supports the MOVBE instruction set.
* @since 0.9.26
*/
public boolean hasMOVBE() {
return (CPUID.getECXCPUFlags() & (1 << 22)) != 0; // ECX Bit 22
}
/**
* Also known as LZCNT
* @return true iff the CPU supports the ABM instruction set.
* @since 0.9.26
*/
public boolean hasABM() {
return (CPUID.getExtendedECXCPUFlags() & (1 << 5)) != 0; // Extended ECX Bit 5
}
@Override
public String getCPUModelString() throws UnknownCPUException {
throw new UnknownCPUException("Class CPUIDCPUInfo cannot indentify CPUs");
}
}