diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-10-05 17:02:15 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-10-05 17:04:15 +0200 |
commit | 0ed023275f79d6dd7b1be832da27175f788b8e4d (patch) | |
tree | e8bea39cd11b75c5dfad3b39ba96169c6499a0ec | |
parent | 2a77d4f70b8b653ba405e6c01591bc402ab25a52 (diff) | |
parent | f6f7d1504134683c435e2c7d804279d982e52bb4 (diff) | |
download | ffmpeg-0ed023275f79d6dd7b1be832da27175f788b8e4d.tar.gz |
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>
-rwxr-xr-x | configure | 6 | ||||
-rw-r--r-- | libavutil/x86/Makefile | 3 | ||||
-rw-r--r-- | libavutil/x86/cpu.c | 58 | ||||
-rw-r--r-- | libavutil/x86/cpu.h | 4 | ||||
-rw-r--r-- | libavutil/x86/cpuid.asm | 91 |
5 files changed, 118 insertions, 44 deletions
@@ -1278,7 +1278,6 @@ HAVE_LIST=" clock_gettime closesocket cmov - cpuid cpunop dcbzl dev_bktr_ioctl_bt848_h @@ -1354,7 +1353,6 @@ HAVE_LIST=" rint round roundf - rweflags sched_getaffinity sdl sdl_video_size @@ -1399,7 +1397,6 @@ HAVE_LIST=" windows_h winsock2_h xform_asm - xgetbv xmm_clobbers " @@ -3401,10 +3398,7 @@ elif enabled sparc; then elif enabled x86; then - check_code ld immintrin.h "return __xgetbv(0)" "cc" && enable xgetbv - check_code ld intrin.h "int info[4]; __cpuid(info, 0)" "cc" && enable cpuid check_code ld intrin.h "__rdtsc()" "cc" && enable rdtsc - check_code ld intrin.h "unsigned int x = __readeflags()" "cc" && enable rweflags check_code ld mmintrin.h "_mm_empty()" "cc" && enable mm_empty 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 |