From 3f150ffba31e404ca48624dc6af27b85c1704862 Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Mon, 9 Jul 2012 02:21:26 +0200 Subject: [PATCH] x86/cpu: implement support for xgetbv through intrinsics MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Storsjö --- configure | 2 ++ libavutil/x86/cpu.c | 11 +++++++++++ 2 files changed, 13 insertions(+) diff --git a/configure b/configure index a1506c9..76ad4c7 100755 --- a/configure +++ b/configure @@ -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 5d77b0c..dfdc123 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 + +#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" \ -- 2.7.4