Commit 896a5bff authored by Janne Grunau's avatar Janne Grunau

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.
parent 68a06b3a
...@@ -1467,6 +1467,7 @@ SYSTEM_FUNCS=" ...@@ -1467,6 +1467,7 @@ SYSTEM_FUNCS="
" "
TOOLCHAIN_FEATURES=" TOOLCHAIN_FEATURES="
as_dn_directive
asm_mod_q asm_mod_q
attribute_may_alias attribute_may_alias
attribute_packed attribute_packed
...@@ -3721,6 +3722,20 @@ unsigned int endian = 'B' << 24 | 'I' << 16 | 'G' << 8 | 'E'; ...@@ -3721,6 +3722,20 @@ unsigned int endian = 'B' << 24 | 'I' << 16 | 'G' << 8 | 'E';
EOF EOF
od -t x1 $TMPO | grep -q '42 *49 *47 *45' && enable bigendian 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"' check_inline_asm inline_asm_labels '"1:\n"'
if enabled aarch64; then if enabled aarch64; then
...@@ -3739,7 +3754,6 @@ elif enabled arm; then ...@@ -3739,7 +3754,6 @@ elif enabled arm; then
check_cpp_condition stddef.h "defined __thumb__" && enable_weak thumb check_cpp_condition stddef.h "defined __thumb__" && enable_weak thumb
enabled thumb && check_cflags -mthumb || check_cflags -marm enabled thumb && check_cflags -mthumb || check_cflags -marm
nogas=die
if check_cpp_condition stddef.h "defined __ARM_PCS_VFP"; then if check_cpp_condition stddef.h "defined __ARM_PCS_VFP"; then
enable vfp_args enable vfp_args
...@@ -3767,6 +3781,11 @@ EOF ...@@ -3767,6 +3781,11 @@ EOF
check_inline_asm asm_mod_q '"add r0, %Q0, %R0" :: "r"((long long)0)' 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 [ $target_os != win32 ] && enabled_all armv6t2 shared !pic && enable_weak_pic
elif enabled mips; then elif enabled mips; then
...@@ -3792,7 +3811,6 @@ elif enabled ppc; then ...@@ -3792,7 +3811,6 @@ elif enabled ppc; then
# AltiVec flags: The FSF version of GCC differs from the Apple version # AltiVec flags: The FSF version of GCC differs from the Apple version
if enabled altivec; then if enabled altivec; then
nogas=warn
check_cflags -maltivec -mabi=altivec && check_cflags -maltivec -mabi=altivec &&
{ check_header altivec.h && inc_altivec_h="#include <altivec.h>" ; } || { check_header altivec.h && inc_altivec_h="#include <altivec.h>" ; } ||
check_cflags -faltivec check_cflags -faltivec
...@@ -3872,17 +3890,6 @@ EOF ...@@ -3872,17 +3890,6 @@ EOF
fi 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 check_ldflags -Wl,--as-needed
if check_func dlopen; then if check_func dlopen; then
......
...@@ -22,6 +22,8 @@ ...@@ -22,6 +22,8 @@
#include "libavcodec/vc1dsp.h" #include "libavcodec/vc1dsp.h"
#include "vc1dsp.h" #include "vc1dsp.h"
#include "config.h"
void ff_vc1_inv_trans_8x8_neon(int16_t *block); 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_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); 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) ...@@ -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->vc1_inv_trans_4x4_dc = ff_vc1_inv_trans_4x4_dc_neon;
dsp->put_vc1_mspel_pixels_tab[ 0] = ff_put_pixels8x8_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[ 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[ 2] = ff_put_vc1_mspel_mc20_neon;
dsp->put_vc1_mspel_pixels_tab[ 3] = ff_put_vc1_mspel_mc30_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) ...@@ -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[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[14] = ff_put_vc1_mspel_mc23_neon;
dsp->put_vc1_mspel_pixels_tab[15] = ff_put_vc1_mspel_mc33_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->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; dsp->avg_no_rnd_vc1_chroma_pixels_tab[0] = ff_avg_vc1_chroma_mc8_neon;
......
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
#include "libavutil/arm/asm.S" #include "libavutil/arm/asm.S"
#include "neon.S" #include "neon.S"
#include "config.h"
@ Transpose rows into columns of a matrix of 16-bit elements. For 4x4, pass @ Transpose rows into columns of a matrix of 16-bit elements. For 4x4, pass
@ double-word registers, for 8x4, pass quad-word registers. @ double-word registers, for 8x4, pass quad-word registers.
.macro transpose16 r0, r1, r2, r3 .macro transpose16 r0, r1, r2, r3
...@@ -661,6 +663,7 @@ function ff_vc1_inv_trans_4x4_neon, export=1 ...@@ -661,6 +663,7 @@ function ff_vc1_inv_trans_4x4_neon, export=1
bx lr bx lr
endfunc endfunc
#if HAVE_AS_DN_DIRECTIVE
@ The absolute value of multiplication constants from vc1_mspel_filter and vc1_mspel_{ver,hor}_filter_16bits. @ 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}). @ 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 #define MSPEL_MODE_1_MUL_CONSTANTS 4 53 18 3
...@@ -984,6 +987,7 @@ PUT_VC1_MSPEL_MC_V_ONLY(2) ...@@ -984,6 +987,7 @@ PUT_VC1_MSPEL_MC_V_ONLY(2)
PUT_VC1_MSPEL_MC_V_ONLY(3) PUT_VC1_MSPEL_MC_V_ONLY(3)
#undef PUT_VC1_MSPEL_MC_V_ONLY #undef PUT_VC1_MSPEL_MC_V_ONLY
#endif
function ff_put_pixels8x8_neon, export=1 function ff_put_pixels8x8_neon, export=1
vld1.64 {d0}, [r1], r2 vld1.64 {d0}, [r1], r2
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment