meow-7.2.2
richard 2010-01-15 18:46:20 -08:00
commit f40216fde7
1 changed files with 56 additions and 39 deletions

View File

@ -39,45 +39,62 @@
#define TIME_FAST_TIMERS 0
#if LL_WINDOWS
// because MS has different signatures for these functions in winnt.h
// need to rename them to avoid conflicts
#define _interlockedbittestandset _renamed_interlockedbittestandset
#define _interlockedbittestandreset _renamed_interlockedbittestandreset
#include <intrin.h>
#undef _interlockedbittestandset
#undef _interlockedbittestandreset
#define LL_INLINE __forceinline
// shift off lower 8 bits for lower resolution but longer term timing
// on 1Ghz machine, a 32-bit word will hold ~1000 seconds of timing
inline U32 get_cpu_clock_count_32()
{
U64 time_stamp = __rdtsc();
return (U32)(time_stamp >> 8);
}
// return full timer value, *not* shifted by 8 bits
inline U64 get_cpu_clock_count_64()
{
return __rdtsc();
}
#else
#define LL_INLINE
#endif // LL_WINDOWS
#if (LL_LINUX || LL_SOLARIS || LL_DARWIN) && (defined(__i386__) || defined(__amd64__))
inline U32 get_cpu_clock_count_32()
{
U64 x;
__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
return (U32)x >> 8;
}
inline U32 get_cpu_clock_count_64()
{
U64 x;
__asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
return x;
#define LL_INLINE __forceinline
//
// NOTE: put back in when we aren't using platform sdk anymore
//
// because MS has different signatures for these functions in winnt.h
// need to rename them to avoid conflicts
//#define _interlockedbittestandset _renamed_interlockedbittestandset
//#define _interlockedbittestandreset _renamed_interlockedbittestandreset
//#include <intrin.h>
//#undef _interlockedbittestandset
//#undef _interlockedbittestandreset
//inline U32 get_cpu_clock_count_32()
//{
// U64 time_stamp = __rdtsc();
// return (U32)(time_stamp >> 8);
//}
//
//// return full timer value, *not* shifted by 8 bits
//inline U64 get_cpu_clock_count_64()
//{
// return __rdtsc();
//}
// shift off lower 8 bits for lower resolution but longer term timing
// on 1Ghz machine, a 32-bit word will hold ~1000 seconds of timing
inline U32 get_cpu_clock_count_32()
{
U32 ret_val;
__asm
{
_emit 0x0f
_emit 0x31
shr eax,8
shl edx,24
or eax, edx
mov dword ptr [ret_val], eax
}
return ret_val;
}
// return full timer value, *not* shifted by 8 bits
inline U64 get_cpu_clock_count_64()
{
U64 ret_val;
__asm
{
_emit 0x0f
_emit 0x31
mov eax,eax
mov edx,edx
mov dword ptr [ret_val+4], edx
mov dword ptr [ret_val], eax
}
return ret_val;
}
#endif