Protect code that uses CMOV instructions with HAVE_CMOV,
authorGuillaume Poirier <gpoirier@mplayerhq.hu>
Fri, 20 Oct 2006 17:53:19 +0000 (17:53 +0000)
committerGuillaume Poirier <gpoirier@mplayerhq.hu>
Fri, 20 Oct 2006 17:53:19 +0000 (17:53 +0000)
Make configure set CMOV_IS_FAST on arches on which cmov has a low latency
(typically non-Netburst based processor)

Originally committed as revision 6749 to svn://svn.ffmpeg.org/ffmpeg/trunk

configure
libavcodec/cabac.h
libavutil/common.h
libavutil/internal.h

index 64b906f..12a6054 100755 (executable)
--- a/configure
+++ b/configure
@@ -347,6 +347,7 @@ cpu="generic"
 powerpc_perf="no"
 mmx="default"
 cmov="no"
+cmov_is_fast="no"
 armv5te="default"
 iwmmxt="default"
 altivec="default"
@@ -1107,9 +1108,16 @@ if test $cpu != "generic"; then
             cmov="no"
         ;;
         # targets that do support conditional mov (cmov)
-        i686|pentiumpro|pentium[234]|pentium-m|prescott|athlon|athlon-tbird|athlon-4|athlon-[mx]p|nocona|athlon64|k8|opteron|athlon-fx)
+        i686|pentiumpro|pentium[23]|pentium-m|athlon|athlon-tbird|athlon-4|athlon-[mx]p|athlon64|k8|opteron|athlon-fx)
             add_cflags "-march=$cpu"
             cmov="yes"
+            cmov_is_fast="yes"
+        ;;
+        # targets that do support conditional mov but on which it's slow
+        pentium4|prescott|nocona)
+            add_cflags "-march=$cpu"
+            cmov="yes"
+            cmov_is_fast="no"
         ;;
         sparc64)
             add_cflags "-mcpu=v9"
@@ -1559,6 +1567,7 @@ echo "broken inttypes.h $emu_fast_int"
 if test $arch = "x86" -o $arch = "x86_64"; then
     echo "MMX enabled      $mmx"
     echo "CMOV enabled     $cmov"
+    echo "CMOV is fast     $cmov_is_fast"
 fi
 if test $arch = "armv4l"; then
     echo "ARMv5TE enabled  $armv5te"
@@ -1745,6 +1754,10 @@ if test "$cmov" = "yes" ; then
   echo "TARGET_CMOV=yes" >> config.mak
   echo "#define HAVE_CMOV 1" >> $TMPH
 fi
+if test "$cmov_is_fast" = "yes" ; then
+  echo "TARGET_CMOV_IS_FAST=yes" >> config.mak
+  echo "#define CMOV_IS_FAST 1" >> $TMPH
+fi
 if test "$armv5te" = "yes" ; then
   echo "TARGET_ARMV5TE=yes" >> config.mak
   echo "#define HAVE_ARMV5TE 1" >> $TMPH
index e191a62..ff3e06a 100644 (file)
@@ -32,7 +32,6 @@
 #define CABAC_BITS 16
 #define CABAC_MASK ((1<<CABAC_BITS)-1)
 #define BRANCHLESS_CABAC_DECODER 1
-#define CMOV_IS_FAST 1
 //#define ARCH_X86_DISABLED 1
 
 typedef struct CABACContext{
@@ -454,7 +453,7 @@ static int always_inline get_cabac_inline(CABACContext *c, uint8_t * const state
 #else /* BRANCHLESS_CABAC_DECODER */
 
 
-#if (defined CMOV_IS_FAST  && __CPU__ >= 686)
+#if defined CMOV_IS_FAST
 #define BRANCHLESS_GET_CABAC_UPDATE(ret, cabac, statep, low, lowword, range, tmp, tmpbyte)\
         "mov    "tmp"       , %%ecx                                     \n\t"\
         "shl    $17         , "tmp"                                     \n\t"\
index 9a836f1..3ae5971 100644 (file)
@@ -238,7 +238,7 @@ static inline int av_log2_16bit(unsigned int v)
 /* median of 3 */
 static inline int mid_pred(int a, int b, int c)
 {
-#if (defined(ARCH_X86) && __CPU__ >= 686 || defined(ARCH_X86_64)) && !defined(RUNTIME_CPUDETECT)
+#if HAVE_CMOV
     int i=b;
     asm volatile(
         "cmp    %2, %1 \n\t"
index 29e4cc8..285d304 100644 (file)
@@ -168,7 +168,7 @@ static inline int ff_sqrt(int a)
             level= (level^mask)-mask;
 #endif
 
-#if __CPU__ >= 686 && !defined(RUNTIME_CPUDETECT)
+#ifdef HAVE_CMOV
 #define COPY3_IF_LT(x,y,a,b,c,d)\
 asm volatile (\
     "cmpl %0, %3        \n\t"\