From: Daniel Santos Date: Sun, 17 Sep 2017 22:04:40 +0000 (+0000) Subject: PR target/82196 correct choice of avx/sse stubs for -mcall-ms2sysv-xlogues X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3cb626e4f7cebadf907f5e09f2432f0838f73ff9;p=gcc.git PR target/82196 correct choice of avx/sse stubs for -mcall-ms2sysv-xlogues 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 or 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. From-SVN: r252896 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b09c7ce5812..fcfcfbb2578 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2017-09-17 Daniel Santos + + 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 + or avx version of the stub. + 2017-09-17 H.J. Lu PR target/82166 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 4f0414ffa9d..1ed6f75d455 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/ChangeLog b/gcc/testsuite/ChangeLog index 47de348eb51..d2aa6052dcb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-09-17 Daniel Santos + + gcc.target/i386/pr82196-1.c: New test. + gcc.target/i386/pr82196-2.c: Likewise. + 2017-09-17 H.J. Lu PR target/82166 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..ef858328f00 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr82196-1.c @@ -0,0 +1,14 @@ +/* { 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" } } */ + +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..8fe58411d5e --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr82196-2.c @@ -0,0 +1,14 @@ +/* { 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" } } */ + +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/ChangeLog b/libgcc/ChangeLog index 8c1e1738c73..b548922904c 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,31 @@ +2017-09-17 Daniel Santos + + 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. + 2017-09-01 Olivier Hainque * config.host (*-*-vxworks7): Widen scope to vxworks7*. 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.S deleted file mode 100644 index f842c20a77a..00000000000 --- a/libgcc/config/i386/resms64.S +++ /dev/null @@ -1,57 +0,0 @@ -/* Epilogue stub for 64-bit ms/sysv clobbers: restore - Copyright (C) 2016-2017 Free Software Foundation, Inc. - Contributed by Daniel Santos - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 3, or (at your option) -any later version. - -GCC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -Under Section 7 of GPL version 3, you are granted additional -permissions described in the GCC Runtime Library Exception, version -3.1, as published by the Free Software Foundation. - -You should have received a copy of the GNU General Public License and -a copy of the GCC Runtime Library Exception along with this program; -see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -. */ - -#ifdef __x86_64__ -#include "i386-asm.h" - -/* Epilogue routine for restoring 64-bit ms/sysv registers. */ - - .text -HIDDEN_FUNC(__resms64_18) - mov -0x70(%rsi),%r15 -HIDDEN_FUNC(__resms64_17) - mov -0x68(%rsi),%r14 -HIDDEN_FUNC(__resms64_16) - mov -0x60(%rsi),%r13 -HIDDEN_FUNC(__resms64_15) - mov -0x58(%rsi),%r12 -HIDDEN_FUNC(__resms64_14) - mov -0x50(%rsi),%rbp -HIDDEN_FUNC(__resms64_13) - mov -0x48(%rsi),%rbx -HIDDEN_FUNC(__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) - -#endif /* __x86_64__ */ diff --git a/libgcc/config/i386/resms64.h b/libgcc/config/i386/resms64.h new file mode 100644 index 00000000000..f01b41897bc --- /dev/null +++ b/libgcc/config/i386/resms64.h @@ -0,0 +1,57 @@ +/* Epilogue stub for 64-bit ms/sysv clobbers: restore + Copyright (C) 2016-2017 Free Software Foundation, Inc. + Contributed by Daniel Santos + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3, or (at your option) +any later version. + +GCC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +Under Section 7 of GPL version 3, you are granted additional +permissions described in the GCC Runtime Library Exception, version +3.1, as published by the Free Software Foundation. + +You should have received a copy of the GNU General Public License and +a copy of the GCC Runtime Library Exception along with this program; +see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +. */ + +#ifdef __x86_64__ +#include "i386-asm.h" + +/* Epilogue routine for restoring 64-bit ms/sysv registers. */ + + .text +MS2SYSV_STUB_BEGIN(resms64_18) + mov -0x70(%rsi),%r15 +MS2SYSV_STUB_BEGIN(resms64_17) + mov -0x68(%rsi),%r14 +MS2SYSV_STUB_BEGIN(resms64_16) + mov -0x60(%rsi),%r13 +MS2SYSV_STUB_BEGIN(resms64_15) + mov -0x58(%rsi),%r12 +MS2SYSV_STUB_BEGIN(resms64_14) + mov -0x50(%rsi),%rbp +MS2SYSV_STUB_BEGIN(resms64_13) + mov -0x48(%rsi),%rbx +MS2SYSV_STUB_BEGIN(resms64_12) + mov -0x40(%rsi),%rdi + SSE_RESTORE + mov -0x38(%rsi),%rsi + ret +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.S deleted file mode 100644 index 81946cda944..00000000000 --- a/libgcc/config/i386/resms64f.S +++ /dev/null @@ -1,55 +0,0 @@ -/* Epilogue stub for 64-bit ms/sysv clobbers: restore (with hard frame pointer) - Copyright (C) 2016-2017 Free Software Foundation, Inc. - Contributed by Daniel Santos - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 3, or (at your option) -any later version. - -GCC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -Under Section 7 of GPL version 3, you are granted additional -permissions described in the GCC Runtime Library Exception, version -3.1, as published by the Free Software Foundation. - -You should have received a copy of the GNU General Public License and -a copy of the GCC Runtime Library Exception along with this program; -see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -. */ - -#ifdef __x86_64__ -#include "i386-asm.h" - -/* Epilogue routine for restoring 64-bit ms/sysv registers when hard frame - pointer is used. */ - - .text -HIDDEN_FUNC(__resms64f_17) - mov -0x68(%rsi),%r15 -HIDDEN_FUNC(__resms64f_16) - mov -0x60(%rsi),%r14 -HIDDEN_FUNC(__resms64f_15) - mov -0x58(%rsi),%r13 -HIDDEN_FUNC(__resms64f_14) - mov -0x50(%rsi),%r12 -HIDDEN_FUNC(__resms64f_13) - mov -0x48(%rsi),%rbx -HIDDEN_FUNC(__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) - -#endif /* __x86_64__ */ diff --git a/libgcc/config/i386/resms64f.h b/libgcc/config/i386/resms64f.h new file mode 100644 index 00000000000..743ec514cef --- /dev/null +++ b/libgcc/config/i386/resms64f.h @@ -0,0 +1,55 @@ +/* Epilogue stub for 64-bit ms/sysv clobbers: restore (with hard frame pointer) + Copyright (C) 2016-2017 Free Software Foundation, Inc. + Contributed by Daniel Santos + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3, or (at your option) +any later version. + +GCC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +Under Section 7 of GPL version 3, you are granted additional +permissions described in the GCC Runtime Library Exception, version +3.1, as published by the Free Software Foundation. + +You should have received a copy of the GNU General Public License and +a copy of the GCC Runtime Library Exception along with this program; +see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +. */ + +#ifdef __x86_64__ +#include "i386-asm.h" + +/* Epilogue routine for restoring 64-bit ms/sysv registers when hard frame + pointer is used. */ + + .text +MS2SYSV_STUB_BEGIN(resms64f_17) + mov -0x68(%rsi),%r15 +MS2SYSV_STUB_BEGIN(resms64f_16) + mov -0x60(%rsi),%r14 +MS2SYSV_STUB_BEGIN(resms64f_15) + mov -0x58(%rsi),%r13 +MS2SYSV_STUB_BEGIN(resms64f_14) + mov -0x50(%rsi),%r12 +MS2SYSV_STUB_BEGIN(resms64f_13) + mov -0x48(%rsi),%rbx +MS2SYSV_STUB_BEGIN(resms64f_12) + mov -0x40(%rsi),%rdi + SSE_RESTORE + mov -0x38(%rsi),%rsi + ret +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.S deleted file mode 100644 index acf34fa0837..00000000000 --- a/libgcc/config/i386/resms64fx.S +++ /dev/null @@ -1,57 +0,0 @@ -/* Epilogue stub for 64-bit ms/sysv clobbers: restore, leave and return - Copyright (C) 2016-2017 Free Software Foundation, Inc. - Contributed by Daniel Santos - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 3, or (at your option) -any later version. - -GCC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -Under Section 7 of GPL version 3, you are granted additional -permissions described in the GCC Runtime Library Exception, version -3.1, as published by the Free Software Foundation. - -You should have received a copy of the GNU General Public License and -a copy of the GCC Runtime Library Exception along with this program; -see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -. */ - -#ifdef __x86_64__ -#include "i386-asm.h" - -/* Epilogue routine for 64-bit ms/sysv registers when hard frame pointer - * used -- restores registers, restores frame pointer and then returns - * from the function. */ - - .text -HIDDEN_FUNC(__resms64fx_17) - mov -0x68(%rsi),%r15 -HIDDEN_FUNC(__resms64fx_16) - mov -0x60(%rsi),%r14 -HIDDEN_FUNC(__resms64fx_15) - mov -0x58(%rsi),%r13 -HIDDEN_FUNC(__resms64fx_14) - mov -0x50(%rsi),%r12 -HIDDEN_FUNC(__resms64fx_13) - mov -0x48(%rsi),%rbx -HIDDEN_FUNC(__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) - -#endif /* __x86_64__ */ diff --git a/libgcc/config/i386/resms64fx.h b/libgcc/config/i386/resms64fx.h new file mode 100644 index 00000000000..965807a1299 --- /dev/null +++ b/libgcc/config/i386/resms64fx.h @@ -0,0 +1,57 @@ +/* Epilogue stub for 64-bit ms/sysv clobbers: restore, leave and return + Copyright (C) 2016-2017 Free Software Foundation, Inc. + Contributed by Daniel Santos + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3, or (at your option) +any later version. + +GCC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +Under Section 7 of GPL version 3, you are granted additional +permissions described in the GCC Runtime Library Exception, version +3.1, as published by the Free Software Foundation. + +You should have received a copy of the GNU General Public License and +a copy of the GCC Runtime Library Exception along with this program; +see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +. */ + +#ifdef __x86_64__ +#include "i386-asm.h" + +/* Epilogue routine for 64-bit ms/sysv registers when hard frame pointer + * used -- restores registers, restores frame pointer and then returns + * from the function. */ + + .text +MS2SYSV_STUB_BEGIN(resms64fx_17) + mov -0x68(%rsi),%r15 +MS2SYSV_STUB_BEGIN(resms64fx_16) + mov -0x60(%rsi),%r14 +MS2SYSV_STUB_BEGIN(resms64fx_15) + mov -0x58(%rsi),%r13 +MS2SYSV_STUB_BEGIN(resms64fx_14) + mov -0x50(%rsi),%r12 +MS2SYSV_STUB_BEGIN(resms64fx_13) + mov -0x48(%rsi),%rbx +MS2SYSV_STUB_BEGIN(resms64fx_12) + mov -0x40(%rsi),%rdi + SSE_RESTORE + mov -0x38(%rsi),%rsi + leaveq + ret +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.S deleted file mode 100644 index e27aab7d881..00000000000 --- a/libgcc/config/i386/resms64x.S +++ /dev/null @@ -1,59 +0,0 @@ -/* Epilogue stub for 64-bit ms/sysv clobbers: restore and return - Copyright (C) 2016-2017 Free Software Foundation, Inc. - Contributed by Daniel Santos - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 3, or (at your option) -any later version. - -GCC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -Under Section 7 of GPL version 3, you are granted additional -permissions described in the GCC Runtime Library Exception, version -3.1, as published by the Free Software Foundation. - -You should have received a copy of the GNU General Public License and -a copy of the GCC Runtime Library Exception along with this program; -see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -. */ - -#ifdef __x86_64__ -#include "i386-asm.h" - -/* Epilogue routine for restoring 64-bit ms/sysv registers and returning from - * function. */ - - .text -HIDDEN_FUNC(__resms64x_18) - mov -0x70(%rsi),%r15 -HIDDEN_FUNC(__resms64x_17) - mov -0x68(%rsi),%r14 -HIDDEN_FUNC(__resms64x_16) - mov -0x60(%rsi),%r13 -HIDDEN_FUNC(__resms64x_15) - mov -0x58(%rsi),%r12 -HIDDEN_FUNC(__resms64x_14) - mov -0x50(%rsi),%rbp -HIDDEN_FUNC(__resms64x_13) - mov -0x48(%rsi),%rbx -HIDDEN_FUNC(__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) - -#endif /* __x86_64__ */ diff --git a/libgcc/config/i386/resms64x.h b/libgcc/config/i386/resms64x.h new file mode 100644 index 00000000000..689a1dec20b --- /dev/null +++ b/libgcc/config/i386/resms64x.h @@ -0,0 +1,59 @@ +/* Epilogue stub for 64-bit ms/sysv clobbers: restore and return + Copyright (C) 2016-2017 Free Software Foundation, Inc. + Contributed by Daniel Santos + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3, or (at your option) +any later version. + +GCC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +Under Section 7 of GPL version 3, you are granted additional +permissions described in the GCC Runtime Library Exception, version +3.1, as published by the Free Software Foundation. + +You should have received a copy of the GNU General Public License and +a copy of the GCC Runtime Library Exception along with this program; +see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +. */ + +#ifdef __x86_64__ +#include "i386-asm.h" + +/* Epilogue routine for restoring 64-bit ms/sysv registers and returning from + * function. */ + + .text +MS2SYSV_STUB_BEGIN(resms64x_18) + mov -0x70(%rsi),%r15 +MS2SYSV_STUB_BEGIN(resms64x_17) + mov -0x68(%rsi),%r14 +MS2SYSV_STUB_BEGIN(resms64x_16) + mov -0x60(%rsi),%r13 +MS2SYSV_STUB_BEGIN(resms64x_15) + mov -0x58(%rsi),%r12 +MS2SYSV_STUB_BEGIN(resms64x_14) + mov -0x50(%rsi),%rbp +MS2SYSV_STUB_BEGIN(resms64x_13) + mov -0x48(%rsi),%rbx +MS2SYSV_STUB_BEGIN(resms64x_12) + mov -0x40(%rsi),%rdi + SSE_RESTORE + mov -0x38(%rsi),%rsi + mov %r10,%rsp + ret +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.S deleted file mode 100644 index 44dda46ec54..00000000000 --- a/libgcc/config/i386/savms64.S +++ /dev/null @@ -1,57 +0,0 @@ -/* Prologue stub for 64-bit ms/sysv clobbers: save - Copyright (C) 2016-2017 Free Software Foundation, Inc. - Contributed by Daniel Santos - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 3, or (at your option) -any later version. - -GCC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -Under Section 7 of GPL version 3, you are granted additional -permissions described in the GCC Runtime Library Exception, version -3.1, as published by the Free Software Foundation. - -You should have received a copy of the GNU General Public License and -a copy of the GCC Runtime Library Exception along with this program; -see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -. */ - -#ifdef __x86_64__ -#include "i386-asm.h" - -/* Prologue routine for saving 64-bit ms/sysv registers. */ - - .text -HIDDEN_FUNC(__savms64_18) - mov %r15,-0x70(%rax) -HIDDEN_FUNC(__savms64_17) - mov %r14,-0x68(%rax) -HIDDEN_FUNC(__savms64_16) - mov %r13,-0x60(%rax) -HIDDEN_FUNC(__savms64_15) - mov %r12,-0x58(%rax) -HIDDEN_FUNC(__savms64_14) - mov %rbp,-0x50(%rax) -HIDDEN_FUNC(__savms64_13) - mov %rbx,-0x48(%rax) -HIDDEN_FUNC(__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) - -#endif /* __x86_64__ */ diff --git a/libgcc/config/i386/savms64.h b/libgcc/config/i386/savms64.h new file mode 100644 index 00000000000..28d5e3548ab --- /dev/null +++ b/libgcc/config/i386/savms64.h @@ -0,0 +1,57 @@ +/* Prologue stub for 64-bit ms/sysv clobbers: save + Copyright (C) 2016-2017 Free Software Foundation, Inc. + Contributed by Daniel Santos + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3, or (at your option) +any later version. + +GCC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +Under Section 7 of GPL version 3, you are granted additional +permissions described in the GCC Runtime Library Exception, version +3.1, as published by the Free Software Foundation. + +You should have received a copy of the GNU General Public License and +a copy of the GCC Runtime Library Exception along with this program; +see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +. */ + +#ifdef __x86_64__ +#include "i386-asm.h" + +/* Prologue routine for saving 64-bit ms/sysv registers. */ + + .text +MS2SYSV_STUB_BEGIN(savms64_18) + mov %r15,-0x70(%rax) +MS2SYSV_STUB_BEGIN(savms64_17) + mov %r14,-0x68(%rax) +MS2SYSV_STUB_BEGIN(savms64_16) + mov %r13,-0x60(%rax) +MS2SYSV_STUB_BEGIN(savms64_15) + mov %r12,-0x58(%rax) +MS2SYSV_STUB_BEGIN(savms64_14) + mov %rbp,-0x50(%rax) +MS2SYSV_STUB_BEGIN(savms64_13) + mov %rbx,-0x48(%rax) +MS2SYSV_STUB_BEGIN(savms64_12) + mov %rdi,-0x40(%rax) + mov %rsi,-0x38(%rax) + SSE_SAVE + ret +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.S deleted file mode 100644 index 64e91ac0394..00000000000 --- a/libgcc/config/i386/savms64f.S +++ /dev/null @@ -1,55 +0,0 @@ -/* Prologue stub for 64-bit ms/sysv clobbers: save (with hard frame pointer) - Copyright (C) 2016-2017 Free Software Foundation, Inc. - Contributed by Daniel Santos - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 3, or (at your option) -any later version. - -GCC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -Under Section 7 of GPL version 3, you are granted additional -permissions described in the GCC Runtime Library Exception, version -3.1, as published by the Free Software Foundation. - -You should have received a copy of the GNU General Public License and -a copy of the GCC Runtime Library Exception along with this program; -see the files COPYING3 and COPYING.RUNTIME respectively. If not, see -. */ - -#ifdef __x86_64__ -#include "i386-asm.h" - -/* Prologue routine for saving 64-bit ms/sysv registers when realignment is - * needed or hard frame pointer used. */ - - .text -HIDDEN_FUNC(__savms64f_17) - mov %r15,-0x68(%rax) -HIDDEN_FUNC(__savms64f_16) - mov %r14,-0x60(%rax) -HIDDEN_FUNC(__savms64f_15) - mov %r13,-0x58(%rax) -HIDDEN_FUNC(__savms64f_14) - mov %r12,-0x50(%rax) -HIDDEN_FUNC(__savms64f_13) - mov %rbx,-0x48(%rax) -HIDDEN_FUNC(__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) - -#endif /* __x86_64__ */ diff --git a/libgcc/config/i386/savms64f.h b/libgcc/config/i386/savms64f.h new file mode 100644 index 00000000000..723e1080f5c --- /dev/null +++ b/libgcc/config/i386/savms64f.h @@ -0,0 +1,55 @@ +/* Prologue stub for 64-bit ms/sysv clobbers: save (with hard frame pointer) + Copyright (C) 2016-2017 Free Software Foundation, Inc. + Contributed by Daniel Santos + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3, or (at your option) +any later version. + +GCC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +Under Section 7 of GPL version 3, you are granted additional +permissions described in the GCC Runtime Library Exception, version +3.1, as published by the Free Software Foundation. + +You should have received a copy of the GNU General Public License and +a copy of the GCC Runtime Library Exception along with this program; +see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +. */ + +#ifdef __x86_64__ +#include "i386-asm.h" + +/* Prologue routine for saving 64-bit ms/sysv registers when realignment is + * needed or hard frame pointer used. */ + + .text +MS2SYSV_STUB_BEGIN(savms64f_17) + mov %r15,-0x68(%rax) +MS2SYSV_STUB_BEGIN(savms64f_16) + mov %r14,-0x60(%rax) +MS2SYSV_STUB_BEGIN(savms64f_15) + mov %r13,-0x58(%rax) +MS2SYSV_STUB_BEGIN(savms64f_14) + mov %r12,-0x50(%rax) +MS2SYSV_STUB_BEGIN(savms64f_13) + mov %rbx,-0x48(%rax) +MS2SYSV_STUB_BEGIN(savms64f_12) + mov %rdi,-0x40(%rax) + mov %rsi,-0x38(%rax) + SSE_SAVE + ret +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