From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 50145 invoked by alias); 27 Apr 2017 08:00:42 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 49671 invoked by uid 89); 27 Apr 2017 08:00:21 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-7.3 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_3,RCVD_IN_DNSWL_LOW,RP_MATCHES_RCVD,SPF_PASS autolearn=ham version=3.3.2 spammy=Wine, seh, H*F:D*pobox.com, H*Ad:U*hubicka X-HELO: sasl.smtp.pobox.com Received: from pb-smtp1.pobox.com (HELO sasl.smtp.pobox.com) (64.147.108.70) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 27 Apr 2017 08:00:18 +0000 Received: from sasl.smtp.pobox.com (unknown [127.0.0.1]) by pb-smtp1.pobox.com (Postfix) with ESMTP id 9B43482A12; Thu, 27 Apr 2017 04:00:17 -0400 (EDT) Received: from pb-smtp1.nyi.icgroup.com (unknown [127.0.0.1]) by pb-smtp1.pobox.com (Postfix) with ESMTP id 902DC82A11; Thu, 27 Apr 2017 04:00:16 -0400 (EDT) Received: from [192.168.1.4] (unknown [76.215.41.237]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by pb-smtp1.pobox.com (Postfix) with ESMTPSA id B922782A0D; Thu, 27 Apr 2017 04:00:15 -0400 (EDT) From: Daniel Santos Subject: [PATCH v4 0/12] [i386] Improve 64-bit Microsoft to System V ABI pro/epilogues To: gcc-patches Cc: Uros Bizjak , Jan Hubicka Message-ID: <49e81c0b-07a4-22df-d7c3-2439177ac7cf@pobox.com> Date: Thu, 27 Apr 2017 08:05:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.5.1 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-Pobox-Relay-ID: 8C867B70-2B1F-11E7-85AE-E680B56B9B0B-06139138!pb-smtp1.pobox.com X-IsSubscribed: yes X-SW-Source: 2017-04/txt/msg01341.txt.bz2 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 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 * 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): New pattern. (save_multiple_realign): Likewise. (restore_multiple): Likewise. (restore_multiple_and_return): Likewise. (restore_multiple_leave_return): Likewise. * Makefile.in: Export HOSTCXX and HOSTCXXFLAGS to site.exp gcc/testsuite/ChangeLog: 2017-04-25 Daniel Santos * 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 * 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.