[gcc r17-2578] x86: Don't set cum->preserve_none_abi for x86-64 MS calls

"H.J. Lu via Gcc-cvs" <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:336f25a0ad83cc74b6a18137ffd177eefa4a81b0

commit r17-2578-g336f25a0ad83cc74b6a18137ffd177eefa4a81b0
Author: H.J. Lu <[email protected]>
Date:   Wed May 13 08:27:50 2026 +0800

    x86: Don't set cum->preserve_none_abi for x86-64 MS calls
    
    In 64-bit mode, preserve_none attribute uses the same number of integer
    parameters passed in registers as SYSV ABI, but with a different set of
    6 registers, by setting cum->preserve_none_abi to true.  Don't set
    cum->preserve_none_abi to true for MS ABI functions with preserve_none
    attribute to keep the number of integer parameters passed in registers
    unchanged as 4.  This treats preserve_none attribute the same way as
    no_callee_saved_registers attribute for MS ABI functions.
    
    gcc/
    
            PR target/125297
            * config/i386/i386.cc (init_cumulative_args): Don't set
            cum->preserve_none_abi to true for MS ABI functions.
            * doc/extend.texi: Update x86-64 preserve_none attribute
            documentation.
    
    gcc/testsuite/
    
            PR target/125297
            * gcc.target/i386/preserve-none-1.c: Skip llp64 target.
            * gcc.target/i386/preserve-none-31a.c: New test.
            * gcc.target/i386/preserve-none-31b.c: Likewise.
            * gcc.target/i386/preserve-none-32.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]>

Diff:
---
 gcc/config/i386/i386.cc                           |  3 +
 gcc/doc/extend.texi                               |  9 +--
 gcc/testsuite/gcc.target/i386/preserve-none-1.c   |  2 +-
 gcc/testsuite/gcc.target/i386/preserve-none-31a.c | 33 ++++++++++
 gcc/testsuite/gcc.target/i386/preserve-none-31b.c | 22 +++++++
 gcc/testsuite/gcc.target/i386/preserve-none-32.c  | 20 ++++++
 gcc/testsuite/gcc.target/i386/preserve-none-33a.c | 34 ++++++++++
 gcc/testsuite/gcc.target/i386/preserve-none-33b.c | 22 +++++++
 gcc/testsuite/gcc.target/i386/preserve-none-34a.c | 34 ++++++++++
 gcc/testsuite/gcc.target/i386/preserve-none-34b.c | 12 ++++
 gcc/testsuite/gcc.target/i386/preserve-none-35a.c | 60 +++++++++++++++++
 gcc/testsuite/gcc.target/i386/preserve-none-35b.c | 39 +++++++++++
 gcc/testsuite/gcc.target/i386/preserve-none-35c.c | 39 +++++++++++
 gcc/testsuite/gcc.target/i386/preserve-none-35d.c | 80 +++++++++++++++++++++++
 gcc/testsuite/gcc.target/i386/preserve-none-35e.c | 80 +++++++++++++++++++++++
 gcc/testsuite/gcc.target/i386/preserve-none-35f.c | 80 +++++++++++++++++++++++
 gcc/testsuite/gcc.target/i386/preserve-none-35g.c | 80 +++++++++++++++++++++++
 gcc/testsuite/gcc.target/i386/preserve-none-36a.c | 33 ++++++++++
 gcc/testsuite/gcc.target/i386/preserve-none-36b.c | 22 +++++++
 gcc/testsuite/gcc.target/i386/preserve-none-36c.c | 18 +++++
 gcc/testsuite/gcc.target/i386/preserve-none-36d.c | 30 +++++++++
 gcc/testsuite/gcc.target/i386/preserve-none-36e.c | 30 +++++++++
 gcc/testsuite/gcc.target/i386/preserve-none-36f.c | 30 +++++++++
 gcc/testsuite/gcc.target/i386/preserve-none-36g.c | 30 +++++++++
 gcc/testsuite/gcc.target/i386/preserve-none-37a.c | 33 ++++++++++
 gcc/testsuite/gcc.target/i386/preserve-none-37b.c | 17 +++++
 gcc/testsuite/gcc.target/i386/preserve-none-37c.c | 18 +++++
 gcc/testsuite/gcc.target/i386/preserve-none-37d.c | 18 +++++
 gcc/testsuite/gcc.target/i386/preserve-none-37e.c | 18 +++++
 gcc/testsuite/gcc.target/i386/preserve-none-37f.c | 18 +++++
 gcc/testsuite/gcc.target/i386/preserve-none-37g.c | 18 +++++
 gcc/testsuite/gcc.target/i386/preserve-none-37h.c | 27 ++++++++
 gcc/testsuite/gcc.target/i386/preserve-none-37i.c | 27 ++++++++
 gcc/testsuite/gcc.target/i386/preserve-none-37j.c | 18 +++++
 34 files changed, 1049 insertions(+), 5 deletions(-)

diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
index b137f5c22dc7..56a90333cfcb 100644
--- a/gcc/config/i386/i386.cc
+++ b/gcc/config/i386/i386.cc
@@ -1898,8 +1898,11 @@ init_cumulative_args (CUMULATIVE_ARGS *cum,  /* Argument info to initialize */
       cum->call_abi = ix86_function_type_abi (fntype);
       preserve_none_type = fntype;
     }
+
+  /* For MS ABI functions, parameter passing scheme is unchanged.  */
   cum->preserve_none_abi
     = (preserve_none_type
+       && cum->call_abi != MS_ABI
        && (lookup_attribute ("preserve_none",
 			     TYPE_ATTRIBUTES (preserve_none_type))
 	   != nullptr));
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index 4761b07973a7..a61138f5496d 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -8899,10 +8899,11 @@ interrupt.
 @item preserve_none
 This attribute applies to functions.
 
-It is similar to @code{no_callee_saved_registers}, except
-on x86-64, r12, r13, r14, r15, rdi and rsi registers are used for
-integer parameter passing and this calling convention is subject to
-change.
+It is similar to @code{no_callee_saved_registers}, except on x86-64
+with the SysV ABI, r12, r13, r14, r15, rdi and rsi registers are used
+for integer parameter passing and this calling convention is subject to
+change.  For the Microsoft ABI, this attribute is treated the same as
+@code{no_callee_saved_registers}.
 
 @atindex @code{no_caller_saved_registers}, x86
 @item no_caller_saved_registers
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-1.c b/gcc/testsuite/gcc.target/i386/preserve-none-1.c
index 25c6494610d6..fff0f5d77797 100644
--- a/gcc/testsuite/gcc.target/i386/preserve-none-1.c
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-1.c
@@ -1,4 +1,4 @@
-/* { dg-do compile { target { ! ia32 } } } */
+/* { dg-do compile { target { { ! ia32 } && { ! llp64 } } } } */
 /* { dg-options "-O2 -fomit-frame-pointer" } */
 
 extern void boring(void);
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 000000000000..ae991b96f9f8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-31a.c
@@ -0,0 +1,33 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -mabi=ms -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -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
+**	movl	120\(%rsp\), %eax
+**	movl	\$-559038737, 48\(%rsp\)
+**	movl	%eax, 40\(%rsp\)
+**	movl	112\(%rsp\), %eax
+**	movl	%eax, 32\(%rsp\)
+**	call	continuation
+**	addq	\$72, %rsp
+**	.cfi_def_cfa_offset 8
+**	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 000000000000..df8da5aeab8a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-31b.c
@@ -0,0 +1,22 @@
+/* { dg-do compile { target { llp64 } } } */
+/* { dg-options "-O2 -mabi=ms -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.seh_endprologue').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.} } } */
+
+/*
+**entry:
+**	subq	\$72, %rsp
+**	.seh_stackalloc	72
+**	.seh_endprologue
+**	movl	120\(%rsp\), %eax
+**	movl	%eax, 40\(%rsp\)
+**	movl	112\(%rsp\), %eax
+**	movl	\$-559038737, 48\(%rsp\)
+**	movl	%eax, 32\(%rsp\)
+**	call	continuation
+**	nop
+**	addq	\$72, %rsp
+**	ret
+*/
+
+#include "preserve-none-31a.c"
diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-32.c b/gcc/testsuite/gcc.target/i386/preserve-none-32.c
new file mode 100644
index 000000000000..fa8ecccb97a8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-32.c
@@ -0,0 +1,20 @@
+/* { dg-do compile { target { llp64 } } } */
+/* { dg-options "-O2 -mabi=ms -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.seh_endprologue').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.} } } */
+
+/*
+**entry:
+**	.seh_endprologue
+**	jmp	continuation
+*/
+
+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-33a.c b/gcc/testsuite/gcc.target/i386/preserve-none-33a.c
new file mode 100644
index 000000000000..7073760a0051
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-33a.c
@@ -0,0 +1,34 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -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
+**	movl	%r9d, 40\(%rsp\)
+**	movl	%ecx, %r9d
+**	movl	%edi, %ecx
+**	movl	%r8d, 32\(%rsp\)
+**	movl	%edx, %r8d
+**	movl	%esi, %edx
+**	movl	\$-559038737, 48\(%rsp\)
+**	call	continuation
+**	addq	\$72, %rsp
+**	.cfi_def_cfa_offset 8
+**	ret
+**...
+*/
+
+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 000000000000..7af728634938
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-33b.c
@@ -0,0 +1,22 @@
+/* { dg-do compile { target { llp64 } } } */
+/* { dg-options "-O2 -mabi=ms -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.seh_endprologue').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.} } } */
+
+/*
+**entry:
+**	subq	\$72, %rsp
+**	.seh_stackalloc	72
+**	.seh_endprologue
+**	movl	120\(%rsp\), %eax
+**	movl	%eax, 40\(%rsp\)
+**	movl	112\(%rsp\), %eax
+**	movl	\$-559038737, 48\(%rsp\)
+**	movl	%eax, 32\(%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 000000000000..add7927518d9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-34a.c
@@ -0,0 +1,34 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -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
+**	movl	%r9d, 48\(%rsp\)
+**	movl	%edx, %r9d
+**	movl	%edi, %edx
+**	movl	%r8d, 40\(%rsp\)
+**	movl	%esi, %r8d
+**	movl	%ecx, 32\(%rsp\)
+**	call	continuation
+**	addq	\$72, %rsp
+**	.cfi_def_cfa_offset 8
+**	ret
+**	.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 000000000000..28c3d23119fc
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-34b.c
@@ -0,0 +1,12 @@
+/* { dg-do compile { target { llp64 } } } */
+/* { dg-options "-O2 -mabi=ms -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.seh_endprologue').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.} } } */
+
+/*
+**entry:
+**	.seh_endprologue
+**	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 000000000000..177bf8730e4d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-35a.c
@@ -0,0 +1,60 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -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	96\(%rsp\), %rax
+**	movq	%r13, 40\(%rsp\)
+**	movl	40\(%rsp\), %r13d
+**	movq	%r14, 48\(%rsp\)
+**	movl	48\(%rsp\), %r14d
+**	movq	%r15, 56\(%rsp\)
+**	movl	56\(%rsp\), %r15d
+**	movq	%rdi, 64\(%rsp\)
+**	movl	64\(%rsp\), %edi
+**	movq	%rsi, 72\(%rsp\)
+**	movl	72\(%rsp\), %esi
+**	movq	%rax, 8\(%rsp\)
+**	leaq	32\(%rsp\), %rax
+**	movq	%rax, 16\(%rsp\)
+**	xorl	%eax, %eax
+**	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 000000000000..76ee7f79c935
--- /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 -mno-push-args -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	%edi, %r12d
+**	leaq	96\(%rsp\), %rax
+**	movq	%rsi, 40\(%rsp\)
+**	movl	40\(%rsp\), %r13d
+**	movq	%rdx, 48\(%rsp\)
+**	movl	48\(%rsp\), %r14d
+**	movq	%rcx, 56\(%rsp\)
+**	movl	56\(%rsp\), %r15d
+**	movq	%r8, 64\(%rsp\)
+**	movl	64\(%rsp\), %edi
+**	movq	%r9, 72\(%rsp\)
+**	movl	72\(%rsp\), %esi
+**	movq	%rax, 8\(%rsp\)
+**	leaq	32\(%rsp\), %rax
+**	movq	%rax, 16\(%rsp\)
+**	xorl	%eax, %eax
+**	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 000000000000..8a3072076938
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-35c.c
@@ -0,0 +1,39 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -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	96\(%rsp\), %rax
+**	movq	%rsi, 40\(%rsp\)
+**	movl	40\(%rsp\), %esi
+**	movq	%rdx, 48\(%rsp\)
+**	movl	48\(%rsp\), %edx
+**	movq	%rcx, 56\(%rsp\)
+**	movl	56\(%rsp\), %ecx
+**	movq	%r8, 64\(%rsp\)
+**	movl	64\(%rsp\), %r8d
+**	movq	%r9, 72\(%rsp\)
+**	movl	72\(%rsp\), %r9d
+**	movq	%rax, 8\(%rsp\)
+**	leaq	32\(%rsp\), %rax
+**	movq	%rax, 16\(%rsp\)
+**	xorl	%eax, %eax
+**	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 000000000000..4a362233587b
--- /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 -mno-push-args -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 000000000000..510281c7a793
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-35e.c
@@ -0,0 +1,80 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -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\), %esi
+**	cmpl	\$47, %edx
+**	ja	.L18
+**	leal	16\(%rax\), %edi
+**	movl	\(%edx\), %r8d
+**	cmpl	\$47, %edi
+**	ja	.L19
+**	leal	24\(%rax\), %edx
+**	movl	\(%edi\), %r9d
+**	cmpl	\$47, %edx
+**	ja	.L20
+**	addl	\$32, %eax
+**	movl	\(%edx\), %edi
+**	cmpl	\$47, %eax
+**	movl	%eax, %edx
+**	movl	\$0, %eax
+**	cmovbe	%rdx, %rax
+**.L9:
+**	movl	\(%rax\), %eax
+**	movl	%edi, 32\(%rsp\)
+**	movl	%esi, %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, %esi
+**	movl	8, %r8d
+**	movl	\$16, %eax
+**.L5:
+**	movl	\(%rax\), %r9d
+**	leaq	8\(%rax\), %rdx
+**.L7:
+**	movl	\(%rdx\), %edi
+**	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__ ((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 000000000000..301a357a3cfb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-35f.c
@@ -0,0 +1,80 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -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\), %esi
+**	cmpl	\$47, %edx
+**	ja	.L18
+**	leal	16\(%rax\), %edi
+**	movl	\(%edx\), %r8d
+**	cmpl	\$47, %edi
+**	ja	.L19
+**	leal	24\(%rax\), %edx
+**	movl	\(%edi\), %r9d
+**	cmpl	\$47, %edx
+**	ja	.L20
+**	addl	\$32, %eax
+**	movl	\(%edx\), %edi
+**	cmpl	\$47, %eax
+**	movl	%eax, %edx
+**	movl	\$0, %eax
+**	cmovbe	%rdx, %rax
+**.L9:
+**	movl	\(%rax\), %eax
+**	movl	%edi, 32\(%rsp\)
+**	movl	%esi, %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, %esi
+**	movl	8, %r8d
+**	movl	\$16, %eax
+**.L5:
+**	movl	\(%rax\), %r9d
+**	leaq	8\(%rax\), %rdx
+**.L7:
+**	movl	\(%rdx\), %edi
+**	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__ ((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 000000000000..3057456c6302
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-35g.c
@@ -0,0 +1,80 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -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\), %esi
+**	cmpl	\$47, %edx
+**	ja	.L18
+**	leal	16\(%rax\), %edi
+**	movl	\(%edx\), %r8d
+**	cmpl	\$47, %edi
+**	ja	.L19
+**	leal	24\(%rax\), %edx
+**	movl	\(%edi\), %r9d
+**	cmpl	\$47, %edx
+**	ja	.L20
+**	addl	\$32, %eax
+**	movl	\(%edx\), %edi
+**	cmpl	\$47, %eax
+**	movl	%eax, %edx
+**	movl	\$0, %eax
+**	cmovbe	%rdx, %rax
+**.L9:
+**	movl	\(%rax\), %eax
+**	movl	%edi, 32\(%rsp\)
+**	movl	%esi, %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, %esi
+**	movl	8, %r8d
+**	movl	\$16, %eax
+**.L5:
+**	movl	\(%rax\), %r9d
+**	leaq	8\(%rax\), %rdx
+**.L7:
+**	movl	\(%rdx\), %edi
+**	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__ ((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 000000000000..71b526ff4354
--- /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 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -mtune=generic" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB0:
+**	.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 000000000000..022bfba60890
--- /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 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -march=x86-64" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB0:
+**	.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 000000000000..caecf5d37fb6
--- /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 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -march=x86-64" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB0:
+**	.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 000000000000..efab3a74b9a5
--- /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 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -march=x86-64" } */
+/* 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
+**	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 000000000000..76a5e83a6abd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-36e.c
@@ -0,0 +1,30 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -march=x86-64" } */
+/* 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
+**	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__ ((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 000000000000..64bc9390ed36
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-36f.c
@@ -0,0 +1,30 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -march=x86-64" } */
+/* 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
+**	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__ ((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 000000000000..e63e3d3e011a
--- /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 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -march=x86-64" } */
+/* 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
+**	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__ ((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 000000000000..c0894752b03f
--- /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 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -march=x86-64" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB0:
+**	.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 000000000000..9129d6b606fc
--- /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 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -march=x86-64" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB0:
+**	.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 000000000000..e3ea3b12ee5c
--- /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 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -march=x86-64" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB0:
+**	.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 000000000000..bd9601d17ae0
--- /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 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -march=x86-64" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB0:
+**	.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 000000000000..339370a4ae21
--- /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 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -march=x86-64" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB0:
+**	.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 000000000000..32afd5bdad3e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-37f.c
@@ -0,0 +1,18 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -march=x86-64" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB0:
+**	.cfi_startproc
+**	jmp	continuation
+**	.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 000000000000..ad0180c370af
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-37g.c
@@ -0,0 +1,18 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -march=x86-64" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB0:
+**	.cfi_startproc
+**	jmp	continuation
+**	.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 000000000000..b3906e091736
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-37h.c
@@ -0,0 +1,27 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -mabi=ms -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -march=x86-64" } */
+/* 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__ ((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 000000000000..d0270475e1c6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/preserve-none-37i.c
@@ -0,0 +1,27 @@
+/* { dg-do compile { target { *-*-linux* && lp64 } } } */
+/* { dg-options "-O2 -mabi=ms -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -march=x86-64" } */
+/* 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, 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 000000000000..9a7f9bb4556f
--- /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 -mtune-ctrl=^prologue_using_move,^epilogue_using_move -mno-push-args -fomit-frame-pointer -march=x86-64" } */
+/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
+/* { dg-final { check-function-bodies "**" "" "" { target "*-*-*" } {^\t?\.}  } } */
+
+/*
+**entry:
+**.LFB0:
+**	.cfi_startproc
+**	jmp	continuation
+**	.cfi_endproc
+**...
+*/
+
+#define CALLEE_ATTRIBUTE __attribute__ ((preserve_none))
+#define CALLER_ATTRIBUTE __attribute__ ((preserve_none))
+
+#include "preserve-none-37a.c"
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.