]> git.sesse.net Git - ffmpeg/commitdiff
x86: Serialize rdtsc in read_time()
authorHenrik Gramner <henrik@gramner.com>
Wed, 8 Jul 2015 20:33:53 +0000 (22:33 +0200)
committerLuca Barbato <lu_zero@gentoo.org>
Wed, 8 Jul 2015 22:10:13 +0000 (00:10 +0200)
Improves the accuracy of measurements, especially in short sections.

To quote the Intel 64 and IA-32 Architectures Software Developer's Manual:
"The RDTSC instruction is not a serializing instruction. It does not necessarily
wait until all previous instructions have been executed before reading the counter.
Similarly, subsequent instructions may begin execution before the read operation
is performed. If software requires RDTSC to be executed only after all previous
instructions have completed locally, it can either use RDTSCP (if the processor
supports that instruction) or execute the sequence LFENCE;RDTSC."

SSE2 is a requirement for lfence so only use it on SSE2-capable systems.
Prefer lfence;rdtsc over rdtscp since rdtscp is supported on fewer systems.

Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
libavutil/x86/timer.h

index cdd67ddbb5c7ea40dde9c74194a8612189e633d2..bb7c34134114c2cc62aa3f4ca511d07d4dbe6add 100644 (file)
 static inline uint64_t read_time(void)
 {
     uint32_t a, d;
-    __asm__ volatile("rdtsc" : "=a" (a), "=d" (d));
+    __asm__ volatile(
+#if ARCH_X86_64 || defined(__SSE2__)
+                     "lfence \n\t"
+#endif
+                     "rdtsc  \n\t"
+                     : "=a" (a), "=d" (d));
     return ((uint64_t)d << 32) + a;
 }