[PATCH] [i386, libgcc] PR 82196 -mcall-ms2sysv-xlogues emits wrong AVX/SSE MOV
Uros Bizjak
ubizjak@gmail.com
Sun Sep 17 15:53:00 GMT 2017
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
>
More information about the Gcc-patches
mailing list