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));
    

  • Mod

    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();
    }
    

Anmelden zum Antworten