diff --git a/libatomic/ChangeLog b/libatomic/ChangeLog index 231270776a73a5d702a7f446b1eb3b0700a37226..81aaba4b11f5c3a42325db04fbd37885553fde0e 100644 --- a/libatomic/ChangeLog +++ b/libatomic/ChangeLog @@ -1,3 +1,8 @@ +2018-03-09 Andreas Krebbel <krebbel@linux.vnet.ibm.com> + + * config/s390/exch_n.c: New file. + * configure.tgt: Add the config directory for s390. + 2018-02-14 Igor Tsimbalist <igor.v.tsimbalist@intel.com> PR target/84148 diff --git a/libatomic/config/s390/exch_n.c b/libatomic/config/s390/exch_n.c new file mode 100644 index 0000000000000000000000000000000000000000..b2340b4aa6a76826d117bd41604585b9fa7d9509 --- /dev/null +++ b/libatomic/config/s390/exch_n.c @@ -0,0 +1,69 @@ +/* Copyright (C) 2018 Free Software Foundation, Inc. + Contributed by Andreas Krebbel <krebbel@linux.vnet.ibm.com> + + This file is part of the GNU Atomic Library (libatomic). + + Libatomic is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + Libatomic is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. + + Under Section 7 of GPL version 3, you are granted additional + permissions described in the GCC Runtime Library Exception, version + 3.1, as published by the Free Software Foundation. + + You should have received a copy of the GNU General Public License and + a copy of the GCC Runtime Library Exception along with this program; + see the files COPYING3 and COPYING.RUNTIME respectively. If not, see + <http://www.gnu.org/licenses/>. */ + +#include <libatomic_i.h> + + +/* The compiler builtin will use the hardware instruction cdsg if the + memory operand is properly aligned and will fall back to the + library call otherwise. + + In case the compiler for one part is able to detect that the + location is aligned and fails to do so for another usage of the hw + instruction and the sw fall back would be mixed on the same memory + location. To avoid this the library fall back also has to use the + hardware instruction if possible. */ + +#if !DONE && N == 16 +UTYPE +SIZE(libat_exchange) (UTYPE *mptr, UTYPE newval, int smodel UNUSED) +{ + if (!((uintptr_t)mptr & 0xf)) + { + /* Use the builtin only if the memory operand is 16 byte + aligned. */ + return __atomic_exchange_n ((UTYPE *)__builtin_assume_aligned (mptr, 16), + newval, __ATOMIC_SEQ_CST); + } + else + { + UTYPE oldval; + UWORD magic; + + pre_seq_barrier (smodel); + magic = protect_start (mptr); + + oldval = *mptr; + *mptr = newval; + + protect_end (mptr, magic); + post_seq_barrier (smodel); + + return oldval; + } +} +#define DONE 1 +#endif /* N == 16 */ + +#include "../../exch_n.c" diff --git a/libatomic/configure.tgt b/libatomic/configure.tgt index 807ef10f058bf59efd211b04646ded38994407ce..ea8c34f8c710cc40b5646b665c24cc0933a92c73 100644 --- a/libatomic/configure.tgt +++ b/libatomic/configure.tgt @@ -129,6 +129,11 @@ case "${target}" in config_path="${config_path} linux/arm posix" ;; + s390*-*-linux*) + # OS support for atomic primitives. + config_path="${config_path} s390 posix" + ;; + *-*-linux* | *-*-gnu* | *-*-k*bsd*-gnu \ | *-*-netbsd* | *-*-freebsd* | *-*-openbsd* | *-*-dragonfly* \ | *-*-solaris2* | *-*-sysv4* | *-*-irix6* | *-*-osf* | *-*-hpux11* \