diff options
author | Daniel Santos <daniel.santos@pobox.com> | 2017-09-17 22:04:40 +0000 |
---|---|---|
committer | Daniel Santos <dansan@gcc.gnu.org> | 2017-09-17 22:04:40 +0000 |
commit | 3cb626e4f7cebadf907f5e09f2432f0838f73ff9 (patch) | |
tree | e791665e16c2e5c65230207cf93169c1a71c3801 /gcc | |
parent | 01f44e44faf37fc34775b9e28e46d1c9243b247d (diff) | |
download | gcc-3cb626e4f7cebadf907f5e09f2432f0838f73ff9.zip gcc-3cb626e4f7cebadf907f5e09f2432f0838f73ff9.tar.gz gcc-3cb626e4f7cebadf907f5e09f2432f0838f73ff9.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr82196-1.c | 14 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr82196-2.c | 14 |
5 files changed, 50 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b09c7ce..fcfcfbb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2017-09-17 Daniel Santos <daniel.santos@pobox.com> + + 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 <hongjiu.lu@intel.com> PR target/82166 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 4f0414f..1ed6f75 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 47de348..d2aa605 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-09-17 Daniel Santos <daniel.santos@pobox.com> + + gcc.target/i386/pr82196-1.c: New test. + gcc.target/i386/pr82196-2.c: Likewise. + 2017-09-17 H.J. Lu <hongjiu.lu@intel.com> 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 0000000..ef85832 --- /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 0000000..8fe5841 --- /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 (); +} |