From 33505bcf10452fe4bdb96c573805251753f06dc5 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Sun, 28 Feb 2016 14:36:41 +0000 Subject: [PATCH] * config/i386/cygming.h (STACK_REALIGN_DEFAULT): Define. From-SVN: r233791 --- gcc/ChangeLog | 4 +++ gcc/config/i386/cygming.h | 5 +++ gcc/testsuite/ChangeLog | 4 +++ .../gcc.target/i386/stack-realign-win.c | 35 +++++++++++++++++++ 4 files changed, 48 insertions(+) create mode 100644 gcc/testsuite/gcc.target/i386/stack-realign-win.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 85c6301bf6d..4db03b62e83 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2016-02-28 Eric Botcazou + + * config/i386/cygming.h (STACK_REALIGN_DEFAULT): Define. + 2016-02-27 Jeff Law Revert diff --git a/gcc/config/i386/cygming.h b/gcc/config/i386/cygming.h index 7cd8ac51d93..9da473359a5 100644 --- a/gcc/config/i386/cygming.h +++ b/gcc/config/i386/cygming.h @@ -39,6 +39,11 @@ along with GCC; see the file COPYING3. If not see #undef MAX_STACK_ALIGNMENT #define MAX_STACK_ALIGNMENT (TARGET_SEH ? 128 : MAX_OFILE_ALIGNMENT) +/* 32-bit Windows aligns the stack on a 4-byte boundary but SSE instructions + may require 16-byte alignment. */ +#undef STACK_REALIGN_DEFAULT +#define STACK_REALIGN_DEFAULT TARGET_SSE + /* Support hooks for SEH. */ #undef TARGET_ASM_UNWIND_EMIT #define TARGET_ASM_UNWIND_EMIT i386_pe_seh_unwind_emit diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 89531733c8d..835ee2bf138 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2016-02-28 Eric Botcazou + + * gcc.target/i386/stack-realign-win.c: New test. + 2016-02-28 Harald Anlauf PR fortran/60126 diff --git a/gcc/testsuite/gcc.target/i386/stack-realign-win.c b/gcc/testsuite/gcc.target/i386/stack-realign-win.c new file mode 100644 index 00000000000..e27a5650542 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/stack-realign-win.c @@ -0,0 +1,35 @@ +/* { dg-do compile { target *-*-mingw* *-*-cygwin* } } */ +/* { dg-require-effective-target ia32 } */ +/* { dg-options "-msse -O" } */ + +extern void abort (void); + +typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__)); + +static __m128 +load_m128 (float *e) +{ + return * (__m128 *) e; +} + +typedef union +{ + __m128 x; + float a[4]; +} union128; + +void test (void) +{ + union128 u; + float e[4] __attribute__ ((aligned (16))) + = {2134.3343, 1234.635654, 1.2234, 876.8976}; + int i; + + u.x = load_m128 (e); + + for (i = 0; i < 4; i++) + if (u.a[i] != e[i]) + abort (); +} + +/* { dg-final { scan-assembler "andl\\t\\$-16, %esp" } } */ -- 2.30.2