From 94e4c3a333c50170c6645bc5ea43578270249644 Mon Sep 17 00:00:00 2001 From: Guillaume Poirier Date: Fri, 20 Oct 2006 17:53:19 +0000 Subject: [PATCH] Protect code that uses CMOV instructions with HAVE_CMOV, 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 | 15 ++++++++++++++- libavcodec/cabac.h | 3 +-- libavutil/common.h | 2 +- libavutil/internal.h | 2 +- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/configure b/configure index 64b906f..12a6054 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 e191a62..ff3e06a 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 9a836f1..3ae5971 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 29e4cc8..285d304 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"\ -- 2.7.4