ultimatepp/bazaar/SysInfo/CPUSpeed.cpp
koldo 6b7a56b0a9 *SysInfo: Solved NO_XTEST problem detected by erikjwaxx
git-svn-id: svn://ultimatepp.org/upp/trunk@14135 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2020-03-06 21:39:22 +00:00

69 lines
No EOL
1.5 KiB
C++

#include "SysInfo.h"
namespace Upp {
#if defined(PLATFORM_WIN32) || defined (PLATFORM_WIN64)
#if defined(__MINGW32__) && !defined (__MINGW64__)
uint64 __rdtsc() {
/* #if defined(__MINGW64__) // Now it is unnecessary
unsigned int lo, hi;
__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
return uint64(lo) | (uint64(hi) << 32);
#else*/
unsigned int lo, hi;
__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
return uint64(lo) | (uint64(hi) << 32);
// #endif
}
#endif
int GetCpuSpeed()
{
LARGE_INTEGER nFreq, nCtrStop, nCtr;
if(!QueryPerformanceFrequency(&nFreq))
return 0;
QueryPerformanceCounter(&nCtrStop);
nCtrStop.QuadPart += nFreq.QuadPart;
unsigned __int64 start = __rdtsc();
do {
QueryPerformanceCounter(&nCtr);
} while (nCtr.QuadPart < nCtrStop.QuadPart);
unsigned __int64 end = __rdtsc();
return int((end - start)/1000000);
}
#endif
#if defined(PLATFORM_POSIX)
#define __rdtsc(tm) __asm__ __volatile__ (".byte 0x0f; .byte 0x31" :"=a" (tm))
#define COUNT_SEC (double)tv.tv_sec + (1.e-6)*tv.tv_usec
int GetCpuSpeed()
{
struct timeval tv;
double cnt1, cnt2;
unsigned long start, end;
__rdtsc(start);
gettimeofday(&tv, 0);
cnt1 = COUNT_SEC + 0.01;
do {
gettimeofday(&tv, 0);
cnt2 = COUNT_SEC;
} while(cnt2 < cnt1);
__rdtsc(end);
return int((end-start)/10000);
}
#endif
}