Commit ec9d2c15 authored by Mans Rullgard's avatar Mans Rullgard

ARM: use Q/R inline asm operand modifiers only if supported

Some compilers do not support the Q/R modifiers used to access
the low/high parts of a 64-bit register pair.  Check for this
and disable all uses of it when not supported.

Fixes bug #337.
Signed-off-by: default avatarMans Rullgard <mans@mansr.com>
parent 4ab26cb4
...@@ -1077,6 +1077,7 @@ HAVE_LIST=" ...@@ -1077,6 +1077,7 @@ HAVE_LIST="
alsa_asoundlib_h alsa_asoundlib_h
altivec_h altivec_h
arpa_inet_h arpa_inet_h
asm_mod_q
asm_mod_y asm_mod_y
attribute_may_alias attribute_may_alias
attribute_packed attribute_packed
...@@ -2792,6 +2793,7 @@ EOF ...@@ -2792,6 +2793,7 @@ EOF
enabled neon && check_asm neon '"vadd.i16 q0, q0, q0"' enabled neon && check_asm neon '"vadd.i16 q0, q0, q0"'
enabled vfpv3 && check_asm vfpv3 '"vmov.f32 s0, #1.0"' enabled vfpv3 && check_asm vfpv3 '"vmov.f32 s0, #1.0"'
check_asm asm_mod_q '"add r0, %Q0, %R0" :: "r"((long long)0)'
check_asm asm_mod_y '"vmul.i32 d0, d0, %y0" :: "x"(0)' check_asm asm_mod_y '"vmul.i32 d0, d0, %y0" :: "x"(0)'
enabled_all armv6t2 shared !pic && enable_pic enabled_all armv6t2 shared !pic && enable_pic
......
...@@ -97,6 +97,8 @@ static av_always_inline av_const int FASTDIV(int a, int b) ...@@ -97,6 +97,8 @@ static av_always_inline av_const int FASTDIV(int a, int b)
#endif /* HAVE_ARMV6 */ #endif /* HAVE_ARMV6 */
#if HAVE_ASM_MOD_Q
#define av_clipl_int32 av_clipl_int32_arm #define av_clipl_int32 av_clipl_int32_arm
static av_always_inline av_const int32_t av_clipl_int32_arm(int64_t a) static av_always_inline av_const int32_t av_clipl_int32_arm(int64_t a)
{ {
...@@ -110,6 +112,8 @@ static av_always_inline av_const int32_t av_clipl_int32_arm(int64_t a) ...@@ -110,6 +112,8 @@ static av_always_inline av_const int32_t av_clipl_int32_arm(int64_t a)
return x; return x;
} }
#endif /* HAVE_ASM_MOD_Q */
#endif /* HAVE_INLINE_ASM */ #endif /* HAVE_INLINE_ASM */
#endif /* AVUTIL_ARM_INTMATH_H */ #endif /* AVUTIL_ARM_INTMATH_H */
...@@ -61,6 +61,8 @@ static av_always_inline void AV_WN32(void *p, uint32_t v) ...@@ -61,6 +61,8 @@ static av_always_inline void AV_WN32(void *p, uint32_t v)
__asm__ ("str %1, %0" : "=m"(*(uint32_t *)p) : "r"(v)); __asm__ ("str %1, %0" : "=m"(*(uint32_t *)p) : "r"(v));
} }
#if HAVE_ASM_MOD_Q
#define AV_RN64 AV_RN64 #define AV_RN64 AV_RN64
static av_always_inline uint64_t AV_RN64(const void *p) static av_always_inline uint64_t AV_RN64(const void *p)
{ {
...@@ -82,6 +84,8 @@ static av_always_inline void AV_WN64(void *p, uint64_t v) ...@@ -82,6 +84,8 @@ static av_always_inline void AV_WN64(void *p, uint64_t v)
: "r"(v)); : "r"(v));
} }
#endif /* HAVE_ASM_MOD_Q */
#endif /* HAVE_INLINE_ASM */ #endif /* HAVE_INLINE_ASM */
#endif /* AVUTIL_ARM_INTREADWRITE_H */ #endif /* AVUTIL_ARM_INTREADWRITE_H */
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