; English forum: http://www.purebasic.fr/english/viewtopic.php?t=3811&postdays=0&postorder=asc&start=15
; Author: jack (updated for PB4.00 by blbltheworm)
; Date: 26. September 2003
; OS: Windows
; Demo: No
; from PB forums by Hi-Toro
; post http://purebasic.myforums.net/viewtopic.php?t=3811&highlight=utility
; inline asm by jack
Structure bit64
LowPart.l
HighPart.l
EndStructure
Procedure CPUSPEED()
OneMillion.l=1000000
Define.bit64 ulEAX_EDX, ulFreq, ulTicks, ulValue, ulStartCounter, ulResult
QueryPerformanceFrequency_(ulFreq)
QueryPerformanceCounter_(ulTicks)
! fild qword [esp+12] ;ulFreq
! fild qword [esp+20] ;ulTicks
! faddp st1,st0 ;ST0=ulFreq+ulTicks
! fistp qword [esp+28];ST0->ulValue
;ulValue\LowPart = ulTicks\LowPart + ulFreq\LowPart
! RDTSC
! MOV [esp+4], eax ;MOV ulEAX_EDX\LowPart, eax
! MOV [esp+8], edx ;MOV ulEAX_EDX\HighPart,edx
! fild qword [esp+4] ;ulEAX_EDX
! fistp qword [esp+36];ulStartCounter
;ulStartCounter\LowPart = ulEAX_EDX\LowPart
! fild qword [esp+28] ;ulValue
startloop:
! fild qword [esp+20] ;ulTicks
! FCOMP
! FNSTSW ax
! SAHF
! JAE l_endloop
;While (ulTicks\LowPart <= ulValue\LowPart)
QueryPerformanceCounter_(ulTicks)
;Wend
Goto startloop
endloop:
! fstp st0
! RDTSC
! MOV [esp+4], eax ;MOV ulEAX_EDX\LowPart, eax
! MOV [esp+8], edx ;MOV ulEAX_EDX\HighPart,edx
! fild qword [esp+4] ;ulEAX_EDX
! fild qword [esp+36] ;ulStartCounter
! fsubp st1,st0 ;ST0=ulEAX_EDX - ulStartCounter
! fild dword [esp] ;OneMillion
! fdivp st1,st0 ;ST0=(ulEAX_EDX - ulStartCounter)/1000000
! fistp qword [esp+44];ST0->ulResult
;ulResult\LowPart = (ulEAX_EDX\LowPart - ulStartCounter\LowPart)/1000000
ProcedureReturn ulResult\LowPart-2; / 1000000
EndProcedure; Takes 1 second to calculate...
mhz = CPUSPEED()
MessageRequester("CPU Speed", "CPU speed: " + Str (mhz) + " MHz", #MB_ICONINFORMATION)
; IDE Options = PureBasic v4.00 (Windows - x86)
; Folding = -
; EnableAsm