a2cf7d
From 33f3c934e3023b85c3774ee0482ec4da2a10a3b5 Mon Sep 17 00:00:00 2001
a2cf7d
From: Stefan Liebler <stli@linux.ibm.com>
a2cf7d
Date: Wed, 11 Dec 2019 15:09:32 +0100
a2cf7d
Subject: [PATCH 24/28] S390: Implement math-barriers math_opt_barrier and
a2cf7d
 math_force_eval.
a2cf7d
a2cf7d
This patch implements the s390 specific math barriers in order
a2cf7d
to omit the store and load from stack if possible.
a2cf7d
a2cf7d
(cherry picked from commit 433a2ba68cd91842546e0f0d43d65835634d570d)
a2cf7d
---
a2cf7d
 sysdeps/s390/fpu/math-barriers.h | 46 ++++++++++++++++++++++++++++++++
a2cf7d
 1 file changed, 46 insertions(+)
a2cf7d
 create mode 100644 sysdeps/s390/fpu/math-barriers.h
a2cf7d
a2cf7d
diff --git a/sysdeps/s390/fpu/math-barriers.h b/sysdeps/s390/fpu/math-barriers.h
a2cf7d
new file mode 100644
a2cf7d
index 0000000000..7c3e6b15e0
a2cf7d
--- /dev/null
a2cf7d
+++ b/sysdeps/s390/fpu/math-barriers.h
a2cf7d
@@ -0,0 +1,46 @@
a2cf7d
+/* Control when floating-point expressions are evaluated.  s390 version.
a2cf7d
+   Copyright (C) 2019 Free Software Foundation, Inc.
a2cf7d
+   This file is part of the GNU C Library.
a2cf7d
+
a2cf7d
+   The GNU C Library is free software; you can redistribute it and/or
a2cf7d
+   modify it under the terms of the GNU Lesser General Public
a2cf7d
+   License as published by the Free Software Foundation; either
a2cf7d
+   version 2.1 of the License, or (at your option) any later version.
a2cf7d
+
a2cf7d
+   The GNU C Library is distributed in the hope that it will be useful,
a2cf7d
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
a2cf7d
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
a2cf7d
+   Lesser General Public License for more details.
a2cf7d
+
a2cf7d
+   You should have received a copy of the GNU Lesser General Public
a2cf7d
+   License along with the GNU C Library; if not, see
a2cf7d
+   <https://www.gnu.org/licenses/>.  */
a2cf7d
+
a2cf7d
+#ifndef S390_MATH_BARRIERS_H
a2cf7d
+#define S390_MATH_BARRIERS_H 1
a2cf7d
+
a2cf7d
+#ifdef HAVE_S390_VX_GCC_SUPPORT
a2cf7d
+# define ASM_CONSTRAINT_VR "v"
a2cf7d
+#else
a2cf7d
+# define ASM_CONSTRAINT_VR
a2cf7d
+#endif
a2cf7d
+
a2cf7d
+#define math_opt_barrier(x)						\
a2cf7d
+  ({ __typeof (x) __x = (x);						\
a2cf7d
+    if (__builtin_types_compatible_p (__typeof (x), _Float128))		\
a2cf7d
+      __asm__ ("# math_opt_barrier_f128 %0" : "+fm" (__x));		\
a2cf7d
+    else								\
a2cf7d
+      __asm__ ("# math_opt_barrier %0"					\
a2cf7d
+	       : "+f" ASM_CONSTRAINT_VR "m" (__x));			\
a2cf7d
+    __x; })
a2cf7d
+#define math_force_eval(x)						\
a2cf7d
+  ({ __typeof (x) __x = (x);						\
a2cf7d
+    if (__builtin_types_compatible_p (__typeof (x), _Float128))		\
a2cf7d
+      __asm__ __volatile__ ("# math_force_eval_f128 %0"			\
a2cf7d
+			    : : "fm" (__x));				\
a2cf7d
+    else								\
a2cf7d
+      __asm__ __volatile__ ("# math_force_eval %0"			\
a2cf7d
+			    : : "f" ASM_CONSTRAINT_VR "m" (__x));	\
a2cf7d
+  })
a2cf7d
+
a2cf7d
+#endif
a2cf7d
-- 
a2cf7d
2.18.2
a2cf7d