[Ffmpeg-devel] [PATCH] build with '--enable-gprof'
Dmitry Antipov
dmantipov
Thu Dec 7 14:02:22 CET 2006
Michael Niedermayer wrote:
> rejected NO further complication of the ifdefs will be accpeted, replace
> them by EBP_IS_SPECIAL and set that by a configure check which checks if
> the compiler with the current flags can use ebp
Ok. Try to look at this, but note that the check is strictly gcc-specific.
(For example, Intel C will compile it, but the resulting code is wrong and
will cause SIGSEGV. So, if the portability is important, the checking code
should be similar to the following:
#if defined(__INTEL_COMPILER)
#error "This will compile, but will not run"
#elif defined(__YOUR_FAVORITE_CC)
/* stuff */
#elif defined(__GNUC__)
int main (int argc, char *argv[])
{
asm volatile ("mov %0, %%ebp\n\t"
: : "r"(argc) : "ebp");
return 0;
}
#else
#error "Unsupported compiler"
#endif
Dmitry
Index: configure
===================================================================
--- configure (revision 7245)
+++ configure (working copy)
@@ -626,6 +626,7 @@
gpl="no"
memalign_hack="no"
asmalign_pot="unknown"
+ebp_is_special="unknown"
LIB_INSTALL_EXTRA_CMD='$(RANLIB) "$(libdir)/$(LIB)"'
# OS specific
@@ -1187,7 +1188,7 @@
fi
fi
-if test $optimize != "no"; then
+if test $optimize != "no" && test $gprof != "yes"; then
add_cflags "-fomit-frame-pointer"
fi
@@ -1678,8 +1679,8 @@
fi
if test "$gprof" = "yes" ; then
- add_cflags "-p"
- add_ldflags "-p"
+ add_cflags "-pg"
+ add_ldflags "-pg"
fi
VHOOKCFLAGS="-fPIC $CFLAGS"
@@ -1691,6 +1692,19 @@
echo 'asm (".align 3");' | check_cc && asmalign_pot="yes"
fi
+# find if ebp may be used as a general register (x86)
+if test $arch = "x86_32" -o $arch = "x86_64"; then
+ ebp_is_special="yes"
+ check_cc <<EOF && ebp_is_special="no"
+int main (int argc, char *argv[])
+{
+ asm volatile ("mov %0, %%ebp\n\t"
+ : : "r"(argc) : "ebp");
+ return 0;
+}
+EOF
+fi
+
echo "install prefix $PREFIX"
echo "source path $source_path"
echo "C compiler $cc"
@@ -1947,6 +1961,7 @@
printf '#define ASMALIGN(ZEROBITS) ".align 1<<" #ZEROBITS "\\n\\t"\n' >> $TMPH
fi
+test "$ebp_is_special" = "yes" && echo '#define EBP_IS_SPECIAL 1' >> $TMPH
for codec in $DECODER_LIST $ENCODER_LIST $PARSER_LIST $DEMUXER_LIST $MUXER_LIST; do
ucname="`toupper $codec`"
Index: libavcodec/cabac.h
===================================================================
--- libavcodec/cabac.h (revision 7245)
+++ libavcodec/cabac.h (working copy)
@@ -376,7 +376,7 @@
#define BYTE "16"
#define BYTEEND "20"
#endif
-#if defined(ARCH_X86) && !(defined(PIC) && defined(__GNUC__))
+#if defined(ARCH_X86) && !defined(EBP_IS_SPECIAL)
int bit;
#ifndef BRANCHLESS_CABAC_DECODER
@@ -532,7 +532,7 @@
);
bit&=1;
#endif /* BRANCHLESS_CABAC_DECODER */
-#else /* defined(ARCH_X86) && !(defined(PIC) && defined(__GNUC__)) */
+#else /* defined(ARCH_X86) && !defined(EBP_IS_SPECIAL) */
int s = *state;
int RangeLPS= ff_h264_lps_range[2*(c->range&0xC0) + s];
int bit, lps_mask attribute_unused;
@@ -571,7 +571,7 @@
if(!(c->low & CABAC_MASK))
refill2(c);
#endif /* BRANCHLESS_CABAC_DECODER */
-#endif /* defined(ARCH_X86) && !(defined(PIC) && defined(__GNUC__)) */
+#endif /* defined(ARCH_X86) && !defined(EBP_IS_SPECIAL) */
return bit;
}
@@ -632,7 +632,7 @@
static always_inline int get_cabac_bypass_sign(CABACContext *c, int val){
-#if defined(ARCH_X86) && !(defined(PIC) && defined(__GNUC__))
+#if defined(ARCH_X86) && !defined(EBP_IS_SPECIAL)
asm volatile(
"movl "RANGE "(%1), %%ebx \n\t"
"movl "LOW "(%1), %%eax \n\t"
@@ -680,7 +680,7 @@
//FIXME the x86 code from this file should be moved into i386/h264 or cabac something.c/h (note ill kill you if you move my code away from under my fingers before iam finished with it!)
//FIXME use some macros to avoid duplicatin get_cabac (cant be done yet as that would make optimization work hard)
-#if defined(ARCH_X86) && !(defined(PIC) && defined(__GNUC__))
+#if defined(ARCH_X86) && !defined(EBP_IS_SPECIAL)
static int decode_significance_x86(CABACContext *c, int max_coeff, uint8_t *significant_coeff_ctx_base, int *index){
void *end= significant_coeff_ctx_base + max_coeff - 1;
int minusstart= -(int)significant_coeff_ctx_base;
@@ -786,7 +786,7 @@
);
return coeff_count;
}
-#endif /* defined(ARCH_X86) && !(defined(PIC) && defined(__GNUC__)) */
+#endif /* defined(ARCH_X86) && !defined(EBP_IS_SPECIAL) */
/**
*
Index: libavcodec/h264.c
===================================================================
--- libavcodec/h264.c (revision 7245)
+++ libavcodec/h264.c (working copy)
@@ -6027,7 +6027,7 @@
index[coeff_count++] = last;\
}
const uint8_t *sig_off = significant_coeff_flag_offset_8x8[MB_FIELD];
-#if defined(ARCH_X86) && !(defined(PIC) && defined(__GNUC__))
+#if defined(ARCH_X86) && !defined(EBP_IS_SPECIAL)
coeff_count= decode_significance_8x8_x86(CC, significant_coeff_ctx_base, index, sig_off);
} else {
coeff_count= decode_significance_x86(CC, max_coeff, significant_coeff_ctx_base, index);
More information about the ffmpeg-devel
mailing list