diff --git a/libavcodec/common.h b/libavcodec/common.h index 5a47c4a3c8..75ef127f24 100644 --- a/libavcodec/common.h +++ b/libavcodec/common.h @@ -456,9 +456,9 @@ if((y)<(x)){\ } #endif -#if defined(ARCH_X86) || defined(ARCH_X86_64) +#if defined(ARCH_X86) || defined(ARCH_X86_64) || defined(ARCH_POWERPC) #if defined(ARCH_X86_64) -static inline uint64_t rdtsc(void) +static inline uint64_t read_time(void) { uint64_t a, d; asm volatile( "rdtsc\n\t" @@ -466,8 +466,8 @@ static inline uint64_t rdtsc(void) ); return (d << 32) | (a & 0xffffffff); } -#else -static inline long long rdtsc(void) +#elif defined(ARCH_X86) +static inline long long read_time(void) { long long l; asm volatile( "rdtsc\n\t" @@ -475,14 +475,33 @@ static inline long long rdtsc(void) ); return l; } +#else //FIXME check ppc64 +static inline uint64_t read_time(void) +{ + uint32_t tbu, tbl, temp; + + /* from section 2.2.1 of the 32-bit PowerPC PEM */ + __asm__ __volatile__( + "1:\n" + "mftbu %2\n" + "mftb %0\n" + "mftbu %1\n" + "cmpw %2,%1\n" + "bne 1b\n" + : "=r"(tbl), "=r"(tbu), "=r"(temp) + : + : "cc"); + + return (((uint64_t)tbu)<<32) | (uint64_t)tbl; +} #endif #define START_TIMER \ uint64_t tend;\ -uint64_t tstart= rdtsc();\ +uint64_t tstart= read_time();\ #define STOP_TIMER(id) \ -tend= rdtsc();\ +tend= read_time();\ {\ static uint64_t tsum=0;\ static int tcount=0;\