[gcc r17-2578] x86: Don't set cum->preserve_none_abi for x86-64 MS calls
H.J. Lu
hjl@gcc.gnu.org
Tue Jul 21 03:30:58 GMT 2026
https://gcc.gnu.org/g:336f25a0ad83cc74b6a18137ffd177eefa4a81b0
commit r17-2578-g336f25a0ad83cc74b6a18137ffd177eefa4a81b0
Author: H.J. Lu <hjl.tools@gmail.com>
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 <hjl.tools@gmail.com>
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"
More information about the Gcc-cvs
mailing list