[Pixman] [PATCH 1/2] Add empty SSSE3 implementation

Matt Turner mattst88 at gmail.com
Thu Sep 5 18:07:52 PDT 2013


On Thu, Aug 29, 2013 at 10:02 AM, Søren Sandmann Pedersen
<sandmann at cs.au.dk> 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 (soren.sandmann at gmail.com)
> + */
> +#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
> Pixman at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/pixman
>


More information about the Pixman mailing list