Seite 1 von 1

Verfügbarkeit von CPU - Instruktionserweiterungen prüfen.

Verfasst: 01.06.2009 11:23
von cxAlex
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)

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

Verfasst: 02.06.2009 16:30
von mpz
Hi,

Einfach super und leicht zu handhaben...

Gruß Michael