All of patches are concerned with 64-bit Microsoft ABI functions that
call System V ABI function which clobbers RSI, RDI and XMM6-15 and are
aimed at improving performance and .text size of Wine 64. I had
previously submitted these as separate patch sets, but have combined
them for simplicity. (Does this make the ChangeLogs too big? Please let
me know if you want me to break these back apart.) Below are the
included patchsets and a summary of changes since the previous post(s):
1.) PR78962 Use aligned SSE movs for re-aligned MS ABI pro/epilogues.
https://gcc.gnu.org/ml/gcc-patches/2016-12/msg01859.html
Changes:
* The SEH unwind emit code (in winnt.c) does not currently support
CFA_REG_EXPRESSION, which is required to make this work, so I have
disabled it on SEH targets.
* Updated comments on CFA_REG_EXPRESSION in winnt.c.
2.) Add option to call out-of-line stubs instead of emitting inline
saves and restores. https://gcc.gnu.org/ml/gcc-patches/2017-02/msg00548.html
Changes:
* Renamed option from -moutline-msabi-xlogues to -mcall-ms2sysv-xlogues
* Since this patch set depends upon aligned SSE MOVs after stack
realignment, I have disabled it on SEH targets with a sorry().
* I was previously trying to cache the rtx for symbols to the libgcc
stubs instead of creating new ones, but this caused problems in
subsequent passes and it was disabled with a "TODO" comment. I have
removed this code, as well as the rtx cache that was just wasting
memory in class xlogue_layout.
* Improved comment documentation.
3.) A comprehensive test program to validate correct behavior in these
pro- and epilogues. https://gcc.gnu.org/ml/gcc-patches/2017-02/msg00542.html
Changes:
* The previous version repeated all tests for each -j<jobs> instead of
running in parallel. I have fixed this implementing a primitive but
effective file-based parallelization scheme.
* I noticed that there was gcc/testsuite/gcc.target/x86_64/abi
directory for tests specific to testing 64-bit abi issues, so I've
moved my tests to an "ms-sysv" subdirectory of that (instead of
gcc/testsuite/gcc.target/i386/msabi).
* Fixed breakages on Cygwin.
* Corrected a bad "_noinfo" optimization barrier (function call by
volatile pointer).
* Minor cleanup/improvements.
gcc/Makefile.in | 2 +
gcc/config/i386/i386.c | 916 +++++++++++++++++++--
gcc/config/i386/i386.h | 33 +-
gcc/config/i386/i386.opt | 4 +
gcc/config/i386/predicates.md | 155 ++++
gcc/config/i386/sse.md | 37 +
gcc/config/i386/winnt.c | 3 +-
gcc/doc/invoke.texi | 13 +-
.../gcc.target/x86_64/abi/ms-sysv/do-test.S | 163 ++++
gcc/testsuite/gcc.target/x86_64/abi/ms-sysv/gen.cc | 807 ++++++++++++++++++
.../gcc.target/x86_64/abi/ms-sysv/ms-sysv.c | 373 +++++++++
.../gcc.target/x86_64/abi/ms-sysv/ms-sysv.exp | 178 ++++
libgcc/config.host | 2 +-
libgcc/config/i386/i386-asm.h | 82 ++
libgcc/config/i386/resms64.S | 57 ++
libgcc/config/i386/resms64f.S | 55 ++
libgcc/config/i386/resms64fx.S | 57 ++
libgcc/config/i386/resms64x.S | 59 ++
libgcc/config/i386/savms64.S | 57 ++
libgcc/config/i386/savms64f.S | 55 ++
libgcc/config/i386/t-msabi | 7 +
21 files changed, 3020 insertions(+), 95 deletions(-)
gcc/ChangeLog:
2017-04-25 Daniel Santos<daniel.san...@pobox.com>
* config/i386/i386.opt: Add option -mcall-ms2sysv-xlogues.
* config/i386/i386.h
(x86_64_ms_sysv_extra_clobbered_registers): Change type to unsigned.
(NUM_X86_64_MS_CLOBBERED_REGS): New macro.
(struct machine_function): Add new members call_ms2sysv,
call_ms2sysv_pad_in, call_ms2sysv_pad_out and call_ms2sysv_extra_regs.
(struct machine_frame_state): New fields sp_realigned and
sp_realigned_offset.
* config/i386/i386.c
(enum xlogue_stub): New enum.
(enum xlogue_stub_sets): New enum.
(class xlogue_layout): New class.
(struct ix86_frame): New fields stack_realign_allocate_offset,
stack_realign_offset and outlined_save_offset. Modify comments to
detail stack layout when using out-of-line stubs.
(ix86_target_string): Add -mcall-ms2sysv-xlogues option.
(ix86_option_override_internal): Add sorry() for TARGET_SEH and
-mcall-ms2sysv-xlogues.
(stub_managed_regs): New static variable.
(ix86_save_reg): Add new parameter ignore_outlined to optionally omit
registers managed by out-of-line stub.
(disable_call_ms2sysv_xlogues): New function.
(ix86_compute_frame_layout): Modify re-alignment calculations, disable
m->call_ms2sysv when appropriate and compute frame layout for
out-of-line stubs.
(sp_valid_at, fp_valid_at): New inline functions.
(choose_basereg): New function.
(choose_baseaddr): Add align parameter, use choose_basereg and modify
all callers.
(ix86_emit_save_reg_using_mov, ix86_emit_restore_sse_regs_using_mov):
Use align parameter of choose_baseaddr to generated aligned SSE movs
when possible.
(pro_epilogue_adjust_stack): Modify to track
machine_frame_state::sp_realigned.
(ix86_nsaved_regs): Modify to accommodate changes to ix86_save_reg.
(ix86_nsaved_sseregs): Likewise.
(ix86_emit_save_regs): Likewise.
(ix86_emit_save_regs_using_mov): Likewise.
(ix86_emit_save_sse_regs_using_mov): Likewise.
(get_scratch_register_on_entry): Likewise.
(gen_frame_set): New function.
(gen_frame_load): Likewise.
(gen_frame_store): Likewise.
(emit_outlined_ms2sysv_save): Likewise.
(emit_outlined_ms2sysv_restore): Likewise.
(ix86_expand_prologue): Modify stack re-alignment code and call
emit_outlined_ms2sysv_save when appropriate.
(ix86_emit_leave): Clear machine_frame_state::sp_realigned. Add
parameter rtx_insn *insn, which allows the function to be used to only
generate the notes.
(ix86_expand_epilogue): Modify validity checks of frame and stack
pointers, and call emit_outlined_ms2sysv_restore when appropriate.
(ix86_expand_call): Modify to enable m->call_ms2sysv when appropriate.
* config/i386/predicates.md
(save_multiple): New predicate.
(restore_multiple): Likewise.
* config/i386/sse.md
(save_multiple<mode>): New pattern.
(save_multiple_realign<mode>): Likewise.
(restore_multiple<mode>): Likewise.
(restore_multiple_and_return<mode>): Likewise.
(restore_multiple_leave_return<mode>): Likewise.
* Makefile.in: Export HOSTCXX and HOSTCXXFLAGS to site.exp
gcc/testsuite/ChangeLog:
2017-04-25 Daniel Santos<daniel.san...@pobox.com>
* config.host: Add i386/t-msabi to i386/t-linux file list.
* config/i386/i386-asm.h: New file.
* config/i386/resms64.S: New file.
* config/i386/resms64f.S: New file.
* config/i386/resms64fx.S: New file.
* config/i386/resms64x.S: New file.
* config/i386/savms64.S: New file.
* config/i386/savms64f.S: New file.
* config/i386/t-msabi: New file.
libgcc/ChangeLog:
2017-04-25 Daniel Santos<daniel.san...@pobox.com>
* gcc.target/x86_64/abi/ms-sysv/do-test.S: New file.
* gcc.target/x86_64/abi/ms-sysv/gen.cc: Likewise.
* gcc.target/x86_64/abi/ms-sysv/ms-sysv.c: Likewise.
* gcc.target/x86_64/abi/ms-sysv/ms-sysv.exp: Likewise.