This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH v4 0/12] [i386] Improve 64-bit Microsoft to System V ABI pro/epilogues


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.santos@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.santos@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.santos@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.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]