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* \