summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicky <sl.nicky.ml@googlemail.com>2016-04-22 23:59:28 +0200
committerNicky <sl.nicky.ml@googlemail.com>2016-04-22 23:59:28 +0200
commitc87d24ac71c662ab37b6b937f92d960c6d8d092f (patch)
tree6232731bb5f175c975a5fbee32e4e3c23f951fe5
parente8aa2dd71fff7a39f2b03039b23afa8bdf804fcb (diff)
Fasttimers: Windows) Always use the __rdtsc() intrinsic rather than inline assembly. Linux/OSX) The rtdsc assembly intruction is clobbering EAX and EDX, the snippet was not protecting EDX accordingly.
(transplanted from 6307b134f821390367d4c86a03b9a492ac7ed282)
-rw-r--r--indra/llcommon/llfasttimer.h44
1 files changed, 8 insertions, 36 deletions
diff --git a/indra/llcommon/llfasttimer.h b/indra/llcommon/llfasttimer.h
index 0336f9d0e9..2024d707da 100644
--- a/indra/llcommon/llfasttimer.h
+++ b/indra/llcommon/llfasttimer.h
@@ -90,43 +90,15 @@ public:
#if LL_FASTTIMER_USE_RDTSC
static U32 getCPUClockCount32()
{
- U32 ret_val;
-#if !defined(_M_AMD64)
- __asm
- {
- _emit 0x0f
- _emit 0x31
- shr eax,8
- shl edx,24
- or eax, edx
- mov dword ptr [ret_val], eax
- }
-#else
unsigned __int64 val = __rdtsc();
val = val >> 8;
- ret_val = static_cast<U32>(val);
-#endif
- return ret_val;
+ return static_cast<U32>(val);
}
// return full timer value, *not* shifted by 8 bits
static U64 getCPUClockCount64()
{
- U64 ret_val;
-#if !defined(_M_AMD64)
- __asm
- {
- _emit 0x0f
- _emit 0x31
- mov eax,eax
- mov edx,edx
- mov dword ptr [ret_val+4], edx
- mov dword ptr [ret_val], eax
- }
-#else
- ret_val = static_cast<U64>( __rdtsc() );
-#endif
- return ret_val;
+ return static_cast<U64>( __rdtsc() );
}
#else
@@ -183,16 +155,16 @@ public:
// Mac+Linux+Solaris FAST x86 implementation of CPU clock
static U32 getCPUClockCount32()
{
- U64 x;
- __asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
- return (U32)(x >> 8);
+ U32 low(0),high(0);
+ __asm__ volatile (".byte 0x0f, 0x31": "=a"(low), "=d"(high) );
+ return (low>>8) | (high<<24);
}
static U64 getCPUClockCount64()
{
- U64 x;
- __asm__ volatile (".byte 0x0f, 0x31": "=A"(x));
- return x;
+ U32 low(0),high(0);
+ __asm__ volatile (".byte 0x0f, 0x31": "=a"(low), "=d"(high) );
+ return (U64)low | ( ((U64)high) << 32);
}
#endif