diff options
author | Ronald S. Bultje <rsbultje@gmail.com> | 2012-07-09 04:21:26 +0400 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2012-07-10 15:33:17 +0400 |
commit | 3f150ffba31e404ca48624dc6af27b85c1704862 (patch) | |
tree | 286b306d9772f2a412208906073ca764dd868d73 | |
parent | f80ddd5bf760e685f4d912ce6e6763e6cab45910 (diff) |
x86/cpu: implement support for xgetbv through intrinsics
Signed-off-by: Martin Storsjö <martin@martin.st>
-rwxr-xr-x | configure | 2 | ||||
-rw-r--r-- | libavutil/x86/cpu.c | 11 |
2 files changed, 13 insertions, 0 deletions
@@ -1169,6 +1169,7 @@ HAVE_LIST=" windows_h winsock2_h xform_asm + xgetbv xmm_clobbers yasm " @@ -2742,6 +2743,7 @@ elif enabled sparc; then elif enabled x86; then + check_code ld immintrin.h "__xgetbv(0)" && enable xgetbv check_code ld intrin.h "__rdtsc()" && enable rdtsc check_code ld mmintrin.h "_mm_empty()" && enable mm_empty diff --git a/libavutil/x86/cpu.c b/libavutil/x86/cpu.c index 5d77b0c2df..dfdc12394c 100644 --- a/libavutil/x86/cpu.c +++ b/libavutil/x86/cpu.c @@ -34,8 +34,19 @@ : "=a" (eax), "=S" (ebx), "=c" (ecx), "=d" (edx) \ : "0" (index)) +#if HAVE_INLINE_ASM #define xgetbv(index, eax, edx) \ __asm__ (".byte 0x0f, 0x01, 0xd0" : "=a"(eax), "=d"(edx) : "c" (index)) +#elif HAVE_XGETBV +#include <immintrin.h> + +#define xgetbv(index, eax, edx) \ + do { \ + uint64_t res = __xgetbv(index); \ + eax = res; \ + edx = res >> 32; \ + } while (0) +#endif /* HAVE_XGETBV */ #define get_eflags(x) \ __asm__ volatile ("pushfl \n" \ |