commit:     ae7d2c2f05513ca58a1f4cf98220fd8710fd354c
Author:     Sam James <sam <AT> gentoo <DOT> org>
AuthorDate: Sun Jun 29 00:28:53 2025 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Sun Jun 29 00:29:23 2025 +0000
URL:        https://gitweb.gentoo.org/proj/gcc-patches.git/commit/?id=ae7d2c2f

16.0.0: add 85_all_PR120840.patch

Bug: https://gcc.gnu.org/PR120840
Signed-off-by: Sam James <sam <AT> gentoo.org>

 16.0.0/gentoo/85_all_PR120840.patch | 873 ++++++++++++++++++++++++++++++++++++
 16.0.0/gentoo/README.history        |   4 +
 2 files changed, 877 insertions(+)

diff --git a/16.0.0/gentoo/85_all_PR120840.patch 
b/16.0.0/gentoo/85_all_PR120840.patch
new file mode 100644
index 0000000..c9c710f
--- /dev/null
+++ b/16.0.0/gentoo/85_all_PR120840.patch
@@ -0,0 +1,873 @@
+https://inbox.sourceware.org/gcc-patches/CAMe9rOpBxdLoJrGZqt5_JhPAuvWUOpGWMLiGg=dskkytdqv...@mail.gmail.com/
+
+From cefa274db3abc864bbe4d163d78108fb50fb9e97 Mon Sep 17 00:00:00 2001
+Message-ID: 
<cefa274db3abc864bbe4d163d78108fb50fb9e97.1751156913.git....@gentoo.org>
+From: "H.J. Lu" <[email protected]>
+Date: Sat, 28 Jun 2025 09:39:41 +0800
+Subject: [PATCH] x86: Preserve frame pointer for no_callee_saved_registers
+ attribute
+
+Update functions with no_callee_saved_registers/preserve_none attribute
+to preserve frame pointer since caller may use it to save the current
+stack:
+
+       pushq   %rbp
+       movq    %rsp, %rbp
+       ...
+       call    function
+       ...
+       leave
+       ret
+
+If callee changes frame pointer without restoring it, caller will fail
+to restore its stack after callee returns.
+
+There are no regressions on Linux/x86-64.  Also tested with
+
+https://github.com/python/cpython
+
+configured with "./configure --with-tail-call-interp".
+
+gcc/
+
+       PR target/120840
+       * config/i386/i386-expand.cc (ix86_expand_call): Don't mark
+       hard frame pointer as clobber.
+       * config/i386/i386-options.cc (ix86_set_func_type): Use
+       TYPE_NO_CALLEE_SAVED_REGISTERS instead of
+       TYPE_NO_CALLEE_SAVED_REGISTERS_EXCEPT_BP.
+       * config/i386/i386.cc (ix86_function_ok_for_sibcall): Remove the
+       TYPE_NO_CALLEE_SAVED_REGISTERS_EXCEPT_BP check.
+       (ix86_save_reg): Merge TYPE_NO_CALLEE_SAVED_REGISTERS and
+       TYPE_PRESERVE_NONE with TYPE_NO_CALLEE_SAVED_REGISTERS_EXCEPT_BP.
+       * config/i386/i386.h (call_saved_registers_type): Remove
+       TYPE_NO_CALLEE_SAVED_REGISTERS_EXCEPT_BP.
+       * doc/extend.texi: Update no_callee_saved_registers documentation.
+
+gcc/testsuite/
+
+       PR target/120840
+       * gcc.target/i386/no-callee-saved-1.c: Updated.
+       * gcc.target/i386/no-callee-saved-2.c: Likewise.
+       * gcc.target/i386/no-callee-saved-7.c: Likewise.
+       * gcc.target/i386/no-callee-saved-8.c: Likewise.
+       * gcc.target/i386/no-callee-saved-9.c: Likewise.
+       * gcc.target/i386/no-callee-saved-10.c: Likewise.
+       * gcc.target/i386/no-callee-saved-18.c: Likewise.
+       * gcc.target/i386/no-callee-saved-19a.c: Likewise.
+       * gcc.target/i386/no-callee-saved-19c.c: Likewise.
+       * gcc.target/i386/no-callee-saved-19d.c: Likewise.
+       * gcc.target/i386/pr119784a.c: Likewise.
+       * gcc.target/i386/preserve-none-6.c: Likewise.
+       * gcc.target/i386/preserve-none-7.c: Likewise.
+       * gcc.target/i386/preserve-none-12.c: Likewise.
+       * gcc.target/i386/preserve-none-13.c: Likewise.
+       * gcc.target/i386/preserve-none-14.c: Likewise.
+       * gcc.target/i386/preserve-none-15.c: Likewise.
+       * gcc.target/i386/preserve-none-23.c: Likewise.
+       * gcc.target/i386/pr120840-1a.c: New test.
+       * gcc.target/i386/pr120840-1b.c: Likewise.
+       * gcc.target/i386/pr120840-1c.c: Likewise.
+       * gcc.target/i386/pr120840-1d.c: Likewise.
+
+Signed-off-by: H.J. Lu <[email protected]>
+---
+ gcc/config/i386/i386-expand.cc                |  1 +
+ gcc/config/i386/i386-options.cc               | 23 +++--
+ gcc/config/i386/i386.cc                       |  5 --
+ gcc/config/i386/i386.h                        |  3 -
+ gcc/doc/extend.texi                           |  9 +-
+ .../gcc.target/i386/no-callee-saved-1.c       |  6 +-
+ .../gcc.target/i386/no-callee-saved-10.c      |  4 +-
+ .../gcc.target/i386/no-callee-saved-18.c      |  4 +-
+ .../gcc.target/i386/no-callee-saved-19a.c     | 32 ++++---
+ .../gcc.target/i386/no-callee-saved-19c.c     | 26 +++---
+ .../gcc.target/i386/no-callee-saved-19d.c     | 28 +++----
+ .../gcc.target/i386/no-callee-saved-2.c       |  6 +-
+ .../gcc.target/i386/no-callee-saved-7.c       |  4 +-
+ .../gcc.target/i386/no-callee-saved-8.c       |  4 +-
+ .../gcc.target/i386/no-callee-saved-9.c       |  4 +-
+ gcc/testsuite/gcc.target/i386/pr119784a.c     | 27 +++---
+ gcc/testsuite/gcc.target/i386/pr120840-1a.c   | 83 +++++++++++++++++++
+ gcc/testsuite/gcc.target/i386/pr120840-1b.c   | 20 +++++
+ gcc/testsuite/gcc.target/i386/pr120840-1c.c   | 20 +++++
+ gcc/testsuite/gcc.target/i386/pr120840-1d.c   | 20 +++++
+ .../gcc.target/i386/preserve-none-12.c        |  4 +-
+ .../gcc.target/i386/preserve-none-13.c        |  4 +-
+ .../gcc.target/i386/preserve-none-14.c        |  4 +-
+ .../gcc.target/i386/preserve-none-15.c        |  4 +-
+ .../gcc.target/i386/preserve-none-23.c        |  4 +-
+ .../gcc.target/i386/preserve-none-6.c         |  6 +-
+ .../gcc.target/i386/preserve-none-7.c         |  6 +-
+ 27 files changed, 248 insertions(+), 113 deletions(-)
+ create mode 100644 gcc/testsuite/gcc.target/i386/pr120840-1a.c
+ create mode 100644 gcc/testsuite/gcc.target/i386/pr120840-1b.c
+ create mode 100644 gcc/testsuite/gcc.target/i386/pr120840-1c.c
+ create mode 100644 gcc/testsuite/gcc.target/i386/pr120840-1d.c
+
+diff --git a/gcc/config/i386/i386-expand.cc b/gcc/config/i386/i386-expand.cc
+index c1c0cf9ff80a..83076adb55db 100644
+--- a/gcc/config/i386/i386-expand.cc
++++ b/gcc/config/i386/i386-expand.cc
+@@ -10377,6 +10377,7 @@ ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1,
+       char c_mask = CALL_USED_REGISTERS_MASK (is_64bit_ms_abi);
+       for (int i = 0; i < FIRST_PSEUDO_REGISTER; i++)
+       if (!fixed_regs[i]
++          && i != HARD_FRAME_POINTER_REGNUM
+           && !(ix86_call_used_regs[i] == 1
+                || (ix86_call_used_regs[i] & c_mask))
+           && !STACK_REGNO_P (i)
+diff --git a/gcc/config/i386/i386-options.cc b/gcc/config/i386/i386-options.cc
+index 60c04f65d9f9..09cb1337f94c 100644
+--- a/gcc/config/i386/i386-options.cc
++++ b/gcc/config/i386/i386-options.cc
+@@ -3280,19 +3280,18 @@ ix86_set_func_type (tree fndecl)
+   if (lookup_attribute ("preserve_none",
+                            TYPE_ATTRIBUTES (TREE_TYPE (fndecl))))
+     no_callee_saved_registers = TYPE_PRESERVE_NONE;
+-  else if (lookup_attribute ("no_callee_saved_registers",
+-                      TYPE_ATTRIBUTES (TREE_TYPE (fndecl))))
++  else if ((lookup_attribute ("no_callee_saved_registers",
++                            TYPE_ATTRIBUTES (TREE_TYPE (fndecl))))
++         || (ix86_noreturn_no_callee_saved_registers
++             && TREE_THIS_VOLATILE (fndecl)
++             && optimize
++             && !optimize_debug
++             && (TREE_NOTHROW (fndecl) || !flag_exceptions)
++             && !lookup_attribute ("interrupt",
++                                   TYPE_ATTRIBUTES (TREE_TYPE (fndecl)))
++             && !lookup_attribute ("no_caller_saved_registers",
++                               TYPE_ATTRIBUTES (TREE_TYPE (fndecl)))))
+     no_callee_saved_registers = TYPE_NO_CALLEE_SAVED_REGISTERS;
+-  else if (ix86_noreturn_no_callee_saved_registers
+-         && TREE_THIS_VOLATILE (fndecl)
+-         && optimize
+-         && !optimize_debug
+-         && (TREE_NOTHROW (fndecl) || !flag_exceptions)
+-         && !lookup_attribute ("interrupt",
+-                               TYPE_ATTRIBUTES (TREE_TYPE (fndecl)))
+-         && !lookup_attribute ("no_caller_saved_registers",
+-                               TYPE_ATTRIBUTES (TREE_TYPE (fndecl))))
+-    no_callee_saved_registers = TYPE_NO_CALLEE_SAVED_REGISTERS_EXCEPT_BP;
+ 
+   if (cfun->machine->func_type == TYPE_UNKNOWN)
+     {
+diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
+index 5e9559f5c05e..44763c8eb014 100644
+--- a/gcc/config/i386/i386.cc
++++ b/gcc/config/i386/i386.cc
+@@ -1043,8 +1043,6 @@ ix86_function_ok_for_sibcall (tree decl, tree exp)
+   if ((cfun->machine->call_saved_registers
+        != TYPE_NO_CALLEE_SAVED_REGISTERS)
+       && cfun->machine->call_saved_registers != TYPE_PRESERVE_NONE
+-      && (cfun->machine->call_saved_registers
+-        != TYPE_NO_CALLEE_SAVED_REGISTERS_EXCEPT_BP)
+       && ix86_type_no_callee_saved_registers_p (type))
+     return false;
+ 
+@@ -6774,9 +6772,6 @@ ix86_save_reg (unsigned int regno, bool maybe_eh_return, 
bool ignore_outlined)
+ 
+     case TYPE_NO_CALLEE_SAVED_REGISTERS:
+     case TYPE_PRESERVE_NONE:
+-      return false;
+-
+-    case TYPE_NO_CALLEE_SAVED_REGISTERS_EXCEPT_BP:
+       if (regno != HARD_FRAME_POINTER_REGNUM)
+       return false;
+       break;
+diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
+index a275a32682e6..45de61c64b23 100644
+--- a/gcc/config/i386/i386.h
++++ b/gcc/config/i386/i386.h
+@@ -2804,9 +2804,6 @@ enum call_saved_registers_type
+   /* The current function is a function specified with the
+      "no_callee_saved_registers" attribute.  */
+   TYPE_NO_CALLEE_SAVED_REGISTERS,
+-  /* The current function is a function specified with the "noreturn"
+-     attribute.  */
+-  TYPE_NO_CALLEE_SAVED_REGISTERS_EXCEPT_BP,
+   /* The current function is a function specified with the
+      "preserve_none" attribute.  */
+   TYPE_PRESERVE_NONE,
+diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
+index 946105d5cdcc..e9aa12ba1041 100644
+--- a/gcc/doc/extend.texi
++++ b/gcc/doc/extend.texi
+@@ -6124,10 +6124,11 @@ pass arguments, unless it takes a variable number of 
arguments.
+ @cindex @code{no_callee_saved_registers} function attribute, x86
+ @item no_callee_saved_registers
+ Use this attribute to indicate that the specified function has no
+-callee-saved registers. That is, all registers can be used as scratch
+-registers. For example, this attribute can be used for a function
+-called from the interrupt handler assembly stub which will preserve
+-all registers and return from interrupt.
++callee-saved registers. That is, all registers, except for stack and
++frame pointers, can be used as scratch registers. For example, this
++attribute can be used for a function called from the interrupt handler
++assembly stub which will preserve all registers and return from
++interrupt.
+ 
+ @cindex @code{preserve_none} function attribute, x86
+ @item preserve_none
+diff --git a/gcc/testsuite/gcc.target/i386/no-callee-saved-1.c 
b/gcc/testsuite/gcc.target/i386/no-callee-saved-1.c
+index 599c2a3fa191..e535485b1cf3 100644
+--- a/gcc/testsuite/gcc.target/i386/no-callee-saved-1.c
++++ b/gcc/testsuite/gcc.target/i386/no-callee-saved-1.c
+@@ -26,5 +26,7 @@ foo (void *frame)
+   }
+ }
+ 
+-/* { dg-final { scan-assembler-not "push" } } */
+-/* { dg-final { scan-assembler-not "pop" } } */
++/* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*" 1 } } */
++/* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*" 1 } } */
+diff --git a/gcc/testsuite/gcc.target/i386/no-callee-saved-10.c 
b/gcc/testsuite/gcc.target/i386/no-callee-saved-10.c
+index 87766c6cd886..6c54144350e6 100644
+--- a/gcc/testsuite/gcc.target/i386/no-callee-saved-10.c
++++ b/gcc/testsuite/gcc.target/i386/no-callee-saved-10.c
+@@ -18,7 +18,7 @@ foo (void)
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)cx" 1 } } */
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)dx" 1 } } */
+-/* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)bp" } } */
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)si" 1 } } */
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)di" 1 } } */
+ /* { dg-final { scan-assembler-times "pushq\[\\t \]*%r8" 1 { target { ! ia32 
} } } } */
+@@ -33,7 +33,7 @@ foo (void)
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)cx" 1 } } */
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)dx" 1 } } */
+-/* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)bp" } } */
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)si" 1 } } */
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)di" 1 } } */
+ /* { dg-final { scan-assembler-times "popq\[\\t \]*%r8" 1 { target { ! ia32 } 
} } } */
+diff --git a/gcc/testsuite/gcc.target/i386/no-callee-saved-18.c 
b/gcc/testsuite/gcc.target/i386/no-callee-saved-18.c
+index e7101009be47..128b9c46e8ec 100644
+--- a/gcc/testsuite/gcc.target/i386/no-callee-saved-18.c
++++ b/gcc/testsuite/gcc.target/i386/no-callee-saved-18.c
+@@ -19,7 +19,7 @@ foo (uintptr_t p)
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)cx" } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)dx" } } */
+-/* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)bp" } } */
+ /* { dg-final { scan-assembler-times "pushl\[\\t \]*%esi" 1 { target ia32 } } 
} */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%rsi" { target { ! ia32 } } 
} } */
+ /* { dg-final { scan-assembler-times "pushl\[\\t \]*%edi" 1 { target ia32 } } 
} */
+@@ -36,7 +36,7 @@ foo (uintptr_t p)
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)cx" } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)dx" } } */
+-/* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)bp" } } */
+ /* { dg-final { scan-assembler-times "popl\[\\t \]*%esi" 1 { target ia32 } } 
} */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%rsi" { target { ! ia32 } } 
} } */
+ /* { dg-final { scan-assembler-times "popl\[\\t \]*%edi" 1 { target ia32 } } 
} */
+diff --git a/gcc/testsuite/gcc.target/i386/no-callee-saved-19a.c 
b/gcc/testsuite/gcc.target/i386/no-callee-saved-19a.c
+index 25ef8558a5db..12f35cfa8bba 100644
+--- a/gcc/testsuite/gcc.target/i386/no-callee-saved-19a.c
++++ b/gcc/testsuite/gcc.target/i386/no-callee-saved-19a.c
+@@ -16,9 +16,9 @@
+ 
+ #define NEXT { op_t *op = next; [[gnu::musttail]] return (*op)(op + 1); }
+ #ifdef __x86_64__
+-# define CLOBBER asm("" ::: "r12","r13","r14","r15","rbp","rbx")
++# define CLOBBER asm("" ::: "r12","r13","r14","r15","rbx")
+ #else
+-# define CLOBBER asm("" ::: "ebp","ebx")
++# define CLOBBER asm("" ::: "ebx")
+ #endif
+ #define DONT_SAVE_REGS __attribute__((no_callee_saved_registers))
+ #define SAVE_REGS __attribute__((no_caller_saved_registers))
+@@ -83,15 +83,14 @@ op_t code[] = { inc, inc, dec, end, };
+ **    .cfi_startproc
+ **    subq    \$376, %rsp
+ **...
+-**    movq    %rax, 256\(%rsp\)
+-**    movq    %rdx, 264\(%rsp\)
+-**    movq    %rcx, 272\(%rsp\)
+-**    movq    %rbx, 280\(%rsp\)
+-**    movq    %rsi, 288\(%rsp\)
+-**    movq    %rdi, 296\(%rsp\)
++**    movq    %rdi, 304\(%rsp\)
+ **...
+ **    movl    \$code\+8, %edi
+-**    movq    %rbp, 304\(%rsp\)
++**    movq    %rax, 264\(%rsp\)
++**    movq    %rdx, 272\(%rsp\)
++**    movq    %rcx, 280\(%rsp\)
++**    movq    %rbx, 288\(%rsp\)
++**    movq    %rsi, 296\(%rsp\)
+ **    movq    %r8, 312\(%rsp\)
+ **    movq    %r9, 320\(%rsp\)
+ **    movq    %r10, 328\(%rsp\)
+@@ -132,13 +131,12 @@ op_t code[] = { inc, inc, dec, end, };
+ **    movaps  176\(%rsp\), %xmm11
+ **    movaps  192\(%rsp\), %xmm12
+ **    movaps  208\(%rsp\), %xmm13
+-**    movq    256\(%rsp\), %rax
+-**    movq    264\(%rsp\), %rdx
+-**    movq    272\(%rsp\), %rcx
+-**    movq    280\(%rsp\), %rbx
+-**    movq    288\(%rsp\), %rsi
+-**    movq    296\(%rsp\), %rdi
+-**    movq    304\(%rsp\), %rbp
++**    movq    264\(%rsp\), %rax
++**    movq    272\(%rsp\), %rdx
++**    movq    280\(%rsp\), %rcx
++**    movq    288\(%rsp\), %rbx
++**    movq    296\(%rsp\), %rsi
++**    movq    304\(%rsp\), %rdi
+ **    movq    312\(%rsp\), %r8
+ **    movq    320\(%rsp\), %r9
+ **    movq    328\(%rsp\), %r10
+@@ -146,8 +144,8 @@ op_t code[] = { inc, inc, dec, end, };
+ **    movq    344\(%rsp\), %r12
+ **    movq    352\(%rsp\), %r13
+ **    movq    360\(%rsp\), %r14
+-**    movaps  224\(%rsp\), %xmm14
+ **    movq    368\(%rsp\), %r15
++**    movaps  224\(%rsp\), %xmm14
+ **    movaps  240\(%rsp\), %xmm15
+ **    addq    \$376, %rsp
+ **...
+diff --git a/gcc/testsuite/gcc.target/i386/no-callee-saved-19c.c 
b/gcc/testsuite/gcc.target/i386/no-callee-saved-19c.c
+index 2ad388d1a567..05aca9f4b119 100644
+--- a/gcc/testsuite/gcc.target/i386/no-callee-saved-19c.c
++++ b/gcc/testsuite/gcc.target/i386/no-callee-saved-19c.c
+@@ -51,13 +51,12 @@
+ **.LFB[0-9]+:
+ **    .cfi_startproc
+ **...
+-**    movl    %eax, 140\(%esp\)
+-**    movl    %edx, 144\(%esp\)
+-**    movl    %ecx, 148\(%esp\)
+-**    movl    %ebx, 152\(%esp\)
+-**    movl    %esi, 156\(%esp\)
+-**    movl    %edi, 160\(%esp\)
+-**    movl    %ebp, 164\(%esp\)
++**    movl    %eax, 144\(%esp\)
++**    movl    %edx, 148\(%esp\)
++**    movl    %ecx, 152\(%esp\)
++**    movl    %ebx, 156\(%esp\)
++**    movl    %esi, 160\(%esp\)
++**    movl    %edi, 164\(%esp\)
+ **    movaps  %xmm0, 12\(%esp\)
+ **    movaps  %xmm1, 28\(%esp\)
+ **    movaps  %xmm2, 44\(%esp\)
+@@ -78,13 +77,12 @@
+ **    movaps  96\(%esp\), %xmm5
+ **    movaps  112\(%esp\), %xmm6
+ **    movaps  128\(%esp\), %xmm7
+-**    movl    144\(%esp\), %eax
+-**    movl    148\(%esp\), %edx
+-**    movl    152\(%esp\), %ecx
+-**    movl    156\(%esp\), %ebx
+-**    movl    160\(%esp\), %esi
+-**    movl    164\(%esp\), %edi
+-**    movl    168\(%esp\), %ebp
++**    movl    148\(%esp\), %eax
++**    movl    152\(%esp\), %edx
++**    movl    156\(%esp\), %ecx
++**    movl    160\(%esp\), %ebx
++**    movl    164\(%esp\), %esi
++**    movl    168\(%esp\), %edi
+ **...
+ **    ret
+ **    .cfi_endproc
+diff --git a/gcc/testsuite/gcc.target/i386/no-callee-saved-19d.c 
b/gcc/testsuite/gcc.target/i386/no-callee-saved-19d.c
+index a18d12e58997..b3caa3d81b2d 100644
+--- a/gcc/testsuite/gcc.target/i386/no-callee-saved-19d.c
++++ b/gcc/testsuite/gcc.target/i386/no-callee-saved-19d.c
+@@ -50,15 +50,14 @@
+ **    .cfi_startproc
+ **    subq    \$504, %rsp
+ **...
+-**    movq    %rax, 256\(%rsp\)
+-**    movq    %rdx, 264\(%rsp\)
+-**    movq    %rcx, 272\(%rsp\)
+-**    movq    %rbx, 280\(%rsp\)
+-**    movq    %rsi, 288\(%rsp\)
+-**    movq    %rdi, 296\(%rsp\)
++**    movq    %rax, 264\(%rsp\)
++**    movq    %rdx, 272\(%rsp\)
++**    movq    %rcx, 280\(%rsp\)
++**    movq    %rbx, 288\(%rsp\)
++**    movq    %rsi, 296\(%rsp\)
++**    movq    %rdi, 304\(%rsp\)
+ **...
+ **    movl    \$code\+8, %edi
+-**    movq    %rbp, 304\(%rsp\)
+ **    movq    %r8, 312\(%rsp\)
+ **    movq    %r9, 320\(%rsp\)
+ **    movq    %r10, 328\(%rsp\)
+@@ -116,13 +115,12 @@
+ **    movaps  176\(%rsp\), %xmm11
+ **    movaps  192\(%rsp\), %xmm12
+ **    movaps  208\(%rsp\), %xmm13
+-**    movq    256\(%rsp\), %rax
+-**    movq    264\(%rsp\), %rdx
+-**    movq    272\(%rsp\), %rcx
+-**    movq    280\(%rsp\), %rbx
+-**    movq    288\(%rsp\), %rsi
+-**    movq    296\(%rsp\), %rdi
+-**    movq    304\(%rsp\), %rbp
++**    movq    264\(%rsp\), %rax
++**    movq    272\(%rsp\), %rdx
++**    movq    280\(%rsp\), %rcx
++**    movq    288\(%rsp\), %rbx
++**    movq    296\(%rsp\), %rsi
++**    movq    304\(%rsp\), %rdi
+ **    movq    312\(%rsp\), %r8
+ **    movq    320\(%rsp\), %r9
+ **    movq    328\(%rsp\), %r10
+@@ -132,9 +130,9 @@
+ **    movq    360\(%rsp\), %r14
+ **    movq    368\(%rsp\), %r15
+ **    movq    376\(%rsp\), %r16
++**    movq    384\(%rsp\), %r17
+ **    movaps  224\(%rsp\), %xmm14
+ **    movaps  240\(%rsp\), %xmm15
+-**    movq    384\(%rsp\), %r17
+ **    movq    392\(%rsp\), %r18
+ **    movq    400\(%rsp\), %r19
+ **    movq    408\(%rsp\), %r20
+diff --git a/gcc/testsuite/gcc.target/i386/no-callee-saved-2.c 
b/gcc/testsuite/gcc.target/i386/no-callee-saved-2.c
+index 98e2701d925e..e074ca51df40 100644
+--- a/gcc/testsuite/gcc.target/i386/no-callee-saved-2.c
++++ b/gcc/testsuite/gcc.target/i386/no-callee-saved-2.c
+@@ -26,5 +26,7 @@ foo (void *frame)
+   }
+ }
+ 
+-/* { dg-final { scan-assembler-not "push" } } */
+-/* { dg-final { scan-assembler-not "pop" } } */
++/* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*" 1 } } */
++/* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*" 1 } } */
+diff --git a/gcc/testsuite/gcc.target/i386/no-callee-saved-7.c 
b/gcc/testsuite/gcc.target/i386/no-callee-saved-7.c
+index a1837fdfd4b5..821d1e2a4d42 100644
+--- a/gcc/testsuite/gcc.target/i386/no-callee-saved-7.c
++++ b/gcc/testsuite/gcc.target/i386/no-callee-saved-7.c
+@@ -17,7 +17,7 @@ foo (void)
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)cx" } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)dx" } } */
+-/* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)bp" } } */
+ /* { dg-final { scan-assembler-times "pushl\[\\t \]*%esi" 1 { target ia32 } } 
} */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%rsi" { target { ! ia32 } } 
} } */
+ /* { dg-final { scan-assembler-times "pushl\[\\t \]*%edi" 1 { target ia32 } } 
} */
+@@ -34,7 +34,7 @@ foo (void)
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)cx" } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)dx" } } */
+-/* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)bp" } } */
+ /* { dg-final { scan-assembler-times "popl\[\\t \]*%esi" 1 { target ia32 } } 
} */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%rsi" { target { ! ia32 } } 
} } */
+ /* { dg-final { scan-assembler-times "popl\[\\t \]*%edi" 1 { target ia32 } } 
} */
+diff --git a/gcc/testsuite/gcc.target/i386/no-callee-saved-8.c 
b/gcc/testsuite/gcc.target/i386/no-callee-saved-8.c
+index 90b98a21aef7..ed3d96bdca05 100644
+--- a/gcc/testsuite/gcc.target/i386/no-callee-saved-8.c
++++ b/gcc/testsuite/gcc.target/i386/no-callee-saved-8.c
+@@ -18,7 +18,7 @@ foo (void)
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)cx" } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)dx" } } */
+-/* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)bp" } } */
+ /* { dg-final { scan-assembler-times "pushl\[\\t \]*%esi" 1 { target ia32 } } 
} */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%rsi" { target { ! ia32 } } 
} } */
+ /* { dg-final { scan-assembler-times "pushl\[\\t \]*%edi" 1 { target ia32 } } 
} */
+@@ -35,7 +35,7 @@ foo (void)
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)cx" } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)dx" } } */
+-/* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)bp" } } */
+ /* { dg-final { scan-assembler-times "popl\[\\t \]*%esi" 1 { target ia32 } } 
} */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%rsi" { target { ! ia32 } } 
} } */
+ /* { dg-final { scan-assembler-times "popl\[\\t \]*%edi" 1 { target ia32 } } 
} */
+diff --git a/gcc/testsuite/gcc.target/i386/no-callee-saved-9.c 
b/gcc/testsuite/gcc.target/i386/no-callee-saved-9.c
+index e261100ac1a1..7730c5903d4b 100644
+--- a/gcc/testsuite/gcc.target/i386/no-callee-saved-9.c
++++ b/gcc/testsuite/gcc.target/i386/no-callee-saved-9.c
+@@ -17,7 +17,7 @@ foo (fn_t bar)
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)cx" } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)dx" } } */
+-/* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)bp" } } */
+ /* { dg-final { scan-assembler-times "pushl\[\\t \]*%esi" 1 { target ia32 } } 
} */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%rsi" { target { ! ia32 } } 
} } */
+ /* { dg-final { scan-assembler-times "pushl\[\\t \]*%edi" 1 { target ia32 } } 
} */
+@@ -34,7 +34,7 @@ foo (fn_t bar)
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)cx" } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)dx" } } */
+-/* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)bp" } } */
+ /* { dg-final { scan-assembler-times "popl\[\\t \]*%esi" 1 { target ia32 } } 
} */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%rsi" { target { ! ia32 } } 
} } */
+ /* { dg-final { scan-assembler-times "popl\[\\t \]*%edi" 1 { target ia32 } } 
} */
+diff --git a/gcc/testsuite/gcc.target/i386/pr119784a.c 
b/gcc/testsuite/gcc.target/i386/pr119784a.c
+index 8a119d4cc1f8..a3b7e4aa7cca 100644
+--- a/gcc/testsuite/gcc.target/i386/pr119784a.c
++++ b/gcc/testsuite/gcc.target/i386/pr119784a.c
+@@ -11,14 +11,12 @@
+ **    .cfi_startproc
+ **    subq    \$248, %rsp
+ **...
+-**    movq    %rax, \(%rsp\)
+-**    movq    %rdx, 8\(%rsp\)
+-**    movq    %rcx, 16\(%rsp\)
+-**    movq    %rbx, 24\(%rsp\)
+-**    movq    %rsi, 32\(%rsp\)
+-**    movq    %rdi, 40\(%rsp\)
+-**...
+-**    movq    %rbp, 48\(%rsp\)
++**    movq    %rax, 8\(%rsp\)
++**    movq    %rdx, 16\(%rsp\)
++**    movq    %rcx, 24\(%rsp\)
++**    movq    %rbx, 32\(%rsp\)
++**    movq    %rsi, 40\(%rsp\)
++**    movq    %rdi, 48\(%rsp\)
+ **    movq    %r8, 56\(%rsp\)
+ **    movq    %r9, 64\(%rsp\)
+ **    movq    %r10, 72\(%rsp\)
+@@ -45,13 +43,12 @@
+ **    movq    %r31, 240\(%rsp\)
+ **...
+ **    call    \*code\(%rip\)
+-**    movq    \(%rsp\), %rax
+-**    movq    8\(%rsp\), %rdx
+-**    movq    16\(%rsp\), %rcx
+-**    movq    24\(%rsp\), %rbx
+-**    movq    32\(%rsp\), %rsi
+-**    movq    40\(%rsp\), %rdi
+-**    movq    48\(%rsp\), %rbp
++**    movq    8\(%rsp\), %rax
++**    movq    16\(%rsp\), %rdx
++**    movq    24\(%rsp\), %rcx
++**    movq    32\(%rsp\), %rbx
++**    movq    40\(%rsp\), %rsi
++**    movq    48\(%rsp\), %rdi
+ **    movq    56\(%rsp\), %r8
+ **    movq    64\(%rsp\), %r9
+ **    movq    72\(%rsp\), %r10
+diff --git a/gcc/testsuite/gcc.target/i386/pr120840-1a.c 
b/gcc/testsuite/gcc.target/i386/pr120840-1a.c
+new file mode 100644
+index 000000000000..cc5800311b30
+--- /dev/null
++++ b/gcc/testsuite/gcc.target/i386/pr120840-1a.c
+@@ -0,0 +1,83 @@
++/* { dg-do run } */
++/* { dg-options "-save-temps -O2 -fno-omit-frame-pointer 
-mtune-ctrl=prologue_using_move,epilogue_using_move,use_leave" } */
++
++#ifndef DONT_SAVE_REGS1
++# define DONT_SAVE_REGS1 __attribute__((no_callee_saved_registers))
++#endif
++#ifndef DONT_SAVE_REGS2
++# define DONT_SAVE_REGS2 __attribute__((no_callee_saved_registers))
++#endif
++
++/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
++/* { dg-final { check-function-bodies "**" "" "" { target "*-*-linux*" } 
{^\t?\.}  } } */
++
++/*
++**do_test:
++**.LFB[0-9]+:
++**...
++**    leave
++**...
++**    ret
++**...
++*/
++
++#include <stdlib.h>
++
++DONT_SAVE_REGS1
++__attribute__ ((weak, __optimize__ ("-fomit-frame-pointer")))
++void
++continuation (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6)
++{
++  /* Clobber frame pointer register.  */
++  asm ("xor %%ebp, %%ebp" ::: "ebp");
++
++  if (arg1 != 17)
++    abort ();
++  if (arg2 != 8)
++    abort ();
++  if (arg3 != 20)
++    abort ();
++  if (arg4 != -3)
++    abort ();
++  if (arg5 != -4)
++    abort ();
++  if (arg6 != 26)
++    abort ();
++}
++
++DONT_SAVE_REGS2
++__attribute__ ((weak, __optimize__ ("-fomit-frame-pointer")))
++void
++entry (int arg1, int arg2, int arg3, int arg4, int arg5, int arg6)
++{
++  /* Clobber frame pointer register.  */
++  asm ("xor %%ebp, %%ebp" ::: "ebp");
++
++  if (arg1 != 17)
++    abort ();
++  if (arg2 != 8)
++    abort ();
++  if (arg3 != 20)
++    abort ();
++  if (arg4 != -3)
++    abort ();
++  if (arg5 != -4)
++    abort ();
++  if (arg6 != 26)
++    abort ();
++  continuation (arg1, arg2, arg3, arg4, arg5, arg6);
++}
++
++__attribute__ ((weak))
++void
++do_test (void)
++{
++  entry (17, 8, 20, -3, -4, 26);
++}
++
++int
++main (void)
++{
++  do_test ();
++  return 0;
++}
+diff --git a/gcc/testsuite/gcc.target/i386/pr120840-1b.c 
b/gcc/testsuite/gcc.target/i386/pr120840-1b.c
+new file mode 100644
+index 000000000000..a759e3402b5c
+--- /dev/null
++++ b/gcc/testsuite/gcc.target/i386/pr120840-1b.c
+@@ -0,0 +1,20 @@
++/* { dg-do run } */
++/* { dg-options "-save-temps -O2 -fno-omit-frame-pointer 
-mtune-ctrl=prologue_using_move,epilogue_using_move,use_leave" } */
++
++#define DONT_SAVE_REGS1 __attribute__((preserve_none))
++#define DONT_SAVE_REGS2 __attribute__((no_callee_saved_registers))
++
++/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
++/* { dg-final { check-function-bodies "**" "" "" { target "*-*-linux*" } 
{^\t?\.}  } } */
++
++/*
++**do_test:
++**.LFB[0-9]+:
++**...
++**    leave
++**...
++**    ret
++**...
++*/
++
++#include "pr120840-1a.c"
+diff --git a/gcc/testsuite/gcc.target/i386/pr120840-1c.c 
b/gcc/testsuite/gcc.target/i386/pr120840-1c.c
+new file mode 100644
+index 000000000000..84aa353d705b
+--- /dev/null
++++ b/gcc/testsuite/gcc.target/i386/pr120840-1c.c
+@@ -0,0 +1,20 @@
++/* { dg-do run } */
++/* { dg-options "-save-temps -O2 -fno-omit-frame-pointer 
-mtune-ctrl=prologue_using_move,epilogue_using_move,use_leave" } */
++
++#define DONT_SAVE_REGS1 __attribute__((no_callee_saved_registers))
++#define DONT_SAVE_REGS2 __attribute__((preserve_none))
++
++/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
++/* { dg-final { check-function-bodies "**" "" "" { target "*-*-linux*" } 
{^\t?\.}  } } */
++
++/*
++**do_test:
++**.LFB[0-9]+:
++**...
++**    leave
++**...
++**    ret
++**...
++*/
++
++#include "pr120840-1a.c"
+diff --git a/gcc/testsuite/gcc.target/i386/pr120840-1d.c 
b/gcc/testsuite/gcc.target/i386/pr120840-1d.c
+new file mode 100644
+index 000000000000..a6b38a6aff17
+--- /dev/null
++++ b/gcc/testsuite/gcc.target/i386/pr120840-1d.c
+@@ -0,0 +1,20 @@
++/* { dg-do run } */
++/* { dg-options "-save-temps -O2 -fno-omit-frame-pointer 
-mtune-ctrl=prologue_using_move,epilogue_using_move,use_leave" } */
++
++#define DONT_SAVE_REGS1 __attribute__((preserve_none))
++#define DONT_SAVE_REGS2 __attribute__((preserve_none))
++
++/* Keep labels and directives ('.cfi_startproc', '.cfi_endproc').  */
++/* { dg-final { check-function-bodies "**" "" "" { target "*-*-linux*" } 
{^\t?\.}  } } */
++
++/*
++**do_test:
++**.LFB[0-9]+:
++**...
++**    leave
++**...
++**    ret
++**...
++*/
++
++#include "pr120840-1a.c"
+diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-12.c 
b/gcc/testsuite/gcc.target/i386/preserve-none-12.c
+index 6960f6607972..b2fd0abcd065 100644
+--- a/gcc/testsuite/gcc.target/i386/preserve-none-12.c
++++ b/gcc/testsuite/gcc.target/i386/preserve-none-12.c
+@@ -17,7 +17,7 @@ foo (void)
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)cx" } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)dx" } } */
+-/* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)bp" } } */
+ /* { dg-final { scan-assembler-times "pushl\[\\t \]*%esi" 1 { target ia32 } } 
} */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%rsi" { target { ! ia32 } } 
} } */
+ /* { dg-final { scan-assembler-times "pushl\[\\t \]*%edi" 1 { target ia32 } } 
} */
+@@ -34,7 +34,7 @@ foo (void)
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)cx" } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)dx" } } */
+-/* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)bp" } } */
+ /* { dg-final { scan-assembler-times "popl\[\\t \]*%esi" 1 { target ia32 } } 
} */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%rsi" { target { ! ia32 } } 
} } */
+ /* { dg-final { scan-assembler-times "popl\[\\t \]*%edi" 1 { target ia32 } } 
} */
+diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-13.c 
b/gcc/testsuite/gcc.target/i386/preserve-none-13.c
+index 31b33201e852..d0f309979c64 100644
+--- a/gcc/testsuite/gcc.target/i386/preserve-none-13.c
++++ b/gcc/testsuite/gcc.target/i386/preserve-none-13.c
+@@ -18,7 +18,7 @@ foo (void)
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)cx" } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)dx" } } */
+-/* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)bp" } } */
+ /* { dg-final { scan-assembler-times "pushl\[\\t \]*%esi" 1 { target ia32 } } 
} */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%rsi" { target { ! ia32 } } 
} } */
+ /* { dg-final { scan-assembler-times "pushl\[\\t \]*%edi" 1 { target ia32 } } 
} */
+@@ -35,7 +35,7 @@ foo (void)
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)cx" } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)dx" } } */
+-/* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)bp" } } */
+ /* { dg-final { scan-assembler-times "popl\[\\t \]*%esi" 1 { target ia32 } } 
} */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%rsi" { target { ! ia32 } } 
} } */
+ /* { dg-final { scan-assembler-times "popl\[\\t \]*%edi" 1 { target ia32 } } 
} */
+diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-14.c 
b/gcc/testsuite/gcc.target/i386/preserve-none-14.c
+index 64a957ddf833..ca23b586fa16 100644
+--- a/gcc/testsuite/gcc.target/i386/preserve-none-14.c
++++ b/gcc/testsuite/gcc.target/i386/preserve-none-14.c
+@@ -17,7 +17,7 @@ foo (fn_t bar)
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)cx" } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)dx" } } */
+-/* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)bp" } } */
+ /* { dg-final { scan-assembler-times "pushl\[\\t \]*%esi" 1 { target ia32 } } 
} */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%rsi" { target { ! ia32 } } 
} } */
+ /* { dg-final { scan-assembler-times "pushl\[\\t \]*%edi" 1 { target ia32 } } 
} */
+@@ -34,7 +34,7 @@ foo (fn_t bar)
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)cx" } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)dx" } } */
+-/* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)bp" } } */
+ /* { dg-final { scan-assembler-times "popl\[\\t \]*%esi" 1 { target ia32 } } 
} */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%rsi" { target { ! ia32 } } 
} } */
+ /* { dg-final { scan-assembler-times "popl\[\\t \]*%edi" 1 { target ia32 } } 
} */
+diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-15.c 
b/gcc/testsuite/gcc.target/i386/preserve-none-15.c
+index 8af930bd9141..54527e3a8479 100644
+--- a/gcc/testsuite/gcc.target/i386/preserve-none-15.c
++++ b/gcc/testsuite/gcc.target/i386/preserve-none-15.c
+@@ -18,7 +18,7 @@ foo (void)
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)cx" 1 } } */
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)dx" 1 } } */
+-/* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)bp" } } */
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)si" 1 } } */
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)di" 1 } } */
+ /* { dg-final { scan-assembler-times "pushq\[\\t \]*%r8" 1 { target { ! ia32 
} } } } */
+@@ -33,7 +33,7 @@ foo (void)
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)cx" 1 } } */
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)dx" 1 } } */
+-/* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)bp" } } */
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)si" 1 } } */
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)di" 1 } } */
+ /* { dg-final { scan-assembler-times "popq\[\\t \]*%r8" 1 { target { ! ia32 } 
} } } */
+diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-23.c 
b/gcc/testsuite/gcc.target/i386/preserve-none-23.c
+index 8cc933f8aa8f..8e83879443fa 100644
+--- a/gcc/testsuite/gcc.target/i386/preserve-none-23.c
++++ b/gcc/testsuite/gcc.target/i386/preserve-none-23.c
+@@ -19,7 +19,7 @@ foo (uintptr_t p)
+ /* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)cx" } } */
+ /* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)dx" } } */
+-/* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-not "push(?:l|q)\[\\t \]*%(?:e|r)bp" } } */
+ /* { dg-final { scan-assembler-times "pushl\[\\t \]*%esi" 1 { target ia32 } } 
} */
+ /* { dg-final { scan-assembler-not "pushq\[\\t \]*%rsi" { target { ! ia32 } } 
} } */
+ /* { dg-final { scan-assembler-times "pushl\[\\t \]*%edi" 1 { target ia32 } } 
} */
+@@ -36,7 +36,7 @@ foo (uintptr_t p)
+ /* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bx" 1 } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)cx" } } */
+ /* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)dx" } } */
+-/* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-not "pop(?:l|q)\[\\t \]*%(?:e|r)bp" } } */
+ /* { dg-final { scan-assembler-times "popl\[\\t \]*%esi" 1 { target ia32 } } 
} */
+ /* { dg-final { scan-assembler-not "popq\[\\t \]*%rsi" { target { ! ia32 } } 
} } */
+ /* { dg-final { scan-assembler-times "popl\[\\t \]*%edi" 1 { target ia32 } } 
} */
+diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-6.c 
b/gcc/testsuite/gcc.target/i386/preserve-none-6.c
+index 2606ea3bc198..037f9ecfa036 100644
+--- a/gcc/testsuite/gcc.target/i386/preserve-none-6.c
++++ b/gcc/testsuite/gcc.target/i386/preserve-none-6.c
+@@ -26,5 +26,7 @@ foo (void *frame)
+   }
+ }
+ 
+-/* { dg-final { scan-assembler-not "push" } } */
+-/* { dg-final { scan-assembler-not "pop" } } */
++/* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*" 1 } } */
++/* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*" 1 } } */
+diff --git a/gcc/testsuite/gcc.target/i386/preserve-none-7.c 
b/gcc/testsuite/gcc.target/i386/preserve-none-7.c
+index 79ce761eaf5c..2c80560887c2 100644
+--- a/gcc/testsuite/gcc.target/i386/preserve-none-7.c
++++ b/gcc/testsuite/gcc.target/i386/preserve-none-7.c
+@@ -26,5 +26,7 @@ foo (void *frame)
+   }
+ }
+ 
+-/* { dg-final { scan-assembler-not "push" } } */
+-/* { dg-final { scan-assembler-not "pop" } } */
++/* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*%(?:e|r)bp" 1 } } */
++/* { dg-final { scan-assembler-times "push(?:l|q)\[\\t \]*" 1 } } */
++/* { dg-final { scan-assembler-times "pop(?:l|q)\[\\t \]*" 1 } } */
+
+base-commit: 8dcb922452516ebbf362e7c202b48d8ef547edce
+-- 
+2.50.0
+

diff --git a/16.0.0/gentoo/README.history b/16.0.0/gentoo/README.history
index b3cf833..1a556c2 100644
--- a/16.0.0/gentoo/README.history
+++ b/16.0.0/gentoo/README.history
@@ -1,3 +1,7 @@
+4      ????
+
+       + 85_all_PR120840.patch
+
 3      1 June 2025
 
        + 36_all_no-afdo-testing.patch


Reply via email to