[FFmpeg-cvslog] ARM: use Q/R inline asm operand modifiers only if supported

Mans Rullgard git at videolan.org
Thu Aug 9 01:02:18 CEST 2012


ffmpeg | branch: master | Mans Rullgard <mans at mansr.com> | Tue Aug  7 17:43:29 2012 +0100| [ec9d2c15c17ada4ebb5c8ca335a71a1f330dcaf9] | committer: 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: Mans Rullgard <mans at mansr.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=ec9d2c15c17ada4ebb5c8ca335a71a1f330dcaf9
---

 configure                    |    2 ++
 libavutil/arm/intmath.h      |    4 ++++
 libavutil/arm/intreadwrite.h |    4 ++++
 3 files changed, 10 insertions(+)

diff --git a/configure b/configure
index f432068..da4036e 100755
--- a/configure
+++ b/configure
@@ -1077,6 +1077,7 @@ HAVE_LIST="
     alsa_asoundlib_h
     altivec_h
     arpa_inet_h
+    asm_mod_q
     asm_mod_y
     attribute_may_alias
     attribute_packed
@@ -2792,6 +2793,7 @@ EOF
     enabled neon    && check_asm neon    '"vadd.i16 q0, q0, q0"'
     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)'
 
     enabled_all armv6t2 shared !pic && enable_pic
diff --git a/libavutil/arm/intmath.h b/libavutil/arm/intmath.h
index b6a45c1..fa31ecf 100644
--- a/libavutil/arm/intmath.h
+++ b/libavutil/arm/intmath.h
@@ -97,6 +97,8 @@ static av_always_inline av_const int FASTDIV(int a, int b)
 
 #endif /* HAVE_ARMV6 */
 
+#if HAVE_ASM_MOD_Q
+
 #define av_clipl_int32 av_clipl_int32_arm
 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;
 }
 
+#endif /* HAVE_ASM_MOD_Q */
+
 #endif /* HAVE_INLINE_ASM */
 
 #endif /* AVUTIL_ARM_INTMATH_H */
diff --git a/libavutil/arm/intreadwrite.h b/libavutil/arm/intreadwrite.h
index ed53330..6eff733 100644
--- a/libavutil/arm/intreadwrite.h
+++ b/libavutil/arm/intreadwrite.h
@@ -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));
 }
 
+#if HAVE_ASM_MOD_Q
+
 #define AV_RN64 AV_RN64
 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)
              : "r"(v));
 }
 
+#endif /* HAVE_ASM_MOD_Q */
+
 #endif /* HAVE_INLINE_ASM */
 
 #endif /* AVUTIL_ARM_INTREADWRITE_H */



More information about the ffmpeg-cvslog mailing list