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"
