Verfügbarkeit von CPU - Instruktionserweiterungen prüfen.
Verfasst: 01.06.2009 11:23
Ich hab im Codearchiv Helles Code gefunden mit dem man vorhandene Befehlserweiterungen feststellten kann (MMX, SSE...). Damit kann man dann auf kompatiblen CPUs optimierten Code verwenden um die Leistung zu steigern. Ich hab das ganze mal in eine Form gebracht mit der man das ganze leicht verwenden kann:
@Helle:
Toller Code, wirklich klasse.
Weist du auch wie man auf die neueren Technologien prüfen kann? (VT-x, VT-i, AMD-V, SSE4.1, SSE4.2)
@Helle:
Toller Code, wirklich klasse.
Weist du auch wie man auf die neueren Technologien prüfen kann? (VT-x, VT-i, AMD-V, SSE4.1, SSE4.2)
Code: Alles auswählen
Procedure Support_InstructionSetExtensionCheck()
!pushfd
!pop eax
!mov edx,eax
!xor edx,$200000
!push edx
!popfd
!pushfd
!pop edx
!push eax
!popfd
!cmp eax,edx
!jz l_iscpuid
ProcedureReturn #True
IsCPUID:
EndProcedure
Procedure Support_MMX()
!mov eax,1h
!cpuid
!test edx, $800000
!jz l_nommx
ProcedureReturn #True
NOMMX:
EndProcedure
Procedure Support_SSE()
!mov eax,1h
!cpuid
!test edx, $2000000
!jz l_nosse
ProcedureReturn #True
NOSSE:
EndProcedure
Procedure Support_SSE2()
!mov eax,1h
!cpuid
!test edx, $4000000
!jz l_nosse2
ProcedureReturn #True
NOSSE2:
EndProcedure
Procedure Support_SSE3()
!mov eax,1h
!cpuid
!test ecx, $1
!jz l_nosse3
ProcedureReturn #True
NOSSE3:
EndProcedure
Procedure Support_SSSE3()
!mov eax,1h
!cpuid
!test ecx, $200
!jz l_nossse3
ProcedureReturn #True
NOSSSE3:
EndProcedure
Procedure Support_CMOVcc()
!mov eax,1h
!cpuid
!test edx,$8000
!jz l_nocmov
ProcedureReturn #True
NOCMOV:
EndProcedure
Procedure Support_3DNow()
!mov eax,80000000h
!cpuid
!cmp eax,80000000h
!jbe l_noext
!mov eax,80000001h
!cpuid
!or eax,eax
!je l_noext
!test edx,$80000000
!jz l_noext
ProcedureReturn #True
NOEXT:
EndProcedure
Procedure Support_extended3DNow()
!mov eax,80000000h
!cpuid
!cmp eax,80000000h
!jbe l_noext2
!mov eax,80000001h
!cpuid
!or eax,eax
!je l_noext2
!test edx, $80000000
!jz l_noext2
!test edx, $40000000
!jz l_noext2
ProcedureReturn #True
NOEXT2:
EndProcedure
If Support_InstructionSetExtensionCheck() ; Check funktioniert
Debug "MMX: "+Str(Support_MMX())
Debug "SSE: "+Str(Support_SSE())
Debug "SSE2: "+Str(Support_SSE2())
Debug "SSE3: "+Str(Support_SSE3())
Debug "SSSE3: "+Str(Support_SSSE3())
Debug "CMOVcc: "+Str(Support_CMOVcc())
Debug "3DNow: "+Str(Support_3DNow())
Debug "extended3DNow: "+Str(Support_extended3DNow())
EndIf