b $0F,$A2 /// cpuid db $0F,$31 /// rdtsc mov StartTicks,eax pop ebx end;
repeat QueryPerformanceCounter(Count1); until Count1-Count2>=TestFreq;
asm push ebx xor eax,eax xor ebx,ebx xor ecx,ecx xor edx,edx db $0F,$A2 /// cpuid db $0F,$31 /// rdtsc mov EndTicks,eax pop ebx end;
ElapsedTime:=MulDiv(Count1-Count2,1000000,HighFreq); end else begin timeBeginPeriod(1); TimeStart:=timeGetTime;
repeat TimeStop:=timeGetTime; until TimeStop <> TimeStart;
asm push ebx xor eax,eax xor ebx,ebx xor ecx,ecx xor edx,edx db $0F,$A2 /// cpuid db $0F,$31 /// rdtsc mov StartTicks,eax pop ebx end;
repeat TimeStart:=timeGetTime; until TimeStart-TimeStop>=timePeriod;
asm push ebx xor eax,eax xor ebx,ebx xor ecx,ecx xor edx,edx db $0F,$A2 /// cpuid db $0F,$31 /// rdtsc mov EndTicks,eax pop ebx end; timeEndPeriod(1);
ElapsedTime:=(TimeStart-TimeStop)*1000; end; TotalTicks:=EndTicks-StartTicks; result:=TotalTicks div ElapsedTime; end; procedure TCpuData.GetFMS(var Family,Model,Stepping:byte); var TempFlags:dword; BinFlags:array[0..31] of byte; i,pos:integer; begin asm push eax push ebx push ecx push edx mov eax,1 db $0F,$A2 /// cpuid mov TempFlags,eax pop edx pop ecx pop ebx pop eax end; for i:=0 to 31 do begin BinFlags[i]:=TempFlags mod 2; TempFlags:=TempFlags div 2; end; family:=0; model:=0; stepping:=0; pos:=0; for i:=0 to 3 do begin stepping:=stepping+(BinFlags[pos]*StrToInt(FloatToStr(Power(2,i)))); inc(pos); end; pos:=4; for i:=0 to 3 do begin model:=model+(BinFlags[pos]*StrToInt(FloatToStr(Power(2,i)))); inc(pos); end; pos:=8; for i:=0 to 3 do begin family:=family+(BinFlags[pos]*StrToInt(FloatToStr(Power(2,i)))); inc(pos); end; end; function TCpuData.GetMaxCpuId:dword; var TempMax:dword; begin asm push eax push ebx push ecx push edx mov eax,0 db $0F,$A2 /// cpuid mov TempMax,eax pop edx pop ecx pop ebx pop eax end; GetMaxCpuId:=TempMax; end; function TCpuData.CheckFPU:Boolean; label NoFpu; var TempCheck:dword; begin TempCheck:=1; asm push eax push ebx push ecx push edx mov eax,1 db $0F,$A2 /// cpuid test edx,$1 jz NoFpu mov edx,0 mov TempCheck,edx NoFpu: pop edx pop ecx pop ebx pop eax end; CheckFpu:=(TempCheck=0); end; function TCpuData.CheckTSC:Boolean; label NoTSC; var TempCheck:dword; begin TempCheck:=1; asm push eax push ebx push ecx push edx mov eax,1 db $0F,$A2 /// cpuid test edx,$10 jz NoTSC mov edx,0 mov TempCheck,edx NoTSC: pop edx pop ecx pop ebx pop eax end; CheckTSC:=(TempCheck=0); end; function TCpuData.CheckMSR:Boolean; label NoMSR; var TempCheck:dword; begin TempCheck:=1; asm push eax push ebx push ecx push edx mov eax,1 db $0F,$A2 /// cpuid test edx,$20 jz NoMSR mov edx,0 mov TempCheck,edx NoMSR: pop edx pop ecx pop ebx pop eax end; CheckMSR:=(TempCheck=0); end; function TCpuData.CheckMPS:Boolean; var SysInfo:TSystemInfo; begin GetSysTemInfo(SysInfo); CheckMPS:=(SysInfo.dwNumberOfProcessors>1); end; function TCpuData.GetNoCpus:cardinal; var SysInfo:TSystemInfo; begin GetSystemInfo(SysInfo); GetNoCpus:=SysInfo.dwNumberOfProcessors; end; function TCpuData.CheckPN:Boolean; label NoPN; var TempCheck:dword; begin TempCheck:=1; asm push eax push ebx push ecx push edx mov eax,1 db $0F,$A2 /// cpuid test edx,$40000 jz NoPN mov edx,0 mov TempCheck,edx NoPN: pop edx pop ecx pop ebx pop eax end; CheckPN:=(TempCheck=0); end; function TCpuData.CheckCMPXCHG8B:Boolean; label NoCMPXCHG8B; var TempCheck:dword; begin TempCheck:=1; asm push eax push ebx push ecx push edx mov eax,1 db $0F,$A2 /// cpuid test edx,$100 jz NoCMPXCHG8B mov edx,0 mov TempCheck,edx NoCMPXCHG8B: pop edx pop ecx pop ebx pop eax end; CheckCMPXCHG8B:=(TempCheck=0); end; function TCpuData.CheckCMOVe:Boolean; label NoCMOVe; var TempCheck:dword; begin TempCheck:=1; asm push eax push ebx push ecx push edx mov eax,1 db $0F,$A2 /// cpuid test edx,$8000 jz NoCMOVe mov edx,0 mov TempCheck,edx NoCMOVe: pop edx pop ecx pop ebx pop eax end; CheckCMOVe:=(TempCheck=0); end; function TCpuData.CheckSelfSnoop:Boolean; label NoSelfSnoop; var TempCheck:dword; begin TempCheck:=1; asm push eax push ebx push ecx