On Mon, Jul 20, 2026 at 3:41 PM Hongtao Liu <[email protected]> wrote:
>
> On Fri, Jul 10, 2026 at 2:51 PM H.J. Lu <[email protected]> wrote:
> >
> > On Thu, Jul 9, 2026 at 2:42 PM Hongtao Liu <[email protected]> wrote:
> > >
> > > On Thu, Jul 9, 2026 at 9:41 AM H.J. Lu <[email protected]> wrote:
> > > >
> > > > In 64-bit mode, preserve_none attribute uses a different calling
> > > > convention.  Ignore MS ABI with preserve_none attribute to always
> > > > use the preserve_none calling convention with preserve_none
> > > > attribute.
> > > >
> > > > gcc/
> > > >
> > >
> > > >
> > > > It has 8 registers.   Tests show that
> > > > x86_64_preserve_none_int_parameter_registers
> > > > is used for functions with __attribute__ ((preserve_none, ms_abi)).
> > > I mean for sse registers, init_cumulative_args sets the integer count
> > > via the new predicate but leaves the SSE count keyed on the raw ABI
> > > (i386.cc:1940):
> >
> > Fixed with tests in the v3 patch.
> >
> > > 927  /* Set up the number of registers to use for passing arguments.  */
> > > 928  cum->nregs = ix86_regparm;
> > > 929  if (TARGET_64BIT)
> > > 930    {
> > > 931      cum->nregs = (x86_64_cumulative_ms_abi_p (cum)
> > > 932                    ? X86_64_MS_REGPARM_MAX
> > > 933                    : X86_64_REGPARM_MAX);
> > > 934    }
> > > 935  if (TARGET_SSE)
> > > 936    {
> > > 937      cum->sse_nregs = SSE_REGPARM_MAX;
> > > 938      if (TARGET_64BIT)
> > > 939        {
> > > 940          cum->sse_nregs = (cum->call_abi == SYSV_ABI
> > > 941                           ? X86_64_SSE_REGPARM_MAX
> > > 942                           : X86_64_MS_SSE_REGPARM_MAX);
> > > 943        }
> > > 944    }
> > >
> > >
> > >  if  -mabi=ms is in the command line, with plain preserve_none in the
> > > attribute, only 4 sse registers is used for parameter passing
> > > But with __attribute__ ((preserve_none, ms_abi)), 8 sse registers are
> > > used for parameter passing.
> > >
> > > .i.e
> > > void bar(double,double,double,double,double,double)
> > > __attribute__((preserve_none));
> > >
> > > void
> > > entry (long a1, long a2, long a3, long a4, long a5, long a6)
> > > {
> > > bar (a1, a2, a3, a4, a5, a6);
> > > }
> > >
> >
> > Fixed with tests in the v3 patch.
> >
> > Here is the v3 patch.
>
> Ok.

I found an issue with the v3 patch.   Here is the v4 patch with
the fix:

@@ -1665,10 +1668,18 @@ ix86_function_type_abi (const_tree fntype)
          warned = 1;
        }

-      abi = MS_ABI;
+      /* NB: preserve_none attribute overrides ms_abi in 64-bit mode.  */
+      if (!TARGET_64BIT
+         || !lookup_attribute ("preserve_none",
+                               TYPE_ATTRIBUTES (fntype)))
+       abi = MS_ABI;
     }
   else if (abi == MS_ABI
-          && lookup_attribute ("sysv_abi", TYPE_ATTRIBUTES (fntype)))
+          && ((TARGET_64BIT
+               && lookup_attribute ("preserve_none",             <<<<
This is added.
+                                    TYPE_ATTRIBUTES (fntype)))
+              || lookup_attribute ("sysv_abi",
+                                   TYPE_ATTRIBUTES (fntype))))
     abi = SYSV_ABI;

   return abi;

and tests.

-- 
H.J.
---
In 64-bit mode, preserve_none attribute uses a different calling
convention.  Ignore MS ABI with preserve_none attribute to always
use the preserve_none calling convention with preserve_none
attribute.

gcc/

PR target/125297
* config/i386/i386.cc (ix86_function_arg_regno_p): Use
x86_64_preserve_none_int_parameter_registers for
TYPE_PRESERVE_NONE.
(ix86_function_type_abi): In 64-bit mode, ignore ms_abi
attribute with preserve_none attribute.
(x86_64_cumulative_ms_abi_p): New function.
(init_cumulative_args): Call x86_64_cumulative_ms_abi_p to
decide if MS_ABI is used.
(ix86_function_arg_advance): Likewise.
(ix86_function_arg): Likewise.
(ix86_pass_by_reference): Likewise.
(ix86_setup_incoming_varargs): Likewise.

gcc/testsuite/

PR target/125297
* gcc.target/i386/preserve-none-31a.c: New test.
* gcc.target/i386/preserve-none-31b.c: Likewise.
* gcc.target/i386/preserve-none-32a.c: Likewise.
* gcc.target/i386/preserve-none-32b.c: Likewise.
* gcc.target/i386/preserve-none-33a.c: Likewise.
* gcc.target/i386/preserve-none-33b.c: Likewise.
* gcc.target/i386/preserve-none-34a.c: Likewise.
* gcc.target/i386/preserve-none-34b.c: Likewise.
* gcc.target/i386/preserve-none-35a.c: Likewise.
* gcc.target/i386/preserve-none-35b.c: Likewise.
* gcc.target/i386/preserve-none-35c.c: Likewise.
* gcc.target/i386/preserve-none-35d.c: Likewise.
* gcc.target/i386/preserve-none-35e.c: Likewise.
* gcc.target/i386/preserve-none-35f.c: Likewise.
* gcc.target/i386/preserve-none-35g.c: Likewise.
* gcc.target/i386/preserve-none-36a.c: Likewise.
* gcc.target/i386/preserve-none-36b.c: Likewise.
* gcc.target/i386/preserve-none-36c.c: Likewise.
* gcc.target/i386/preserve-none-36d.c: Likewise.
* gcc.target/i386/preserve-none-36e.c: Likewise.
* gcc.target/i386/preserve-none-36f.c: Likewise.
* gcc.target/i386/preserve-none-36g.c: Likewise.
* gcc.target/i386/preserve-none-37a.c: Likewise.
* gcc.target/i386/preserve-none-37b.c: Likewise.
* gcc.target/i386/preserve-none-37c.c: Likewise.
* gcc.target/i386/preserve-none-37d.c: Likewise.
* gcc.target/i386/preserve-none-37e.c: Likewise.
* gcc.target/i386/preserve-none-37f.c: Likewise.
* gcc.target/i386/preserve-none-37g.c: Likewise.
* gcc.target/i386/preserve-none-37h.c: Likewise.
* gcc.target/i386/preserve-none-37i.c: Likewise.
* gcc.target/i386/preserve-none-37j.c: Likewise.
From fc4641801f0a244fa566fca75eefb860c9bc7cb6 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <[email protected]>
Date: Mon, 20 Jul 2026 07:57:31 +0800
Subject: [PATCH v4] x86: Check store of a register onto stack by callee

commit b4c215b36d63e1c264d8c1bd5d34f9aef1bb8463
Author: H.J. Lu <[email protected]>
Date:   Sat Jun 28 06:27:25 2025 +0800

    Adjust check for addressable misaligned stack argument

ignores arguments passed on stack since caller is responsible to align
the outgoing stack for arguments passed on stack.  However, callee may
store a register argument onto stack:

(set (mem/c:V2DI (plus:DI (reg/f:DI 7 sp)
	(const_int -16 [0xfffffffffffffff0])) [4 a1+0 S16 A128])
     (reg:V2DI 20 xmm0 [ a1 ]))

Update ix86_update_stack_alignment to check store of a register onto
stack by callee.

gcc/

	PR target/126320
	* config/i386/i386.cc (ix86_update_stack_alignment): Check store
	of a register onto stack by callee.

gcc/testsuite/

	PR target/126320
	* gcc.target/i386/pr126320.c: New test.

Signed-off-by: H.J. Lu <[email protected]>
---
 gcc/config/i386/i386.cc                  | 20 +++++++++--
 gcc/testsuite/gcc.target/i386/pr126320.c | 45 ++++++++++++++++++++++++
 2 files changed, 63 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/i386/pr126320.c

diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
index 043faf80309..aec4e4d41f2 100644
--- a/gcc/config/i386/i386.cc
+++ b/gcc/config/i386/i386.cc
@@ -8647,6 +8647,20 @@ ix86_update_stack_alignment (rtx, const_rtx pat, void *data)
      alignment if the memory is referenced by the stack access register. */
   stack_access_data *p = (stack_access_data *) data;
 
+  /* Check store of argument into stack by callee:
+
+     (set (mem/c:V2DI (plus:DI (reg/f:DI 7 sp)
+		(const_int -16 [0xfffffffffffffff0])) [4 a1+0 S16 A128])
+	  (reg:V2DI 20 xmm0 [ a1 ]))
+
+   */
+  rtx dest = nullptr, src = nullptr;
+  if (GET_CODE (pat) == SET)
+    {
+      dest = SET_DEST (pat);
+      src = SET_SRC (pat);
+    }
+
   subrtx_iterator::array_type array;
   FOR_EACH_SUBRTX (iter, array, pat, ALL)
     {
@@ -8655,9 +8669,11 @@ ix86_update_stack_alignment (rtx, const_rtx pat, void *data)
 	{
 	  /* NB: Ignore arguments passed on stack since caller is
 	     responsible to align the outgoing stack for arguments
-	     passed on stack.  */
+	     passed on stack.  Callee, not caller, stores a register
+	     onto stack.  */
 	  if (reg_mentioned_p (p->reg, XEXP (op, 0))
-	      && !ix86_argument_passed_on_stack_p (op))
+	      && ((op == dest && REG_P (src))
+		  || !ix86_argument_passed_on_stack_p (op)))
 	    {
 	      unsigned int alignment = MEM_ALIGN (op);
 
diff --git a/gcc/testsuite/gcc.target/i386/pr126320.c b/gcc/testsuite/gcc.target/i386/pr126320.c
new file mode 100644
index 00000000000..fd567a5c816
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr126320.c
@@ -0,0 +1,45 @@
+/* { dg-do run } */
+/* { dg-options "-O1 -march=x86-64 -mavx2" } */
+
+#include <stdint.h>
+
+typedef int64_t v2i64 __attribute__ ((vector_size (16)));
+void *g4, *f3_p2;
+int8_t g15, g23;
+v2i64 g21;
+_Bool g22, f3_c4;
+__attribute__ ((__vector_size__ (16 * sizeof (int)))) int g26;
+int16_t g29;
+
+__attribute__((noipa, noinline))
+void
+do_test (v2i64 a1)
+{
+  int16_t v3;
+lbl_entry:
+  f3_p2 = &a1;
+  v3 = g29;
+  if (g22)
+    goto lbl_bf4;
+  f3_c4 = v3 - 709;
+  if (f3_c4)
+    return;
+lbl_bf4:
+  g21 = a1;
+  uint8_t __ov_tmp_g15;
+  g15 = __ov_tmp_g15;
+  a1[0] = 0;
+  g26 = g26 == ~g26;
+  g4 = f3_p2;
+  g23 = 0;
+  goto lbl_entry;
+}
+
+int
+main (void)
+{
+ if (__builtin_cpu_supports ("avx2"))
+   do_test (g21);
+
+  return 0;
+}
-- 
2.55.0

From e2363cbbd1ef674a15ab1349c5dceae10e9bb426 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <[email protected]>
Date: Wed, 13 May 2026 08:27:50 +0800
Subject: [PATCH v4] x86: Honor preserve_none ABI for x86-64 MS calls

In 64-bit mode, preserve_none attribute uses a different calling
convention.  Ignore MS ABI with preserve_none attribute to always
use the preserve_none calling convention with preserve_none
attribute.

gcc/

	PR target/125297
	* config/i386/i386.cc (ix86_function_arg_regno_p): Use
	x86_64_preserve_none_int_parameter_registers for
	TYPE_PRESERVE_NONE.
	(ix86_function_type_abi): In 64-bit mode, ignore ms_abi
	attribute with preserve_none attribute.
	(x86_64_cumulative_ms_abi_p): New function.
	(init_cumulative_args): Call x86_64_cumulative_ms_abi_p to
	decide if MS_ABI is used.
	(ix86_function_arg_advance): Likewise.
	(ix86_function_arg): Likewise.
	(ix86_pass_by_reference): Likewise.
	(ix86_setup_incoming_varargs): Likewise.

gcc/testsuite/

	PR target/125297
	* gcc.target/i386/preserve-none-31a.c: New test.
	* gcc.target/i386/preserve-none-31b.c: Likewise.
	* gcc.target/i386/preserve-none-32a.c: Likewise.
	* gcc.target/i386/preserve-none-32b.c: Likewise.
	* gcc.target/i386/preserve-none-33a.c: Likewise.
	* gcc.target/i386/preserve-none-33b.c: Likewise.
	* gcc.target/i386/preserve-none-34a.c: Likewise.
	* gcc.target/i386/preserve-none-34b.c: Likewise.
	* gcc.target/i386/preserve-none-35a.c: Likewise.
	* gcc.target/i386/preserve-none-35b.c: Likewise.
	* gcc.target/i386/preserve-none-35c.c: Likewise.
	* gcc.target/i386/preserve-none-35d.c: Likewise.
	* gcc.target/i386/preserve-none-35e.c: Likewise.
	* gcc.target/i386/preserve-none-35f.c: Likewise.
	* gcc.target/i386/preserve-none-35g.c: Likewise.
	* gcc.target/i386/preserve-none-36a.c: Likewise.
	* gcc.target/i386/preserve-none-36b.c: Likewise.
	* gcc.target/i386/preserve-none-36c.c: Likewise.
	* gcc.target/i386/preserve-none-36d.c: Likewise.
	* gcc.target/i386/preserve-none-36e.c: Likewise.
	* gcc.target/i386/preserve-none-36f.c: Likewise.
	* gcc.target/i386/preserve-none-36g.c: Likewise.
	* gcc.target/i386/preserve-none-37a.c: Likewise.
	* gcc.target/i386/preserve-none-37b.c: Likewise.
	* gcc.target/i386/preserve-none-37c.c: Likewise.
	* gcc.target/i386/preserve-none-37d.c: Likewise.
	* gcc.target/i386/preserve-none-37e.c: Likewise.
	* gcc.target/i386/preserve-none-37f.c: Likewise.
	* gcc.target/i386/preserve-none-37g.c: Likewise.
	* gcc.target/i386/preserve-none-37h.c: Likewise.
	* gcc.target/i386/preserve-none-37i.c: Likewise.
	* gcc.target/i386/preserve-none-37j.c: Likewise.

Signed-off-by: H.J. Lu <[email protected]>
---
 gcc/config/i386/i386.cc                       | 56 +++++++-----
 .../gcc.target/i386/preserve-none-31a.c       | 36 ++++++++
 .../gcc.target/i386/preserve-none-31b.c       | 25 ++++++
 .../gcc.target/i386/preserve-none-32a.c       | 33 +++++++
 .../gcc.target/i386/preserve-none-32b.c       | 18 ++++
 .../gcc.target/i386/preserve-none-33a.c       | 36 ++++++++
 .../gcc.target/i386/preserve-none-33b.c       | 25 ++++++
 .../gcc.target/i386/preserve-none-34a.c       | 29 +++++++
 .../gcc.target/i386/preserve-none-34b.c       | 18 ++++
 .../gcc.target/i386/preserve-none-35a.c       | 55 ++++++++++++
 .../gcc.target/i386/preserve-none-35b.c       | 39 +++++++++
 .../gcc.target/i386/preserve-none-35c.c       | 34 ++++++++
 .../gcc.target/i386/preserve-none-35d.c       | 80 +++++++++++++++++
 .../gcc.target/i386/preserve-none-35e.c       | 34 ++++++++
 .../gcc.target/i386/preserve-none-35f.c       | 44 ++++++++++
 .../gcc.target/i386/preserve-none-35g.c       | 85 +++++++++++++++++++
 .../gcc.target/i386/preserve-none-36a.c       | 33 +++++++
 .../gcc.target/i386/preserve-none-36b.c       | 22 +++++
 .../gcc.target/i386/preserve-none-36c.c       | 18 ++++
 .../gcc.target/i386/preserve-none-36d.c       | 30 +++++++
 .../gcc.target/i386/preserve-none-36e.c       | 18 ++++
 .../gcc.target/i386/preserve-none-36f.c       | 35 ++++++++
 .../gcc.target/i386/preserve-none-36g.c       | 30 +++++++
 .../gcc.target/i386/preserve-none-37a.c       | 33 +++++++
 .../gcc.target/i386/preserve-none-37b.c       | 17 ++++
 .../gcc.target/i386/preserve-none-37c.c       | 18 ++++
 .../gcc.target/i386/preserve-none-37d.c       | 18 ++++
 .../gcc.target/i386/preserve-none-37e.c       | 18 ++++
 .../gcc.target/i386/preserve-none-37f.c       | 27 ++++++
 .../gcc.target/i386/preserve-none-37g.c       | 27 ++++++
 .../gcc.target/i386/preserve-none-37h.c       | 18 ++++
 .../gcc.target/i386/preserve-none-37i.c       | 18 ++++
 .../gcc.target/i386/preserve-none-37j.c       | 18 ++++
 33 files changed, 1026 insertions(+), 19 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-31a.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-31b.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-32a.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-32b.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-33a.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-33b.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-34a.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-34b.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-35a.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-35b.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-35c.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-35d.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-35e.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-35f.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-35g.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-36a.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-36b.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-36c.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-36d.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-36e.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-36f.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-36g.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-37a.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-37b.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-37c.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-37d.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-37e.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-37f.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-37g.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-37h.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-37i.c
 create mode 100644 gcc/testsuite/gcc.target/i386/preserve-none-37j.c

diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
index dc24eaa13de..043faf80309 100644
--- a/gcc/config/i386/i386.cc
+++ b/gcc/config/i386/i386.cc
@@ -1591,16 +1591,19 @@ ix86_function_arg_regno_p (int regno)
   if (call_abi == SYSV_ABI && regno == AX_REG)
     return true;
 
+  int regparm_max = X86_64_REGPARM_MAX;
   if (cfun
       && cfun->machine->call_saved_registers == TYPE_PRESERVE_NONE)
     parm_regs = x86_64_preserve_none_int_parameter_registers;
   else if (call_abi == MS_ABI)
-    parm_regs = x86_64_ms_abi_int_parameter_registers;
+    {
+      parm_regs = x86_64_ms_abi_int_parameter_registers;
+      regparm_max = X86_64_MS_REGPARM_MAX;
+    }
   else
     parm_regs = x86_64_int_parameter_registers;
 
-  for (i = 0; i < (call_abi == MS_ABI
-		   ? X86_64_MS_REGPARM_MAX : X86_64_REGPARM_MAX); i++)
+  for (i = 0; i < regparm_max; i++)
     if (regno == parm_regs[i])
       return true;
   return false;
@@ -1665,10 +1668,18 @@ ix86_function_type_abi (const_tree fntype)
 	  warned = 1;
 	}
 
-      abi = MS_ABI;
+      /* NB: preserve_none attribute overrides ms_abi in 64-bit mode.  */
+      if (!TARGET_64BIT
+	  || !lookup_attribute ("preserve_none",
+				TYPE_ATTRIBUTES (fntype)))
+	abi = MS_ABI;
     }
   else if (abi == MS_ABI
-	   && lookup_attribute ("sysv_abi", TYPE_ATTRIBUTES (fntype)))
+	   && ((TARGET_64BIT
+		&& lookup_attribute ("preserve_none",
+				     TYPE_ATTRIBUTES (fntype)))
+	       || lookup_attribute ("sysv_abi",
+				    TYPE_ATTRIBUTES (fntype))))
     abi = SYSV_ABI;
 
   return abi;
@@ -1856,6 +1867,17 @@ ix86_init_pic_reg (void)
   commit_one_edge_insertion (entry_edge);
 }
 
+/* Return true if x86-64 CUM is MS_ABI.  */
+
+static bool
+x86_64_cumulative_ms_abi_p (CUMULATIVE_ARGS *cum)
+{
+  if (!cum)
+    return ix86_abi == MS_ABI;
+
+  return !cum->preserve_none_abi && cum->call_abi == MS_ABI;
+}
+
 /* Initialize a variable CUM of type CUMULATIVE_ARGS
    for a call to a function whose data type is FNTYPE.
    For a library call, FNTYPE is 0.  */
@@ -1910,18 +1932,18 @@ init_cumulative_args (CUMULATIVE_ARGS *cum,  /* Argument info to initialize */
   cum->nregs = ix86_regparm;
   if (TARGET_64BIT)
     {
-      cum->nregs = (cum->call_abi == SYSV_ABI
-                   ? X86_64_REGPARM_MAX
-                   : X86_64_MS_REGPARM_MAX);
+      cum->nregs = (x86_64_cumulative_ms_abi_p (cum)
+		    ? X86_64_MS_REGPARM_MAX
+		    : X86_64_REGPARM_MAX);
     }
   if (TARGET_SSE)
     {
       cum->sse_nregs = SSE_REGPARM_MAX;
       if (TARGET_64BIT)
         {
-          cum->sse_nregs = (cum->call_abi == SYSV_ABI
-                           ? X86_64_SSE_REGPARM_MAX
-                           : X86_64_MS_SSE_REGPARM_MAX);
+	  cum->sse_nregs = (x86_64_cumulative_ms_abi_p (cum)
+			    ? X86_64_MS_SSE_REGPARM_MAX
+			    : X86_64_SSE_REGPARM_MAX);
         }
     }
   if (TARGET_MMX)
@@ -3262,9 +3284,7 @@ ix86_function_arg_advance (cumulative_args_t cum_v,
 
   if (TARGET_64BIT)
     {
-      enum calling_abi call_abi = cum ? cum->call_abi : ix86_abi;
-
-      if (call_abi == MS_ABI)
+      if (x86_64_cumulative_ms_abi_p (cum))
 	nregs = function_arg_advance_ms_64 (cum, bytes, words);
       else
 	nregs = function_arg_advance_64 (cum, mode, arg.type, words,
@@ -3593,7 +3613,7 @@ ix86_function_arg (cumulative_args_t cum_v, const function_arg_info &arg)
 
   if (TARGET_64BIT)
     {
-      if (cum->call_abi == MS_ABI)
+      if (x86_64_cumulative_ms_abi_p (cum))
 	reg = function_arg_ms_64 (cum, mode, arg.mode, arg.named,
 				  arg.type, bytes);
       else
@@ -3622,10 +3642,8 @@ ix86_pass_by_reference (cumulative_args_t cum_v, const function_arg_info &arg)
 
   if (TARGET_64BIT)
     {
-      enum calling_abi call_abi = cum ? cum->call_abi : ix86_abi;
-
       /* See Windows x64 Software Convention.  */
-      if (call_abi == MS_ABI)
+      if (x86_64_cumulative_ms_abi_p (cum))
 	{
 	  HOST_WIDE_INT msize = GET_MODE_SIZE (arg.mode);
 
@@ -4794,7 +4812,7 @@ ix86_setup_incoming_varargs (cumulative_args_t cum_v,
       && stdarg_p (fntype))
     ix86_function_arg_advance (pack_cumulative_args (&next_cum), arg);
 
-  if (cum->call_abi == MS_ABI)
+  if (x86_64_cumulative_ms_abi_p (cum))
     setup_incoming_varargs_ms_64 (&next_cum);
   else
     setup_incoming_varargs_64 (&next_cum);
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-31a.c b/gcc/testsuite/gcc.target/i386/preserve-none-31a.c
new file mode 100644
index 00000000000..0bcc80b0ee6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-31a.c
@@ -0,0 +1,36 @@
+/* { dg-do compile { target { lp64 } } } */
+/* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -mtune=generic -mabi=ms" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	subq	\$24, %rsp
+**...
+**	movl	%ecx, %r12d
+**	movl	%edx, %r13d
+**	movl	%r9d, %r15d
+**	movl	\$-559038737, \(%rsp\)
+**	movl	72\(%rsp\), %esi
+**	movl	%r8d, %r14d
+**	xorl	%eax, %eax
+**	movl	64\(%rsp\), %edi
+**	call	continuation
+**	addq	\$24, %rsp
+**...
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+extern void continuation (int, int, int, int, int, int, ...)
+  __attribute__ ((preserve_none));
+
+__attribute__ ((no_callee_saved_registers))
+void
+entry (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6)
+{
+  continuation (arg1, arg2, arg3, arg4, arg5, arg6, 0xdeadbeef);
+}
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-31b.c b/gcc/testsuite/gcc.target/i386/preserve-none-31b.c
new file mode 100644
index 00000000000..9b6ad95c36f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-31b.c
@@ -0,0 +1,25 @@
+/* { dg-do compile { target { llp64 } } } */
+/* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -mtune=generic -mabi=ms" } */
+/* Keep labels and directives ('.seh_endprologue').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.} } } */
+
+/*
+**entry:
+**	subq	\$72, %rsp
+**	.seh_stackalloc	72
+**	.seh_endprologue
+**	xorl	%eax, %eax
+**	movl	120\(%rsp\), %esi
+**	movl	112\(%rsp\), %edi
+**	movl	%ecx, %r12d
+**	movl	%edx, %r13d
+**	movl	%r9d, %r15d
+**	movl	%r8d, %r14d
+**	movl	\$-559038737, 48\(%rsp\)
+**	call	continuation
+**	nop
+**	addq	\$72, %rsp
+**	ret
+*/
+
+#include "preserve-none-31a.c"
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-32a.c b/gcc/testsuite/gcc.target/i386/preserve-none-32a.c
new file mode 100644
index 00000000000..46728da97f4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-32a.c
@@ -0,0 +1,33 @@
+/* { dg-do compile { target { lp64 } } } */
+/* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -mtune=generic -mabi=ms" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	subq	\$8, %rsp
+**...
+**	movl	%edx, %r12d
+**	movl	%r9d, %r14d
+**	movl	%r8d, %r13d
+**	movl	64\(%rsp\), %esi
+**	movl	56\(%rsp\), %edi
+**	movl	48\(%rsp\), %r15d
+**	call	continuation
+**	addq	\$8, %rsp
+**...
+**	.cfi_endproc
+**...
+*/
+
+extern void continuation (double, int, int, int, int, int, int)
+  __attribute__ ((preserve_none));
+
+__attribute__ ((no_callee_saved_registers))
+void
+entry (double fp, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6)
+{
+  continuation (fp, arg1, arg2, arg3, arg4, arg5, arg6);
+}
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-32b.c b/gcc/testsuite/gcc.target/i386/preserve-none-32b.c
new file mode 100644
index 00000000000..3de4322fef7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-32b.c
@@ -0,0 +1,18 @@
+/* { dg-do compile { target { llp64 } } } */
+/* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -mtune=generic -mabi=ms" } */
+/* Keep labels and directives ('.seh_endprologue').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.} } } */
+
+/*
+**entry:
+**	.seh_endprologue
+**	movl	56\(%rsp\), %esi
+**	movl	48\(%rsp\), %edi
+**	movl	40\(%rsp\), %r15d
+**	movl	%edx, %r12d
+**	movl	%r9d, %r14d
+**	movl	%r8d, %r13d
+**	jmp	continuation
+*/
+
+#include "preserve-none-32a.c"
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-33a.c b/gcc/testsuite/gcc.target/i386/preserve-none-33a.c
new file mode 100644
index 00000000000..086df3681ec
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-33a.c
@@ -0,0 +1,36 @@
+/* { dg-do compile { target { lp64 } } } */
+/* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -mtune=generic -mabi=sysv" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	subq	\$24, %rsp
+**...
+**	movl	%edi, %r12d
+**	movl	%esi, %r13d
+**	movl	%edx, %r14d
+**	movl	\$-559038737, \(%rsp\)
+**	movl	%ecx, %r15d
+**	movl	%r9d, %esi
+**	movl	%r8d, %edi
+**	xorl	%eax, %eax
+**	call	continuation
+**	addq	\$24, %rsp
+**...
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+extern void continuation (int, int, int, int, int, int, ...)
+  __attribute__ ((preserve_none, ms_abi));
+
+__attribute__ ((no_callee_saved_registers))
+void
+entry (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6)
+{
+  continuation (arg1, arg2, arg3, arg4, arg5, arg6, 0xdeadbeef);
+}
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-33b.c b/gcc/testsuite/gcc.target/i386/preserve-none-33b.c
new file mode 100644
index 00000000000..b82f790d645
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-33b.c
@@ -0,0 +1,25 @@
+/* { dg-do compile { target { llp64 } } } */
+/* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -mtune=generic -mabi=ms" } */
+/* Keep labels and directives ('.seh_endprologue').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.} } } */
+
+/*
+**entry:
+**	subq	\$72, %rsp
+**	.seh_stackalloc	72
+**	.seh_endprologue
+**	xorl	%eax, %eax
+**	movl	120\(%rsp\), %esi
+**	movl	112\(%rsp\), %edi
+**	movl	%ecx, %r12d
+**	movl	%edx, %r13d
+**	movl	%r9d, %r15d
+**	movl	%r8d, %r14d
+**	movl	\$-559038737, 48\(%rsp\)
+**	call	continuation
+**	nop
+**	addq	\$72, %rsp
+**	ret
+*/
+
+#include "preserve-none-33a.c"
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-34a.c b/gcc/testsuite/gcc.target/i386/preserve-none-34a.c
new file mode 100644
index 00000000000..dbc36e9a21b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-34a.c
@@ -0,0 +1,29 @@
+/* { dg-do compile { target { lp64 } } } */
+/* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mtune=generic -mabi=sysv" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	movl	%edi, %r12d
+**	movl	%esi, %r13d
+**	movl	%edx, %r14d
+**	movl	%ecx, %r15d
+**	movl	%r9d, %esi
+**	movl	%r8d, %edi
+**	jmp	continuation
+**	.cfi_endproc
+**...
+*/
+
+extern void continuation (double, int, int, int, int, int, int)
+  __attribute__ ((preserve_none, ms_abi));
+
+__attribute__ ((no_callee_saved_registers))
+void
+entry (double fp, int arg1, int arg2, int arg3, int arg4, int arg5, int arg6)
+{
+  continuation (fp, arg1, arg2, arg3, arg4, arg5, arg6);
+}
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-34b.c b/gcc/testsuite/gcc.target/i386/preserve-none-34b.c
new file mode 100644
index 00000000000..75323ad7863
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-34b.c
@@ -0,0 +1,18 @@
+/* { dg-do compile { target { llp64 } } } */
+/* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -mtune=generic -mabi=ms" } */
+/* Keep labels and directives ('.seh_endprologue').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.} } } */
+
+/*
+**entry:
+**	.seh_endprologue
+**	movl	56\(%rsp\), %esi
+**	movl	48\(%rsp\), %edi
+**	movl	40\(%rsp\), %r15d
+**	movl	%edx, %r12d
+**	movl	%r9d, %r14d
+**	movl	%r8d, %r13d
+**	jmp	continuation
+*/
+
+#include "preserve-none-34a.c"
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-35a.c b/gcc/testsuite/gcc.target/i386/preserve-none-35a.c
new file mode 100644
index 00000000000..0bba3bfffef
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-35a.c
@@ -0,0 +1,55 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	subq	\$88, %rsp
+**	.cfi_def_cfa_offset 96
+**	leaq	96\(%rsp\), %rax
+**	movq	%r13, 40\(%rsp\)
+**	movq	%rax, 8\(%rsp\)
+**	leaq	32\(%rsp\), %rax
+**	movq	%rax, 16\(%rsp\)
+**	xorl	%eax, %eax
+**	movq	%r14, 48\(%rsp\)
+**	movq	%r15, 56\(%rsp\)
+**	movq	%rdi, 64\(%rsp\)
+**	movq	%rsi, 72\(%rsp\)
+**	movl	\$8, \(%rsp\)
+**	call	continuation
+**	addq	\$88, %rsp
+**	.cfi_def_cfa_offset 8
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+#include <stdarg.h>
+
+#ifndef CALLEE_ATTRIBUTE
+#define CALLEE_ATTRIBUTE __attribute__ ((preserve_none, sysv_abi))
+#endif
+
+#ifndef CALLER_ATTRIBUTE
+#define CALLER_ATTRIBUTE __attribute__ ((preserve_none, sysv_abi))
+#endif
+
+extern void continuation (int, ...) CALLEE_ATTRIBUTE;
+
+CALLER_ATTRIBUTE
+void
+entry (int i, ...)
+{
+  va_list argp;
+  va_start (argp, i);
+  int arg1 = va_arg (argp, int);
+  int arg2 = va_arg (argp, int);
+  int arg3 = va_arg (argp, int);
+  int arg4 = va_arg (argp, int);
+  int arg5 = va_arg (argp, int);
+  continuation (i, arg1, arg2, arg3, arg4, arg5);
+}
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-35b.c b/gcc/testsuite/gcc.target/i386/preserve-none-35b.c
new file mode 100644
index 00000000000..6d473e2e66b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-35b.c
@@ -0,0 +1,39 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	subq	\$88, %rsp
+**	.cfi_def_cfa_offset 96
+**	movl	%edi, %r12d
+**	movl	%ecx, %r15d
+**	movl	%r8d, %edi
+**	leaq	96\(%rsp\), %rax
+**	movq	%rsi, 40\(%rsp\)
+**	movl	%edx, %r14d
+**	movl	%r9d, %esi
+**	movq	%rax, 8\(%rsp\)
+**	movl	40\(%rsp\), %r13d
+**	leaq	32\(%rsp\), %rax
+**	movq	%rax, 16\(%rsp\)
+**	xorl	%eax, %eax
+**	movq	%rdx, 48\(%rsp\)
+**	movq	%rcx, 56\(%rsp\)
+**	movq	%r8, 64\(%rsp\)
+**	movq	%r9, 72\(%rsp\)
+**	movl	\$8, \(%rsp\)
+**	call	continuation
+**	addq	\$88, %rsp
+**	.cfi_def_cfa_offset 8
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+#define CALLER_ATTRIBUTE __attribute__ ((no_callee_saved_registers, sysv_abi))
+
+#include "preserve-none-35a.c"
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-35c.c b/gcc/testsuite/gcc.target/i386/preserve-none-35c.c
new file mode 100644
index 00000000000..d05e68f0f17
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-35c.c
@@ -0,0 +1,34 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	subq	\$88, %rsp
+**	.cfi_def_cfa_offset 96
+**	leaq	96\(%rsp\), %rax
+**	movq	%rsi, 40\(%rsp\)
+**	movq	%rax, 8\(%rsp\)
+**	leaq	32\(%rsp\), %rax
+**	movq	%rax, 16\(%rsp\)
+**	xorl	%eax, %eax
+**	movq	%rdx, 48\(%rsp\)
+**	movq	%rcx, 56\(%rsp\)
+**	movq	%r8, 64\(%rsp\)
+**	movq	%r9, 72\(%rsp\)
+**	movl	\$8, \(%rsp\)
+**	call	continuation
+**	addq	\$88, %rsp
+**	.cfi_def_cfa_offset 8
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+#define CALLEE_ATTRIBUTE __attribute__ ((sysv_abi))
+#define CALLER_ATTRIBUTE __attribute__ ((sysv_abi))
+
+#include "preserve-none-35a.c"
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-35d.c b/gcc/testsuite/gcc.target/i386/preserve-none-35d.c
new file mode 100644
index 00000000000..6493158cfab
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-35d.c
@@ -0,0 +1,80 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB0:
+**	.cfi_startproc
+**	subq	\$88, %rsp
+**	.cfi_def_cfa_offset 96
+**	leaq	104\(%rsp\), %rax
+**	movq	%rdx, 104\(%rsp\)
+**	movq	%r8, 112\(%rsp\)
+**	movq	%r9, 120\(%rsp\)
+**	movq	\$0, 56\(%rsp\)
+**	movq	\$0, 64\(%rsp\)
+**	movq	%rax, 48\(%rsp\)
+**	cmpl	\$47, %eax
+**	ja	.L2
+**	leal	8\(%rax\), %edx
+**	movl	\(%eax\), %r10d
+**	cmpl	\$47, %edx
+**	ja	.L18
+**	leal	16\(%rax\), %r9d
+**	movl	\(%edx\), %r8d
+**	cmpl	\$47, %r9d
+**	ja	.L19
+**	leal	24\(%rax\), %edx
+**	movl	\(%r9d\), %r9d
+**	cmpl	\$47, %edx
+**	ja	.L20
+**	addl	\$32, %eax
+**	movl	\(%edx\), %r11d
+**	cmpl	\$47, %eax
+**	movl	%eax, %edx
+**	movl	\$0, %eax
+**	cmovbe	%rdx, %rax
+**.L9:
+**	movl	\(%rax\), %eax
+**	movl	%r11d, 32\(%rsp\)
+**	movl	%r10d, %edx
+**	movl	%eax, 40\(%rsp\)
+**	call	continuation
+**	addq	\$88, %rsp
+**	.cfi_remember_state
+**	.cfi_def_cfa_offset 8
+**	ret
+**	.p2align 4,,10
+**	.p2align 3
+**.L2:
+**	.cfi_restore_state
+**	movl	0, %r10d
+**	movl	8, %r8d
+**	movl	\$16, %eax
+**.L5:
+**	movl	\(%rax\), %r9d
+**	leaq	8\(%rax\), %rdx
+**.L7:
+**	movl	\(%rdx\), %r11d
+**	leaq	8\(%rdx\), %rax
+**	jmp	.L9
+**.L18:
+**	movl	0, %r8d
+**	movl	\$8, %eax
+**	jmp	.L5
+**.L20:
+**	xorl	%edx, %edx
+**	jmp	.L7
+**.L19:
+**	xorl	%eax, %eax
+**	jmp	.L5
+**	.cfi_endproc
+**...
+*/
+
+#define CALLEE_ATTRIBUTE __attribute__ ((ms_abi))
+#define CALLER_ATTRIBUTE __attribute__ ((ms_abi))
+
+#include "preserve-none-35a.c"
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-35e.c b/gcc/testsuite/gcc.target/i386/preserve-none-35e.c
new file mode 100644
index 00000000000..d1f0209b854
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-35e.c
@@ -0,0 +1,34 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	subq	\$88, %rsp
+**	.cfi_def_cfa_offset 96
+**	leaq	96\(%rsp\), %rax
+**	movq	%r13, 40\(%rsp\)
+**	movq	%rax, 8\(%rsp\)
+**	leaq	32\(%rsp\), %rax
+**	movq	%rax, 16\(%rsp\)
+**	xorl	%eax, %eax
+**	movq	%r14, 48\(%rsp\)
+**	movq	%r15, 56\(%rsp\)
+**	movq	%rdi, 64\(%rsp\)
+**	movq	%rsi, 72\(%rsp\)
+**	movl	\$8, \(%rsp\)
+**	call	continuation
+**	addq	\$88, %rsp
+**	.cfi_def_cfa_offset 8
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+#define CALLEE_ATTRIBUTE __attribute__ ((preserve_none, ms_abi))
+#define CALLER_ATTRIBUTE __attribute__ ((preserve_none, ms_abi))
+
+#include "preserve-none-35a.c"
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-35f.c b/gcc/testsuite/gcc.target/i386/preserve-none-35f.c
new file mode 100644
index 00000000000..f50af4737ff
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-35f.c
@@ -0,0 +1,44 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB0:
+**	.cfi_startproc
+**	subq	\$88, %rsp
+**	.cfi_def_cfa_offset 96
+**	movl	%r12d, %ecx
+**	leaq	96\(%rsp\), %rax
+**	movq	%rsi, 72\(%rsp\)
+**	movq	%rax, 8\(%rsp\)
+**	leaq	32\(%rsp\), %rax
+**	movq	%rax, 16\(%rsp\)
+**	movq	%r13, 40\(%rsp\)
+**	movq	%r14, 48\(%rsp\)
+**	movq	%r15, 56\(%rsp\)
+**	movq	%rdi, 64\(%rsp\)
+**	movl	\$8, \(%rsp\)
+**	pushq	%rsi
+**	.cfi_def_cfa_offset 104
+**	movl	72\(%rsp\), %eax
+**	pushq	%rax
+**	.cfi_def_cfa_offset 112
+**	subq	\$32, %rsp
+**	.cfi_def_cfa_offset 144
+**	movl	104\(%rsp\), %r9d
+**	movl	96\(%rsp\), %r8d
+**	movl	88\(%rsp\), %edx
+**	call	continuation
+**	addq	\$136, %rsp
+**	.cfi_def_cfa_offset 8
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+#define CALLEE_ATTRIBUTE __attribute__ ((no_callee_saved_registers, ms_abi))
+#define CALLER_ATTRIBUTE __attribute__ ((preserve_none, ms_abi))
+
+#include "preserve-none-35a.c"
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-35g.c b/gcc/testsuite/gcc.target/i386/preserve-none-35g.c
new file mode 100644
index 00000000000..300f806414a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-35g.c
@@ -0,0 +1,85 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB0:
+**	.cfi_startproc
+**	subq	\$40, %rsp
+**	.cfi_def_cfa_offset 48
+**	movl	%ecx, %r12d
+**	leaq	56\(%rsp\), %rax
+**	movq	%rdx, 56\(%rsp\)
+**	movq	%r8, 64\(%rsp\)
+**	movq	%r9, 72\(%rsp\)
+**	movq	\$0, 8\(%rsp\)
+**	movq	\$0, 16\(%rsp\)
+**	movq	%rax, \(%rsp\)
+**	cmpl	\$47, %eax
+**	ja	.L2
+**	leal	8\(%rax\), %edx
+**	movl	\(%eax\), %r13d
+**	cmpl	\$47, %edx
+**	ja	.L18
+**	leal	16\(%rax\), %ecx
+**	movl	\(%edx\), %r14d
+**	cmpl	\$47, %ecx
+**	ja	.L19
+**	leal	24\(%rax\), %edx
+**	movl	\(%ecx\), %r15d
+**	cmpl	\$47, %edx
+**	ja	.L20
+**	addl	\$32, %eax
+**	movl	\(%edx\), %edi
+**	cmpl	\$47, %eax
+**	movl	%eax, %edx
+**	movl	\$0, %eax
+**	cmovbe	%rdx, %rax
+**	movl	\(%rax\), %esi
+**	xorl	%eax, %eax
+**	call	continuation
+**	addq	\$40, %rsp
+**	.cfi_remember_state
+**	.cfi_def_cfa_offset 8
+**	ret
+**	.p2align 4,,10
+**	.p2align 3
+**.L2:
+**	.cfi_restore_state
+**	movl	0, %r13d
+**	movl	8, %r14d
+**	movl	\$16, %eax
+**.L5:
+**	movl	\(%rax\), %r15d
+**	leaq	8\(%rax\), %rdx
+**.L7:
+**	movl	8\(%rdx\), %esi
+**	movl	\(%rdx\), %edi
+**	leaq	8\(%rdx\), %rax
+**	xorl	%eax, %eax
+**	call	continuation
+**	addq	\$40, %rsp
+**	.cfi_remember_state
+**	.cfi_def_cfa_offset 8
+**	ret
+**.L18:
+**	.cfi_restore_state
+**	movl	0, %r14d
+**	movl	\$8, %eax
+**	jmp	.L5
+**.L20:
+**	xorl	%edx, %edx
+**	jmp	.L7
+**.L19:
+**	xorl	%eax, %eax
+**	jmp	.L5
+**	.cfi_endproc
+**...
+*/
+
+#define CALLEE_ATTRIBUTE __attribute__ ((preserve_none, ms_abi))
+#define CALLER_ATTRIBUTE __attribute__ ((no_callee_saved_registers, ms_abi))
+
+#include "preserve-none-35a.c"
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-36a.c b/gcc/testsuite/gcc.target/i386/preserve-none-36a.c
new file mode 100644
index 00000000000..bf5fe5196f8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-36a.c
@@ -0,0 +1,33 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -march=x86-64 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	jmp	continuation
+**	.cfi_endproc
+**...
+*/
+
+#ifndef CALLEE_ATTRIBUTE
+#define CALLEE_ATTRIBUTE __attribute__ ((preserve_none, sysv_abi))
+#endif
+
+#ifndef CALLER_ATTRIBUTE
+#define CALLER_ATTRIBUTE __attribute__ ((preserve_none, sysv_abi))
+#endif
+
+typedef float v4sf __attribute__((vector_size(16)));
+
+extern void continuation (long, long, long, long, long, v4sf)
+    CALLEE_ATTRIBUTE;
+
+CALLER_ATTRIBUTE
+void
+entry (long arg1, long arg2, long arg3, long arg4, long arg5, v4sf arg6)
+{
+  continuation (arg1, arg2, arg3, arg4, arg5, arg6);
+}
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-36b.c b/gcc/testsuite/gcc.target/i386/preserve-none-36b.c
new file mode 100644
index 00000000000..9a110b309ba
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-36b.c
@@ -0,0 +1,22 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -march=x86-64 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	movq	%rdi, %r12
+**	movq	%rsi, %r13
+**	movq	%rdx, %r14
+**	movq	%rcx, %r15
+**	movq	%r8, %rdi
+**	jmp	continuation
+**	.cfi_endproc
+**...
+*/
+
+#define CALLER_ATTRIBUTE __attribute__ ((no_callee_saved_registers, sysv_abi))
+
+#include "preserve-none-36a.c"
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-36c.c b/gcc/testsuite/gcc.target/i386/preserve-none-36c.c
new file mode 100644
index 00000000000..200aeb9b579
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-36c.c
@@ -0,0 +1,18 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -march=x86-64 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	jmp	continuation
+**	.cfi_endproc
+**...
+*/
+
+#define CALLEE_ATTRIBUTE __attribute__ ((sysv_abi))
+#define CALLER_ATTRIBUTE __attribute__ ((sysv_abi))
+
+#include "preserve-none-36a.c"
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-36d.c b/gcc/testsuite/gcc.target/i386/preserve-none-36d.c
new file mode 100644
index 00000000000..edf840f9d07
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-36d.c
@@ -0,0 +1,30 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -march=x86-64 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	subq	\$72, %rsp
+**	.cfi_def_cfa_offset 80
+**	movq	120\(%rsp\), %rax
+**	movaps	\(%rax\), %xmm0
+**	leaq	48\(%rsp\), %rax
+**	movq	%rax, 40\(%rsp\)
+**	movq	112\(%rsp\), %rax
+**	movaps	%xmm0, 48\(%rsp\)
+**	movq	%rax, 32\(%rsp\)
+**	call	continuation
+**	addq	\$72, %rsp
+**	.cfi_def_cfa_offset 8
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+#define CALLEE_ATTRIBUTE __attribute__ ((ms_abi))
+#define CALLER_ATTRIBUTE __attribute__ ((ms_abi))
+
+#include "preserve-none-36a.c"
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-36e.c b/gcc/testsuite/gcc.target/i386/preserve-none-36e.c
new file mode 100644
index 00000000000..87cb8e763bd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-36e.c
@@ -0,0 +1,18 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -march=x86-64 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	jmp	continuation
+**	.cfi_endproc
+**...
+*/
+
+#define CALLEE_ATTRIBUTE __attribute__ ((preserve_none, ms_abi))
+#define CALLER_ATTRIBUTE __attribute__ ((preserve_none, ms_abi))
+
+#include "preserve-none-36a.c"
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-36f.c b/gcc/testsuite/gcc.target/i386/preserve-none-36f.c
new file mode 100644
index 00000000000..6b2dbc1e1ba
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-36f.c
@@ -0,0 +1,35 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -march=x86-64 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB0:
+**	.cfi_startproc
+**	subq	\$24, %rsp
+**	.cfi_def_cfa_offset 32
+**	movq	%r14, %r8
+**	movq	%r15, %r9
+**	movq	%r13, %rdx
+**	movq	%rsp, %rax
+**	movaps	%xmm0, \(%rsp\)
+**	movq	%r12, %rcx
+**	pushq	%rax
+**	.cfi_def_cfa_offset 40
+**	pushq	%rdi
+**	.cfi_def_cfa_offset 48
+**	subq	\$32, %rsp
+**	.cfi_def_cfa_offset 80
+**	call	continuation
+**	addq	\$72, %rsp
+**	.cfi_def_cfa_offset 8
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+#define CALLEE_ATTRIBUTE __attribute__ ((no_callee_saved_registers, ms_abi))
+#define CALLER_ATTRIBUTE __attribute__ ((preserve_none, ms_abi))
+
+#include "preserve-none-36a.c"
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-36g.c b/gcc/testsuite/gcc.target/i386/preserve-none-36g.c
new file mode 100644
index 00000000000..b0f801bd5da
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-36g.c
@@ -0,0 +1,30 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -march=x86-64 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB0:
+**	.cfi_startproc
+**	subq	\$8, %rsp
+**	.cfi_def_cfa_offset 16
+**	movq	%rcx, %r12
+**	movq	%rdx, %r13
+**	movq	%r9, %r15
+**	movq	56\(%rsp\), %rax
+**	movq	48\(%rsp\), %rdi
+**	movq	%r8, %r14
+**	movaps	\(%rax\), %xmm0
+**	call	continuation
+**	addq	\$8, %rsp
+**	.cfi_def_cfa_offset 8
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+#define CALLEE_ATTRIBUTE __attribute__ ((preserve_none, ms_abi))
+#define CALLER_ATTRIBUTE __attribute__ ((no_callee_saved_registers, ms_abi))
+
+#include "preserve-none-36a.c"
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-37a.c b/gcc/testsuite/gcc.target/i386/preserve-none-37a.c
new file mode 100644
index 00000000000..cb8550aa934
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-37a.c
@@ -0,0 +1,33 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -march=x86-64 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	jmp	continuation
+**	.cfi_endproc
+**...
+*/
+
+#ifndef CALLEE_ATTRIBUTE
+#define CALLEE_ATTRIBUTE __attribute__ ((preserve_none, sysv_abi))
+#endif
+
+#ifndef CALLER_ATTRIBUTE
+#define CALLER_ATTRIBUTE __attribute__ ((preserve_none, sysv_abi))
+#endif
+
+extern void continuation (double, double, double, double,
+			  double, double, double, double)
+    CALLEE_ATTRIBUTE;
+
+CALLER_ATTRIBUTE
+void
+entry (double arg1, double arg2, double arg3, double arg4,
+       double arg5, double arg6, double arg7, double arg8)
+{
+  continuation (arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
+}
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-37b.c b/gcc/testsuite/gcc.target/i386/preserve-none-37b.c
new file mode 100644
index 00000000000..2f465e2cd9a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-37b.c
@@ -0,0 +1,17 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -march=x86-64 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	jmp	continuation
+**	.cfi_endproc
+**...
+*/
+
+#define CALLER_ATTRIBUTE __attribute__ ((no_callee_saved_registers, sysv_abi))
+
+#include "preserve-none-37a.c"
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-37c.c b/gcc/testsuite/gcc.target/i386/preserve-none-37c.c
new file mode 100644
index 00000000000..33f6de28ac7
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-37c.c
@@ -0,0 +1,18 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -march=x86-64 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	jmp	continuation
+**	.cfi_endproc
+**...
+*/
+
+#define CALLEE_ATTRIBUTE __attribute__ ((sysv_abi))
+#define CALLER_ATTRIBUTE __attribute__ ((sysv_abi))
+
+#include "preserve-none-37a.c"
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-37d.c b/gcc/testsuite/gcc.target/i386/preserve-none-37d.c
new file mode 100644
index 00000000000..86fb3a1d172
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-37d.c
@@ -0,0 +1,18 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -march=x86-64 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	jmp	continuation
+**	.cfi_endproc
+**...
+*/
+
+#define CALLEE_ATTRIBUTE __attribute__ ((ms_abi))
+#define CALLER_ATTRIBUTE __attribute__ ((ms_abi))
+
+#include "preserve-none-37a.c"
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-37e.c b/gcc/testsuite/gcc.target/i386/preserve-none-37e.c
new file mode 100644
index 00000000000..d089b51555e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-37e.c
@@ -0,0 +1,18 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -march=x86-64 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	jmp	continuation
+**	.cfi_endproc
+**...
+*/
+
+#define CALLEE_ATTRIBUTE __attribute__ ((preserve_none, ms_abi))
+#define CALLER_ATTRIBUTE __attribute__ ((preserve_none, ms_abi))
+
+#include "preserve-none-37a.c"
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-37f.c b/gcc/testsuite/gcc.target/i386/preserve-none-37f.c
new file mode 100644
index 00000000000..015aa7f113e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-37f.c
@@ -0,0 +1,27 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -march=x86-64 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB0:
+**	.cfi_startproc
+**	subq	\$72, %rsp
+**	.cfi_def_cfa_offset 80
+**	movsd	%xmm7, 56\(%rsp\)
+**	movsd	%xmm6, 48\(%rsp\)
+**	movsd	%xmm5, 40\(%rsp\)
+**	movsd	%xmm4, 32\(%rsp\)
+**	call	continuation
+**	addq	\$72, %rsp
+**	.cfi_def_cfa_offset 8
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+#define CALLEE_ATTRIBUTE __attribute__ ((no_callee_saved_registers, ms_abi))
+#define CALLER_ATTRIBUTE __attribute__ ((preserve_none, ms_abi))
+
+#include "preserve-none-37a.c"
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-37g.c b/gcc/testsuite/gcc.target/i386/preserve-none-37g.c
new file mode 100644
index 00000000000..17a3123eefa
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-37g.c
@@ -0,0 +1,27 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -march=x86-64 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB0:
+**	.cfi_startproc
+**	subq	\$8, %rsp
+**	.cfi_def_cfa_offset 16
+**	movsd	72\(%rsp\), %xmm7
+**	movsd	64\(%rsp\), %xmm6
+**	movsd	56\(%rsp\), %xmm5
+**	movsd	48\(%rsp\), %xmm4
+**	call	continuation
+**	addq	\$8, %rsp
+**	.cfi_def_cfa_offset 8
+**	ret
+**	.cfi_endproc
+**...
+*/
+
+#define CALLEE_ATTRIBUTE __attribute__ ((preserve_none, ms_abi))
+#define CALLER_ATTRIBUTE __attribute__ ((no_callee_saved_registers, ms_abi))
+
+#include "preserve-none-37a.c"
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-37h.c b/gcc/testsuite/gcc.target/i386/preserve-none-37h.c
new file mode 100644
index 00000000000..c0a0970e0e5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-37h.c
@@ -0,0 +1,18 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -mabi=ms -march=x86-64 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	jmp	continuation
+**	.cfi_endproc
+**...
+*/
+
+#define CALLEE_ATTRIBUTE __attribute__ ((preserve_none))
+#define CALLER_ATTRIBUTE __attribute__ ((preserve_none, sysv_abi))
+
+#include "preserve-none-37a.c"
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-37i.c b/gcc/testsuite/gcc.target/i386/preserve-none-37i.c
new file mode 100644
index 00000000000..f10ce66d4a5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-37i.c
@@ -0,0 +1,18 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -mabi=ms -march=x86-64 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	jmp	continuation
+**	.cfi_endproc
+**...
+*/
+
+#define CALLEE_ATTRIBUTE __attribute__ ((preserve_none, sysv_abi))
+#define CALLER_ATTRIBUTE __attribute__ ((preserve_none))
+
+#include "preserve-none-37a.c"
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-37j.c b/gcc/testsuite/gcc.target/i386/preserve-none-37j.c
new file mode 100644
index 00000000000..4852e20cd3f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-37j.c
@@ -0,0 +1,18 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -mabi=ms -march=x86-64 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB[0-9]+:
+**	.cfi_startproc
+**	jmp	continuation
+**	.cfi_endproc
+**...
+*/
+
+#define CALLEE_ATTRIBUTE __attribute__ ((preserve_none))
+#define CALLER_ATTRIBUTE __attribute__ ((preserve_none))
+
+#include "preserve-none-37a.c"
-- 
2.55.0

Reply via email to