mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-24 21:11:19 +08:00
re PR target/13685 (Building simple test application with -march=pentium3 -Os gives SIGSEGV (unaligned sse instruction))
PR target/13685 * config/i386/i386.c (override_options): Use 128-bit stack boundary if -msse. From-SVN: r116775
This commit is contained in:
parent
2e71a7a31e
commit
d0655f33aa
@ -1,3 +1,9 @@
|
||||
2006-09-07 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR target/13685
|
||||
* config/i386/i386.c (override_options): Use 128-bit
|
||||
stack boundary if -msse.
|
||||
|
||||
2006-09-07 Eric Christopher <echristo@apple.com>
|
||||
|
||||
* config/darwin.h (MACHO_SYMBOL_FLAG_VARIABLE): Update
|
||||
|
@ -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)
|
||||
|
26
gcc/testsuite/gcc.target/i386/sse-20.c
Normal file
26
gcc/testsuite/gcc.target/i386/sse-20.c
Normal file
@ -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 --;
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user