;- Ermittlung einiger Prozessor-Eigenschaften, "Helle" Klaus Helbing, 21.06.2007, PB4.02 Global mmx.c = 151 ;erstmal auf "-" setzen für nicht vorhanden Global dnow.c = 151 Global ednow.c = 151 Global cmov.c = 151 Global sse.c = 151 Global sse2.c = 151 Global sse3.c = 151 Global ssse3.c = 151 Global sse41.c = 151 Global sse42.c = 151 Global popcnt.c = 151 Global Bit0.l = $1 ;für SSE3 Global Bit9.l = $200 ;für SSSE3 Global Bit15.l = $8000 ;für CMOVcc Global Bit19.l = $80000 ;für SSE4.1 Global Bit20.l = $100000 ;für SSE4.2 Global Bit21.l = $200000 ;für EFlag Global Bit23.l = $800000 ;für MMX und POPCNT Global Bit25.l = $2000000 ;für SSE Global Bit26.l = $4000000 ;für SSE2 Global Bit30.l = $40000000 ;für extended 3DNow! Global Bit31.l = $80000000 ;für 3DNow! Global Name$ = "Der getestete Prozessor unterstützt :" Global MMX$ = "MMX : " Global DNOW$ = "3DNow! : " Global EDNOW$ = "ext3DNow! : " Global CMOV$ = "CMOVcc : " Global SSE$ = "SSE : " Global SSE2$ = "SSE2 : " Global SSE3$ = "SSE3 : " Global SSSE3$ = "SSSE3 : " Global SSE41$ = "SSE4.1 : " Global SSE42$ = "SSE4.2 : " Global POPCNT$ = "POPCNT : " ;-------- Test, ob der CPUID-Befehl überhaupt vom Prozessor verarbeitet werden kann ;-------- ist möglich, wenn Bit21 des EFlag-Registers verändert werden kann !pushfd ;das EFlag-Register (32-Bit) auf den Stack !pop eax ;rein in EAX !mov edx,eax ;EAX unverändert lassen !xor edx,[v_Bit21] ;Bit21 kippen !push edx !popfd ;in EFlag schreiben !pushfd ;wieder auf Stack !pop edx !push eax ;der Ordnung halber alten Wert wieder herstellen !popfd !cmp eax,edx !jne l_iscpuid ;sind nicht gleich -> CPUID ist möglich MessageRequester("Status", "Der getestete Prozessor unterstützt den CPUID-Befehl nicht und somit weder MMX oder SSE !") End IsCPUID: ;------------------------------------------------------------------------------ ;-------- Test auf MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2 und POPCNT ;-------- vorhanden, wenn im Rückgaberegister EDX bzw. ECX die entsprechenden Bits gesetzt sind !mov eax,1h !cpuid !test edx,[v_Bit23] ;MMX !jz l_nommx !mov [v_mmx],2bh ;"+" für vorhanden NOMMX: !test edx,[v_Bit25] ;SSE !jz l_nosse !mov [v_sse],2bh NOSSE: !test edx,[v_Bit26] ;SSE2 !jz l_nosse2 !mov [v_sse2],2bh NOSSE2: !test ecx,[v_Bit0] ;SSE3 !jz l_nosse3 !mov [v_sse3],2bh NOSSE3: !test ecx,[v_Bit9] ;SSSE3 !jz l_nossse3 !mov [v_ssse3],2bh NOSSSE3: !test ecx,[v_Bit19] ;SSE4.1 !jz l_nosse41 !mov [v_sse41],2bh NOSSE41: !test ecx,[v_Bit20] ;SSE4.2 !jz l_nosse42 !mov [v_sse42],2bh NOSSE42: !test ecx,[v_Bit23] ;POPCNT !jz l_nopopcnt !mov [v_popcnt],2bh NOPOPCNT: ;-------- Test auf CMOVcc (bedingtes Kopieren) !test edx,[v_Bit15] !jz l_nocmov !mov [v_cmov],2bh NOCMOV: ;------------------------------------------------------------------------------ ;-------- Anzahl der vorhandenen extended levels ermitteln als Vorstufe für 3DNow!-Test ;-------- Rückgabewert in EAX (-80000000h) gibt Anzahl der extended level an !mov eax,80000000h !cpuid !cmp eax,80000000h ;hat nichts mit einem Bit zu tun! !jbe l_noext ;keine extended levels, 3DNow! überspringen ;------------------------------------------------------------------------------ ;-------- Test auf 3DNow! und extended 3DNow! (auch DSP=Digital Signal Processing genannt) ;-------- vorhanden, wenn im Rückgaberegister EDX das Bit31 bzw. Bit30 gesetzt ist ;-------- ext.3DNow! (DSP) sind 5 Befehle: PF2IW, PFNACC, PFPNACC, PI2FW und PSWAPD ;-------- 3DNow! steht nur auf AMD-Prozessoren ab dem K6-2 zur Verfügung !mov eax,80000001h ;80000001h ist praktisch das erste extended level, dieser wird von Intel-Prozessoren nicht unterstützt! !cpuid ;Intel-Prozessoren liefern hier EAX=0 zurück !or eax,eax !je l_noext ;ist Intel-Prozessor !test edx,[v_Bit31] ;3DNow! !jz l_noext !mov [v_dnow],2bh !test edx,[v_Bit30] ;extended 3DNow! !jz l_noext !mov [v_ednow],2bh NOEXT: ;------------------------------------------------------------------------------ MessageRequester(Name$,MMX$+Chr(mmx)+Chr(10)+DNOW$+Chr(dnow)+Chr(10)+EDNOW$+Chr(ednow)+Chr(10)+CMOV$+Chr(cmov)+Chr(10)+SSE$+Chr(sse)+Chr(10)+SSE2$+Chr(sse2)+Chr(10)+SSE3$+Chr(sse3)+Chr(10)+SSSE3$+Chr(ssse3)+Chr(10)+SSE41$+Chr(sse41)+Chr(10)+SSE42$+Chr(sse42)+Chr(10)+POPCNT$+Chr(popcnt)) End ; IDE Options = PureBasic 4.10 Beta 2 (Windows - x86) ; CursorPosition = 60 ; FirstLine = 54 ; Folding = - ; EnableAsm ; DisableDebugger