i386.c (ix86_expand_epilogue): Adjust offset for xmm register restore.
authorKai Tietz <kai.tietz@onevision.com>
Mon, 21 Sep 2009 13:24:37 +0000 (13:24 +0000)
committerKai Tietz <ktietz@gcc.gnu.org>
Mon, 21 Sep 2009 13:24:37 +0000 (15:24 +0200)
2009-09-21  Kai Tietz  <kai.tietz@onevision.com>

* config/i386/i386.c (ix86_expand_epilogue): Adjust offset for
xmm register restore.

2009-09-21  Kai Tietz  <kai.tietz@onevision.com>

* gcc.dg/torture/calleesave-sse.c: New.

From-SVN: r151918

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/calleesave-sse.c [new file with mode: 0644]

index 83b4fc3..9dbabcd 100644 (file)
@@ -1,3 +1,8 @@
+2009-09-21  Kai Tietz  <kai.tietz@onevision.com>
+
+       * config/i386/i386.c (ix86_expand_epilogue): Adjust offset for
+       xmm register restore.
+
 2009-09-21  Jan Hubicka  <jh@suse.cz>
 
        * dwarf2out.c (decl_loc_table_eq): Allow decl_loc_table to be NULL.
index 3d907c0..335a526 100644 (file)
@@ -8916,7 +8916,7 @@ ix86_expand_epilogue (int style)
                                     hard_frame_pointer_rtx,
                                     GEN_INT (offset), style, false);
           ix86_emit_restore_sse_regs_using_mov (stack_pointer_rtx,
-                                               frame.to_allocate, red_offset,
+                                               0, red_offset,
                                                style == 2);
          pro_epilogue_adjust_stack (stack_pointer_rtx, stack_pointer_rtx,
                                     GEN_INT (frame.nsseregs * 16 + frame.padding0),
index e676b08..89f787a 100644 (file)
@@ -1,3 +1,7 @@
+2009-09-21  Kai Tietz  <kai.tietz@onevision.com>
+
+       * gcc.dg/torture/calleesave-sse.c: New.
+
 2009-09-21  Jan Hubicka  <jh@suse.cz>
 
        * gcc.dg/guality/inline-params.c: New testcase.
diff --git a/gcc/testsuite/gcc.dg/torture/calleesave-sse.c b/gcc/testsuite/gcc.dg/torture/calleesave-sse.c
new file mode 100644 (file)
index 0000000..292791c
--- /dev/null
@@ -0,0 +1,43 @@
+/* { dg-do run } */
+/* { dg-options "-fno-omit-frame-pointer" } */
+
+#define alloca __builtin_alloca
+extern void abort (void);
+
+__attribute__ ((noinline)) static double
+bar (double a, double b, double c, double d, char *h)
+{
+  *h = 0;
+  return a * b + b + c;
+}
+
+__attribute__ ((noinline)) static int
+boo (double a, double b, double c, double d)
+{
+  return c * b + a + b;
+}
+
+__attribute__ ((noinline)) static double
+foo (double a, double b, double c, double d)
+{
+ int aa = boo (b, c, d, a);
+ return bar (a, b, c, d, (char *) alloca (aa))
+       + bar (d, c, b, a, (char *) alloca (aa));
+}
+
+int main ()
+{
+  double a = 2.0, b = 3.0, c = 4.0, d = 5.0;
+  double r1, r2;
+  int aa;
+
+  aa = boo (b, c, d, a);
+  r1 = bar (a, b, c, d, (char *) alloca (aa))
+       + bar (d, c, b, a, (char *) alloca (aa));
+  r2 = foo (a, b, c, d);
+
+  if (r1 != r2)
+    abort ();
+  return 0;
+}
+