分享
 
 
 

cpu support code

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

#ifndef CPU_SUPPORT_H

#define CPU_SUPPORT_H

#define CPU_SUPPORTS_CPUID (0x00000001L)

#define CPU_SUPPORTS_FPU (0x00000002L)

#define CPU_SUPPORTS_MMX (0x00000004L)

#define CPU_SUPPORTS_INTEGER_SSE (0x00000008L)

#define CPU_SUPPORTS_SSE (0x00000010L)

#define CPU_SUPPORTS_SSE2 (0x00000020L)

#define CPU_SUPPORTS_3DNOW (0x00000040L)

#define CPU_SUPPORTS_3DNOW_EXT (0x00000080L)

long CPUGetSupportedExtensions();

#endif

--------------------------------------------------------------------------------------------------------------

#include <wtypes.h>

#include <winnt.h>

#include "cpusupport.h"

static long g_lCPUExtensionsAvailable;

// This is ridiculous ???

static long CPUCheckForSSESupport() {

__try

{

// __asm andps xmm0,xmm0

__asm _emit 0x0f

__asm _emit 0x54

__asm _emit 0xc0

}

__except(EXCEPTION_EXECUTE_HANDLER)

{

// The operating system does not recognize andps. Reset them.

if (_exception_code() == STATUS_ILLEGAL_INSTRUCTION)

g_lCPUExtensionsAvailable &= ~(CPU_SUPPORTS_SSE|CPU_SUPPORTS_SSE2);

}

return g_lCPUExtensionsAvailable;

}

long __declspec(naked) CPUGetSupportedExtensions() {

__asm {

push ebp

push edi

push esi

push ebx

xor ebp,ebp ;cpu flags - if we don't have CPUID, we probably

;won't want to try FPU optimizations.

;check for CPUID.

pushfd ;flags -> EAX

pop eax

or eax,00200000h ;set the ID bit

push eax ;EAX -> flags

popfd

pushfd ;flags -> EAX

pop eax

and eax,00200000h ;ID bit set?

jz done ;nope...

;CPUID exists, check for features register.

mov ebp,00000003h

xor eax,eax

cpuid

or eax,eax

jz done ;no features register?!?

;features register exists, look for MMX, SSE, SSE2.

mov eax,1

cpuid

mov ebx,edx

and ebx,00800000h ;MMX is bit 23

shr ebx,21

or ebp,ebx ;set bit 2 if MMX exists

mov ebx,edx

and edx,02000000h ;SSE is bit 25

shr edx,25

neg edx

and edx,00000018h ;set bits 3 and 4 if SSE exists

or ebp,edx

and ebx,04000000h ;SSE2 is bit 26

shr ebx,21

and ebx,00000020h ;set bit 5

or ebp,ebx

;check for vendor feature register (K6/Athlon).

mov eax,80000000h

cpuid

mov ecx,80000001h

cmp eax,ecx

jb done

;vendor feature register exists, look for 3DNow! and Athlon extensions

mov eax,ecx

cpuid

mov eax,edx

and edx,80000000h ;3DNow! is bit 31

shr edx,25

or ebp,edx ;set bit 6

mov edx,eax

and eax,40000000h ;3DNow!2 is bit 30

shr eax,23

or ebp,eax ;set bit 7

and edx,00400000h ;AMD MMX extensions (integer SSE) is bit 22

shr edx,19

or ebp,edx

done:

mov eax,ebp

mov g_lCPUExtensionsAvailable, ebp

;Full SSE and SSE-2 require OS support for the xmm* registers.

test eax,00000030h

jz nocheck

call CPUCheckForSSESupport

nocheck:

pop ebx

pop esi

pop edi

pop ebp

ret

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有