From 88cea5cfb7540d7b97a7afe1f977b70a602d6ece Mon Sep 17 00:00:00 2001 From: jason Date: Fri, 8 Sep 2006 00:28:30 +0000 Subject: [PATCH] PR target/13685 * config/i386/i386.c (override_options): Use 128-bit stack boundary if -msse. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@116775 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/config/i386/i386.c | 32 ++++++++++++++++---------------- gcc/testsuite/gcc.target/i386/sse-20.c | 26 ++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 16 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/sse-20.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 68c78accc58..a430e20667a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-09-07 Jason Merrill + + PR target/13685 + * config/i386/i386.c (override_options): Use 128-bit + stack boundary if -msse. + 2006-09-07 Eric Christopher * config/darwin.h (MACHO_SYMBOL_FLAG_VARIABLE): Update diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index f668782ed28..962b9900507 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -1799,22 +1799,6 @@ override_options (void) align_functions = processor_target_table[ix86_tune].align_func; } - /* Validate -mpreferred-stack-boundary= value, or provide default. - The default of 128 bits is for Pentium III's SSE __m128, but we - don't want additional code to keep the stack aligned when - optimizing for code size. */ - ix86_preferred_stack_boundary = ((TARGET_64BIT || TARGET_MACHO || !optimize_size) - ? 128 : 32); - if (ix86_preferred_stack_boundary_string) - { - i = atoi (ix86_preferred_stack_boundary_string); - if (i < (TARGET_64BIT ? 4 : 2) || i > 12) - error ("-mpreferred-stack-boundary=%d is not between %d and 12", i, - TARGET_64BIT ? 4 : 2); - else - ix86_preferred_stack_boundary = (1 << i) * BITS_PER_UNIT; - } - /* Validate -mbranch-cost= value, or provide default. */ ix86_branch_cost = ix86_cost->branch_cost; if (ix86_branch_cost_string) @@ -1909,6 +1893,22 @@ override_options (void) target_flags |= MASK_NO_RED_ZONE; } + /* Validate -mpreferred-stack-boundary= value, or provide default. + The default of 128 bits is for Pentium III's SSE __m128, but we + don't want additional code to keep the stack aligned when + optimizing for code size. */ + ix86_preferred_stack_boundary + = ((TARGET_MACHO || TARGET_SSE || !optimize_size) ? 128 : 32); + if (ix86_preferred_stack_boundary_string) + { + i = atoi (ix86_preferred_stack_boundary_string); + if (i < (TARGET_64BIT ? 4 : 2) || i > 12) + error ("-mpreferred-stack-boundary=%d is not between %d and 12", i, + TARGET_64BIT ? 4 : 2); + else + ix86_preferred_stack_boundary = (1 << i) * BITS_PER_UNIT; + } + /* Accept -msseregparm only if at least SSE support is enabled. */ if (TARGET_SSEREGPARM && ! TARGET_SSE) diff --git a/gcc/testsuite/gcc.target/i386/sse-20.c b/gcc/testsuite/gcc.target/i386/sse-20.c new file mode 100644 index 00000000000..5aa8f7a2812 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/sse-20.c @@ -0,0 +1,26 @@ +/* PR target/13685 */ +/* { dg-options "-Os -msse" } */ + +typedef float __m128 __attribute__ ((vector_size (16))); +typedef int __m64 __attribute__ ((vector_size (8))); + +int puts (const char *s); +void foo (__m128 *, __m64 *, int); + +int main (void) +{ + foo (0, 0, 0); + return 0; +} + +void foo (__m128 *dst, __m64 *src, int n) +{ + __m128 xmm0 = { 0 }; + while (n > 64) + { + puts (""); + xmm0 = __builtin_ia32_cvtpi2ps (xmm0, *src); + *dst = xmm0; + n --; + } +} -- 2.11.4.GIT