diff options
| author | Arun Raghavan <arun.raghavan@collabora.co.uk> | 2010-11-26 11:55:57 +0530 | 
|---|---|---|
| committer | Colin Guthrie <cguthrie@mandriva.org> | 2010-11-28 16:23:18 +0000 | 
| commit | 12b900858ae82d435c100d6eb94cb7bb22fe5e29 (patch) | |
| tree | c53218901e1ba933393bedd755c9f477c9ce932c | |
| parent | 6828c594e3fdc3d4553dbf9aae018afe861e047c (diff) | |
volume: Add explicit checks for ARMv6 instructionsv0.98-dev
This ensures that the build does not fail if the ssat and pkhbt
instructions are not available (armv5te and below).
Fixes: http://www.pulseaudio.org/ticket/790
| -rw-r--r-- | configure.ac | 33 | ||||
| -rw-r--r-- | src/pulsecore/svolume_arm.c | 8 | 
2 files changed, 36 insertions, 5 deletions
diff --git a/configure.ac b/configure.ac index f93d4616..0f6ff815 100644 --- a/configure.ac +++ b/configure.ac @@ -227,7 +227,7 @@ else                      [pulseaudio_cv_support_arm_atomic_ops=no])                   ])                 AS_IF([test "$pulseaudio_cv_support_arm_atomic_ops" = "yes"], [ -                   AC_DEFINE([ATOMIC_ARM_INLINE_ASM], 1, [Have ARMv6 instructions.]) +                   AC_DEFINE([ATOMIC_ARM_INLINE_ASM], 1, [Have ARM atomic instructions.])                     need_libatomic_ops=no                   ])             fi @@ -246,6 +246,37 @@ else      esac  fi +# If we're on ARM, check for the ARMV6 instructions we need */ +case $host in +  arm*) +    AC_CACHE_CHECK([support for required armv6 instructions], +      pulseaudio_cv_support_armv6, +      [AC_COMPILE_IFELSE( +         AC_LANG_PROGRAM([], +           [[volatile int a = -60000, b = 0xaaaabbbb, c = 0xccccdddd; +             asm volatile ("ldr r0, %2 \n" +                           "ldr r2, %3 \n" +                           "ldr r3, %4 \n" +                           "ssat r1, #8, r0 \n" +                           "str r1, %0 \n" +                           "pkhbt r1, r3, r2, LSL #8 \n" +                           "str r1, %1 \n" +                           : "=m" (a), "=m" (b) +                           : "m" (a), "m" (b), "m" (c) +                           : "r0", "r1", "r2", "r3", "cc"); +             return (a == -128 && b == 0xaabbdddd) ? 0 : -1; +           ]]), +         [pulseaudio_cv_support_armv6=yes], +         [pulseaudio_cv_support_armv6=no]) +      ]) +    AS_IF([test "$pulseaudio_cv_support_armv6" = "yes"], [ +        AC_DEFINE([HAVE_ARMV6], 1, [Have ARMv6 instructions.]) +      ]) +  ;; +  *) +  ;; +esac +  CC_CHECK_TLS  AC_CACHE_CHECK([whether $CC knows _Bool], diff --git a/src/pulsecore/svolume_arm.c b/src/pulsecore/svolume_arm.c index fdd8f09a..3973e518 100644 --- a/src/pulsecore/svolume_arm.c +++ b/src/pulsecore/svolume_arm.c @@ -35,7 +35,7 @@  #include "sample-util.h"  #include "endianmacros.h" -#if defined (__arm__) +#if defined (__arm__) && defined (HAVE_ARMV6)  #define MOD_INC() \      " subs  r0, r6, %2              \n\t" \ @@ -182,11 +182,11 @@ static void run_test (void) {  }  #endif -#endif /* defined (__arm__) */ +#endif /* defined (__arm__) && defined (HAVE_ARMV6) */  void pa_volume_func_init_arm (pa_cpu_arm_flag_t flags) { -#if defined (__arm__) +#if defined (__arm__) && defined (HAVE_ARMV6)      pa_log_info("Initialising ARM optimized functions.");  #ifdef RUN_TEST @@ -194,5 +194,5 @@ void pa_volume_func_init_arm (pa_cpu_arm_flag_t flags) {  #endif      pa_set_volume_func (PA_SAMPLE_S16NE,     (pa_do_volume_func_t) pa_volume_s16ne_arm); -#endif /* defined (__arm__) */ +#endif /* defined (__arm__) && defined (HAVE_ARMV6) */  }  | 
