diff options
author | Janne Grunau <janne-libav@jannau.net> | 2014-05-29 14:21:05 +0200 |
---|---|---|
committer | Janne Grunau <janne-libav@jannau.net> | 2014-06-03 14:23:03 +0200 |
commit | 896a5bff64264f4d01ed98eacc97a67260c1e17e (patch) | |
tree | 97b2aa8e1a230e7fda4a1d9232b12c5500ace3c1 | |
parent | 68a06b3a639ee21c78532ee4c50c3366bf890ff7 (diff) | |
download | ffmpeg-streaming-896a5bff64264f4d01ed98eacc97a67260c1e17e.zip ffmpeg-streaming-896a5bff64264f4d01ed98eacc97a67260c1e17e.tar.gz |
arm: check if AS supports .dn
Move the GNU as check before the arch specific asm checks since the .dn
check requires gas compatible assembler.
Disable the VC-1 motion compensation NEON asm which is the only part
using that directive. The integrated assembler in the upcoming clang 3.5
does not support .dn/.qn without plans to change that. Too much effort
to implement it while it is rarely used.
http://llvm.org/bugs/show_bug.cgi?id=18199.
-rwxr-xr-x | configure | 33 | ||||
-rw-r--r-- | libavcodec/arm/vc1dsp_init_neon.c | 4 | ||||
-rw-r--r-- | libavcodec/arm/vc1dsp_neon.S | 4 |
3 files changed, 28 insertions, 13 deletions
@@ -1467,6 +1467,7 @@ SYSTEM_FUNCS=" " TOOLCHAIN_FEATURES=" + as_dn_directive asm_mod_q attribute_may_alias attribute_packed @@ -3721,6 +3722,20 @@ unsigned int endian = 'B' << 24 | 'I' << 16 | 'G' << 8 | 'E'; EOF od -t x1 $TMPO | grep -q '42 *49 *47 *45' && enable bigendian + +if enabled asm; then + enabled arm && nogas=die + enabled_all ppc altivec && nogas=warn + as=${gas:=$as} + check_as <<EOF && enable gnu_as || \ + $nogas "GNU assembler not found, install gas-preprocessor" +.macro m n +\n: .int 0 +.endm +m x +EOF +fi + check_inline_asm inline_asm_labels '"1:\n"' if enabled aarch64; then @@ -3739,7 +3754,6 @@ elif enabled arm; then check_cpp_condition stddef.h "defined __thumb__" && enable_weak thumb enabled thumb && check_cflags -mthumb || check_cflags -marm - nogas=die if check_cpp_condition stddef.h "defined __ARM_PCS_VFP"; then enable vfp_args @@ -3767,6 +3781,11 @@ EOF check_inline_asm asm_mod_q '"add r0, %Q0, %R0" :: "r"((long long)0)' + check_as <<EOF && enable as_dn_directive +ra .dn d0.i16 +.unreq ra +EOF + [ $target_os != win32 ] && enabled_all armv6t2 shared !pic && enable_weak_pic elif enabled mips; then @@ -3792,7 +3811,6 @@ elif enabled ppc; then # AltiVec flags: The FSF version of GCC differs from the Apple version if enabled altivec; then - nogas=warn check_cflags -maltivec -mabi=altivec && { check_header altivec.h && inc_altivec_h="#include <altivec.h>" ; } || check_cflags -faltivec @@ -3872,17 +3890,6 @@ EOF fi -if enabled asm; then - as=${gas:=$as} - check_as <<EOF && enable gnu_as || \ - $nogas "GNU assembler not found, install gas-preprocessor" -.macro m n -\n: .int 0 -.endm -m x -EOF -fi - check_ldflags -Wl,--as-needed if check_func dlopen; then diff --git a/libavcodec/arm/vc1dsp_init_neon.c b/libavcodec/arm/vc1dsp_init_neon.c index 912e33c..9ded7a2 100644 --- a/libavcodec/arm/vc1dsp_init_neon.c +++ b/libavcodec/arm/vc1dsp_init_neon.c @@ -22,6 +22,8 @@ #include "libavcodec/vc1dsp.h" #include "vc1dsp.h" +#include "config.h" + void ff_vc1_inv_trans_8x8_neon(int16_t *block); void ff_vc1_inv_trans_4x8_neon(uint8_t *dest, int linesize, int16_t *block); void ff_vc1_inv_trans_8x4_neon(uint8_t *dest, int linesize, int16_t *block); @@ -91,6 +93,7 @@ av_cold void ff_vc1dsp_init_neon(VC1DSPContext *dsp) dsp->vc1_inv_trans_4x4_dc = ff_vc1_inv_trans_4x4_dc_neon; dsp->put_vc1_mspel_pixels_tab[ 0] = ff_put_pixels8x8_neon; + if (HAVE_AS_DN_DIRECTIVE) { dsp->put_vc1_mspel_pixels_tab[ 1] = ff_put_vc1_mspel_mc10_neon; dsp->put_vc1_mspel_pixels_tab[ 2] = ff_put_vc1_mspel_mc20_neon; dsp->put_vc1_mspel_pixels_tab[ 3] = ff_put_vc1_mspel_mc30_neon; @@ -106,6 +109,7 @@ av_cold void ff_vc1dsp_init_neon(VC1DSPContext *dsp) dsp->put_vc1_mspel_pixels_tab[13] = ff_put_vc1_mspel_mc13_neon; dsp->put_vc1_mspel_pixels_tab[14] = ff_put_vc1_mspel_mc23_neon; dsp->put_vc1_mspel_pixels_tab[15] = ff_put_vc1_mspel_mc33_neon; + } dsp->put_no_rnd_vc1_chroma_pixels_tab[0] = ff_put_vc1_chroma_mc8_neon; dsp->avg_no_rnd_vc1_chroma_pixels_tab[0] = ff_avg_vc1_chroma_mc8_neon; diff --git a/libavcodec/arm/vc1dsp_neon.S b/libavcodec/arm/vc1dsp_neon.S index d1b24cf..fa87ede 100644 --- a/libavcodec/arm/vc1dsp_neon.S +++ b/libavcodec/arm/vc1dsp_neon.S @@ -24,6 +24,8 @@ #include "libavutil/arm/asm.S" #include "neon.S" +#include "config.h" + @ Transpose rows into columns of a matrix of 16-bit elements. For 4x4, pass @ double-word registers, for 8x4, pass quad-word registers. .macro transpose16 r0, r1, r2, r3 @@ -661,6 +663,7 @@ function ff_vc1_inv_trans_4x4_neon, export=1 bx lr endfunc +#if HAVE_AS_DN_DIRECTIVE @ The absolute value of multiplication constants from vc1_mspel_filter and vc1_mspel_{ver,hor}_filter_16bits. @ The sign is embedded in the code below that carries out the multiplication (mspel_filter{,.16}). #define MSPEL_MODE_1_MUL_CONSTANTS 4 53 18 3 @@ -984,6 +987,7 @@ PUT_VC1_MSPEL_MC_V_ONLY(2) PUT_VC1_MSPEL_MC_V_ONLY(3) #undef PUT_VC1_MSPEL_MC_V_ONLY +#endif function ff_put_pixels8x8_neon, export=1 vld1.64 {d0}, [r1], r2 |