资源介绍
#include "StdAfx.h"
#include "cpuassembly.h"
// bit flags set by cpuid when called with register eax set to 1
#define MMX_SUPPORTED 0x00800000
#define SSE_SUPPORTED 0x02000000
#define SSE2_SUPPORTED 0x04000000
#define AMD_3DNOW_SUPPORTED 0x80000000
// AMD specific
#define AMD_3DNOW_EX_SUPPORTED 0x40000000
#define AMD_MMX_EX_SUPPORTED 0x00400000
#define SUPPORT_MMX 0x0001
#define SUPPORT_3DNOW 0x0002
#define SUPPORT_SSE 0x0004
#define SUPPORT_SSE2 0x0008
CPUAssembly::CPUAssembly(void)
{
memset(&sCPUInfo, 0, sizeof(sCPUInfo));
}
CPUAssembly::~CPUAssembly(void)
{
}
bool CPUAssembly::IsCPUID() const
{
__try
{
_asm
{
xor eax, eax
cpuid
}
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
return false;
}
return true;
}
bool CPUAssembly::QueryCPUInfo()
{
if (!IsCPUID())
return false;
memset(&sCPUInfo, 0, sizeof(sCPUInfo));
DWORD dwStandard = 0;
DWORD dwFeature = 0;
DWORD dwMax = 0;
DWORD dwExt = 0;
int feature = 0;
int os_support = 0;
union {
char cBuffer[12+1];
struct {
DWORD dw0;
DWORD dw1;
DWORD dw2;
} stc;
} Vendor;
memset(&Vendor, 0, sizeof(Vendor));
_asm {
push ebx
push ecx
push edx
// get the vendor string
xor eax, eax
cpuid
mov dwMax, eax
mov Vendor.stc.dw0, ebx
mov Vendor.stc.dw1, edx
mov Vendor.stc.dw2, ecx
// get the Standard bits
mov eax, 1
cpuid
mov dwStandard, eax
mov dwFeature, edx
// get AMD-specials
mov eax, 80000000h
cpuid
cmp eax, 80000000h
jc notamd
mov eax, 80000001h
cpuid
mov dwExt, edx
notamd:
pop ecx
pop ebx
pop edx
}
if (dwFeature & MMX_SUPPORTED)
sCPUInfo.dwFeatures |= SUPPORT_MMX;
if (dwExt & AMD_3DNOW_SUPPORTED)
sCPUInfo.dwFeatures |= SUPPORT_3DNOW;
if (dwFeature & SSE_SUPPORTED)
sCPUInfo.dwFeatures |= SUPPORT_SSE;
if (dwFeature & SSE2_SUPPORTED)
sCPUInfo.dwFeatures |= SUPPORT_SSE2;
sCPUInfo.iFamily = (short int)((dwStandard >> 8) & 0xF); // retrieve family
if (sCPUInfo.iFamily == 15) // retrieve extended family
sCPUInfo.iFamilyEx = (dwStandard >> 16) & 0xFF0;
sCPUInfo.iModel = (short int)((dwStandard >> 4) & 0xF); // retrieve model
if (sCPUInfo.iModel == 15) // retrieve extended model
sCPUInfo.iModelEx = (dwStandard >> 12) & 0xF;
sCPUInfo.iStepping = (short int)((dwStandard) & 0xF); // retrieve stepping
strcpy(sCPUInfo.sVendorName, Vendor.cBuffer);
sCPUInfo.iSpeed = ICPUInfo::GetSpeed();
strcpy(sCPUInfo.sProcessorName, ICPUInfo::GetCPUName(sCPUInfo.sVendorName,
sCPUInfo.iFamily, sCPUInfo.iModel,
sCPUInfo.iFamilyEx, sCPUInfo.iModelEx).c_str());
return true;
}
unsigned int CPUAssembly::GetSpeedMHz() const
{
return (unsigned int)(sCPUInfo.iSpeed/(1024*1024));
}
std::string CPUAssembly::GetCPUName() const
{
return sCPUInfo.sProcessorName;
}
std::string CPUAssembly::GetVendorName() const
{
return sCPUInfo.sVendorName;
}
short int CPUAssembly::GetCPUFamily() const
{
return sCPUInfo.iFamily;
}
short int CPUAssembly::GetCPUModel() const
{
return sCPUInfo.iModel;
}
short int CPUAssembly::GetCPUStepping() const
{
return sCPUInfo.iStepping;
}
bool CPUAssembly::IsMMXSupported() const
{
return ((sCPUInfo.dwFeatures & SUPPORT_MMX) == SUPPORT_MMX);
}
bool CPUAssembly::IsSSESupported() const
{
return ((sCPUInfo.dwFeatures & SUPPORT_SSE) == SUPPORT_SSE);
}
bool CPUAssembly::IsSSE2Supported() const
{
return ((sCPUInfo.dwFeatures & SUPPORT_SSE2) == SUPPORT_SSE2);
}
bool CPUAssembly::Is3DNowSupported() const
{
return ((sCPUInfo.dwFeatures & SUPPORT_3DNOW) == SUPPORT_3DNOW);
}
- 上一篇: 易语言CPU优化
- 下一篇: 易语言多线程例子,可以学一下