changeset 3567:1f8730f62765 libavcodec

r5954 broke fft on cpus with 3dnow but without mm3dnow.h
author lorenm
date Thu, 10 Aug 2006 18:49:47 +0000
parents b63ef6fcbc70
children 945caa35ee9a
files fft.c
diffstat 1 files changed, 27 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/fft.c	Thu Aug 10 16:05:29 2006 +0000
+++ b/fft.c	Thu Aug 10 18:49:47 2006 +0000
@@ -58,17 +58,38 @@
     s->exptab1 = NULL;
 
     /* compute constant table for HAVE_SSE version */
-#if (defined(HAVE_MMX) && (defined(HAVE_BUILTIN_VECTOR) || defined(HAVE_MM3DNOW))) || defined(HAVE_ALTIVEC)
+#if (defined(HAVE_MMX) && (defined(HAVE_BUILTIN_VECTOR) || defined(HAVE_MM3DNOW))) \
+    || (defined(HAVE_ALTIVEC) && !defined(ALTIVEC_USE_REFERENCE_C_CODE))
     {
-        int has_vectors = 0;
+        int has_vectors = mm_support();
 
+        if (has_vectors) {
 #if defined(HAVE_MMX)
-        has_vectors = mm_support() & (MM_3DNOW | MM_3DNOWEXT | MM_SSE | MM_SSE2);
+            if (has_vectors & MM_3DNOWEXT)
+                s->imdct_calc = ff_imdct_calc_3dn2;
+#ifdef HAVE_MM3DNOW
+            if (has_vectors & MM_3DNOWEXT)
+                /* 3DNowEx for Athlon(XP) */
+                s->fft_calc = ff_fft_calc_3dn2;
+            else if (has_vectors & MM_3DNOW)
+                /* 3DNow! for K6-2/3 */
+                s->fft_calc = ff_fft_calc_3dn;
 #endif
-#if defined(HAVE_ALTIVEC) && !defined(ALTIVEC_USE_REFERENCE_C_CODE)
-        has_vectors = mm_support() & MM_ALTIVEC;
+#ifdef HAVE_BUILTIN_VECTOR
+            if (has_vectors & MM_SSE2)
+                /* SSE for P4/K8 */
+                s->fft_calc = ff_fft_calc_sse;
+            else if ((has_vectors & MM_SSE) &&
+                     s->fft_calc == ff_fft_calc_c)
+                /* SSE for P3 */
+                s->fft_calc = ff_fft_calc_sse;
 #endif
-        if (has_vectors) {
+#else /* HAVE_MMX */
+            if (has_vectors & MM_ALTIVEC)
+                s->fft_calc = ff_fft_calc_altivec;
+#endif
+        }
+        if (s->fft_calc != ff_fft_calc_c) {
             int np, nblocks, np2, l;
             FFTComplex *q;
 
@@ -94,29 +115,6 @@
                 nblocks = nblocks >> 1;
             } while (nblocks != 0);
             av_freep(&s->exptab);
-#if defined(HAVE_MMX)
-            if (has_vectors & MM_3DNOWEXT)
-                s->imdct_calc = ff_imdct_calc_3dn2;
-#ifdef HAVE_MM3DNOW
-            if (has_vectors & MM_3DNOWEXT)
-                /* 3DNowEx for Athlon(XP) */
-                s->fft_calc = ff_fft_calc_3dn2;
-            else if (has_vectors & MM_3DNOW)
-                /* 3DNow! for K6-2/3 */
-                s->fft_calc = ff_fft_calc_3dn;
-#endif
-#ifdef HAVE_BUILTIN_VECTOR
-            if (has_vectors & MM_SSE2)
-                /* SSE for P4/K8 */
-                s->fft_calc = ff_fft_calc_sse;
-            else if ((has_vectors & MM_SSE) &&
-                     s->fft_calc == ff_fft_calc_c)
-                /* SSE for P3 */
-                s->fft_calc = ff_fft_calc_sse;
-#endif
-#else /* HAVE_MMX */
-            s->fft_calc = ff_fft_calc_altivec;
-#endif
         }
     }
 #endif