📄 cpuid.c
字号:
/*CPUID.C*/
#include <windows.h>
#include "defs.h"
#define _MMX_FEATURE_BIT 0x00800000
#define _SSE_FEATURE_BIT 0x02000000
#define _SSE2_FEATURE_BIT 0x04000000
// This bit is set when cpuid is called with
// register set to 80000001h (only applicable to AMD)
#define _3DNOW_FEATURE_BIT 0x80000000
typedef unsigned long DWORD;
int G722_IsCPUID()
{
__try {
_asm
{
xor eax, eax
cpuid
}
} __except ( EXCEPTION_EXECUTE_HANDLER) {
return 0;
}
return 1;
}
int G722_os_support(int feature)
{
__try
{
switch (feature)
{
case _CPU_FEATURE_SSE:
__asm {
xorps xmm0, xmm0 // __asm _emit 0x0f __asm _emit 0x57 __asm _emit 0xc0
// executing SSE instruction
}
break;
case _CPU_FEATURE_SSE2:
__asm {
__asm _emit 0x66 __asm _emit 0x0f __asm _emit 0x57 __asm _emit 0xc0
// xorpd xmm0, xmm0
// executing WNI instruction
}
break;
case _CPU_FEATURE_3DNOW:
__asm {
__asm _emit 0x0f __asm _emit 0x0f __asm _emit 0xc0 __asm _emit 0x96
// pfrcp mm0, mm0
// executing 3Dnow instruction
}
break;
case _CPU_FEATURE_MMX:
__asm {
pxor mm0, mm0 // executing MMX instruction
}
break;
}
} __except (EXCEPTION_EXECUTE_HANDLER) {
if (_exception_code() == STATUS_ILLEGAL_INSTRUCTION) {
return (0);
}
return (0);
}
return 1;
}
int G722_GetCPUID ()
{
DWORD dwStandard = 0;
DWORD dwFeature = 0;
DWORD dwMax = 0;
DWORD dwExt = 0;
int feature = 0, os_support = 0;
union
{
char cBuf[12+1];
struct
{
DWORD dw0;
DWORD dw1;
DWORD dw2;
};
} Ident;
if (!G722_IsCPUID())
{
return 0;
}
_asm
{
push ebx
push ecx
push edx
// get the vendor string
xor eax,eax
cpuid
mov dwMax,eax
mov Ident.dw0,ebx
mov Ident.dw1,edx
mov Ident.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_FEATURE_BIT)
{
feature |= _CPU_FEATURE_MMX;
if (G722_os_support(_CPU_FEATURE_MMX))
os_support |= _CPU_FEATURE_MMX;
}
if (dwExt & _3DNOW_FEATURE_BIT)
{
feature |= _CPU_FEATURE_3DNOW;
if (G722_os_support(_CPU_FEATURE_3DNOW))
os_support |= _CPU_FEATURE_3DNOW;
}
if (dwFeature & _SSE_FEATURE_BIT)
{
feature |= _CPU_FEATURE_SSE;
if (G722_os_support(_CPU_FEATURE_SSE))
os_support |= _CPU_FEATURE_SSE;
}
if (dwFeature & _SSE2_FEATURE_BIT)
{
feature |= _CPU_FEATURE_SSE2;
if (G722_os_support(_CPU_FEATURE_SSE2))
os_support |= _CPU_FEATURE_SSE2;
}
__asm emms;
return feature;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -