diff mbox series

[i386,libgcc] PR 82196 -mcall-ms2sysv-xlogues emits wrong AVX/SSE MOV

Message ID 20170914040348.6339-1-daniel.santos@pobox.com
State New
Headers show
Series [i386,libgcc] PR 82196 -mcall-ms2sysv-xlogues emits wrong AVX/SSE MOV | expand

Commit Message

Daniel Santos Sept. 14, 2017, 4:03 a.m. UTC
I made a silly mistake in libgcc by testing the cpp macro __AVX__ to
determine rather to use movaps or vmovaps in the stubs.  This resulted
in the stubs choice of instruction being decided by the machine flags
when the compiler was built rather than those being supplied at the
command line.  This patch splits stubs into separate sse and avx
versions so that both are available.

gcc:
	config/i386/i386.c: (xlogue_layout::STUB_NAME_MAX_LEN): Increase to 20
	bytes.
	(xlogue_layout::s_stub_names): Add an additional size-2 diminsion.
	(xlogue_layout::get_stub_name): Modify to select the appropairate sse
	and avx version of the stub.

gcc/testsuite:
	gcc.target/i386/pr82196-1.c: New test.
	gcc.target/i386/pr82196-2.c: Likewise.

libgcc:
	config/i386/i386-asm.h (PASTE2): New macro.
	(ASMNAME): Modify to use PASTE2.
	(MS2SYSV_STUB_PREFIX): New macro for isa prefix.
	(MS2SYSV_STUB_BEGIN, MS2SYSV_STUB_END): New macros for stub headers.
	config/i386/resms64.S: Rename to a header file, use MS2SYSV_STUB_BEGIN
	instead of HIDDEN_FUNC and MS2SYSV_STUB_END instead of FUNC_END.
	config/i386/resms64f.S: Likewise.
	config/i386/resms64fx.S: Likewise.
	config/i386/resms64x.S: Likewise.
	config/i386/savms64.S: Likewise.
	config/i386/savms64f.S: Likewise.
	config/i386/avx_resms64.S: New file that only defines a macro and
	includes it's corresponding header file.
	config/i386/avx_resms64f.S: Likewise.
	config/i386/avx_resms64fx.S: Likewise.
	config/i386/avx_resms64x.S: Likewise.
	config/i386/avx_savms64.S: Likewise.
	config/i386/avx_savms64f.S: Likewise.
	config/i386/sse_resms64.S: Likewise.
	config/i386/sse_resms64f.S: Likewise.
	config/i386/sse_resms64fx.S: Likewise.
	config/i386/sse_resms64x.S: Likewise.
	config/i386/sse_savms64.S: Likewise.
	config/i386/sse_savms64f.S: Likewise.
	config/i386/t-msabi: Modified to add avx and sse versions of stubs.
Signed-off-by: Daniel Santos <daniel.santos@pobox.com>
---
 gcc/config/i386/i386.c                          | 15 ++++++-----
 gcc/testsuite/gcc.target/i386/pr82196-1.c       | 14 ++++++++++
 gcc/testsuite/gcc.target/i386/pr82196-2.c       | 14 ++++++++++
 libgcc/config/i386/avx_resms64.S                |  2 ++
 libgcc/config/i386/avx_resms64f.S               |  2 ++
 libgcc/config/i386/avx_resms64fx.S              |  2 ++
 libgcc/config/i386/avx_resms64x.S               |  2 ++
 libgcc/config/i386/avx_savms64.S                |  2 ++
 libgcc/config/i386/avx_savms64f.S               |  2 ++
 libgcc/config/i386/i386-asm.h                   | 34 ++++++++++++++++---------
 libgcc/config/i386/{resms64.S => resms64.h}     | 28 ++++++++++----------
 libgcc/config/i386/{resms64f.S => resms64f.h}   | 24 ++++++++---------
 libgcc/config/i386/{resms64fx.S => resms64fx.h} | 24 ++++++++---------
 libgcc/config/i386/{resms64x.S => resms64x.h}   | 28 ++++++++++----------
 libgcc/config/i386/{savms64.S => savms64.h}     | 28 ++++++++++----------
 libgcc/config/i386/{savms64f.S => savms64f.h}   | 24 ++++++++---------
 libgcc/config/i386/sse_resms64.S                |  2 ++
 libgcc/config/i386/sse_resms64f.S               |  2 ++
 libgcc/config/i386/sse_resms64fx.S              |  2 ++
 libgcc/config/i386/sse_resms64x.S               |  2 ++
 libgcc/config/i386/sse_savms64.S                |  2 ++
 libgcc/config/i386/sse_savms64f.S               |  2 ++
 libgcc/config/i386/t-msabi                      | 18 ++++++++-----
 23 files changed, 173 insertions(+), 102 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/i386/pr82196-1.c
 create mode 100644 gcc/testsuite/gcc.target/i386/pr82196-2.c
 create mode 100644 libgcc/config/i386/avx_resms64.S
 create mode 100644 libgcc/config/i386/avx_resms64f.S
 create mode 100644 libgcc/config/i386/avx_resms64fx.S
 create mode 100644 libgcc/config/i386/avx_resms64x.S
 create mode 100644 libgcc/config/i386/avx_savms64.S
 create mode 100644 libgcc/config/i386/avx_savms64f.S
 rename libgcc/config/i386/{resms64.S => resms64.h} (76%)
 rename libgcc/config/i386/{resms64f.S => resms64f.h} (79%)
 rename libgcc/config/i386/{resms64fx.S => resms64fx.h} (79%)
 rename libgcc/config/i386/{resms64x.S => resms64x.h} (77%)
 rename libgcc/config/i386/{savms64.S => savms64.h} (76%)
 rename libgcc/config/i386/{savms64f.S => savms64f.h} (79%)
 create mode 100644 libgcc/config/i386/sse_resms64.S
 create mode 100644 libgcc/config/i386/sse_resms64f.S
 create mode 100644 libgcc/config/i386/sse_resms64fx.S
 create mode 100644 libgcc/config/i386/sse_resms64x.S
 create mode 100644 libgcc/config/i386/sse_savms64.S
 create mode 100644 libgcc/config/i386/sse_savms64f.S

Comments

Uros Bizjak Sept. 17, 2017, 3:53 p.m. UTC | #1
On Thu, Sep 14, 2017 at 6:03 AM, Daniel Santos <daniel.santos@pobox.com> wrote:
> I made a silly mistake in libgcc by testing the cpp macro __AVX__ to
> determine rather to use movaps or vmovaps in the stubs.  This resulted
> in the stubs choice of instruction being decided by the machine flags
> when the compiler was built rather than those being supplied at the
> command line.  This patch splits stubs into separate sse and avx
> versions so that both are available.
>
> gcc:
>         config/i386/i386.c: (xlogue_layout::STUB_NAME_MAX_LEN): Increase to 20
>         bytes.
>         (xlogue_layout::s_stub_names): Add an additional size-2 diminsion.
>         (xlogue_layout::get_stub_name): Modify to select the appropairate sse
>         and avx version of the stub.
>
> gcc/testsuite:
>         gcc.target/i386/pr82196-1.c: New test.
>         gcc.target/i386/pr82196-2.c: Likewise.
>
> libgcc:
>         config/i386/i386-asm.h (PASTE2): New macro.
>         (ASMNAME): Modify to use PASTE2.
>         (MS2SYSV_STUB_PREFIX): New macro for isa prefix.
>         (MS2SYSV_STUB_BEGIN, MS2SYSV_STUB_END): New macros for stub headers.
>         config/i386/resms64.S: Rename to a header file, use MS2SYSV_STUB_BEGIN
>         instead of HIDDEN_FUNC and MS2SYSV_STUB_END instead of FUNC_END.
>         config/i386/resms64f.S: Likewise.
>         config/i386/resms64fx.S: Likewise.
>         config/i386/resms64x.S: Likewise.
>         config/i386/savms64.S: Likewise.
>         config/i386/savms64f.S: Likewise.
>         config/i386/avx_resms64.S: New file that only defines a macro and
>         includes it's corresponding header file.
>         config/i386/avx_resms64f.S: Likewise.
>         config/i386/avx_resms64fx.S: Likewise.
>         config/i386/avx_resms64x.S: Likewise.
>         config/i386/avx_savms64.S: Likewise.
>         config/i386/avx_savms64f.S: Likewise.
>         config/i386/sse_resms64.S: Likewise.
>         config/i386/sse_resms64f.S: Likewise.
>         config/i386/sse_resms64fx.S: Likewise.
>         config/i386/sse_resms64x.S: Likewise.
>         config/i386/sse_savms64.S: Likewise.
>         config/i386/sse_savms64f.S: Likewise.
>         config/i386/t-msabi: Modified to add avx and sse versions of stubs.

OK.

Thanks,
Uros.

> Signed-off-by: Daniel Santos <daniel.santos@pobox.com>
> ---
>  gcc/config/i386/i386.c                          | 15 ++++++-----
>  gcc/testsuite/gcc.target/i386/pr82196-1.c       | 14 ++++++++++
>  gcc/testsuite/gcc.target/i386/pr82196-2.c       | 14 ++++++++++
>  libgcc/config/i386/avx_resms64.S                |  2 ++
>  libgcc/config/i386/avx_resms64f.S               |  2 ++
>  libgcc/config/i386/avx_resms64fx.S              |  2 ++
>  libgcc/config/i386/avx_resms64x.S               |  2 ++
>  libgcc/config/i386/avx_savms64.S                |  2 ++
>  libgcc/config/i386/avx_savms64f.S               |  2 ++
>  libgcc/config/i386/i386-asm.h                   | 34 ++++++++++++++++---------
>  libgcc/config/i386/{resms64.S => resms64.h}     | 28 ++++++++++----------
>  libgcc/config/i386/{resms64f.S => resms64f.h}   | 24 ++++++++---------
>  libgcc/config/i386/{resms64fx.S => resms64fx.h} | 24 ++++++++---------
>  libgcc/config/i386/{resms64x.S => resms64x.h}   | 28 ++++++++++----------
>  libgcc/config/i386/{savms64.S => savms64.h}     | 28 ++++++++++----------
>  libgcc/config/i386/{savms64f.S => savms64f.h}   | 24 ++++++++---------
>  libgcc/config/i386/sse_resms64.S                |  2 ++
>  libgcc/config/i386/sse_resms64f.S               |  2 ++
>  libgcc/config/i386/sse_resms64fx.S              |  2 ++
>  libgcc/config/i386/sse_resms64x.S               |  2 ++
>  libgcc/config/i386/sse_savms64.S                |  2 ++
>  libgcc/config/i386/sse_savms64f.S               |  2 ++
>  libgcc/config/i386/t-msabi                      | 18 ++++++++-----
>  23 files changed, 173 insertions(+), 102 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr82196-1.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr82196-2.c
>  create mode 100644 libgcc/config/i386/avx_resms64.S
>  create mode 100644 libgcc/config/i386/avx_resms64f.S
>  create mode 100644 libgcc/config/i386/avx_resms64fx.S
>  create mode 100644 libgcc/config/i386/avx_resms64x.S
>  create mode 100644 libgcc/config/i386/avx_savms64.S
>  create mode 100644 libgcc/config/i386/avx_savms64f.S
>  rename libgcc/config/i386/{resms64.S => resms64.h} (76%)
>  rename libgcc/config/i386/{resms64f.S => resms64f.h} (79%)
>  rename libgcc/config/i386/{resms64fx.S => resms64fx.h} (79%)
>  rename libgcc/config/i386/{resms64x.S => resms64x.h} (77%)
>  rename libgcc/config/i386/{savms64.S => savms64.h} (76%)
>  rename libgcc/config/i386/{savms64f.S => savms64f.h} (79%)
>  create mode 100644 libgcc/config/i386/sse_resms64.S
>  create mode 100644 libgcc/config/i386/sse_resms64f.S
>  create mode 100644 libgcc/config/i386/sse_resms64fx.S
>  create mode 100644 libgcc/config/i386/sse_resms64x.S
>  create mode 100644 libgcc/config/i386/sse_savms64.S
>  create mode 100644 libgcc/config/i386/sse_savms64f.S
>
> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
> index b2b02acc58a..f0d7d0eb196 100644
> --- a/gcc/config/i386/i386.c
> +++ b/gcc/config/i386/i386.c
> @@ -2513,7 +2513,7 @@ public:
>    static const unsigned MAX_REGS = 18;
>    static const unsigned MAX_EXTRA_REGS = MAX_REGS - MIN_REGS;
>    static const unsigned VARIANT_COUNT = MAX_EXTRA_REGS + 1;
> -  static const unsigned STUB_NAME_MAX_LEN = 16;
> +  static const unsigned STUB_NAME_MAX_LEN = 20;
>    static const char * const STUB_BASE_NAMES[XLOGUE_STUB_COUNT];
>    static const unsigned REG_ORDER[MAX_REGS];
>    static const unsigned REG_ORDER_REALIGN[MAX_REGS];
> @@ -2536,7 +2536,7 @@ private:
>    struct reginfo m_regs[MAX_REGS];
>
>    /* Lazy-inited cache of symbol names for stubs.  */
> -  static char s_stub_names[XLOGUE_STUB_COUNT][VARIANT_COUNT]
> +  static char s_stub_names[2][XLOGUE_STUB_COUNT][VARIANT_COUNT]
>                           [STUB_NAME_MAX_LEN];
>
>    static const xlogue_layout s_instances[XLOGUE_SET_COUNT];
> @@ -2588,7 +2588,7 @@ const unsigned xlogue_layout::VARIANT_COUNT;
>  const unsigned xlogue_layout::STUB_NAME_MAX_LEN;
>
>  /* Initialize xlogue_layout::s_stub_names to zero.  */
> -char xlogue_layout::s_stub_names[XLOGUE_STUB_COUNT][VARIANT_COUNT]
> +char xlogue_layout::s_stub_names[2][XLOGUE_STUB_COUNT][VARIANT_COUNT]
>                                 [STUB_NAME_MAX_LEN];
>
>  /* Instantiates all xlogue_layout instances.  */
> @@ -2692,13 +2692,16 @@ const char *
>  xlogue_layout::get_stub_name (enum xlogue_stub stub,
>                               unsigned n_extra_regs)
>  {
> -  char *name = s_stub_names[stub][n_extra_regs];
> +  const int have_avx = TARGET_AVX;
> +  char *name = s_stub_names[!!have_avx][stub][n_extra_regs];
>
>    /* Lazy init */
>    if (!*name)
>      {
> -      int res = snprintf (name, STUB_NAME_MAX_LEN, "__%s_%u",
> -                         STUB_BASE_NAMES[stub], MIN_REGS + n_extra_regs);
> +      int res = snprintf (name, STUB_NAME_MAX_LEN, "__%s_%s_%u",
> +                         (have_avx ? "avx" : "sse"),
> +                         STUB_BASE_NAMES[stub],
> +                         MIN_REGS + n_extra_regs);
>        gcc_checking_assert (res < (int)STUB_NAME_MAX_LEN);
>      }
>
> diff --git a/gcc/testsuite/gcc.target/i386/pr82196-1.c b/gcc/testsuite/gcc.target/i386/pr82196-1.c
> new file mode 100644
> index 00000000000..fa573dc6b66
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr82196-1.c
> @@ -0,0 +1,14 @@
> +/* { dg-do compile } */
> +/* { dg-options "-msse -mcall-ms2sysv-xlogues -O2" } */
> +/* { dg-final { scan-assembler "call.*__sse_savms64_18" } } */
> +/* { dg-final { scan-assembler "jmp.*__sse_resms64x_18" } } */
> +
> +void __attribute__((sysv_abi)) a() {
> +}
> +
> +static void __attribute__((sysv_abi)) (*volatile a_noinfo)() = a;
> +
> +void __attribute__((ms_abi)) b() {
> +  __asm__ __volatile__ ("" :::"rbx", "rbp", "r12", "r13", "r14", "r15");
> +  a_noinfo ();
> +}
> diff --git a/gcc/testsuite/gcc.target/i386/pr82196-2.c b/gcc/testsuite/gcc.target/i386/pr82196-2.c
> new file mode 100644
> index 00000000000..31705bee29b
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr82196-2.c
> @@ -0,0 +1,14 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mavx -mcall-ms2sysv-xlogues -O2" } */
> +/* { dg-final { scan-assembler "call.*__avx_savms64_18" } } */
> +/* { dg-final { scan-assembler "jmp.*__avx_resms64x_18" } } */
> +
> +void __attribute__((sysv_abi)) a() {
> +}
> +
> +static void __attribute__((sysv_abi)) (*volatile a_noinfo)() = a;
> +
> +void __attribute__((ms_abi)) b() {
> +  __asm__ __volatile__ ("" :::"rbx", "rbp", "r12", "r13", "r14", "r15");
> +  a_noinfo ();
> +}
> diff --git a/libgcc/config/i386/avx_resms64.S b/libgcc/config/i386/avx_resms64.S
> new file mode 100644
> index 00000000000..2be744937cf
> --- /dev/null
> +++ b/libgcc/config/i386/avx_resms64.S
> @@ -0,0 +1,2 @@
> +#define MS2SYSV_STUB_AVX
> +#include "resms64.h"
> diff --git a/libgcc/config/i386/avx_resms64f.S b/libgcc/config/i386/avx_resms64f.S
> new file mode 100644
> index 00000000000..76a1340ab1f
> --- /dev/null
> +++ b/libgcc/config/i386/avx_resms64f.S
> @@ -0,0 +1,2 @@
> +#define MS2SYSV_STUB_AVX
> +#include "resms64f.h"
> diff --git a/libgcc/config/i386/avx_resms64fx.S b/libgcc/config/i386/avx_resms64fx.S
> new file mode 100644
> index 00000000000..2ea4738af7e
> --- /dev/null
> +++ b/libgcc/config/i386/avx_resms64fx.S
> @@ -0,0 +1,2 @@
> +#define MS2SYSV_STUB_AVX
> +#include "resms64fx.h"
> diff --git a/libgcc/config/i386/avx_resms64x.S b/libgcc/config/i386/avx_resms64x.S
> new file mode 100644
> index 00000000000..14a53d4fcf9
> --- /dev/null
> +++ b/libgcc/config/i386/avx_resms64x.S
> @@ -0,0 +1,2 @@
> +#define MS2SYSV_STUB_AVX
> +#include "resms64x.h"
> diff --git a/libgcc/config/i386/avx_savms64.S b/libgcc/config/i386/avx_savms64.S
> new file mode 100644
> index 00000000000..fed1620b968
> --- /dev/null
> +++ b/libgcc/config/i386/avx_savms64.S
> @@ -0,0 +1,2 @@
> +#define MS2SYSV_STUB_AVX
> +#include "savms64.h"
> diff --git a/libgcc/config/i386/avx_savms64f.S b/libgcc/config/i386/avx_savms64f.S
> new file mode 100644
> index 00000000000..32279657e30
> --- /dev/null
> +++ b/libgcc/config/i386/avx_savms64f.S
> @@ -0,0 +1,2 @@
> +#define MS2SYSV_STUB_AVX
> +#include "savms64f.h"
> diff --git a/libgcc/config/i386/i386-asm.h b/libgcc/config/i386/i386-asm.h
> index 1387fd24b4f..424e0f72aac 100644
> --- a/libgcc/config/i386/i386-asm.h
> +++ b/libgcc/config/i386/i386-asm.h
> @@ -28,6 +28,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
>
>  #include "auto-host.h"
>
> +#define PASTE2(a, b) PASTE2a(a, b)
> +#define PASTE2a(a, b) a ## b
> +
>  /* These macros currently support GNU/Linux, Solaris and Darwin.  */
>
>  #ifdef __ELF__
> @@ -46,9 +49,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
>  #endif
>
>  #ifdef __USER_LABEL_PREFIX__
> -# define ASMNAME2(prefix, name)        prefix ## name
> -# define ASMNAME1(prefix, name)        ASMNAME2(prefix, name)
> -# define ASMNAME(name)         ASMNAME1(__USER_LABEL_PREFIX__, name)
> +# define ASMNAME(name)         PASTE2(__USER_LABEL_PREFIX__, name)
>  #else
>  # define ASMNAME(name)         name
>  #endif
> @@ -66,15 +67,24 @@ ASMNAME(fn):
>
>  #define FUNC_END(fn) FN_SIZE(ASMNAME(fn))
>
> -#ifdef __SSE2__
> -# ifdef __AVX__
> -#  define MOVAPS vmovaps
> -# else
> -#  define MOVAPS movaps
> -# endif
> +#ifdef MS2SYSV_STUB_AVX
> +# define MS2SYSV_STUB_PREFIX __avx_
> +# define MOVAPS vmovaps
> +#elif defined(MS2SYSV_STUB_SSE)
> +# define MS2SYSV_STUB_PREFIX __sse_
> +# define MOVAPS movaps
> +#endif
> +
> +#if defined (MS2SYSV_STUB_PREFIX) && defined (MOVAPS)
> +
> +# define MS2SYSV_STUB_BEGIN(base_name) \
> +       HIDDEN_FUNC(PASTE2(MS2SYSV_STUB_PREFIX, base_name))
> +
> +# define MS2SYSV_STUB_END(base_name) \
> +       FUNC_END(PASTE2(MS2SYSV_STUB_PREFIX, base_name))
>
>  /* Save SSE registers 6-15. off is the offset of rax to get to xmm6.  */
> -#define SSE_SAVE                  \
> +# define SSE_SAVE                 \
>         MOVAPS %xmm15,-0x30(%rax); \
>         MOVAPS %xmm14,-0x20(%rax); \
>         MOVAPS %xmm13,-0x10(%rax); \
> @@ -87,7 +97,7 @@ ASMNAME(fn):
>         MOVAPS %xmm6,  0x60(%rax)
>
>  /* Restore SSE registers 6-15. off is the offset of rsi to get to xmm6.  */
> -#define SSE_RESTORE                \
> +# define SSE_RESTORE               \
>         MOVAPS -0x30(%rsi), %xmm15; \
>         MOVAPS -0x20(%rsi), %xmm14; \
>         MOVAPS -0x10(%rsi), %xmm13; \
> @@ -99,5 +109,5 @@ ASMNAME(fn):
>         MOVAPS  0x50(%rsi), %xmm7 ; \
>         MOVAPS  0x60(%rsi), %xmm6
>
> -#endif /* __SSE2__ */
> +#endif /* defined (MS2SYSV_STUB_ISA) && defined (MOVAPS) */
>  #endif /* I386_ASM_H */
> diff --git a/libgcc/config/i386/resms64.S b/libgcc/config/i386/resms64.h
> similarity index 76%
> rename from libgcc/config/i386/resms64.S
> rename to libgcc/config/i386/resms64.h
> index f842c20a77a..f01b41897bc 100644
> --- a/libgcc/config/i386/resms64.S
> +++ b/libgcc/config/i386/resms64.h
> @@ -29,29 +29,29 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
>  /* Epilogue routine for restoring 64-bit ms/sysv registers.  */
>
>         .text
> -HIDDEN_FUNC(__resms64_18)
> +MS2SYSV_STUB_BEGIN(resms64_18)
>         mov     -0x70(%rsi),%r15
> -HIDDEN_FUNC(__resms64_17)
> +MS2SYSV_STUB_BEGIN(resms64_17)
>         mov     -0x68(%rsi),%r14
> -HIDDEN_FUNC(__resms64_16)
> +MS2SYSV_STUB_BEGIN(resms64_16)
>         mov     -0x60(%rsi),%r13
> -HIDDEN_FUNC(__resms64_15)
> +MS2SYSV_STUB_BEGIN(resms64_15)
>         mov     -0x58(%rsi),%r12
> -HIDDEN_FUNC(__resms64_14)
> +MS2SYSV_STUB_BEGIN(resms64_14)
>         mov     -0x50(%rsi),%rbp
> -HIDDEN_FUNC(__resms64_13)
> +MS2SYSV_STUB_BEGIN(resms64_13)
>         mov     -0x48(%rsi),%rbx
> -HIDDEN_FUNC(__resms64_12)
> +MS2SYSV_STUB_BEGIN(resms64_12)
>         mov     -0x40(%rsi),%rdi
>         SSE_RESTORE
>         mov     -0x38(%rsi),%rsi
>         ret
> -FUNC_END(__resms64_12)
> -FUNC_END(__resms64_13)
> -FUNC_END(__resms64_14)
> -FUNC_END(__resms64_15)
> -FUNC_END(__resms64_16)
> -FUNC_END(__resms64_17)
> -FUNC_END(__resms64_18)
> +MS2SYSV_STUB_END(resms64_12)
> +MS2SYSV_STUB_END(resms64_13)
> +MS2SYSV_STUB_END(resms64_14)
> +MS2SYSV_STUB_END(resms64_15)
> +MS2SYSV_STUB_END(resms64_16)
> +MS2SYSV_STUB_END(resms64_17)
> +MS2SYSV_STUB_END(resms64_18)
>
>  #endif /* __x86_64__ */
> diff --git a/libgcc/config/i386/resms64f.S b/libgcc/config/i386/resms64f.h
> similarity index 79%
> rename from libgcc/config/i386/resms64f.S
> rename to libgcc/config/i386/resms64f.h
> index 81946cda944..743ec514cef 100644
> --- a/libgcc/config/i386/resms64f.S
> +++ b/libgcc/config/i386/resms64f.h
> @@ -30,26 +30,26 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
>     pointer is used.  */
>
>         .text
> -HIDDEN_FUNC(__resms64f_17)
> +MS2SYSV_STUB_BEGIN(resms64f_17)
>         mov     -0x68(%rsi),%r15
> -HIDDEN_FUNC(__resms64f_16)
> +MS2SYSV_STUB_BEGIN(resms64f_16)
>         mov     -0x60(%rsi),%r14
> -HIDDEN_FUNC(__resms64f_15)
> +MS2SYSV_STUB_BEGIN(resms64f_15)
>         mov     -0x58(%rsi),%r13
> -HIDDEN_FUNC(__resms64f_14)
> +MS2SYSV_STUB_BEGIN(resms64f_14)
>         mov     -0x50(%rsi),%r12
> -HIDDEN_FUNC(__resms64f_13)
> +MS2SYSV_STUB_BEGIN(resms64f_13)
>         mov     -0x48(%rsi),%rbx
> -HIDDEN_FUNC(__resms64f_12)
> +MS2SYSV_STUB_BEGIN(resms64f_12)
>         mov     -0x40(%rsi),%rdi
>         SSE_RESTORE
>         mov     -0x38(%rsi),%rsi
>         ret
> -FUNC_END(__resms64f_12)
> -FUNC_END(__resms64f_13)
> -FUNC_END(__resms64f_14)
> -FUNC_END(__resms64f_15)
> -FUNC_END(__resms64f_16)
> -FUNC_END(__resms64f_17)
> +MS2SYSV_STUB_END(resms64f_12)
> +MS2SYSV_STUB_END(resms64f_13)
> +MS2SYSV_STUB_END(resms64f_14)
> +MS2SYSV_STUB_END(resms64f_15)
> +MS2SYSV_STUB_END(resms64f_16)
> +MS2SYSV_STUB_END(resms64f_17)
>
>  #endif /* __x86_64__ */
> diff --git a/libgcc/config/i386/resms64fx.S b/libgcc/config/i386/resms64fx.h
> similarity index 79%
> rename from libgcc/config/i386/resms64fx.S
> rename to libgcc/config/i386/resms64fx.h
> index acf34fa0837..965807a1299 100644
> --- a/libgcc/config/i386/resms64fx.S
> +++ b/libgcc/config/i386/resms64fx.h
> @@ -31,27 +31,27 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
>   * from the function.  */
>
>         .text
> -HIDDEN_FUNC(__resms64fx_17)
> +MS2SYSV_STUB_BEGIN(resms64fx_17)
>         mov     -0x68(%rsi),%r15
> -HIDDEN_FUNC(__resms64fx_16)
> +MS2SYSV_STUB_BEGIN(resms64fx_16)
>         mov     -0x60(%rsi),%r14
> -HIDDEN_FUNC(__resms64fx_15)
> +MS2SYSV_STUB_BEGIN(resms64fx_15)
>         mov     -0x58(%rsi),%r13
> -HIDDEN_FUNC(__resms64fx_14)
> +MS2SYSV_STUB_BEGIN(resms64fx_14)
>         mov     -0x50(%rsi),%r12
> -HIDDEN_FUNC(__resms64fx_13)
> +MS2SYSV_STUB_BEGIN(resms64fx_13)
>         mov     -0x48(%rsi),%rbx
> -HIDDEN_FUNC(__resms64fx_12)
> +MS2SYSV_STUB_BEGIN(resms64fx_12)
>         mov     -0x40(%rsi),%rdi
>         SSE_RESTORE
>         mov     -0x38(%rsi),%rsi
>         leaveq
>         ret
> -FUNC_END(__resms64fx_12)
> -FUNC_END(__resms64fx_13)
> -FUNC_END(__resms64fx_14)
> -FUNC_END(__resms64fx_15)
> -FUNC_END(__resms64fx_16)
> -FUNC_END(__resms64fx_17)
> +MS2SYSV_STUB_END(resms64fx_12)
> +MS2SYSV_STUB_END(resms64fx_13)
> +MS2SYSV_STUB_END(resms64fx_14)
> +MS2SYSV_STUB_END(resms64fx_15)
> +MS2SYSV_STUB_END(resms64fx_16)
> +MS2SYSV_STUB_END(resms64fx_17)
>
>  #endif /* __x86_64__ */
> diff --git a/libgcc/config/i386/resms64x.S b/libgcc/config/i386/resms64x.h
> similarity index 77%
> rename from libgcc/config/i386/resms64x.S
> rename to libgcc/config/i386/resms64x.h
> index e27aab7d881..689a1dec20b 100644
> --- a/libgcc/config/i386/resms64x.S
> +++ b/libgcc/config/i386/resms64x.h
> @@ -30,30 +30,30 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
>   * function.  */
>
>         .text
> -HIDDEN_FUNC(__resms64x_18)
> +MS2SYSV_STUB_BEGIN(resms64x_18)
>         mov     -0x70(%rsi),%r15
> -HIDDEN_FUNC(__resms64x_17)
> +MS2SYSV_STUB_BEGIN(resms64x_17)
>         mov     -0x68(%rsi),%r14
> -HIDDEN_FUNC(__resms64x_16)
> +MS2SYSV_STUB_BEGIN(resms64x_16)
>         mov     -0x60(%rsi),%r13
> -HIDDEN_FUNC(__resms64x_15)
> +MS2SYSV_STUB_BEGIN(resms64x_15)
>         mov     -0x58(%rsi),%r12
> -HIDDEN_FUNC(__resms64x_14)
> +MS2SYSV_STUB_BEGIN(resms64x_14)
>         mov     -0x50(%rsi),%rbp
> -HIDDEN_FUNC(__resms64x_13)
> +MS2SYSV_STUB_BEGIN(resms64x_13)
>         mov     -0x48(%rsi),%rbx
> -HIDDEN_FUNC(__resms64x_12)
> +MS2SYSV_STUB_BEGIN(resms64x_12)
>         mov     -0x40(%rsi),%rdi
>         SSE_RESTORE
>         mov     -0x38(%rsi),%rsi
>         mov     %r10,%rsp
>         ret
> -FUNC_END(__resms64x_12)
> -FUNC_END(__resms64x_13)
> -FUNC_END(__resms64x_14)
> -FUNC_END(__resms64x_15)
> -FUNC_END(__resms64x_16)
> -FUNC_END(__resms64x_17)
> -FUNC_END(__resms64x_18)
> +MS2SYSV_STUB_END(resms64x_12)
> +MS2SYSV_STUB_END(resms64x_13)
> +MS2SYSV_STUB_END(resms64x_14)
> +MS2SYSV_STUB_END(resms64x_15)
> +MS2SYSV_STUB_END(resms64x_16)
> +MS2SYSV_STUB_END(resms64x_17)
> +MS2SYSV_STUB_END(resms64x_18)
>
>  #endif /* __x86_64__ */
> diff --git a/libgcc/config/i386/savms64.S b/libgcc/config/i386/savms64.h
> similarity index 76%
> rename from libgcc/config/i386/savms64.S
> rename to libgcc/config/i386/savms64.h
> index 44dda46ec54..28d5e3548ab 100644
> --- a/libgcc/config/i386/savms64.S
> +++ b/libgcc/config/i386/savms64.h
> @@ -29,29 +29,29 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
>  /* Prologue routine for saving 64-bit ms/sysv registers.  */
>
>         .text
> -HIDDEN_FUNC(__savms64_18)
> +MS2SYSV_STUB_BEGIN(savms64_18)
>         mov     %r15,-0x70(%rax)
> -HIDDEN_FUNC(__savms64_17)
> +MS2SYSV_STUB_BEGIN(savms64_17)
>         mov     %r14,-0x68(%rax)
> -HIDDEN_FUNC(__savms64_16)
> +MS2SYSV_STUB_BEGIN(savms64_16)
>         mov     %r13,-0x60(%rax)
> -HIDDEN_FUNC(__savms64_15)
> +MS2SYSV_STUB_BEGIN(savms64_15)
>         mov     %r12,-0x58(%rax)
> -HIDDEN_FUNC(__savms64_14)
> +MS2SYSV_STUB_BEGIN(savms64_14)
>         mov     %rbp,-0x50(%rax)
> -HIDDEN_FUNC(__savms64_13)
> +MS2SYSV_STUB_BEGIN(savms64_13)
>         mov     %rbx,-0x48(%rax)
> -HIDDEN_FUNC(__savms64_12)
> +MS2SYSV_STUB_BEGIN(savms64_12)
>         mov     %rdi,-0x40(%rax)
>         mov     %rsi,-0x38(%rax)
>         SSE_SAVE
>         ret
> -FUNC_END(__savms64_12)
> -FUNC_END(__savms64_13)
> -FUNC_END(__savms64_14)
> -FUNC_END(__savms64_15)
> -FUNC_END(__savms64_16)
> -FUNC_END(__savms64_17)
> -FUNC_END(__savms64_18)
> +MS2SYSV_STUB_END(savms64_12)
> +MS2SYSV_STUB_END(savms64_13)
> +MS2SYSV_STUB_END(savms64_14)
> +MS2SYSV_STUB_END(savms64_15)
> +MS2SYSV_STUB_END(savms64_16)
> +MS2SYSV_STUB_END(savms64_17)
> +MS2SYSV_STUB_END(savms64_18)
>
>  #endif /* __x86_64__ */
> diff --git a/libgcc/config/i386/savms64f.S b/libgcc/config/i386/savms64f.h
> similarity index 79%
> rename from libgcc/config/i386/savms64f.S
> rename to libgcc/config/i386/savms64f.h
> index 64e91ac0394..723e1080f5c 100644
> --- a/libgcc/config/i386/savms64f.S
> +++ b/libgcc/config/i386/savms64f.h
> @@ -30,26 +30,26 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
>   * needed or hard frame pointer used.  */
>
>         .text
> -HIDDEN_FUNC(__savms64f_17)
> +MS2SYSV_STUB_BEGIN(savms64f_17)
>         mov     %r15,-0x68(%rax)
> -HIDDEN_FUNC(__savms64f_16)
> +MS2SYSV_STUB_BEGIN(savms64f_16)
>         mov     %r14,-0x60(%rax)
> -HIDDEN_FUNC(__savms64f_15)
> +MS2SYSV_STUB_BEGIN(savms64f_15)
>         mov     %r13,-0x58(%rax)
> -HIDDEN_FUNC(__savms64f_14)
> +MS2SYSV_STUB_BEGIN(savms64f_14)
>         mov     %r12,-0x50(%rax)
> -HIDDEN_FUNC(__savms64f_13)
> +MS2SYSV_STUB_BEGIN(savms64f_13)
>         mov     %rbx,-0x48(%rax)
> -HIDDEN_FUNC(__savms64f_12)
> +MS2SYSV_STUB_BEGIN(savms64f_12)
>         mov     %rdi,-0x40(%rax)
>         mov     %rsi,-0x38(%rax)
>         SSE_SAVE
>         ret
> -FUNC_END(__savms64f_12)
> -FUNC_END(__savms64f_13)
> -FUNC_END(__savms64f_14)
> -FUNC_END(__savms64f_15)
> -FUNC_END(__savms64f_16)
> -FUNC_END(__savms64f_17)
> +MS2SYSV_STUB_END(savms64f_12)
> +MS2SYSV_STUB_END(savms64f_13)
> +MS2SYSV_STUB_END(savms64f_14)
> +MS2SYSV_STUB_END(savms64f_15)
> +MS2SYSV_STUB_END(savms64f_16)
> +MS2SYSV_STUB_END(savms64f_17)
>
>  #endif /* __x86_64__ */
> diff --git a/libgcc/config/i386/sse_resms64.S b/libgcc/config/i386/sse_resms64.S
> new file mode 100644
> index 00000000000..c87f5cc021d
> --- /dev/null
> +++ b/libgcc/config/i386/sse_resms64.S
> @@ -0,0 +1,2 @@
> +#define MS2SYSV_STUB_SSE
> +#include "resms64.h"
> diff --git a/libgcc/config/i386/sse_resms64f.S b/libgcc/config/i386/sse_resms64f.S
> new file mode 100644
> index 00000000000..3a066bc174a
> --- /dev/null
> +++ b/libgcc/config/i386/sse_resms64f.S
> @@ -0,0 +1,2 @@
> +#define MS2SYSV_STUB_SSE
> +#include "resms64f.h"
> diff --git a/libgcc/config/i386/sse_resms64fx.S b/libgcc/config/i386/sse_resms64fx.S
> new file mode 100644
> index 00000000000..142667a28bf
> --- /dev/null
> +++ b/libgcc/config/i386/sse_resms64fx.S
> @@ -0,0 +1,2 @@
> +#define MS2SYSV_STUB_SSE
> +#include "resms64fx.h"
> diff --git a/libgcc/config/i386/sse_resms64x.S b/libgcc/config/i386/sse_resms64x.S
> new file mode 100644
> index 00000000000..2cfc2b0195f
> --- /dev/null
> +++ b/libgcc/config/i386/sse_resms64x.S
> @@ -0,0 +1,2 @@
> +#define MS2SYSV_STUB_SSE
> +#include "resms64x.h"
> diff --git a/libgcc/config/i386/sse_savms64.S b/libgcc/config/i386/sse_savms64.S
> new file mode 100644
> index 00000000000..52f43075b40
> --- /dev/null
> +++ b/libgcc/config/i386/sse_savms64.S
> @@ -0,0 +1,2 @@
> +#define MS2SYSV_STUB_SSE
> +#include "savms64.h"
> diff --git a/libgcc/config/i386/sse_savms64f.S b/libgcc/config/i386/sse_savms64f.S
> new file mode 100644
> index 00000000000..426be35b53b
> --- /dev/null
> +++ b/libgcc/config/i386/sse_savms64f.S
> @@ -0,0 +1,2 @@
> +#define MS2SYSV_STUB_SSE
> +#include "savms64f.h"
> diff --git a/libgcc/config/i386/t-msabi b/libgcc/config/i386/t-msabi
> index f9806a611aa..ffc9c4f6656 100644
> --- a/libgcc/config/i386/t-msabi
> +++ b/libgcc/config/i386/t-msabi
> @@ -1,7 +1,13 @@
>  # Makefile fragment to support -mcall-ms2sysv-xlogues
> -LIB2ADD_ST += $(srcdir)/config/i386/savms64.S \
> -             $(srcdir)/config/i386/resms64.S \
> -             $(srcdir)/config/i386/resms64x.S \
> -             $(srcdir)/config/i386/savms64f.S \
> -             $(srcdir)/config/i386/resms64f.S \
> -             $(srcdir)/config/i386/resms64fx.S
> +LIB2ADD_ST += $(srcdir)/config/i386/avx_savms64.S \
> +             $(srcdir)/config/i386/avx_resms64.S \
> +             $(srcdir)/config/i386/avx_resms64x.S \
> +             $(srcdir)/config/i386/avx_savms64f.S \
> +             $(srcdir)/config/i386/avx_resms64f.S \
> +             $(srcdir)/config/i386/avx_resms64fx.S \
> +             $(srcdir)/config/i386/sse_savms64.S \
> +             $(srcdir)/config/i386/sse_resms64.S \
> +             $(srcdir)/config/i386/sse_resms64x.S \
> +             $(srcdir)/config/i386/sse_savms64f.S \
> +             $(srcdir)/config/i386/sse_resms64f.S \
> +             $(srcdir)/config/i386/sse_resms64fx.S
> --
> 2.14.1
>
Daniel Santos Sept. 17, 2017, 9:58 p.m. UTC | #2
On 09/17/2017 10:53 AM, Uros Bizjak wrote:
> OK.
>
> Thanks,
> Uros.

Thanks. I should have posted this Friday when my tests finished, but
I'll be committing with one minor change so tests don't run on m32 or mx32:

--- a/gcc/testsuite/gcc.target/i386/pr82196-1.c
+++ b/gcc/testsuite/gcc.target/i386/pr82196-1.c
@@ -1,4 +1,4 @@
-/* { dg-do compile } */
+/* { dg-do compile { target lp64 } } */
 /* { dg-options "-msse -mcall-ms2sysv-xlogues -O2" } */
 /* { dg-final { scan-assembler "call.*__sse_savms64_18" } } */
 /* { dg-final { scan-assembler "jmp.*__sse_resms64x_18" } } */
diff --git a/gcc/testsuite/gcc.target/i386/pr82196-2.c b/gcc/testsuite/gcc.target/i386/pr82196-2.c
index 31705bee29b..8fe58411d5e 100644
--- a/gcc/testsuite/gcc.target/i386/pr82196-2.c
+++ b/gcc/testsuite/gcc.target/i386/pr82196-2.c
@@ -1,4 +1,4 @@
-/* { dg-do compile } */
+/* { dg-do compile { target lp64 } } */
 /* { dg-options "-mavx -mcall-ms2sysv-xlogues -O2" } */
 /* { dg-final { scan-assembler "call.*__avx_savms64_18" } } */
 /* { dg-final { scan-assembler "jmp.*__avx_resms64x_18" } } */

Other than that, full regression tests pass.

Thanks,
Daniel
Rainer Orth Sept. 19, 2017, 12:13 p.m. UTC | #3
Daniel Santos <daniel.santos@pobox.com> writes:

> On 09/17/2017 10:53 AM, Uros Bizjak wrote:
>> OK.
>>
>> Thanks,
>> Uros.
>
> Thanks. I should have posted this Friday when my tests finished, but
> I'll be committing with one minor change so tests don't run on m32 or mx32:
>
> --- a/gcc/testsuite/gcc.target/i386/pr82196-1.c
> +++ b/gcc/testsuite/gcc.target/i386/pr82196-1.c
> @@ -1,4 +1,4 @@
> -/* { dg-do compile } */
> +/* { dg-do compile { target lp64 } } */
>  /* { dg-options "-msse -mcall-ms2sysv-xlogues -O2" } */
>  /* { dg-final { scan-assembler "call.*__sse_savms64_18" } } */
>  /* { dg-final { scan-assembler "jmp.*__sse_resms64x_18" } } */
> diff --git a/gcc/testsuite/gcc.target/i386/pr82196-2.c
> b/gcc/testsuite/gcc.target/i386/pr82196-2.c
> index 31705bee29b..8fe58411d5e 100644
> --- a/gcc/testsuite/gcc.target/i386/pr82196-2.c
> +++ b/gcc/testsuite/gcc.target/i386/pr82196-2.c
> @@ -1,4 +1,4 @@
> -/* { dg-do compile } */
> +/* { dg-do compile { target lp64 } } */
>  /* { dg-options "-mavx -mcall-ms2sysv-xlogues -O2" } */
>  /* { dg-final { scan-assembler "call.*__avx_savms64_18" } } */
>  /* { dg-final { scan-assembler "jmp.*__avx_resms64x_18" } } */
>
> Other than that, full regression tests pass.

However, they do FAIL on 64-bit Solaris/x86:

+FAIL: gcc.target/i386/pr82196-1.c (test for excess errors)

Excess errors:
/vol/gcc/src/hg/trunk/local/gcc/testsuite/gcc.target/i386/pr82196-1.c:14:1: error: bp cannot be used in asm here

+UNRESOLVED: gcc.target/i386/pr82196-1.c scan-assembler call.*__sse_savms64_18
+UNRESOLVED: gcc.target/i386/pr82196-1.c scan-assembler jmp.*__sse_resms64x_18
+FAIL: gcc.target/i386/pr82196-2.c (test for excess errors)
+UNRESOLVED: gcc.target/i386/pr82196-2.c scan-assembler call.*__avx_savms64_18
+UNRESOLVED: gcc.target/i386/pr82196-2.c scan-assembler jmp.*__avx_resms64x_18

	Rainer
Uros Bizjak Sept. 19, 2017, 1:33 p.m. UTC | #4
On Tue, Sep 19, 2017 at 2:13 PM, Rainer Orth
<ro@cebitec.uni-bielefeld.de> wrote:
> Daniel Santos <daniel.santos@pobox.com> writes:
>
>> On 09/17/2017 10:53 AM, Uros Bizjak wrote:
>>> OK.
>>>
>>> Thanks,
>>> Uros.
>>
>> Thanks. I should have posted this Friday when my tests finished, but
>> I'll be committing with one minor change so tests don't run on m32 or mx32:
>>
>> --- a/gcc/testsuite/gcc.target/i386/pr82196-1.c
>> +++ b/gcc/testsuite/gcc.target/i386/pr82196-1.c
>> @@ -1,4 +1,4 @@
>> -/* { dg-do compile } */
>> +/* { dg-do compile { target lp64 } } */
>>  /* { dg-options "-msse -mcall-ms2sysv-xlogues -O2" } */
>>  /* { dg-final { scan-assembler "call.*__sse_savms64_18" } } */
>>  /* { dg-final { scan-assembler "jmp.*__sse_resms64x_18" } } */
>> diff --git a/gcc/testsuite/gcc.target/i386/pr82196-2.c
>> b/gcc/testsuite/gcc.target/i386/pr82196-2.c
>> index 31705bee29b..8fe58411d5e 100644
>> --- a/gcc/testsuite/gcc.target/i386/pr82196-2.c
>> +++ b/gcc/testsuite/gcc.target/i386/pr82196-2.c
>> @@ -1,4 +1,4 @@
>> -/* { dg-do compile } */
>> +/* { dg-do compile { target lp64 } } */
>>  /* { dg-options "-mavx -mcall-ms2sysv-xlogues -O2" } */
>>  /* { dg-final { scan-assembler "call.*__avx_savms64_18" } } */
>>  /* { dg-final { scan-assembler "jmp.*__avx_resms64x_18" } } */
>>
>> Other than that, full regression tests pass.
>
> However, they do FAIL on 64-bit Solaris/x86:
>
> +FAIL: gcc.target/i386/pr82196-1.c (test for excess errors)
>
> Excess errors:
> /vol/gcc/src/hg/trunk/local/gcc/testsuite/gcc.target/i386/pr82196-1.c:14:1: error: bp cannot be used in asm here
>
> +UNRESOLVED: gcc.target/i386/pr82196-1.c scan-assembler call.*__sse_savms64_18
> +UNRESOLVED: gcc.target/i386/pr82196-1.c scan-assembler jmp.*__sse_resms64x_18
> +FAIL: gcc.target/i386/pr82196-2.c (test for excess errors)
> +UNRESOLVED: gcc.target/i386/pr82196-2.c scan-assembler call.*__avx_savms64_18
> +UNRESOLVED: gcc.target/i386/pr82196-2.c scan-assembler jmp.*__avx_resms64x_18

Does the test compile with -fomit-frame-pointer?

Uros.
Rainer Orth Sept. 19, 2017, 1:36 p.m. UTC | #5
Uros Bizjak <ubizjak@gmail.com> writes:

>> However, they do FAIL on 64-bit Solaris/x86:
>>
>> +FAIL: gcc.target/i386/pr82196-1.c (test for excess errors)
>>
>> Excess errors:
>> /vol/gcc/src/hg/trunk/local/gcc/testsuite/gcc.target/i386/pr82196-1.c:14:1:
>> error: bp cannot be used in asm here
>>
>> +UNRESOLVED: gcc.target/i386/pr82196-1.c scan-assembler call.*__sse_savms64_18
>> +UNRESOLVED: gcc.target/i386/pr82196-1.c scan-assembler jmp.*__sse_resms64x_18
>> +FAIL: gcc.target/i386/pr82196-2.c (test for excess errors)
>> +UNRESOLVED: gcc.target/i386/pr82196-2.c scan-assembler call.*__avx_savms64_18
>> +UNRESOLVED: gcc.target/i386/pr82196-2.c scan-assembler jmp.*__avx_resms64x_18
>
> Does the test compile with -fomit-frame-pointer?

It does indeed, and the patterns are present as expected.

	Rainer
Daniel Santos Sept. 19, 2017, 9:03 p.m. UTC | #6
On 09/19/2017 07:13 AM, Rainer Orth wrote:
> Daniel Santos <daniel.santos@pobox.com> writes:
>
>> On 09/17/2017 10:53 AM, Uros Bizjak wrote:
>>> OK.
>>>
>>> Thanks,
>>> Uros.
>> Thanks. I should have posted this Friday when my tests finished, but
>> I'll be committing with one minor change so tests don't run on m32 or mx32:
>>
>> --- a/gcc/testsuite/gcc.target/i386/pr82196-1.c
>> +++ b/gcc/testsuite/gcc.target/i386/pr82196-1.c
>> @@ -1,4 +1,4 @@
>> -/* { dg-do compile } */
>> +/* { dg-do compile { target lp64 } } */
>>  /* { dg-options "-msse -mcall-ms2sysv-xlogues -O2" } */
>>  /* { dg-final { scan-assembler "call.*__sse_savms64_18" } } */
>>  /* { dg-final { scan-assembler "jmp.*__sse_resms64x_18" } } */
>> diff --git a/gcc/testsuite/gcc.target/i386/pr82196-2.c
>> b/gcc/testsuite/gcc.target/i386/pr82196-2.c
>> index 31705bee29b..8fe58411d5e 100644
>> --- a/gcc/testsuite/gcc.target/i386/pr82196-2.c
>> +++ b/gcc/testsuite/gcc.target/i386/pr82196-2.c
>> @@ -1,4 +1,4 @@
>> -/* { dg-do compile } */
>> +/* { dg-do compile { target lp64 } } */
>>  /* { dg-options "-mavx -mcall-ms2sysv-xlogues -O2" } */
>>  /* { dg-final { scan-assembler "call.*__avx_savms64_18" } } */
>>  /* { dg-final { scan-assembler "jmp.*__avx_resms64x_18" } } */
>>
>> Other than that, full regression tests pass.
> However, they do FAIL on 64-bit Solaris/x86:
>
> +FAIL: gcc.target/i386/pr82196-1.c (test for excess errors)
>
> Excess errors:
> /vol/gcc/src/hg/trunk/local/gcc/testsuite/gcc.target/i386/pr82196-1.c:14:1: error: bp cannot be used in asm here
>
> +UNRESOLVED: gcc.target/i386/pr82196-1.c scan-assembler call.*__sse_savms64_18
> +UNRESOLVED: gcc.target/i386/pr82196-1.c scan-assembler jmp.*__sse_resms64x_18
> +FAIL: gcc.target/i386/pr82196-2.c (test for excess errors)
> +UNRESOLVED: gcc.target/i386/pr82196-2.c scan-assembler call.*__avx_savms64_18
> +UNRESOLVED: gcc.target/i386/pr82196-2.c scan-assembler jmp.*__avx_resms64x_18
>
> 	Rainer

Sorry about that, I forgot about Solaris' default enabled frame
pointers.  I don't even need a test this complicated, I'll make it much
simpler.

Thanks,
Daniel
diff mbox series

Patch

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index b2b02acc58a..f0d7d0eb196 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -2513,7 +2513,7 @@  public:
   static const unsigned MAX_REGS = 18;
   static const unsigned MAX_EXTRA_REGS = MAX_REGS - MIN_REGS;
   static const unsigned VARIANT_COUNT = MAX_EXTRA_REGS + 1;
-  static const unsigned STUB_NAME_MAX_LEN = 16;
+  static const unsigned STUB_NAME_MAX_LEN = 20;
   static const char * const STUB_BASE_NAMES[XLOGUE_STUB_COUNT];
   static const unsigned REG_ORDER[MAX_REGS];
   static const unsigned REG_ORDER_REALIGN[MAX_REGS];
@@ -2536,7 +2536,7 @@  private:
   struct reginfo m_regs[MAX_REGS];
 
   /* Lazy-inited cache of symbol names for stubs.  */
-  static char s_stub_names[XLOGUE_STUB_COUNT][VARIANT_COUNT]
+  static char s_stub_names[2][XLOGUE_STUB_COUNT][VARIANT_COUNT]
 			  [STUB_NAME_MAX_LEN];
 
   static const xlogue_layout s_instances[XLOGUE_SET_COUNT];
@@ -2588,7 +2588,7 @@  const unsigned xlogue_layout::VARIANT_COUNT;
 const unsigned xlogue_layout::STUB_NAME_MAX_LEN;
 
 /* Initialize xlogue_layout::s_stub_names to zero.  */
-char xlogue_layout::s_stub_names[XLOGUE_STUB_COUNT][VARIANT_COUNT]
+char xlogue_layout::s_stub_names[2][XLOGUE_STUB_COUNT][VARIANT_COUNT]
 				[STUB_NAME_MAX_LEN];
 
 /* Instantiates all xlogue_layout instances.  */
@@ -2692,13 +2692,16 @@  const char *
 xlogue_layout::get_stub_name (enum xlogue_stub stub,
 			      unsigned n_extra_regs)
 {
-  char *name = s_stub_names[stub][n_extra_regs];
+  const int have_avx = TARGET_AVX;
+  char *name = s_stub_names[!!have_avx][stub][n_extra_regs];
 
   /* Lazy init */
   if (!*name)
     {
-      int res = snprintf (name, STUB_NAME_MAX_LEN, "__%s_%u",
-			  STUB_BASE_NAMES[stub], MIN_REGS + n_extra_regs);
+      int res = snprintf (name, STUB_NAME_MAX_LEN, "__%s_%s_%u",
+			  (have_avx ? "avx" : "sse"),
+			  STUB_BASE_NAMES[stub],
+			  MIN_REGS + n_extra_regs);
       gcc_checking_assert (res < (int)STUB_NAME_MAX_LEN);
     }
 
diff --git a/gcc/testsuite/gcc.target/i386/pr82196-1.c b/gcc/testsuite/gcc.target/i386/pr82196-1.c
new file mode 100644
index 00000000000..fa573dc6b66
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr82196-1.c
@@ -0,0 +1,14 @@ 
+/* { dg-do compile } */
+/* { dg-options "-msse -mcall-ms2sysv-xlogues -O2" } */
+/* { dg-final { scan-assembler "call.*__sse_savms64_18" } } */
+/* { dg-final { scan-assembler "jmp.*__sse_resms64x_18" } } */
+
+void __attribute__((sysv_abi)) a() {
+}
+
+static void __attribute__((sysv_abi)) (*volatile a_noinfo)() = a;
+
+void __attribute__((ms_abi)) b() {
+  __asm__ __volatile__ ("" :::"rbx", "rbp", "r12", "r13", "r14", "r15");
+  a_noinfo ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr82196-2.c b/gcc/testsuite/gcc.target/i386/pr82196-2.c
new file mode 100644
index 00000000000..31705bee29b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr82196-2.c
@@ -0,0 +1,14 @@ 
+/* { dg-do compile } */
+/* { dg-options "-mavx -mcall-ms2sysv-xlogues -O2" } */
+/* { dg-final { scan-assembler "call.*__avx_savms64_18" } } */
+/* { dg-final { scan-assembler "jmp.*__avx_resms64x_18" } } */
+
+void __attribute__((sysv_abi)) a() {
+}
+
+static void __attribute__((sysv_abi)) (*volatile a_noinfo)() = a;
+
+void __attribute__((ms_abi)) b() {
+  __asm__ __volatile__ ("" :::"rbx", "rbp", "r12", "r13", "r14", "r15");
+  a_noinfo ();
+}
diff --git a/libgcc/config/i386/avx_resms64.S b/libgcc/config/i386/avx_resms64.S
new file mode 100644
index 00000000000..2be744937cf
--- /dev/null
+++ b/libgcc/config/i386/avx_resms64.S
@@ -0,0 +1,2 @@ 
+#define MS2SYSV_STUB_AVX
+#include "resms64.h"
diff --git a/libgcc/config/i386/avx_resms64f.S b/libgcc/config/i386/avx_resms64f.S
new file mode 100644
index 00000000000..76a1340ab1f
--- /dev/null
+++ b/libgcc/config/i386/avx_resms64f.S
@@ -0,0 +1,2 @@ 
+#define MS2SYSV_STUB_AVX
+#include "resms64f.h"
diff --git a/libgcc/config/i386/avx_resms64fx.S b/libgcc/config/i386/avx_resms64fx.S
new file mode 100644
index 00000000000..2ea4738af7e
--- /dev/null
+++ b/libgcc/config/i386/avx_resms64fx.S
@@ -0,0 +1,2 @@ 
+#define MS2SYSV_STUB_AVX
+#include "resms64fx.h"
diff --git a/libgcc/config/i386/avx_resms64x.S b/libgcc/config/i386/avx_resms64x.S
new file mode 100644
index 00000000000..14a53d4fcf9
--- /dev/null
+++ b/libgcc/config/i386/avx_resms64x.S
@@ -0,0 +1,2 @@ 
+#define MS2SYSV_STUB_AVX
+#include "resms64x.h"
diff --git a/libgcc/config/i386/avx_savms64.S b/libgcc/config/i386/avx_savms64.S
new file mode 100644
index 00000000000..fed1620b968
--- /dev/null
+++ b/libgcc/config/i386/avx_savms64.S
@@ -0,0 +1,2 @@ 
+#define MS2SYSV_STUB_AVX
+#include "savms64.h"
diff --git a/libgcc/config/i386/avx_savms64f.S b/libgcc/config/i386/avx_savms64f.S
new file mode 100644
index 00000000000..32279657e30
--- /dev/null
+++ b/libgcc/config/i386/avx_savms64f.S
@@ -0,0 +1,2 @@ 
+#define MS2SYSV_STUB_AVX
+#include "savms64f.h"
diff --git a/libgcc/config/i386/i386-asm.h b/libgcc/config/i386/i386-asm.h
index 1387fd24b4f..424e0f72aac 100644
--- a/libgcc/config/i386/i386-asm.h
+++ b/libgcc/config/i386/i386-asm.h
@@ -28,6 +28,9 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 
 #include "auto-host.h"
 
+#define PASTE2(a, b) PASTE2a(a, b)
+#define PASTE2a(a, b) a ## b
+
 /* These macros currently support GNU/Linux, Solaris and Darwin.  */
 
 #ifdef __ELF__
@@ -46,9 +49,7 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #endif
 
 #ifdef __USER_LABEL_PREFIX__
-# define ASMNAME2(prefix, name)	prefix ## name
-# define ASMNAME1(prefix, name)	ASMNAME2(prefix, name)
-# define ASMNAME(name)		ASMNAME1(__USER_LABEL_PREFIX__, name)
+# define ASMNAME(name)		PASTE2(__USER_LABEL_PREFIX__, name)
 #else
 # define ASMNAME(name)		name
 #endif
@@ -66,15 +67,24 @@  ASMNAME(fn):
 
 #define FUNC_END(fn) FN_SIZE(ASMNAME(fn))
 
-#ifdef __SSE2__
-# ifdef __AVX__
-#  define MOVAPS vmovaps
-# else
-#  define MOVAPS movaps
-# endif
+#ifdef MS2SYSV_STUB_AVX
+# define MS2SYSV_STUB_PREFIX __avx_
+# define MOVAPS vmovaps
+#elif defined(MS2SYSV_STUB_SSE)
+# define MS2SYSV_STUB_PREFIX __sse_
+# define MOVAPS movaps
+#endif
+
+#if defined (MS2SYSV_STUB_PREFIX) && defined (MOVAPS)
+
+# define MS2SYSV_STUB_BEGIN(base_name) \
+	HIDDEN_FUNC(PASTE2(MS2SYSV_STUB_PREFIX, base_name))
+
+# define MS2SYSV_STUB_END(base_name) \
+	FUNC_END(PASTE2(MS2SYSV_STUB_PREFIX, base_name))
 
 /* Save SSE registers 6-15. off is the offset of rax to get to xmm6.  */
-#define SSE_SAVE		   \
+# define SSE_SAVE		   \
 	MOVAPS %xmm15,-0x30(%rax); \
 	MOVAPS %xmm14,-0x20(%rax); \
 	MOVAPS %xmm13,-0x10(%rax); \
@@ -87,7 +97,7 @@  ASMNAME(fn):
 	MOVAPS %xmm6,  0x60(%rax)
 
 /* Restore SSE registers 6-15. off is the offset of rsi to get to xmm6.  */
-#define SSE_RESTORE		    \
+# define SSE_RESTORE		    \
 	MOVAPS -0x30(%rsi), %xmm15; \
 	MOVAPS -0x20(%rsi), %xmm14; \
 	MOVAPS -0x10(%rsi), %xmm13; \
@@ -99,5 +109,5 @@  ASMNAME(fn):
 	MOVAPS  0x50(%rsi), %xmm7 ; \
 	MOVAPS  0x60(%rsi), %xmm6
 
-#endif /* __SSE2__ */
+#endif /* defined (MS2SYSV_STUB_ISA) && defined (MOVAPS) */
 #endif /* I386_ASM_H */
diff --git a/libgcc/config/i386/resms64.S b/libgcc/config/i386/resms64.h
similarity index 76%
rename from libgcc/config/i386/resms64.S
rename to libgcc/config/i386/resms64.h
index f842c20a77a..f01b41897bc 100644
--- a/libgcc/config/i386/resms64.S
+++ b/libgcc/config/i386/resms64.h
@@ -29,29 +29,29 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 /* Epilogue routine for restoring 64-bit ms/sysv registers.  */
 
 	.text
-HIDDEN_FUNC(__resms64_18)
+MS2SYSV_STUB_BEGIN(resms64_18)
 	mov	-0x70(%rsi),%r15
-HIDDEN_FUNC(__resms64_17)
+MS2SYSV_STUB_BEGIN(resms64_17)
 	mov	-0x68(%rsi),%r14
-HIDDEN_FUNC(__resms64_16)
+MS2SYSV_STUB_BEGIN(resms64_16)
 	mov	-0x60(%rsi),%r13
-HIDDEN_FUNC(__resms64_15)
+MS2SYSV_STUB_BEGIN(resms64_15)
 	mov	-0x58(%rsi),%r12
-HIDDEN_FUNC(__resms64_14)
+MS2SYSV_STUB_BEGIN(resms64_14)
 	mov	-0x50(%rsi),%rbp
-HIDDEN_FUNC(__resms64_13)
+MS2SYSV_STUB_BEGIN(resms64_13)
 	mov	-0x48(%rsi),%rbx
-HIDDEN_FUNC(__resms64_12)
+MS2SYSV_STUB_BEGIN(resms64_12)
 	mov	-0x40(%rsi),%rdi
 	SSE_RESTORE
 	mov	-0x38(%rsi),%rsi
 	ret
-FUNC_END(__resms64_12)
-FUNC_END(__resms64_13)
-FUNC_END(__resms64_14)
-FUNC_END(__resms64_15)
-FUNC_END(__resms64_16)
-FUNC_END(__resms64_17)
-FUNC_END(__resms64_18)
+MS2SYSV_STUB_END(resms64_12)
+MS2SYSV_STUB_END(resms64_13)
+MS2SYSV_STUB_END(resms64_14)
+MS2SYSV_STUB_END(resms64_15)
+MS2SYSV_STUB_END(resms64_16)
+MS2SYSV_STUB_END(resms64_17)
+MS2SYSV_STUB_END(resms64_18)
 
 #endif /* __x86_64__ */
diff --git a/libgcc/config/i386/resms64f.S b/libgcc/config/i386/resms64f.h
similarity index 79%
rename from libgcc/config/i386/resms64f.S
rename to libgcc/config/i386/resms64f.h
index 81946cda944..743ec514cef 100644
--- a/libgcc/config/i386/resms64f.S
+++ b/libgcc/config/i386/resms64f.h
@@ -30,26 +30,26 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
    pointer is used.  */
 
 	.text
-HIDDEN_FUNC(__resms64f_17)
+MS2SYSV_STUB_BEGIN(resms64f_17)
 	mov	-0x68(%rsi),%r15
-HIDDEN_FUNC(__resms64f_16)
+MS2SYSV_STUB_BEGIN(resms64f_16)
 	mov	-0x60(%rsi),%r14
-HIDDEN_FUNC(__resms64f_15)
+MS2SYSV_STUB_BEGIN(resms64f_15)
 	mov	-0x58(%rsi),%r13
-HIDDEN_FUNC(__resms64f_14)
+MS2SYSV_STUB_BEGIN(resms64f_14)
 	mov	-0x50(%rsi),%r12
-HIDDEN_FUNC(__resms64f_13)
+MS2SYSV_STUB_BEGIN(resms64f_13)
 	mov	-0x48(%rsi),%rbx
-HIDDEN_FUNC(__resms64f_12)
+MS2SYSV_STUB_BEGIN(resms64f_12)
 	mov	-0x40(%rsi),%rdi
 	SSE_RESTORE
 	mov	-0x38(%rsi),%rsi
 	ret
-FUNC_END(__resms64f_12)
-FUNC_END(__resms64f_13)
-FUNC_END(__resms64f_14)
-FUNC_END(__resms64f_15)
-FUNC_END(__resms64f_16)
-FUNC_END(__resms64f_17)
+MS2SYSV_STUB_END(resms64f_12)
+MS2SYSV_STUB_END(resms64f_13)
+MS2SYSV_STUB_END(resms64f_14)
+MS2SYSV_STUB_END(resms64f_15)
+MS2SYSV_STUB_END(resms64f_16)
+MS2SYSV_STUB_END(resms64f_17)
 
 #endif /* __x86_64__ */
diff --git a/libgcc/config/i386/resms64fx.S b/libgcc/config/i386/resms64fx.h
similarity index 79%
rename from libgcc/config/i386/resms64fx.S
rename to libgcc/config/i386/resms64fx.h
index acf34fa0837..965807a1299 100644
--- a/libgcc/config/i386/resms64fx.S
+++ b/libgcc/config/i386/resms64fx.h
@@ -31,27 +31,27 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
  * from the function.  */
 
 	.text
-HIDDEN_FUNC(__resms64fx_17)
+MS2SYSV_STUB_BEGIN(resms64fx_17)
 	mov	-0x68(%rsi),%r15
-HIDDEN_FUNC(__resms64fx_16)
+MS2SYSV_STUB_BEGIN(resms64fx_16)
 	mov	-0x60(%rsi),%r14
-HIDDEN_FUNC(__resms64fx_15)
+MS2SYSV_STUB_BEGIN(resms64fx_15)
 	mov	-0x58(%rsi),%r13
-HIDDEN_FUNC(__resms64fx_14)
+MS2SYSV_STUB_BEGIN(resms64fx_14)
 	mov	-0x50(%rsi),%r12
-HIDDEN_FUNC(__resms64fx_13)
+MS2SYSV_STUB_BEGIN(resms64fx_13)
 	mov	-0x48(%rsi),%rbx
-HIDDEN_FUNC(__resms64fx_12)
+MS2SYSV_STUB_BEGIN(resms64fx_12)
 	mov	-0x40(%rsi),%rdi
 	SSE_RESTORE
 	mov	-0x38(%rsi),%rsi
 	leaveq
 	ret
-FUNC_END(__resms64fx_12)
-FUNC_END(__resms64fx_13)
-FUNC_END(__resms64fx_14)
-FUNC_END(__resms64fx_15)
-FUNC_END(__resms64fx_16)
-FUNC_END(__resms64fx_17)
+MS2SYSV_STUB_END(resms64fx_12)
+MS2SYSV_STUB_END(resms64fx_13)
+MS2SYSV_STUB_END(resms64fx_14)
+MS2SYSV_STUB_END(resms64fx_15)
+MS2SYSV_STUB_END(resms64fx_16)
+MS2SYSV_STUB_END(resms64fx_17)
 
 #endif /* __x86_64__ */
diff --git a/libgcc/config/i386/resms64x.S b/libgcc/config/i386/resms64x.h
similarity index 77%
rename from libgcc/config/i386/resms64x.S
rename to libgcc/config/i386/resms64x.h
index e27aab7d881..689a1dec20b 100644
--- a/libgcc/config/i386/resms64x.S
+++ b/libgcc/config/i386/resms64x.h
@@ -30,30 +30,30 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
  * function.  */
 
 	.text
-HIDDEN_FUNC(__resms64x_18)
+MS2SYSV_STUB_BEGIN(resms64x_18)
 	mov	-0x70(%rsi),%r15
-HIDDEN_FUNC(__resms64x_17)
+MS2SYSV_STUB_BEGIN(resms64x_17)
 	mov	-0x68(%rsi),%r14
-HIDDEN_FUNC(__resms64x_16)
+MS2SYSV_STUB_BEGIN(resms64x_16)
 	mov	-0x60(%rsi),%r13
-HIDDEN_FUNC(__resms64x_15)
+MS2SYSV_STUB_BEGIN(resms64x_15)
 	mov	-0x58(%rsi),%r12
-HIDDEN_FUNC(__resms64x_14)
+MS2SYSV_STUB_BEGIN(resms64x_14)
 	mov	-0x50(%rsi),%rbp
-HIDDEN_FUNC(__resms64x_13)
+MS2SYSV_STUB_BEGIN(resms64x_13)
 	mov	-0x48(%rsi),%rbx
-HIDDEN_FUNC(__resms64x_12)
+MS2SYSV_STUB_BEGIN(resms64x_12)
 	mov	-0x40(%rsi),%rdi
 	SSE_RESTORE
 	mov	-0x38(%rsi),%rsi
 	mov	%r10,%rsp
 	ret
-FUNC_END(__resms64x_12)
-FUNC_END(__resms64x_13)
-FUNC_END(__resms64x_14)
-FUNC_END(__resms64x_15)
-FUNC_END(__resms64x_16)
-FUNC_END(__resms64x_17)
-FUNC_END(__resms64x_18)
+MS2SYSV_STUB_END(resms64x_12)
+MS2SYSV_STUB_END(resms64x_13)
+MS2SYSV_STUB_END(resms64x_14)
+MS2SYSV_STUB_END(resms64x_15)
+MS2SYSV_STUB_END(resms64x_16)
+MS2SYSV_STUB_END(resms64x_17)
+MS2SYSV_STUB_END(resms64x_18)
 
 #endif /* __x86_64__ */
diff --git a/libgcc/config/i386/savms64.S b/libgcc/config/i386/savms64.h
similarity index 76%
rename from libgcc/config/i386/savms64.S
rename to libgcc/config/i386/savms64.h
index 44dda46ec54..28d5e3548ab 100644
--- a/libgcc/config/i386/savms64.S
+++ b/libgcc/config/i386/savms64.h
@@ -29,29 +29,29 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 /* Prologue routine for saving 64-bit ms/sysv registers.  */
 
 	.text
-HIDDEN_FUNC(__savms64_18)
+MS2SYSV_STUB_BEGIN(savms64_18)
 	mov	%r15,-0x70(%rax)
-HIDDEN_FUNC(__savms64_17)
+MS2SYSV_STUB_BEGIN(savms64_17)
 	mov	%r14,-0x68(%rax)
-HIDDEN_FUNC(__savms64_16)
+MS2SYSV_STUB_BEGIN(savms64_16)
 	mov	%r13,-0x60(%rax)
-HIDDEN_FUNC(__savms64_15)
+MS2SYSV_STUB_BEGIN(savms64_15)
 	mov	%r12,-0x58(%rax)
-HIDDEN_FUNC(__savms64_14)
+MS2SYSV_STUB_BEGIN(savms64_14)
 	mov	%rbp,-0x50(%rax)
-HIDDEN_FUNC(__savms64_13)
+MS2SYSV_STUB_BEGIN(savms64_13)
 	mov	%rbx,-0x48(%rax)
-HIDDEN_FUNC(__savms64_12)
+MS2SYSV_STUB_BEGIN(savms64_12)
 	mov	%rdi,-0x40(%rax)
 	mov	%rsi,-0x38(%rax)
 	SSE_SAVE
 	ret
-FUNC_END(__savms64_12)
-FUNC_END(__savms64_13)
-FUNC_END(__savms64_14)
-FUNC_END(__savms64_15)
-FUNC_END(__savms64_16)
-FUNC_END(__savms64_17)
-FUNC_END(__savms64_18)
+MS2SYSV_STUB_END(savms64_12)
+MS2SYSV_STUB_END(savms64_13)
+MS2SYSV_STUB_END(savms64_14)
+MS2SYSV_STUB_END(savms64_15)
+MS2SYSV_STUB_END(savms64_16)
+MS2SYSV_STUB_END(savms64_17)
+MS2SYSV_STUB_END(savms64_18)
 
 #endif /* __x86_64__ */
diff --git a/libgcc/config/i386/savms64f.S b/libgcc/config/i386/savms64f.h
similarity index 79%
rename from libgcc/config/i386/savms64f.S
rename to libgcc/config/i386/savms64f.h
index 64e91ac0394..723e1080f5c 100644
--- a/libgcc/config/i386/savms64f.S
+++ b/libgcc/config/i386/savms64f.h
@@ -30,26 +30,26 @@  see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
  * needed or hard frame pointer used.  */
 
 	.text
-HIDDEN_FUNC(__savms64f_17)
+MS2SYSV_STUB_BEGIN(savms64f_17)
 	mov	%r15,-0x68(%rax)
-HIDDEN_FUNC(__savms64f_16)
+MS2SYSV_STUB_BEGIN(savms64f_16)
 	mov	%r14,-0x60(%rax)
-HIDDEN_FUNC(__savms64f_15)
+MS2SYSV_STUB_BEGIN(savms64f_15)
 	mov	%r13,-0x58(%rax)
-HIDDEN_FUNC(__savms64f_14)
+MS2SYSV_STUB_BEGIN(savms64f_14)
 	mov	%r12,-0x50(%rax)
-HIDDEN_FUNC(__savms64f_13)
+MS2SYSV_STUB_BEGIN(savms64f_13)
 	mov	%rbx,-0x48(%rax)
-HIDDEN_FUNC(__savms64f_12)
+MS2SYSV_STUB_BEGIN(savms64f_12)
 	mov	%rdi,-0x40(%rax)
 	mov	%rsi,-0x38(%rax)
 	SSE_SAVE
 	ret
-FUNC_END(__savms64f_12)
-FUNC_END(__savms64f_13)
-FUNC_END(__savms64f_14)
-FUNC_END(__savms64f_15)
-FUNC_END(__savms64f_16)
-FUNC_END(__savms64f_17)
+MS2SYSV_STUB_END(savms64f_12)
+MS2SYSV_STUB_END(savms64f_13)
+MS2SYSV_STUB_END(savms64f_14)
+MS2SYSV_STUB_END(savms64f_15)
+MS2SYSV_STUB_END(savms64f_16)
+MS2SYSV_STUB_END(savms64f_17)
 
 #endif /* __x86_64__ */
diff --git a/libgcc/config/i386/sse_resms64.S b/libgcc/config/i386/sse_resms64.S
new file mode 100644
index 00000000000..c87f5cc021d
--- /dev/null
+++ b/libgcc/config/i386/sse_resms64.S
@@ -0,0 +1,2 @@ 
+#define MS2SYSV_STUB_SSE
+#include "resms64.h"
diff --git a/libgcc/config/i386/sse_resms64f.S b/libgcc/config/i386/sse_resms64f.S
new file mode 100644
index 00000000000..3a066bc174a
--- /dev/null
+++ b/libgcc/config/i386/sse_resms64f.S
@@ -0,0 +1,2 @@ 
+#define MS2SYSV_STUB_SSE
+#include "resms64f.h"
diff --git a/libgcc/config/i386/sse_resms64fx.S b/libgcc/config/i386/sse_resms64fx.S
new file mode 100644
index 00000000000..142667a28bf
--- /dev/null
+++ b/libgcc/config/i386/sse_resms64fx.S
@@ -0,0 +1,2 @@ 
+#define MS2SYSV_STUB_SSE
+#include "resms64fx.h"
diff --git a/libgcc/config/i386/sse_resms64x.S b/libgcc/config/i386/sse_resms64x.S
new file mode 100644
index 00000000000..2cfc2b0195f
--- /dev/null
+++ b/libgcc/config/i386/sse_resms64x.S
@@ -0,0 +1,2 @@ 
+#define MS2SYSV_STUB_SSE
+#include "resms64x.h"
diff --git a/libgcc/config/i386/sse_savms64.S b/libgcc/config/i386/sse_savms64.S
new file mode 100644
index 00000000000..52f43075b40
--- /dev/null
+++ b/libgcc/config/i386/sse_savms64.S
@@ -0,0 +1,2 @@ 
+#define MS2SYSV_STUB_SSE
+#include "savms64.h"
diff --git a/libgcc/config/i386/sse_savms64f.S b/libgcc/config/i386/sse_savms64f.S
new file mode 100644
index 00000000000..426be35b53b
--- /dev/null
+++ b/libgcc/config/i386/sse_savms64f.S
@@ -0,0 +1,2 @@ 
+#define MS2SYSV_STUB_SSE
+#include "savms64f.h"
diff --git a/libgcc/config/i386/t-msabi b/libgcc/config/i386/t-msabi
index f9806a611aa..ffc9c4f6656 100644
--- a/libgcc/config/i386/t-msabi
+++ b/libgcc/config/i386/t-msabi
@@ -1,7 +1,13 @@ 
 # Makefile fragment to support -mcall-ms2sysv-xlogues
-LIB2ADD_ST += $(srcdir)/config/i386/savms64.S \
-	      $(srcdir)/config/i386/resms64.S \
-	      $(srcdir)/config/i386/resms64x.S \
-	      $(srcdir)/config/i386/savms64f.S \
-	      $(srcdir)/config/i386/resms64f.S \
-	      $(srcdir)/config/i386/resms64fx.S
+LIB2ADD_ST += $(srcdir)/config/i386/avx_savms64.S \
+	      $(srcdir)/config/i386/avx_resms64.S \
+	      $(srcdir)/config/i386/avx_resms64x.S \
+	      $(srcdir)/config/i386/avx_savms64f.S \
+	      $(srcdir)/config/i386/avx_resms64f.S \
+	      $(srcdir)/config/i386/avx_resms64fx.S \
+	      $(srcdir)/config/i386/sse_savms64.S \
+	      $(srcdir)/config/i386/sse_resms64.S \
+	      $(srcdir)/config/i386/sse_resms64x.S \
+	      $(srcdir)/config/i386/sse_savms64f.S \
+	      $(srcdir)/config/i386/sse_resms64f.S \
+	      $(srcdir)/config/i386/sse_resms64fx.S