Dominik Vogt wrote: > On Mon, Mar 27, 2017 at 09:27:35PM +0100, Dominik Vogt wrote: > > The attached patch optimizes the atomic_exchange and > > atomic_compare patterns on s390 and s390x (mostly limited to > > SImode and DImode). Among general optimizaation, the changes fix > > most of the problems reported in PR 80080: > > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80080 > > > > Bootstrapped and regression tested on a zEC12 with s390 and s390x > > biarch. > > v5: > * Generate LT pattern directly for const 0 value. > * Split into three patches. > > Bootstrapped and regression tested on a zEC12 with s390 and s390x > biarch.
> gcc/ChangeLog-dv-atomic-gcc7-1 > > * config/s390/s390.md ("cstorecc4"): Use load-on-condition and deal > with CCZmode for TARGET_Z196. > gcc/ChangeLog-dv-atomic-gcc7-2 > > * config/s390/s390.md (define_peephole2): New peephole to help > combining the load-and-test pattern with volatile memory. > gcc/ChangeLog-dv-atomic-gcc7-3 > > * s390-protos.h (s390_expand_cs_hqi): Removed. > (s390_expand_cs, s390_expand_atomic_exchange_tdsi): New prototypes. > * config/s390/s390.c (s390_emit_compare_and_swap): Handle all integer > modes as well as CCZ1mode and CCZmode. > (s390_expand_atomic_exchange_tdsi, s390_expand_atomic): Adapt to new > signature of s390_emit_compare_and_swap. > (s390_expand_cs_hqi): Likewise, make static. > (s390_expand_cs_tdsi): Generate an explicit compare before trying > compare-and-swap, in some cases. > (s390_expand_cs): Wrapper function. > (s390_expand_atomic_exchange_tdsi): New backend specific expander for > atomic_exchange. > (s390_match_ccmode_set): Allow CCZmode <-> CCZ1 mode. > * config/s390/s390.md ("atomic_compare_and_swap<mode>"): Merge the > patterns for small and large integers. Forbid symref memory operands. > Move expander to s390.c. Require cc register. > ("atomic_compare_and_swap<DGPR:mode><CCZZ1:mode>_internal") > ("*atomic_compare_and_swap<TDI:mode><CCZZ1:mode>_1") > ("*atomic_compare_and_swapdi<CCZZ1:mode>_2") > ("*atomic_compare_and_swapsi<CCZZ1:mode>_3"): Use s_operand to forbid > symref memory operands. Remove CC mode and call s390_match_ccmode > instead. > ("atomic_exchange<mode>"): Allow and implement all integer modes. > > gcc/testsuite/ChangeLog-dv-atomic-gcc7 > > * gcc.target/s390/md/atomic_compare_exchange-1.c: New test. > * gcc.target/s390/md/atomic_compare_exchange-1.inc: New test. > * gcc.target/s390/md/atomic_exchange-1.inc: New test. These all look good to me now. Thanks, Ulrich -- Dr. Ulrich Weigand GNU/Linux compilers and toolchain ulrich.weig...@de.ibm.com