summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <ssp@redhat.com>2013-10-02 14:18:31 -0400
committerSøren Sandmann Pedersen <ssp@redhat.com>2013-10-04 03:12:44 -0400
commit1b39cb4a1a2401b0103355c1d44bdfa535f7b6ac (patch)
tree0401689845ab1b79199a85a1c63aae6a60c92de0
parent66452ffb8696196341830fdd1e6943bcaeb902f7 (diff)
configure.ac: For SSE2 and SSSE3 require GCC 4.4 and then use -mstackrealignstackrealign
Code compiled by GCC with -msse2 and -mssse3 assumes a 16 byte aligned stack, but on x86-32 such alignment is not guaranteed. Instead of using the __force_align_arg_pointer__ attribute on all entry points that could potentially call into code compiled with -msse2 or -mssse3, just compile pixman-sse2.c and pixman-ssse3.c with -mstackrealign. This fixes the glyph-test crash introduced by the previous commit and also https://bugs.freedesktop.org/show_bug.cgi?id=68300
-rw-r--r--configure.ac13
-rw-r--r--pixman/pixman-sse2.c6
-rw-r--r--pixman/pixman.c19
3 files changed, 7 insertions, 31 deletions
diff --git a/configure.ac b/configure.ac
index 2dd47766..ab38f5a9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -391,7 +391,7 @@ if test "x$SSE2_CFLAGS" = "x" ; then
SSE2_CFLAGS="-xarch=sse2"
fi
else
- SSE2_CFLAGS="-msse2 -Winline"
+ SSE2_CFLAGS="-mstackrealign -msse2 -Winline"
fi
fi
@@ -401,10 +401,8 @@ xserver_save_CFLAGS=$CFLAGS
CFLAGS="$SSE2_CFLAGS $CFLAGS"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
-#if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2))
-# if !defined(__amd64__) && !defined(__x86_64__)
-# error "Need GCC >= 4.2 for SSE2 intrinsics on x86"
-# endif
+#if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 4))
+# error "Need GCC >= 4.4 for SSE2 intrinsics on x86"
#endif
#include <mmintrin.h>
#include <xmmintrin.h>
@@ -440,7 +438,7 @@ dnl ===========================================================================
dnl Check for SSSE3
if test "x$SSSE3_CFLAGS" = "x" ; then
- SSSE3_CFLAGS="-mssse3 -Winline"
+ SSSE3_CFLAGS="-mstackrealign -mssse3 -Winline"
fi
have_ssse3_intrinsics=no
@@ -449,6 +447,9 @@ xserver_save_CFLAGS=$CFLAGS
CFLAGS="$SSSE3_CFLAGS $CFLAGS"
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+#if defined(__GNUC__) && (__GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 4))
+# error "Need GCC >= 4.4 for SSSE3 intrinsics on x86"
+#endif
#include <mmintrin.h>
#include <xmmintrin.h>
#include <emmintrin.h>
diff --git a/pixman/pixman-sse2.c b/pixman/pixman-sse2.c
index 42c72093..47e8f754 100644
--- a/pixman/pixman-sse2.c
+++ b/pixman/pixman-sse2.c
@@ -3312,9 +3312,6 @@ sse2_composite_over_n_8_8888 (pixman_implementation_t *imp,
}
-#if defined(__GNUC__) && !defined(__x86_64__) && !defined(__amd64__)
-__attribute__((__force_align_arg_pointer__))
-#endif
static pixman_bool_t
sse2_fill (pixman_implementation_t *imp,
uint32_t * bits,
@@ -6411,9 +6408,6 @@ static const pixman_iter_info_t sse2_iters[] =
{ PIXMAN_null },
};
-#if defined(__GNUC__) && !defined(__x86_64__) && !defined(__amd64__)
-__attribute__((__force_align_arg_pointer__))
-#endif
pixman_implementation_t *
_pixman_implementation_create_sse2 (pixman_implementation_t *fallback)
{
diff --git a/pixman/pixman.c b/pixman/pixman.c
index 9555ceaa..5490e59a 100644
--- a/pixman/pixman.c
+++ b/pixman/pixman.c
@@ -547,25 +547,6 @@ analyze_extent (pixman_image_t *image,
return TRUE;
}
-/*
- * Work around GCC bug causing crashes in Mozilla with SSE2
- *
- * When using -msse, gcc generates movdqa instructions assuming that
- * the stack is 16 byte aligned. Unfortunately some applications, such
- * as Mozilla and Mono, end up aligning the stack to 4 bytes, which
- * causes the movdqa instructions to fail.
- *
- * The __force_align_arg_pointer__ makes gcc generate a prologue that
- * realigns the stack pointer to 16 bytes.
- *
- * On x86-64 this is not necessary because the standard ABI already
- * calls for a 16 byte aligned stack.
- *
- * See https://bugs.freedesktop.org/show_bug.cgi?id=15693
- */
-#if defined (USE_SSE2) && defined(__GNUC__) && !defined(__x86_64__) && !defined(__amd64__)
-__attribute__((__force_align_arg_pointer__))
-#endif
PIXMAN_EXPORT void
pixman_image_composite32 (pixman_op_t op,
pixman_image_t * src,