History

x86: check for AVX support

This adds configure and runtime checks for AVX support on x86 CPUs.

Mans Rullgard committed 15 years ago

Commit cdeba2d1 parent 91861ce4 files · +19 −1Browse files

Unified · Split

4 files
  1. configure +4 −0
  2. libavutil/cpu.c +2 −1
  3. libavutil/cpu.h +1 −0
  4. libavutil/x86/cpu.c +12 −0
configure+4−0
@@ -222,6 +222,7 @@ Advanced options (experts only): · 221 unmodified lines
222222 --disable-mmx2 disable MMX2 optimizations
223223 --disable-sse disable SSE optimizations
224224 --disable-ssse3 disable SSSE3 optimizations
225+ --disable-avx disable AVX optimizations
225226 --disable-armv5te disable armv5te optimizations
226227 --disable-armv6 disable armv6 optimizations
227228 --disable-armv6t2 disable armv6t2 optimizations
@@ -975,6 +976,7 @@ ARCH_EXT_LIST=' · 747 unmodified lines
975976 armv6
976977 armv6t2
977978 armvfp
979+ avx
978980 iwmmxt
979981 mmi
980982 mmx
@@ -1183,6 +1185,7 @@ mmx_deps="x86" · 202 unmodified lines
11831185 mmx2_deps="mmx"
11841186 sse_deps="mmx"
11851187 ssse3_deps="sse"
1188+avx_deps="ssse3"
11861189
11871190 aligned_stack_if_any="ppc x86"
11881191 fast_64bit_if_any="alpha ia64 mips64 parisc64 ppc64 sparc64 x86_64"
@@ -2677,6 +2680,7 @@ EOF · 1488 unmodified lines
26772680
26782681 check_yasm "pextrd [eax], xmm0, 1" && enable yasm ||
26792682 die "yasm not found, use --disable-yasm for a crippled build"
2683+ check_yasm "vpaddw xmm0, xmm0, xmm0" || disable avx
26802684 fi
26812685
26822686 case "$cpu" in
libavutil/cpu.c+2−1
@@ -44,7 +44,7 @@ int main(void) · 43 unmodified lines
4444 int cpu_flags = av_get_cpu_flags();
4545
4646 printf("cpu_flags = 0x%08X\n", cpu_flags);
47− printf("cpu_flags = %s%s%s%s%s%s%s%s%s%s%s%s\n",
47+ printf("cpu_flags = %s%s%s%s%s%s%s%s%s%s%s%s%s\n",
4848 #if ARCH_ARM
4949 cpu_flags & AV_CPU_FLAG_IWMMXT ? "IWMMXT " : "",
5050 #elif ARCH_PPC
@@ -60,6 +60,7 @@ int main(void) · 9 unmodified lines
6060 cpu_flags & AV_CPU_FLAG_SSSE3 ? "SSSE3 " : "",
6161 cpu_flags & AV_CPU_FLAG_SSE4 ? "SSE4.1 " : "",
6262 cpu_flags & AV_CPU_FLAG_SSE42 ? "SSE4.2 " : "",
63+ cpu_flags & AV_CPU_FLAG_AVX ? "AVX " : "",
6364 cpu_flags & AV_CPU_FLAG_3DNOW ? "3DNow " : "",
6465 cpu_flags & AV_CPU_FLAG_3DNOWEXT ? "3DNowExt " : "");
6566 #endif
libavutil/cpu.h+1−0
@@ -36,6 +36,7 @@ · 35 unmodified lines
3636 #define AV_CPU_FLAG_SSSE3 0x0080 ///< Conroe SSSE3 functions
3737 #define AV_CPU_FLAG_SSE4 0x0100 ///< Penryn SSE4.1 functions
3838 #define AV_CPU_FLAG_SSE42 0x0200 ///< Nehalem SSE4.2 functions
39+#define AV_CPU_FLAG_AVX 0x4000 ///< AVX functions: requires OS support even if YMM registers aren't used
3940 #define AV_CPU_FLAG_IWMMXT 0x0100 ///< XScale IWMMXT
4041 #define AV_CPU_FLAG_ALTIVEC 0x0001 ///< standard
4142
libavutil/x86/cpu.c+12−0
@@ -35,6 +35,9 @@ · 34 unmodified lines
3535 "=c" (ecx), "=d" (edx)\
3636 : "0" (index));
3737
38+#define xgetbv(index,eax,edx) \
39+ __asm__ ("xgetbv" : "=a"(eax), "=d"(edx) : "c" (index))
40+
3841 /* Function to test if multimedia instructions are supported... */
3942 int ff_get_cpu_flags_x86(void)
4043 {
@@ -93,6 +96,15 @@ int ff_get_cpu_flags_x86(void) · 52 unmodified lines
9396 rval |= AV_CPU_FLAG_SSE4;
9497 if (ecx & 0x00100000 )
9598 rval |= AV_CPU_FLAG_SSE42;
99+#if HAVE_AVX
100+ /* Check OXSAVE and AVX bits */
101+ if ((ecx & 0x18000000) == 0x18000000) {
102+ /* Check for OS support */
103+ xgetbv(0, eax, edx);
104+ if ((eax & 0x6) == 0x6)
105+ rval |= AV_CPU_FLAG_AVX;
106+ }
107+#endif
96108 #endif
97109 ;
98110 }

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t