re PR target/13685 (Building simple test application with -march=pentium3 -Os gives SIGSEGV (unaligned sse instruction))

gcc/

2006-09-11  H.J. Lu  <hongjiu.lu@intel.com>

	PR target/13685
	PR target/27537
	PR target/28621
	* config/i386/i386.c (override_options): Always default to 16
	byte stack boundary.

gcc/testsuite/

2006-09-11  H.J. Lu  <hongjiu.lu@intel.com>

	PR target/13685
	* gcc.target/i386/pr13685.c: New test.

From-SVN: r116860
This commit is contained in:
H.J. Lu 2006-09-11 21:34:06 +00:00 committed by H.J. Lu
parent d306730315
commit 1395ea397e
4 changed files with 56 additions and 6 deletions

View file

@ -1,3 +1,11 @@
2006-09-11 H.J. Lu <hongjiu.lu@intel.com>
PR target/13685
PR target/27537
PR target/28621
* config/i386/i386.c (override_options): Always default to 16
byte stack boundary.
2006-09-11 Alexandre Oliva <aoliva@redhat.com>
PR target/28672

View file

@ -1899,12 +1899,10 @@ override_options (void)
}
/* 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 || TARGET_SSE || !optimize_size)
? 128 : 32;
The default of 128 bits is for Pentium III's SSE __m128. We can't
change it because of optimize_size. Otherwise, we can't mix object
files compiled with -Os and -On. */
ix86_preferred_stack_boundary = 128;
if (ix86_preferred_stack_boundary_string)
{
i = atoi (ix86_preferred_stack_boundary_string);

View file

@ -1,3 +1,8 @@
2006-09-11 H.J. Lu <hongjiu.lu@intel.com>
PR target/13685
* gcc.target/i386/pr13685.c: New test.
2006-09-11 Eric Botcazou <ebotcazou@libertysurf.fr>
* gcc.dg/pr28726.c: New test.

View file

@ -0,0 +1,39 @@
/* PR target/13685 */
/* { dg-do run } */
/* { dg-options "-Os -msse" } */
#include <stdlib.h>
#include <stdio.h>
#include <xmmintrin.h>
#include "../../gcc.dg/i386-cpuid.h"
void foo (__m128 *, __m64 *, int);
__m128 xmm0 = { 0 };
__m64 mm0 = { 0 };
int
main ()
{
unsigned long cpu_facilities = i386_cpuid ();
if ((cpu_facilities & (bit_MMX | bit_SSE | bit_CMOV))
!= (bit_MMX | bit_SSE | bit_CMOV))
/* If host has no SSE support, pass. */
return 0;
foo (&xmm0, &mm0, 4);
return 0;
}
void
foo (__m128 *dst, __m64 *src, int n)
{
__m128 xmm0 = { 0 };
while (n > 64)
{
puts ("");
xmm0 = _mm_cvtpi32_ps (xmm0, *src);
*dst = xmm0;
n--;
}
}