Commit cdeba2de authored by Mans Rullgard's avatar Mans Rullgard Committed by Michael Niedermayer

x86: check for AVX support

This adds configure and runtime checks for AVX support on x86 CPUs.
Signed-off-by: 's avatarMans Rullgard <mans@mansr.com>
(cherry picked from commit 87f1355f)
parent 91861ce2
...@@ -222,6 +222,7 @@ Advanced options (experts only): ...@@ -222,6 +222,7 @@ Advanced options (experts only):
--disable-mmx2 disable MMX2 optimizations --disable-mmx2 disable MMX2 optimizations
--disable-sse disable SSE optimizations --disable-sse disable SSE optimizations
--disable-ssse3 disable SSSE3 optimizations --disable-ssse3 disable SSSE3 optimizations
--disable-avx disable AVX optimizations
--disable-armv5te disable armv5te optimizations --disable-armv5te disable armv5te optimizations
--disable-armv6 disable armv6 optimizations --disable-armv6 disable armv6 optimizations
--disable-armv6t2 disable armv6t2 optimizations --disable-armv6t2 disable armv6t2 optimizations
...@@ -975,6 +976,7 @@ ARCH_EXT_LIST=' ...@@ -975,6 +976,7 @@ ARCH_EXT_LIST='
armv6 armv6
armv6t2 armv6t2
armvfp armvfp
avx
iwmmxt iwmmxt
mmi mmi
mmx mmx
...@@ -1183,6 +1185,7 @@ mmx_deps="x86" ...@@ -1183,6 +1185,7 @@ mmx_deps="x86"
mmx2_deps="mmx" mmx2_deps="mmx"
sse_deps="mmx" sse_deps="mmx"
ssse3_deps="sse" ssse3_deps="sse"
avx_deps="ssse3"
aligned_stack_if_any="ppc x86" aligned_stack_if_any="ppc x86"
fast_64bit_if_any="alpha ia64 mips64 parisc64 ppc64 sparc64 x86_64" fast_64bit_if_any="alpha ia64 mips64 parisc64 ppc64 sparc64 x86_64"
...@@ -2677,6 +2680,7 @@ EOF ...@@ -2677,6 +2680,7 @@ EOF
check_yasm "pextrd [eax], xmm0, 1" && enable yasm || check_yasm "pextrd [eax], xmm0, 1" && enable yasm ||
die "yasm not found, use --disable-yasm for a crippled build" die "yasm not found, use --disable-yasm for a crippled build"
check_yasm "vpaddw xmm0, xmm0, xmm0" || disable avx
fi fi
case "$cpu" in case "$cpu" in
......
...@@ -44,7 +44,7 @@ int main(void) ...@@ -44,7 +44,7 @@ int main(void)
int cpu_flags = av_get_cpu_flags(); int cpu_flags = av_get_cpu_flags();
printf("cpu_flags = 0x%08X\n", cpu_flags); printf("cpu_flags = 0x%08X\n", cpu_flags);
printf("cpu_flags = %s%s%s%s%s%s%s%s%s%s%s%s\n", printf("cpu_flags = %s%s%s%s%s%s%s%s%s%s%s%s%s\n",
#if ARCH_ARM #if ARCH_ARM
cpu_flags & AV_CPU_FLAG_IWMMXT ? "IWMMXT " : "", cpu_flags & AV_CPU_FLAG_IWMMXT ? "IWMMXT " : "",
#elif ARCH_PPC #elif ARCH_PPC
...@@ -60,6 +60,7 @@ int main(void) ...@@ -60,6 +60,7 @@ int main(void)
cpu_flags & AV_CPU_FLAG_SSSE3 ? "SSSE3 " : "", cpu_flags & AV_CPU_FLAG_SSSE3 ? "SSSE3 " : "",
cpu_flags & AV_CPU_FLAG_SSE4 ? "SSE4.1 " : "", cpu_flags & AV_CPU_FLAG_SSE4 ? "SSE4.1 " : "",
cpu_flags & AV_CPU_FLAG_SSE42 ? "SSE4.2 " : "", cpu_flags & AV_CPU_FLAG_SSE42 ? "SSE4.2 " : "",
cpu_flags & AV_CPU_FLAG_AVX ? "AVX " : "",
cpu_flags & AV_CPU_FLAG_3DNOW ? "3DNow " : "", cpu_flags & AV_CPU_FLAG_3DNOW ? "3DNow " : "",
cpu_flags & AV_CPU_FLAG_3DNOWEXT ? "3DNowExt " : ""); cpu_flags & AV_CPU_FLAG_3DNOWEXT ? "3DNowExt " : "");
#endif #endif
......
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
#define AV_CPU_FLAG_SSSE3 0x0080 ///< Conroe SSSE3 functions #define AV_CPU_FLAG_SSSE3 0x0080 ///< Conroe SSSE3 functions
#define AV_CPU_FLAG_SSE4 0x0100 ///< Penryn SSE4.1 functions #define AV_CPU_FLAG_SSE4 0x0100 ///< Penryn SSE4.1 functions
#define AV_CPU_FLAG_SSE42 0x0200 ///< Nehalem SSE4.2 functions #define AV_CPU_FLAG_SSE42 0x0200 ///< Nehalem SSE4.2 functions
#define AV_CPU_FLAG_AVX 0x4000 ///< AVX functions: requires OS support even if YMM registers aren't used
#define AV_CPU_FLAG_IWMMXT 0x0100 ///< XScale IWMMXT #define AV_CPU_FLAG_IWMMXT 0x0100 ///< XScale IWMMXT
#define AV_CPU_FLAG_ALTIVEC 0x0001 ///< standard #define AV_CPU_FLAG_ALTIVEC 0x0001 ///< standard
......
...@@ -35,6 +35,9 @@ ...@@ -35,6 +35,9 @@
"=c" (ecx), "=d" (edx)\ "=c" (ecx), "=d" (edx)\
: "0" (index)); : "0" (index));
#define xgetbv(index,eax,edx) \
__asm__ ("xgetbv" : "=a"(eax), "=d"(edx) : "c" (index))
/* Function to test if multimedia instructions are supported... */ /* Function to test if multimedia instructions are supported... */
int ff_get_cpu_flags_x86(void) int ff_get_cpu_flags_x86(void)
{ {
...@@ -93,6 +96,15 @@ int ff_get_cpu_flags_x86(void) ...@@ -93,6 +96,15 @@ int ff_get_cpu_flags_x86(void)
rval |= AV_CPU_FLAG_SSE4; rval |= AV_CPU_FLAG_SSE4;
if (ecx & 0x00100000 ) if (ecx & 0x00100000 )
rval |= AV_CPU_FLAG_SSE42; rval |= AV_CPU_FLAG_SSE42;
#if HAVE_AVX
/* Check OXSAVE and AVX bits */
if ((ecx & 0x18000000) == 0x18000000) {
/* Check for OS support */
xgetbv(0, eax, edx);
if ((eax & 0x6) == 0x6)
rval |= AV_CPU_FLAG_AVX;
}
#endif
#endif #endif
; ;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment