On Thu, Aug 29, 2013 at 10:02 AM, Søren Sandmann Pedersen <[email protected]> wrote: > This commit adds a new, empty SSSE3 implementation and the associated > build system support. > > configure.ac: detect whether the compiler understands SSSE3 > intrinsics and set up the required CFLAGS > > Makefile.am: Add libpixman-ssse3.la > > pixman-x86.c: Add X86_SSSE3 feature flag and detect it in > detect_cpu_features(). > > pixman-ssse3.c: New file with an empty SSSE3 implementation > --- > configure.ac | 46 +++++++++++++++++++++++++++++++++++++++++++ > pixman/Makefile.am | 12 +++++++++++ > pixman/pixman-private.h | 5 ++++ > pixman/pixman-ssse3.c | 50 > +++++++++++++++++++++++++++++++++++++++++++++++ > pixman/pixman-x86.c | 15 ++++++++++++- > 5 files changed, 126 insertions(+), 2 deletions(-) > create mode 100644 pixman/pixman-ssse3.c > > diff --git a/configure.ac b/configure.ac > index 5b9512c..ff97bfb 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -437,6 +437,50 @@ fi > AM_CONDITIONAL(USE_SSE2, test $have_sse2_intrinsics = yes) > > dnl > =========================================================================== > +dnl Check for SSSE3 > + > +if test "x$SSSE3_CFLAGS" = "x" ; then > + SSSE3_CFLAGS="-mssse3 -Winline" > +fi > + > +have_ssse3_intrinsics=no > +AC_MSG_CHECKING(whether to use SSSE3 intrinsics) > +xserver_save_CFLAGS=$CFLAGS > +CFLAGS="$SSSE3_CFLAGS $CFLAGS" > + > +AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ > +#include <mmintrin.h> > +#include <xmmintrin.h> > +#include <emmintrin.h> > +#include <tmmintrin.h> > +int main () { > + __m128i a = _mm_set1_epi32 (0), b = _mm_set1_epi32 (0), c; > + c = _mm_maddubs_epi16 (a, b); > + return 0; > +}]])], have_ssse3_intrinsics=yes) > +CFLAGS=$xserver_save_CFLAGS > + > +AC_ARG_ENABLE(ssse3, > + [AC_HELP_STRING([--disable-ssse3], > + [disable SSSE3 fast paths])], > + [enable_ssse3=$enableval], [enable_ssse3=auto]) > + > +if test $enable_ssse3 = no ; then > + have_ssse3_intrinsics=disabled > +fi > + > +if test $have_ssse3_intrinsics = yes ; then > + AC_DEFINE(USE_SSSE3, 1, [use SSSE3 compiler intrinsics]) > +fi > + > +AC_MSG_RESULT($have_ssse3_intrinsics) > +if test $enable_ssse3 = yes && test $have_ssse3_intrinsics = no ; then > + AC_MSG_ERROR([SSSE3 intrinsics not detected]) > +fi > + > +AM_CONDITIONAL(USE_SSSE3, test $have_ssse3_intrinsics = yes) > + > +dnl > =========================================================================== > dnl Other special flags needed when building code using MMX or SSE > instructions > case $host_os in > solaris*) > @@ -471,6 +515,8 @@ AC_SUBST(MMX_CFLAGS) > AC_SUBST(MMX_LDFLAGS) > AC_SUBST(SSE2_CFLAGS) > AC_SUBST(SSE2_LDFLAGS) > +AC_SUBST(SSSE3_CFLAGS) > +AC_SUBST(SSSE3_LDFLAGS)
No need for SSSE3_LDFLAGS. Remove it? > dnl > =========================================================================== > dnl Check for VMX/Altivec > diff --git a/pixman/Makefile.am b/pixman/Makefile.am > index b9ea754..b376d9a 100644 > --- a/pixman/Makefile.am > +++ b/pixman/Makefile.am > @@ -52,6 +52,18 @@ libpixman_1_la_LIBADD += libpixman-sse2.la > ASM_CFLAGS_sse2=$(SSE2_CFLAGS) > endif > > +# ssse3 code > +if USE_SSSE3 > +noinst_LTLIBRARIES += libpixman-ssse3.la > +libpixman_ssse3_la_SOURCES = \ > + pixman-ssse3.c > +libpixman_ssse3_la_CFLAGS = $(SSSE3_CFLAGS) > +libpixman_1_la_LDFLAGS += $(SSSE3_LDFLAGS) > +libpixman_1_la_LIBADD += libpixman-ssse3.la > + > +ASM_CFLAGS_ssse3=$(SSSE3_CFLAGS) > +endif > + > # arm simd code > if USE_ARM_SIMD > noinst_LTLIBRARIES += libpixman-arm-simd.la > diff --git a/pixman/pixman-private.h b/pixman/pixman-private.h > index 0afabad..732f3d1 100644 > --- a/pixman/pixman-private.h > +++ b/pixman/pixman-private.h > @@ -593,6 +593,11 @@ pixman_implementation_t * > _pixman_implementation_create_sse2 (pixman_implementation_t *fallback); > #endif > > +#ifdef USE_SSSE3 > +pixman_implementation_t * > +_pixman_implementation_create_ssse3 (pixman_implementation_t *fallback); > +#endif > + > #ifdef USE_ARM_SIMD > pixman_implementation_t * > _pixman_implementation_create_arm_simd (pixman_implementation_t *fallback); > diff --git a/pixman/pixman-ssse3.c b/pixman/pixman-ssse3.c > new file mode 100644 > index 0000000..19d71e7 > --- /dev/null > +++ b/pixman/pixman-ssse3.c > @@ -0,0 +1,50 @@ > +/* > + * Copyright © 2013 Soren Sandmann Pedersen > + * Copyright © 2013 Red Hat, Inc. > + * > + * Permission is hereby granted, free of charge, to any person obtaining a > + * copy of this software and associated documentation files (the "Software"), > + * to deal in the Software without restriction, including without limitation > + * the rights to use, copy, modify, merge, publish, distribute, sublicense, > + * and/or sell copies of the Software, and to permit persons to whom the > + * Software is furnished to do so, subject to the following conditions: > + * > + * The above copyright notice and this permission notice (including the next > + * paragraph) shall be included in all copies or substantial portions of the > + * Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL > + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER > + * DEALINGS IN THE SOFTWARE. > + * > + * Author: Soren Sandmann ([email protected]) > + */ > +#ifdef HAVE_CONFIG_H > +#include <config.h> > +#endif > + > +#include <stdlib.h> > +#include <mmintrin.h> > +#include <xmmintrin.h> > +#include <emmintrin.h> > +#include <tmmintrin.h> > +#include "pixman-private.h" > +#include "pixman-inlines.h" > + > +static const pixman_fast_path_t ssse3_fast_paths[] = > +{ > + { PIXMAN_OP_NONE }, > +}; > + > +pixman_implementation_t * > +_pixman_implementation_create_ssse3 (pixman_implementation_t *fallback) > +{ > + pixman_implementation_t *imp = > + _pixman_implementation_create (fallback, ssse3_fast_paths); > + > + return imp; > +} > diff --git a/pixman/pixman-x86.c b/pixman/pixman-x86.c > index 57e4d1f..6527760 100644 > --- a/pixman/pixman-x86.c > +++ b/pixman/pixman-x86.c > @@ -25,7 +25,7 @@ > > #include "pixman-private.h" > > -#if defined(USE_X86_MMX) || defined (USE_SSE2) > +#if defined(USE_X86_MMX) || defined (USE_SSE2) || defined (USE_SSSE3) > > /* The CPU detection code needs to be in a file not compiled with > * "-mmmx -msse", as gcc would generate CMOV instructions otherwise > @@ -39,7 +39,8 @@ typedef enum > X86_MMX_EXTENSIONS = (1 << 1), > X86_SSE = (1 << 2) | X86_MMX_EXTENSIONS, > X86_SSE2 = (1 << 3), > - X86_CMOV = (1 << 4) > + X86_CMOV = (1 << 4), > + X86_SSSE3 = (1 << 5) > } cpu_features_t; > > #ifdef HAVE_GETISAX > @@ -64,6 +65,8 @@ detect_cpu_features (void) > features |= X86_SSE; > if (result & AV_386_SSE2) > features |= X86_SSE2; > + if (result & AV_386_SSSE3) > + features |= X86_SSSE3; > } > > return features; > @@ -167,6 +170,8 @@ detect_cpu_features (void) > features |= X86_SSE; > if (d & (1 << 26)) > features |= X86_SSE2; > + if (d & (1 << 9)) > + features |= X86_SSSE3; > > /* Check for AMD specific features */ > if ((features & X86_MMX) && !(features & X86_SSE)) > @@ -222,6 +227,7 @@ _pixman_x86_get_implementations (pixman_implementation_t > *imp) > { > #define MMX_BITS (X86_MMX | X86_MMX_EXTENSIONS) > #define SSE2_BITS (X86_MMX | X86_MMX_EXTENSIONS | X86_SSE | X86_SSE2) > +#define SSSE3_BITS (X86_SSE | X86_SSE2 | X86_SSSE3) > > #ifdef USE_X86_MMX > if (!_pixman_disabled ("mmx") && have_feature (MMX_BITS)) > @@ -233,5 +239,10 @@ _pixman_x86_get_implementations (pixman_implementation_t > *imp) > imp = _pixman_implementation_create_sse2 (imp); > #endif > > +#ifdef USE_SSSE3 > + if (!_pixman_disabled ("ssse3") && have_feature (SSSE3_BITS)) > + imp = _pixman_implementation_create_ssse3 (imp); > +#endif > + > return imp; > } > -- > 1.7.1 > > > _______________________________________________ > Pixman mailing list > [email protected] > http://lists.freedesktop.org/mailman/listinfo/pixman > _______________________________________________ Pixman mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/pixman
