rdtsc und gcc
-
hi,
habe hier folgenden code der unter borland und microsoft? compiler funktioniert und mir den timestamp-counter ausliest...
// Counter ist wie folgt definiert... unsigned __int64 Counter; void CycleCounter::ReadTimeStampCounter() { u_long *pCounter = (u_long*) &Counter; // Borland und Microsoft spezifisch #if defined(__BORLANDC__) || defined(_MSC_VER) __asm { mov ecx, pCounter // Zeiger zuweisen rdtsc mov [ecx], eax // Zeiger dereferenzieren und Wert zuweisen mov [ecx + 4], edx } // GCC spezifisch #elif defined(__GNUC__) #endif }
wie muss die assembler-anweisung beim gcc aussehen? komme mit der komischen syntax nicht klar...
asm( "movl %%ecx, %0; rdtsc; movl %%edx, (%%ecx + 4); movl %%eax, (%%ecx)" : /* no output */ : "r" (pCounter) : "%edx", "%eax");
-
mit folgendem code scheint es zu klappen...
__asm__ __volatile__("rdtsc" : "=A" (Counter));
-
die ms/borland variante ist reichlich umständlich, auf statische variablen kann direkt zugegriffen werden:
#if defined(__BORLANDC__) || defined(_MSC_VER) typedef unsigned __int64 u64; inline u64 rdtsc() { asm rdtsc }; #else typedef unsigned long long u64; inline u64 rdtsc() { u64 result; __asm__( "rdtsc" : "=A" (result)); return result; } #endif u64 Counter; void CycleCounter::ReadTimeStampCounter() { Counter = rdtsc(); }