From a589afa3a7f3430a5b37bb9efb6574fe6ac8d9af Mon Sep 17 00:00:00 2001 From: Jeff Muizelaar Date: Wed, 6 May 2009 13:30:29 -0400 Subject: [PATCH] Enable NEON assembly when we can build it This adds detection for ARM NEON build support as well as gnu assembler syntax detection from Jonathan Morton. --- configure.ac | 76 +++++++++++++++++++++++++++++++++++++++++++++++++--- pixman/Makefile.am | 15 +++++++++-- pixman/pixman-pict.c | 1 + 3 files changed, 87 insertions(+), 5 deletions(-) diff --git a/configure.ac b/configure.ac index c35862f..f1998c3 100644 --- a/configure.ac +++ b/configure.ac @@ -326,11 +326,12 @@ AC_SUBST(VMX_CFLAGS) AM_CONDITIONAL(USE_VMX, test $have_vmx_intrinsics = yes) dnl Check for ARM SIMD instructions +ARM_SIMD_CFLAGS="" have_arm_simd=no AC_MSG_CHECKING(whether to use ARM SIMD assembler) xserver_save_CFLAGS=$CFLAGS -CFLAGS="$CFLAGS $ARM_CFLAGS" +CFLAGS="$CFLAGS $ARM_SIMD_CFLAGS" AC_COMPILE_IFELSE([ int main () { asm("uqadd8 r1, r1, r2"); @@ -350,7 +351,7 @@ fi if test $have_arm_simd = yes ; then AC_DEFINE(USE_ARM_SIMD, 1, [use ARM SIMD compiler intrinsics]) else - ARM_CFLAGS= + ARM_SIMD_CFLAGS= fi AC_MSG_RESULT($have_arm_simd) @@ -358,9 +359,78 @@ if test $enable_arm_simd = yes && test $have_arm_simd = no ; then AC_MSG_ERROR([ARM SIMD intrinsics not detected]) fi -AC_SUBST(ARM_CFLAGS) +dnl Check for ARM NEON instructions +ARM_NEON_CFLAGS="-mfpu=neon -mfloat-abi=softfp" + +have_arm_neon=no +AC_MSG_CHECKING(whether to use ARM NEON) +xserver_save_CFLAGS=$CFLAGS +CFLAGS="$CFLAGS $ARM_NEON_CFLAGS" +AC_COMPILE_IFELSE([ +#include +int main () { + uint8x8_t neon_test=vmov_n_u8(0); + return 0; +}], have_arm_neon=yes) +CFLAGS=$xserver_save_CFLAGS + +AC_ARG_ENABLE(arm-neon, + [AC_HELP_STRING([--disable-arm-neon], + [disable ARM NEON fast paths])], + [enable_arm_neon=$enableval], [enable_arm_neon=auto]) + +if test $enable_arm_neon = no ; then + have_arm_neon=disabled +fi + +if test $have_arm_neon = yes ; then + AC_DEFINE(USE_ARM_NEON, 1, [use ARM NEON compiler intrinsics]) +else + ARM_NEON_CFLAGS= +fi + +AC_MSG_RESULT($have_arm_neon) +if test $enable_arm_neon = yes && test $have_arm_neon = no ; then + AC_MSG_ERROR([ARM NEON intrinsics not detected]) +fi + +dnl Check for GNU-style inline assembly support + +have_gcc_inline_asm=no +AC_MSG_CHECKING(whether to use GNU-style inline assembler) +AC_COMPILE_IFELSE([ +int main () { + /* Most modern architectures have a NOP instruction, so this is a fairly generic test. */ + asm volatile ( "\tnop\n" : : : "cc", "memory" ); + return 0; +}], have_gcc_inline_asm=yes) + +AC_ARG_ENABLE(gcc-inline-asm, + [AC_HELP_STRING([--disable-gcc-inline-asm], + [disable GNU-style inline assembler])], + [enable_gcc_inline_asm=$enableval], [enable_gcc_inline_asm=auto]) + +if test $enable_gcc_inline_asm = no ; then + have_gcc_inline_asm=disabled +fi + +if test $have_gcc_inline_asm = yes ; then + AC_DEFINE(USE_GCC_INLINE_ASM, 1, [use GNU-style inline assembler]) +fi + +AC_MSG_RESULT($have_gcc_inline_asm) +if test $enable_gcc_inline_asm = yes && test $have_gcc_inline_asm = no ; then + AC_MSG_ERROR([GNU-style inline assembler not detected]) +fi + + +AC_SUBST(ARM_SIMD_CFLAGS) +AC_SUBST(ARM_NEON_CFLAGS) AM_CONDITIONAL(USE_ARM_SIMD, test $have_arm_simd = yes) +AM_CONDITIONAL(USE_ARM_NEON, test $have_arm_neon = yes) +AM_CONDITIONAL(USE_GCC_INLINE_ASM, test $have_gcc_inline_asm = yes) + AC_ARG_ENABLE(gtk, diff --git a/pixman/Makefile.am b/pixman/Makefile.am index 7fdb085..e976fe4 100644 --- a/pixman/Makefile.am +++ b/pixman/Makefile.am @@ -83,15 +83,26 @@ libpixman_1_la_LDFLAGS += $(SSE2_LDFLAGS) libpixman_1_la_LIBADD += libpixman-sse2.la endif -# arm code +# arm simd code if USE_ARM_SIMD noinst_LTLIBRARIES += libpixman-arm-simd.la libpixman_arm_simd_la_SOURCES = \ pixman-arm-simd.c \ pixman-arm-simd.h -libpixman_arm_simd_la_CFLAGS = $(DEP_CFLAGS) $(ARM_CFLAGS) +libpixman_arm_simd_la_CFLAGS = $(DEP_CFLAGS) $(ARM_SIMD_CFLAGS) libpixman_arm_simd_la_LIBADD = $(DEP_LIBS) libpixman_1_la_LIBADD += libpixman-arm-simd.la endif +# arm neon code +if USE_ARM_NEON +noinst_LTLIBRARIES += libpixman-arm-neon.la +libpixman_arm_neon_la_SOURCES = \ + pixman-arm-neon.c \ + pixman-arm-neon.h +libpixman_arm_neon_la_CFLAGS = $(DEP_CFLAGS) $(ARM_NEON_CFLAGS) +libpixman_arm_neon_la_LIBADD = $(DEP_LIBS) +libpixman_1_la_LIBADD += libpixman-arm-neon.la +endif + diff --git a/pixman/pixman-pict.c b/pixman/pixman-pict.c index 2b64342..1aef166 100644 --- a/pixman/pixman-pict.c +++ b/pixman/pixman-pict.c @@ -35,6 +35,7 @@ #include "pixman-vmx.h" #include "pixman-sse2.h" #include "pixman-arm-simd.h" +#include "pixman-arm-neon.h" #include "pixman-combine32.h" #if defined(USE_ARM_SIMD) && defined(_MSC_VER) -- 2.7.4