; 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