diff --git a/configure b/configure index 64b906fa64..12a6054b83 100755 --- 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 diff --git a/libavcodec/cabac.h b/libavcodec/cabac.h index e191a62124..ff3e06ae10 100644 --- a/libavcodec/cabac.h +++ b/libavcodec/cabac.h @@ -32,7 +32,6 @@ #define CABAC_BITS 16 #define CABAC_MASK ((1<= 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"\ diff --git a/libavutil/common.h b/libavutil/common.h index 9a836f1b57..3ae59716e4 100644 --- a/libavutil/common.h +++ b/libavutil/common.h @@ -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" diff --git a/libavutil/internal.h b/libavutil/internal.h index 29e4cc8fff..285d30457f 100644 --- a/libavutil/internal.h +++ b/libavutil/internal.h @@ -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"\