about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux/s390/htm.h
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/unix/sysv/linux/s390/htm.h')
-rw-r--r--sysdeps/unix/sysv/linux/s390/htm.h187
1 files changed, 0 insertions, 187 deletions
diff --git a/sysdeps/unix/sysv/linux/s390/htm.h b/sysdeps/unix/sysv/linux/s390/htm.h
deleted file mode 100644
index 70d7f66000..0000000000
--- a/sysdeps/unix/sysv/linux/s390/htm.h
+++ /dev/null
@@ -1,187 +0,0 @@
-/* Shared HTM header.  Work around false transactional execution facility
-   intrinsics.
-
-   Copyright (C) 2016-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, see
-   <http://www.gnu.org/licenses/>.  */
-
-#ifndef _HTM_H
-#define _HTM_H 1
-
-#include <htmintrin.h>
-
-#ifdef __s390x__
-# define TX_FPRS_BYTES 64
-# define TX_SAVE_FPRS						\
-  "   std %%f8, 0(%[R_FPRS])\n\t"				\
-  "   std %%f9, 8(%[R_FPRS])\n\t"				\
-  "   std %%f10, 16(%[R_FPRS])\n\t"				\
-  "   std %%f11, 24(%[R_FPRS])\n\t"				\
-  "   std %%f12, 32(%[R_FPRS])\n\t"				\
-  "   std %%f13, 40(%[R_FPRS])\n\t"				\
-  "   std %%f14, 48(%[R_FPRS])\n\t"				\
-  "   std %%f15, 56(%[R_FPRS])\n\t"
-
-# define TX_RESTORE_FPRS					\
-  "   ld %%f8, 0(%[R_FPRS])\n\t"				\
-  "   ld %%f9, 8(%[R_FPRS])\n\t"				\
-  "   ld %%f10, 16(%[R_FPRS])\n\t"				\
-  "   ld %%f11, 24(%[R_FPRS])\n\t"				\
-  "   ld %%f12, 32(%[R_FPRS])\n\t"				\
-  "   ld %%f13, 40(%[R_FPRS])\n\t"				\
-  "   ld %%f14, 48(%[R_FPRS])\n\t"				\
-  "   ld %%f15, 56(%[R_FPRS])\n\t"
-
-#else
-
-# define TX_FPRS_BYTES 16
-# define TX_SAVE_FPRS						\
-  "   std %%f4, 0(%[R_FPRS])\n\t"				\
-  "   std %%f6, 8(%[R_FPRS])\n\t"
-
-# define TX_RESTORE_FPRS					\
-  "   ld %%f4, 0(%[R_FPRS])\n\t"				\
-  "   ld %%f6, 8(%[R_FPRS])\n\t"
-
-#endif /* ! __s390x__  */
-
-/* Use own inline assembly instead of __builtin_tbegin, as tbegin
-   has to filter program interruptions which can't be done with the builtin.
-   Now the fprs have to be saved / restored here, too.
-   The fpc is also not saved / restored with the builtin.
-   The used inline assembly does not clobber the volatile fprs / vrs!
-   Clobbering the latter ones would force the compiler to save / restore
-   the call saved fprs as those overlap with the vrs, but they only need to be
-   restored if the transaction fails but not if the transaction is successfully
-   started.  Thus the user of the tbegin macros in this header file has to
-   compile the file / function with -msoft-float.  It prevents gcc from using
-   fprs / vrs.  */
-#define __libc_tbegin(tdb) __libc_tbegin_base(tdb,,,)
-
-#define __libc_tbegin_retry_output_regs , [R_TX_CNT] "+&d" (__tx_cnt)
-#define __libc_tbegin_retry_input_regs(retry_cnt) , [R_RETRY] "d" (retry_cnt)
-#define __libc_tbegin_retry_abort_path_insn				\
-  /* If tbegin returned _HTM_TBEGIN_TRANSIENT, retry immediately so	\
-     that max tbegin_cnt transactions are tried.  Otherwise return and	\
-     let the caller of this macro do the fallback path.  */		\
-  "   jnh 1f\n\t" /* cc 1/3: jump to fallback path.  */			\
-  /* tbegin returned _HTM_TBEGIN_TRANSIENT: retry with transaction.  */ \
-  "   crje %[R_TX_CNT], %[R_RETRY], 1f\n\t" /* Reached max retries?  */	\
-  "   ahi %[R_TX_CNT], 1\n\t"						\
-  "   ppa %[R_TX_CNT], 0, 1\n\t" /* Transaction-Abort Assist.  */	\
-  "   j 2b\n\t" /* Loop to tbegin.  */
-
-/* Same as __libc_tbegin except if tbegin aborts with _HTM_TBEGIN_TRANSIENT.
-   Then this macros restores the fpc, fprs and automatically retries up to
-   retry_cnt tbegins.  Further saving of the state is omitted as it is already
-   saved.  This macro calls tbegin at most as retry_cnt + 1 times.  */
-#define __libc_tbegin_retry(tdb, retry_cnt)				\
-  ({ int __ret;								\
-    int __tx_cnt = 0;							\
-    __ret = __libc_tbegin_base(tdb,					\
-			       __libc_tbegin_retry_abort_path_insn,	\
-			       __libc_tbegin_retry_output_regs,		\
-			       __libc_tbegin_retry_input_regs(retry_cnt)); \
-    __ret;								\
-  })
-
-#define __libc_tbegin_base(tdb, abort_path_insn, output_regs, input_regs) \
-  ({ int __ret;								\
-     int __fpc;								\
-     char __fprs[TX_FPRS_BYTES];					\
-     __asm__ __volatile__ (".machine push\n\t"				\
-			   ".machinemode \"zarch_nohighgprs\"\n\t"	\
-			   ".machine \"all\"\n\t"			\
-			   /* Save state at the outermost transaction.	\
-			      As extracting nesting depth is expensive	\
-			      on at least zEC12, save fprs at inner	\
-			      transactions, too.			\
-			      The fpc and fprs are saved here as they	\
-			      are not saved by tbegin.  There exist no	\
-			      call-saved vrs, thus they are not saved	\
-			      here.  */					\
-			   "   efpc %[R_FPC]\n\t"			\
-			   TX_SAVE_FPRS					\
-			   /* Begin transaction: save all gprs, allow	\
-			      ar modification and fp operations.  Some	\
-			      program-interruptions (e.g. a null	\
-			      pointer access) are filtered and the	\
-			      transaction will abort.  In this case	\
-			      the normal lock path will execute it	\
-			      again and result in a core dump wich does	\
-			      now show at tbegin but the real executed	\
-			      instruction.				\
-			      However it is not guaranteed that this	\
-			      retry operate on the same data and thus	\
-			      may not end in an program-interruption.	\
-			      Note: This could also be used to probe	\
-			      memory for being accessible!  */		\
-			   "2: tbegin 0, 0xFF0E\n\t"			\
-			   /* Branch away in abort case (this is the	\
-			      prefered sequence.  See PoP in chapter 5	\
-			      Transactional-Execution Facility		\
-			      Operation).  */				\
-			   "   jnz 0f\n\t"				\
-			   /* Transaction has successfully started.  */	\
-			   "   lhi %[R_RET], 0\n\t"			\
-			   "   j 1f\n\t"				\
-			   /* Transaction has aborted.  Now we are at	\
-			      the outermost transaction.  Restore fprs	\
-			      and fpc. */				\
-			   "0: ipm %[R_RET]\n\t"			\
-			   "   srl %[R_RET], 28\n\t"			\
-			   "   sfpc %[R_FPC]\n\t"			\
-			   TX_RESTORE_FPRS				\
-			   abort_path_insn				\
-			   "1:\n\t"					\
-			   ".machine pop\n"				\
-			   : [R_RET] "=&d" (__ret),			\
-			     [R_FPC] "=&d" (__fpc)			\
-			     output_regs				\
-			   : [R_FPRS] "a" (__fprs)			\
-			     input_regs					\
-			   : "cc", "memory");				\
-     __ret;								\
-     })
-
-/* These builtins are usable in context of glibc lock elision code without any
-   changes.  Use them.  */
-#define __libc_tend()							\
-  ({ __asm__ __volatile__ (".machine push\n\t"				\
-			   ".machinemode \"zarch_nohighgprs\"\n\t"	\
-			   ".machine \"all\"\n\t");			\
-    int __ret = __builtin_tend ();					\
-    __asm__ __volatile__ (".machine pop");				\
-    __ret;								\
-  })
-
-#define __libc_tabort(abortcode)					\
-  __asm__ __volatile__ (".machine push\n\t"				\
-			".machinemode \"zarch_nohighgprs\"\n\t"		\
-			".machine \"all\"\n\t");			\
-  __builtin_tabort (abortcode);						\
-  __asm__ __volatile__ (".machine pop")
-
-#define __libc_tx_nesting_depth() \
-  ({ __asm__ __volatile__ (".machine push\n\t"				\
-			   ".machinemode \"zarch_nohighgprs\"\n\t"	\
-			   ".machine \"all\"\n\t");			\
-    int __ret = __builtin_tx_nesting_depth ();				\
-    __asm__ __volatile__ (".machine pop");				\
-    __ret;								\
-  })
-
-#endif