summaryrefslogtreecommitdiff
path: root/libavutil/x86
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-10-05 17:02:15 +0200
committerMichael Niedermayer <michaelni@gmx.at>2012-10-05 17:04:15 +0200
commit0ed023275f79d6dd7b1be832da27175f788b8e4d (patch)
treee8bea39cd11b75c5dfad3b39ba96169c6499a0ec /libavutil/x86
parent2a77d4f70b8b653ba405e6c01591bc402ab25a52 (diff)
parentf6f7d1504134683c435e2c7d804279d982e52bb4 (diff)
Merge remote-tracking branch 'qatar/master'
* qatar/master: h264: don't touch H264Context->ref_count[] during MB decoding x86: get_cpu_flags: add necessary ifdefs around function body x86: Drop CPU detection intrinsics x86: Add YASM implementations of cpuid and xgetbv from x264 Conflicts: configure libavcodec/h264_cabac.c libavcodec/h264_cavlc.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavutil/x86')
-rw-r--r--libavutil/x86/Makefile3
-rw-r--r--libavutil/x86/cpu.c58
-rw-r--r--libavutil/x86/cpu.h4
-rw-r--r--libavutil/x86/cpuid.asm91
4 files changed, 118 insertions, 38 deletions
diff --git a/libavutil/x86/Makefile b/libavutil/x86/Makefile
index 4546353669..3dd696c26a 100644
--- a/libavutil/x86/Makefile
+++ b/libavutil/x86/Makefile
@@ -1,4 +1,5 @@
OBJS += x86/cpu.o \
x86/float_dsp_init.o \
-YASM-OBJS += x86/float_dsp.o \
+YASM-OBJS += x86/cpuid.o \
+ x86/float_dsp.o \
diff --git a/libavutil/x86/cpu.c b/libavutil/x86/cpu.c
index cd2f0092fa..3fee152095 100644
--- a/libavutil/x86/cpu.c
+++ b/libavutil/x86/cpu.c
@@ -22,10 +22,21 @@
#include <stdlib.h>
#include <string.h>
+
#include "libavutil/x86/asm.h"
+#include "libavutil/x86/cpu.h"
#include "libavutil/cpu.h"
-#if HAVE_INLINE_ASM
+#if HAVE_YASM
+
+#define cpuid(index, eax, ebx, ecx, edx) \
+ ff_cpu_cpuid(index, &eax, &ebx, &ecx, &edx)
+
+#define xgetbv(index, eax, edx) \
+ ff_cpu_xgetbv(index, &eax, &edx)
+
+#elif HAVE_INLINE_ASM
+
/* ebx saving is necessary for PIC. gcc seems unable to see it alone */
#define cpuid(index, eax, ebx, ecx, edx) \
__asm__ volatile ( \
@@ -34,35 +45,9 @@
"xchg %%"REG_b", %%"REG_S \
: "=a" (eax), "=S" (ebx), "=c" (ecx), "=d" (edx) \
: "0" (index))
-#elif HAVE_CPUID
-#include <intrin.h>
-#define cpuid(index, eax, ebx, ecx, edx) \
- do { \
- int info[4]; \
- __cpuid(info, index); \
- eax = info[0]; \
- ebx = info[1]; \
- ecx = info[2]; \
- edx = info[3]; \
- } while (0)
-#endif /* HAVE_CPUID */
-
-#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 */
-
-#if HAVE_INLINE_ASM
#define get_eflags(x) \
__asm__ volatile ("pushfl \n" \
@@ -74,22 +59,16 @@
"popfl \n" \
:: "r"(x))
-#elif HAVE_RWEFLAGS
-
-#include <intrin.h>
-
-#define get_eflags(x) \
- x = __readeflags()
-
-#define set_eflags(x) \
- __writeeflags(x)
-
#endif /* HAVE_INLINE_ASM */
#if ARCH_X86_64
#define cpuid_test() 1
+#elif HAVE_YASM
+
+#define cpuid_test ff_cpu_cpuid_test
+
#elif HAVE_INLINE_ASM || HAVE_RWEFLAGS
static int cpuid_test(void)
@@ -110,6 +89,9 @@ static int cpuid_test(void)
int ff_get_cpu_flags_x86(void)
{
int rval = 0;
+
+#ifdef cpuid
+
int eax, ebx, ecx, edx;
int max_std_level, max_ext_level, std_caps = 0, ext_caps = 0;
int family = 0, model = 0;
@@ -213,5 +195,7 @@ int ff_get_cpu_flags_x86(void)
rval |= AV_CPU_FLAG_ATOM;
}
+#endif /* cpuid */
+
return rval;
}
diff --git a/libavutil/x86/cpu.h b/libavutil/x86/cpu.h
index 76abeb90b1..601476ee1a 100644
--- a/libavutil/x86/cpu.h
+++ b/libavutil/x86/cpu.h
@@ -54,4 +54,8 @@
#define INLINE_AVX(flags) CPUEXT(flags, _INLINE, AVX)
#define INLINE_FMA4(flags) CPUEXT(flags, _INLINE, FMA4)
+void ff_cpu_cpuid(int index, int *eax, int *ebx, int *ecx, int *edx);
+void ff_cpu_xgetbv(int op, int *eax, int *edx);
+int ff_cpu_cpuid_test(void);
+
#endif /* AVUTIL_X86_CPU_H */
diff --git a/libavutil/x86/cpuid.asm b/libavutil/x86/cpuid.asm
new file mode 100644
index 0000000000..4a9bf7266c
--- /dev/null
+++ b/libavutil/x86/cpuid.asm
@@ -0,0 +1,91 @@
+;*****************************************************************************
+;* Copyright (C) 2005-2010 x264 project
+;*
+;* Authors: Loren Merritt <lorenm@u.washington.edu>
+;* Jason Garrett-Glaser <darkshikari@gmail.com>
+;*
+;* This file is part of FFmpeg.
+;*
+;* FFmpeg is free software; you can redistribute it and/or
+;* modify it under the terms of the GNU Lesser General Public
+;* License as published by the Free Software Foundation; either
+;* version 2.1 of the License, or (at your option) any later version.
+;*
+;* FFmpeg is distributed in the hope that it will be useful,
+;* but WITHOUT ANY WARRANTY; without even the implied warranty of
+;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;* Lesser General Public License for more details.
+;*
+;* You should have received a copy of the GNU Lesser General Public
+;* License along with FFmpeg; if not, write to the Free Software
+;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+;******************************************************************************
+
+%include "x86inc.asm"
+
+SECTION .text
+
+;-----------------------------------------------------------------------------
+; void ff_cpu_cpuid(int index, int *eax, int *ebx, int *ecx, int *edx)
+;-----------------------------------------------------------------------------
+cglobal cpu_cpuid, 5,7
+ push rbx
+ push r4
+ push r3
+ push r2
+ push r1
+ mov eax, r0d
+ xor ecx, ecx
+ cpuid
+ pop r4
+ mov [r4], eax
+ pop r4
+ mov [r4], ebx
+ pop r4
+ mov [r4], ecx
+ pop r4
+ mov [r4], edx
+ pop rbx
+ RET
+
+;-----------------------------------------------------------------------------
+; void ff_cpu_xgetbv(int op, int *eax, int *edx)
+;-----------------------------------------------------------------------------
+cglobal cpu_xgetbv, 3,7
+ push r2
+ push r1
+ mov ecx, r0d
+ xgetbv
+ pop r4
+ mov [r4], eax
+ pop r4
+ mov [r4], edx
+ RET
+
+%if ARCH_X86_64 == 0
+;-----------------------------------------------------------------------------
+; int ff_cpu_cpuid_test(void)
+; return 0 if unsupported
+;-----------------------------------------------------------------------------
+cglobal cpu_cpuid_test
+ pushfd
+ push ebx
+ push ebp
+ push esi
+ push edi
+ pushfd
+ pop eax
+ mov ebx, eax
+ xor eax, 0x200000
+ push eax
+ popfd
+ pushfd
+ pop eax
+ xor eax, ebx
+ pop edi
+ pop esi
+ pop ebp
+ pop ebx
+ popfd
+ ret
+%endif