OSDN Git Service

PR target/13685
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Sep 2006 00:28:30 +0000 (00:28 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 8 Sep 2006 00:28:30 +0000 (00:28 +0000)
        * 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
gcc/config/i386/i386.c
gcc/testsuite/gcc.target/i386/sse-20.c [new file with mode: 0644]

index 68c78ac..a430e20 100644 (file)
@@ -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
index f668782..962b990 100644 (file)
@@ -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 (file)
index 0000000..5aa8f7a
--- /dev/null
@@ -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 --;
+    }
+}