Browse code

x86: XOP/FMA4 CPU detection support

Jason Garrett-Glaser authored on 2011/09/27 06:44:47
Showing 4 changed files
... ...
@@ -40,8 +40,8 @@
40 40
 #define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c)
41 41
 
42 42
 #define LIBAVUTIL_VERSION_MAJOR 51
43
-#define LIBAVUTIL_VERSION_MINOR 10
44
-#define LIBAVUTIL_VERSION_MICRO  2
43
+#define LIBAVUTIL_VERSION_MINOR 11
44
+#define LIBAVUTIL_VERSION_MICRO  0
45 45
 
46 46
 #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
47 47
                                                LIBAVUTIL_VERSION_MINOR, \
... ...
@@ -60,6 +60,8 @@ static const struct {
60 60
     { AV_CPU_FLAG_SSE4,      "sse4.1"     },
61 61
     { AV_CPU_FLAG_SSE42,     "sse4.2"     },
62 62
     { AV_CPU_FLAG_AVX,       "avx"        },
63
+    { AV_CPU_FLAG_XOP,       "xop"        },
64
+    { AV_CPU_FLAG_FMA4,      "fma4"       },
63 65
     { AV_CPU_FLAG_3DNOW,     "3dnow"      },
64 66
     { AV_CPU_FLAG_3DNOWEXT,  "3dnowext"   },
65 67
 #endif
... ...
@@ -38,6 +38,8 @@
38 38
 #define AV_CPU_FLAG_SSE4         0x0100 ///< Penryn SSE4.1 functions
39 39
 #define AV_CPU_FLAG_SSE42        0x0200 ///< Nehalem SSE4.2 functions
40 40
 #define AV_CPU_FLAG_AVX          0x4000 ///< AVX functions: requires OS support even if YMM registers aren't used
41
+#define AV_CPU_FLAG_XOP          0x0400 ///< Bulldozer XOP functions
42
+#define AV_CPU_FLAG_FMA4         0x0800 ///< Bulldozer FMA4 functions
41 43
 #define AV_CPU_FLAG_IWMMXT       0x0100 ///< XScale IWMMXT
42 44
 #define AV_CPU_FLAG_ALTIVEC      0x0001 ///< standard
43 45
 
... ...
@@ -133,6 +133,15 @@ int ff_get_cpu_flags_x86(void)
133 133
             rval & AV_CPU_FLAG_SSE2 && !(ecx & 0x00000040)) {
134 134
             rval |= AV_CPU_FLAG_SSE2SLOW;
135 135
         }
136
+
137
+        /* XOP and FMA4 use the AVX instruction coding scheme, so they can't be
138
+         * used unless the OS has AVX support. */
139
+        if (rval & AV_CPU_FLAG_AVX) {
140
+            if (ecx & 0x00000800)
141
+                rval |= AV_CPU_FLAG_XOP;
142
+            if (ecx & 0x00010000)
143
+                rval |= AV_CPU_FLAG_FMA4;
144
+        }
136 145
     }
137 146
 
138 147
     if (!strncmp(vendor.c, "GenuineIntel", 12)) {