public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [01/12] Add fesetexcept
@ 2016-08-11 20:57 Joseph Myers
  2016-08-11 20:59 ` [02/12] Add fesetexcept: aarch64 Joseph Myers
                   ` (11 more replies)
  0 siblings, 12 replies; 27+ messages in thread
From: Joseph Myers @ 2016-08-11 20:57 UTC (permalink / raw)
  To: libc-alpha; +Cc: marcus.shawcroft, rth, carlos, vapier, schwab, stli, davem

TS 18661-1 defines an fesetexcept function for setting floating-point
exception flags without the side-effect of causing enabled traps to be
taken.

This patch series implements this function for glibc.  The present
patch adds the fallback stub implementation, x86 and x86_64
implementations, documentation, tests and ABI baseline updates.  The
remaining patches, some of them untested, add implementations for
other architectures.  The implementations generally follow those of
the fesetexceptflag function.

As for fesetexceptflag, the approach taken for architectures where
setting flags causes enabled traps to be taken is to set the flags
(and potentially cause traps) rather than refusing to set the flags
and returning an error.  Since ISO C and TS 18661 provide no way to
enable traps, this is formally in accordance with the standards.

The NEWS entry should be considered a placeholder, since this patch
series is intended to be followed by further such series adding other
TS 18661-1 features, so that the NEWS entry would end up looking more
like

* New <fenv.h> features from TS 18661-1:2014 are added to libm: the
  fesetexcept, fetestexceptflag, fegetmode and fesetmode functions,
  the femode_t type and the FE_DFL_MODE macro.

with hopefully more such entries for other features, rather than
having an entry for a single function in the end.

I believe we have consensus for adding TS 18661-1 interfaces as per
<https://sourceware.org/ml/libc-alpha/2016-06/msg00421.html>.

Tested for x86_64, x86, mips64 (hard float, and soft float to test the
fallback version), arm (hard float) and powerpc (hard float, soft
float and e500).

I intend to commit this patch series on Tuesday.

2016-08-11  Joseph Myers  <joseph@codesourcery.com>

	* math/fesetexcept.c: New file.
	* sysdeps/i386/fpu/fesetexcept.c: Likewise.
	* sysdeps/x86_64/fpu/fesetexcept.c: Likewise.
	* math/fenv.h: Define
	__GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION and include
	<bits/libc-header-start.h> instead of including <features.h>.
	[__GLIBC_USE (IEC_60559_BFP_EXT)] (fesetexcept): New function
	declaration.
	* manual/arith.texi (fesetexcept): Document function.
	* math/Versions (fesetexcept): New libm symbol at version
	GLIBC_2.25.
	* math/Makefile (libm-support): Add fesetexcept.
	(tests): Add test-fesetexcept and test-fesetexcept-traps.
	* math/test-fesetexcept.c: New file.
	* math/test-fesetexcept-traps.c: Likewise.
	* sysdeps/nacl/libm.abilist: Update.
	* sysdeps/unix/sysv/linux/aarch64/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/alpha/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/arm/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/hppa/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/i386/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/ia64/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/microblaze/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips32/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips64/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/nios2/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist:
	Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist:
	Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist:
	Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist:
	Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/sh/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist:
	Likewise.
	* sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist:
	Likewise.
	* sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/x86_64/64/libm.abilist: Likewise.
	* sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist: Likewise.

diff --git a/NEWS b/NEWS
index fe9ff1c..613d29c 100644
--- a/NEWS
+++ b/NEWS
@@ -32,6 +32,8 @@ Version 2.25
   presently cannot avoid being compiled under _GNU_SOURCE, exacerbating the
   problem.
 
+* The fesetexcept function from TS 18661-1:2014 is added to libm.
+
 Security related changes:
 
   [Add security related changes here]
diff --git a/manual/arith.texi b/manual/arith.texi
index ea8ff48..8dcd409 100644
--- a/manual/arith.texi
+++ b/manual/arith.texi
@@ -759,6 +759,18 @@ non-zero value otherwise.
 
 @comment fenv.h
 @comment ISO
+@deftypefun int fesetexcept (int @var{excepts})
+@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
+This function sets the supported exception flags indicated by
+@var{excepts}, like @code{feraiseexcept}, but without causing enabled
+traps to be taken.  @code{fesetexcept} is from TS 18661-1:2014.
+
+The function returns zero in case the operation was successful, a
+non-zero value otherwise.
+@end deftypefun
+
+@comment fenv.h
+@comment ISO
 @deftypefun int fetestexcept (int @var{excepts})
 @safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
 Test whether the exception flags indicated by the parameter @var{except}
diff --git a/math/Makefile b/math/Makefile
index 1da1797..38a4709 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -41,7 +41,7 @@ libm-support = s_lib_version s_matherr s_signgam			\
 	       fclrexcpt fgetexcptflg fraiseexcpt fsetexcptflg		\
 	       ftestexcept fegetround fesetround fegetenv feholdexcpt	\
 	       fesetenv feupdateenv t_exp fedisblxcpt feenablxcpt	\
-	       fegetexcept
+	       fegetexcept fesetexcept
 
 libm-calls =								  \
 	e_acosF e_acoshF e_asinF e_atan2F e_atanhF e_coshF e_expF e_fmodF \
@@ -146,7 +146,8 @@ tests = test-matherr test-fenv atest-exp atest-sincos atest-exp2 basic-test \
 	test-nearbyint-except-2 test-signgam-uchar test-signgam-uchar-init \
 	test-signgam-uint test-signgam-uint-init test-signgam-ullong \
 	test-signgam-ullong-init test-nan-overflow test-nan-payload \
-	test-fexcept test-fexcept-traps $(tests-static)
+	test-fexcept test-fexcept-traps test-fesetexcept \
+	test-fesetexcept-traps $(tests-static)
 tests-static = test-fpucw-static test-fpucw-ieee-static \
 	       test-signgam-uchar-static test-signgam-uchar-init-static \
 	       test-signgam-uint-static test-signgam-uint-init-static \
diff --git a/math/Versions b/math/Versions
index 467d7ed..ff4e4d4 100644
--- a/math/Versions
+++ b/math/Versions
@@ -214,4 +214,7 @@ libm {
     nextup; nextupf; nextupl;
     nextdown; nextdownf; nextdownl;
   }
+  GLIBC_2.25 {
+    fesetexcept;
+  }
 }
diff --git a/math/fenv.h b/math/fenv.h
index 9a1e112..7f4ceb7 100644
--- a/math/fenv.h
+++ b/math/fenv.h
@@ -22,7 +22,8 @@
 #ifndef _FENV_H
 #define _FENV_H	1
 
-#include <features.h>
+#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION
+#include <bits/libc-header-start.h>
 
 /* Get the architecture dependend definitions.  The following definitions
    are expected to be done:
@@ -70,6 +71,12 @@ extern int fegetexceptflag (fexcept_t *__flagp, int __excepts) __THROW;
 /* Raise the supported exceptions represented by EXCEPTS.  */
 extern int feraiseexcept (int __excepts) __THROW;
 
+#if __GLIBC_USE (IEC_60559_BFP_EXT)
+/* Set the supported exception flags represented by EXCEPTS, without
+   causing enabled traps to be taken.  */
+extern int fesetexcept (int __excepts) __THROW;
+#endif
+
 /* Set complete status for exceptions indicated by EXCEPTS according to
    the representation in the object pointed to by FLAGP.  */
 extern int fesetexceptflag (const fexcept_t *__flagp, int __excepts) __THROW;
diff --git a/math/fesetexcept.c b/math/fesetexcept.c
new file mode 100644
index 0000000..892d8ad
--- /dev/null
+++ b/math/fesetexcept.c
@@ -0,0 +1,27 @@
+/* Set given exception flags.
+   Copyright (C) 2016 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/>.  */
+
+#include <fenv.h>
+
+int
+fesetexcept (int excepts)
+{
+  /* This always fails unless nothing needs to be done.  */
+  return (excepts != 0);
+}
+stub_warning (fesetexcept)
diff --git a/math/test-fesetexcept-traps.c b/math/test-fesetexcept-traps.c
new file mode 100644
index 0000000..383b809
--- /dev/null
+++ b/math/test-fesetexcept-traps.c
@@ -0,0 +1,68 @@
+/* Test fesetexcept: exception traps enabled.
+   Copyright (C) 2016 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/>.  */
+
+#include <fenv.h>
+#include <stdio.h>
+#include <math-tests.h>
+
+static int
+do_test (void)
+{
+  int result = 0;
+
+  fedisableexcept (FE_ALL_EXCEPT);
+  int ret = feenableexcept (FE_ALL_EXCEPT);
+  if (!EXCEPTION_ENABLE_SUPPORTED (FE_ALL_EXCEPT) && (ret == -1))
+    {
+      puts ("feenableexcept (FE_ALL_EXCEPT) not supported, cannot test");
+      return 77;
+    }
+  else if (ret != 0)
+    {
+      puts ("feenableexcept (FE_ALL_EXCEPT) failed");
+      result = 1;
+      return result;
+    }
+
+  if (EXCEPTION_SET_FORCES_TRAP)
+    {
+      puts ("setting exceptions traps, cannot test on this architecture");
+      return 77;
+    }
+  /* The test is that this does not cause exception traps.  */
+  ret = fesetexcept (FE_ALL_EXCEPT);
+  if (ret == 0)
+    puts ("fesetexcept (FE_ALL_EXCEPT) succeeded");
+  else
+    {
+      puts ("fesetexcept (FE_ALL_EXCEPT) failed");
+      if (EXCEPTION_TESTS (float))
+	{
+	  puts ("failure of fesetexcept was unexpected");
+	  result = 1;
+	}
+      else
+	puts ("failure of fesetexcept OK");
+    }
+  feclearexcept (FE_ALL_EXCEPT);
+
+  return result;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/math/test-fesetexcept.c b/math/test-fesetexcept.c
new file mode 100644
index 0000000..912a9a6
--- /dev/null
+++ b/math/test-fesetexcept.c
@@ -0,0 +1,129 @@
+/* Test fesetexcept.
+   Copyright (C) 2016 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/>.  */
+
+#include <fenv.h>
+#include <stdio.h>
+#include <math-tests.h>
+
+static int
+test_fesetexcept (int exc, const char *exc_name)
+{
+  int result = 0;
+
+  printf ("Testing %s\n", exc_name);
+  feclearexcept (FE_ALL_EXCEPT);
+  int ret = fesetexcept (exc);
+  if (ret == 0)
+    printf ("fesetexcept (%s) succeeded\n", exc_name);
+  else
+    {
+      printf ("fesetexcept (%s) failed\n", exc_name);
+      if (exc == 0 || EXCEPTION_TESTS (float))
+	{
+	  puts ("failure of fesetexcept was unexpected");
+	  result = 1;
+	}
+      else
+	puts ("failure of fesetexcept OK, skipping further tests");
+      return result;
+    }
+  ret = fetestexcept (FE_ALL_EXCEPT);
+  if (ret != exc)
+    {
+      printf ("raised exceptions %x, expected %x\n",
+	      (unsigned int) ret, (unsigned int) exc);
+      result = 1;
+    }
+
+  ret = feraiseexcept (FE_ALL_EXCEPT);
+  if (ret != 0)
+    {
+      if (exc == 0 && !EXCEPTION_TESTS (float))
+	{
+	  puts ("feraiseexcept (FE_ALL_EXCEPT) failed, skipping further tests");
+	  return result;
+	}
+      puts ("feraiseexcept (FE_ALL_EXCEPT) unexpectedly failed");
+      result = 1;
+    }
+  ret = fesetexcept (exc);
+  if (ret != 0)
+    {
+      puts ("fesetexcept (second test) unexpectedly failed");
+      result = 1;
+    }
+  ret = fetestexcept (FE_ALL_EXCEPT);
+  if (ret != FE_ALL_EXCEPT)
+    {
+      printf ("raised exceptions (second test) %x, expected %x\n",
+	      (unsigned int) ret, (unsigned int) FE_ALL_EXCEPT);
+      result = 1;
+    }
+
+  feclearexcept (FE_ALL_EXCEPT);
+  ret = feraiseexcept (FE_ALL_EXCEPT & ~exc);
+  if (ret != 0)
+    {
+      puts ("feraiseexcept (third test) unexpectedly failed");
+      result = 1;
+    }
+  ret = fesetexcept (exc);
+  if (ret != 0)
+    {
+      puts ("fesetexcept (third test) unexpectedly failed");
+      result = 1;
+    }
+  ret = fetestexcept (FE_ALL_EXCEPT);
+  if (ret != FE_ALL_EXCEPT)
+    {
+      printf ("raised exceptions (third test) %x, expected %x\n",
+	      (unsigned int) ret, (unsigned int) FE_ALL_EXCEPT);
+      result = 1;
+    }
+
+  return result;
+}
+
+static int
+do_test (void)
+{
+  int result = 0;
+
+  result |= test_fesetexcept (0, "0");
+  result |= test_fesetexcept (FE_ALL_EXCEPT, "FE_ALL_EXCEPT");
+#ifdef FE_DIVBYZERO
+  result |= test_fesetexcept (FE_DIVBYZERO, "FE_DIVBYZERO");
+#endif
+#ifdef FE_INEXACT
+  result |= test_fesetexcept (FE_INEXACT, "FE_INEXACT");
+#endif
+#ifdef FE_INVALID
+  result |= test_fesetexcept (FE_INVALID, "FE_INVALID");
+#endif
+#ifdef FE_OVERFLOW
+  result |= test_fesetexcept (FE_OVERFLOW, "FE_OVERFLOW");
+#endif
+#ifdef FE_UNDERFLOW
+  result |= test_fesetexcept (FE_UNDERFLOW, "FE_UNDERFLOW");
+#endif
+
+  return result;
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/sysdeps/i386/fpu/fesetexcept.c b/sysdeps/i386/fpu/fesetexcept.c
new file mode 100644
index 0000000..eeb0c7f
--- /dev/null
+++ b/sysdeps/i386/fpu/fesetexcept.c
@@ -0,0 +1,31 @@
+/* Set given exception flags.  i386 version.
+   Copyright (C) 2016 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/>.  */
+
+#include <fenv.h>
+
+int
+fesetexcept (int excepts)
+{
+  fenv_t temp;
+
+  __asm__ ("fnstenv %0" : "=m" (*&temp));
+  temp.__status_word |= excepts & FE_ALL_EXCEPT;
+  __asm__ ("fldenv %0" : : "m" (*&temp));
+
+  return 0;
+}
diff --git a/sysdeps/nacl/libm.abilist b/sysdeps/nacl/libm.abilist
index 838fede..b50f029 100644
--- a/sysdeps/nacl/libm.abilist
+++ b/sysdeps/nacl/libm.abilist
@@ -379,3 +379,5 @@ GLIBC_2.24 nextdownl F
 GLIBC_2.24 nextup F
 GLIBC_2.24 nextupf F
 GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
diff --git a/sysdeps/unix/sysv/linux/aarch64/libm.abilist b/sysdeps/unix/sysv/linux/aarch64/libm.abilist
index 781d2d3..01b01b7 100644
--- a/sysdeps/unix/sysv/linux/aarch64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/aarch64/libm.abilist
@@ -410,3 +410,5 @@ GLIBC_2.24 nextdownl F
 GLIBC_2.24 nextup F
 GLIBC_2.24 nextupf F
 GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
diff --git a/sysdeps/unix/sysv/linux/alpha/libm.abilist b/sysdeps/unix/sysv/linux/alpha/libm.abilist
index f342c6b..9ba817d 100644
--- a/sysdeps/unix/sysv/linux/alpha/libm.abilist
+++ b/sysdeps/unix/sysv/linux/alpha/libm.abilist
@@ -420,6 +420,8 @@ GLIBC_2.24 nextdownl F
 GLIBC_2.24 nextup F
 GLIBC_2.24 nextupf F
 GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
 GLIBC_2.3.4 GLIBC_2.3.4 A
 GLIBC_2.3.4 __c1_cabsf F
 GLIBC_2.3.4 __c1_cacosf F
diff --git a/sysdeps/unix/sysv/linux/arm/libm.abilist b/sysdeps/unix/sysv/linux/arm/libm.abilist
index 7a02fb1..d9a6f6f 100644
--- a/sysdeps/unix/sysv/linux/arm/libm.abilist
+++ b/sysdeps/unix/sysv/linux/arm/libm.abilist
@@ -68,6 +68,8 @@ GLIBC_2.24 nextdownl F
 GLIBC_2.24 nextup F
 GLIBC_2.24 nextupf F
 GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 _LIB_VERSION D 0x4
 GLIBC_2.4 __clog10 F
diff --git a/sysdeps/unix/sysv/linux/hppa/libm.abilist b/sysdeps/unix/sysv/linux/hppa/libm.abilist
index bf40ddf..75d4797 100644
--- a/sysdeps/unix/sysv/linux/hppa/libm.abilist
+++ b/sysdeps/unix/sysv/linux/hppa/libm.abilist
@@ -380,5 +380,7 @@ GLIBC_2.24 nextdownl F
 GLIBC_2.24 nextup F
 GLIBC_2.24 nextupf F
 GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 exp2l F
diff --git a/sysdeps/unix/sysv/linux/i386/libm.abilist b/sysdeps/unix/sysv/linux/i386/libm.abilist
index 92e9402..17b6d6d 100644
--- a/sysdeps/unix/sysv/linux/i386/libm.abilist
+++ b/sysdeps/unix/sysv/linux/i386/libm.abilist
@@ -422,4 +422,6 @@ GLIBC_2.24 nextdownl F
 GLIBC_2.24 nextup F
 GLIBC_2.24 nextupf F
 GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
 GLIBC_2.4 GLIBC_2.4 A
diff --git a/sysdeps/unix/sysv/linux/ia64/libm.abilist b/sysdeps/unix/sysv/linux/ia64/libm.abilist
index e2737a2..d2d8978 100644
--- a/sysdeps/unix/sysv/linux/ia64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/ia64/libm.abilist
@@ -351,4 +351,6 @@ GLIBC_2.24 nextdownl F
 GLIBC_2.24 nextup F
 GLIBC_2.24 nextupf F
 GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
 GLIBC_2.4 GLIBC_2.4 A
diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
index 7a02fb1..d9a6f6f 100644
--- a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist
@@ -68,6 +68,8 @@ GLIBC_2.24 nextdownl F
 GLIBC_2.24 nextup F
 GLIBC_2.24 nextupf F
 GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 _LIB_VERSION D 0x4
 GLIBC_2.4 __clog10 F
diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist
index 9af59d7..3edf8ae 100644
--- a/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist
+++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist
@@ -420,4 +420,6 @@ GLIBC_2.24 nextdownl F
 GLIBC_2.24 nextup F
 GLIBC_2.24 nextupf F
 GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
 GLIBC_2.4 GLIBC_2.4 A
diff --git a/sysdeps/unix/sysv/linux/microblaze/libm.abilist b/sysdeps/unix/sysv/linux/microblaze/libm.abilist
index 0b1f136..e934101 100644
--- a/sysdeps/unix/sysv/linux/microblaze/libm.abilist
+++ b/sysdeps/unix/sysv/linux/microblaze/libm.abilist
@@ -379,3 +379,5 @@ GLIBC_2.24 nextdownl F
 GLIBC_2.24 nextup F
 GLIBC_2.24 nextupf F
 GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
index 2e2bb00..88cd724 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist
@@ -381,6 +381,8 @@ GLIBC_2.24 nextdownl F
 GLIBC_2.24 nextup F
 GLIBC_2.24 nextupf F
 GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 exp2l F
 _gp_disp _gp_disp A
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
index 7daa595..52d5cb3 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist
@@ -412,4 +412,6 @@ GLIBC_2.24 nextdownl F
 GLIBC_2.24 nextup F
 GLIBC_2.24 nextupf F
 GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
 GLIBC_2.4 GLIBC_2.4 A
diff --git a/sysdeps/unix/sysv/linux/nios2/libm.abilist b/sysdeps/unix/sysv/linux/nios2/libm.abilist
index a36e2f3..37f7a88 100644
--- a/sysdeps/unix/sysv/linux/nios2/libm.abilist
+++ b/sysdeps/unix/sysv/linux/nios2/libm.abilist
@@ -379,3 +379,5 @@ GLIBC_2.24 nextdownl F
 GLIBC_2.24 nextup F
 GLIBC_2.24 nextupf F
 GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
index abe8c5d..ad61a97 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist
@@ -421,6 +421,8 @@ GLIBC_2.24 nextdownl F
 GLIBC_2.24 nextup F
 GLIBC_2.24 nextupf F
 GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
index 1c25f56..8542238 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist
@@ -420,6 +420,8 @@ GLIBC_2.24 nextdownl F
 GLIBC_2.24 nextup F
 GLIBC_2.24 nextupf F
 GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist
index 9d19474..b2f0608 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist
@@ -415,3 +415,5 @@ GLIBC_2.24 nextdownl F
 GLIBC_2.24 nextup F
 GLIBC_2.24 nextupf F
 GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist
index cedb189..e5d36a1 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist
@@ -96,6 +96,8 @@ GLIBC_2.24 nextdownl F
 GLIBC_2.24 nextup F
 GLIBC_2.24 nextupf F
 GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
 GLIBC_2.3 GLIBC_2.3 A
 GLIBC_2.3 _LIB_VERSION D 0x4
 GLIBC_2.3 __clog10 F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
index 9b567c6..457aa71 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist
@@ -410,6 +410,8 @@ GLIBC_2.24 nextdownl F
 GLIBC_2.24 nextup F
 GLIBC_2.24 nextupf F
 GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
index 78a82fb..217d76b 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist
@@ -408,6 +408,8 @@ GLIBC_2.24 nextdownl F
 GLIBC_2.24 nextup F
 GLIBC_2.24 nextupf F
 GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
diff --git a/sysdeps/unix/sysv/linux/sh/libm.abilist b/sysdeps/unix/sysv/linux/sh/libm.abilist
index f98ade7..d1da0df 100644
--- a/sysdeps/unix/sysv/linux/sh/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sh/libm.abilist
@@ -380,5 +380,7 @@ GLIBC_2.24 nextdownl F
 GLIBC_2.24 nextup F
 GLIBC_2.24 nextupf F
 GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 exp2l F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
index d2e8421..1c58255 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist
@@ -413,6 +413,8 @@ GLIBC_2.24 nextdownl F
 GLIBC_2.24 nextup F
 GLIBC_2.24 nextupf F
 GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
 GLIBC_2.4 GLIBC_2.4 A
 GLIBC_2.4 __clog10l F
 GLIBC_2.4 __finitel F
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
index e000221..6915c87 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist
@@ -411,4 +411,6 @@ GLIBC_2.24 nextdownl F
 GLIBC_2.24 nextup F
 GLIBC_2.24 nextupf F
 GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
 GLIBC_2.4 GLIBC_2.4 A
diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist
index 00e82c1..6ebaa0f 100644
--- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist
@@ -380,3 +380,5 @@ GLIBC_2.24 nextdownl F
 GLIBC_2.24 nextup F
 GLIBC_2.24 nextupf F
 GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist
index 00e82c1..6ebaa0f 100644
--- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist
@@ -380,3 +380,5 @@ GLIBC_2.24 nextdownl F
 GLIBC_2.24 nextup F
 GLIBC_2.24 nextupf F
 GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
diff --git a/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist b/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist
index 00e82c1..6ebaa0f 100644
--- a/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist
+++ b/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist
@@ -380,3 +380,5 @@ GLIBC_2.24 nextdownl F
 GLIBC_2.24 nextup F
 GLIBC_2.24 nextupf F
 GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
index 65b4708..2e77c3d 100644
--- a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist
@@ -411,4 +411,6 @@ GLIBC_2.24 nextdownl F
 GLIBC_2.24 nextup F
 GLIBC_2.24 nextupf F
 GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
 GLIBC_2.4 GLIBC_2.4 A
diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
index d35e9f0..b9ccb1a 100644
--- a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
+++ b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist
@@ -410,3 +410,5 @@ GLIBC_2.24 nextdownl F
 GLIBC_2.24 nextup F
 GLIBC_2.24 nextupf F
 GLIBC_2.24 nextupl F
+GLIBC_2.25 GLIBC_2.25 A
+GLIBC_2.25 fesetexcept F
diff --git a/sysdeps/x86_64/fpu/fesetexcept.c b/sysdeps/x86_64/fpu/fesetexcept.c
new file mode 100644
index 0000000..805f769
--- /dev/null
+++ b/sysdeps/x86_64/fpu/fesetexcept.c
@@ -0,0 +1,31 @@
+/* Set given exception flags.  x86_64 version.
+   Copyright (C) 2016 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/>.  */
+
+#include <fenv.h>
+
+int
+fesetexcept (int excepts)
+{
+  unsigned int mxcsr;
+
+  __asm__ ("stmxcsr %0" : "=m" (*&mxcsr));
+  mxcsr |= excepts & FE_ALL_EXCEPT;
+  __asm__ ("ldmxcsr %0" : : "m" (*&mxcsr));
+
+  return 0;
+}

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [03/12] Add fesetexcept: alpha
  2016-08-11 20:57 [01/12] Add fesetexcept Joseph Myers
  2016-08-11 20:59 ` [02/12] Add fesetexcept: aarch64 Joseph Myers
@ 2016-08-11 20:59 ` Joseph Myers
  2016-08-11 21:00 ` [05/12] Add fesetexcept: hppa Joseph Myers
                   ` (9 subsequent siblings)
  11 siblings, 0 replies; 27+ messages in thread
From: Joseph Myers @ 2016-08-11 20:59 UTC (permalink / raw)
  To: libc-alpha; +Cc: rth

This patch adds an Alpha version of fesetexcept.  Untested.

2016-08-11  Joseph Myers  <joseph@codesourcery.com>

	* sysdeps/alpha/fpu/fesetexcept.c: New file.

diff --git a/sysdeps/alpha/fpu/fesetexcept.c b/sysdeps/alpha/fpu/fesetexcept.c
new file mode 100644
index 0000000..5d6904f
--- /dev/null
+++ b/sysdeps/alpha/fpu/fesetexcept.c
@@ -0,0 +1,31 @@
+/* Set given exception flags.  Alpha version.
+   Copyright (C) 2016 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/>.  */
+
+#include <fenv_libc.h>
+
+int
+fesetexcept (int excepts)
+{
+  unsigned long int tmp;
+
+  tmp = __ieee_get_fp_control ();
+  tmp |= excepts & SWCR_STATUS_MASK;
+  __ieee_set_fp_control (tmp);
+
+  return 0;
+}

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [02/12] Add fesetexcept: aarch64
  2016-08-11 20:57 [01/12] Add fesetexcept Joseph Myers
@ 2016-08-11 20:59 ` Joseph Myers
  2016-08-11 21:45   ` Paul Eggert
  2016-08-11 20:59 ` [03/12] Add fesetexcept: alpha Joseph Myers
                   ` (10 subsequent siblings)
  11 siblings, 1 reply; 27+ messages in thread
From: Joseph Myers @ 2016-08-11 20:59 UTC (permalink / raw)
  To: libc-alpha; +Cc: marcus.shawcroft

This patch adds an AArch64 version of fesetexcept.  Untested.

2016-08-11  Joseph Myers  <joseph@codesourcery.com>

	* sysdeps/aarch64/fpu/fesetexcept.c: New file.

diff --git a/sysdeps/aarch64/fpu/fesetexcept.c b/sysdeps/aarch64/fpu/fesetexcept.c
new file mode 100644
index 0000000..52210bb
--- /dev/null
+++ b/sysdeps/aarch64/fpu/fesetexcept.c
@@ -0,0 +1,34 @@
+/* Set given exception flags.  AArch64 version.
+   Copyright (C) 2016 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/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+fesetexcept (int excepts)
+{
+  fpu_fpsr_t fpsr;
+  fpu_fpsr_t fpsr_new;
+
+  _FPU_GETFPSR (fpsr);
+  fpsr_new = fpsr | (excepts & FE_ALL_EXCEPT);
+  if (fpsr != fpsr_new)
+    _FPU_SETFPSR (fpsr_new);
+
+  return 0;
+}

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [04/12] Add fesetexcept: arm
  2016-08-11 20:57 [01/12] Add fesetexcept Joseph Myers
                   ` (2 preceding siblings ...)
  2016-08-11 21:00 ` [05/12] Add fesetexcept: hppa Joseph Myers
@ 2016-08-11 21:00 ` Joseph Myers
  2016-08-11 21:01 ` [07/12] Add fesetexcept: m68k Joseph Myers
                   ` (7 subsequent siblings)
  11 siblings, 0 replies; 27+ messages in thread
From: Joseph Myers @ 2016-08-11 21:00 UTC (permalink / raw)
  To: libc-alpha

This patch adds an ARM version of fesetexcept.

2016-08-11  Joseph Myers  <joseph@codesourcery.com>

	* sysdeps/arm/fesetexcept.c: New file.

diff --git a/sysdeps/arm/fesetexcept.c b/sysdeps/arm/fesetexcept.c
new file mode 100644
index 0000000..96a79ae
--- /dev/null
+++ b/sysdeps/arm/fesetexcept.c
@@ -0,0 +1,38 @@
+/* Set given exception flags.  ARM version.
+   Copyright (C) 2016 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/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+#include <arm-features.h>
+
+int
+fesetexcept (int excepts)
+{
+  fpu_control_t fpscr, new_fpscr;
+
+  /* Fail if a VFP unit isn't present unless nothing needs to be done.  */
+  if (!ARM_HAVE_VFP)
+    return (excepts != 0);
+
+  _FPU_GETCW (fpscr);
+  new_fpscr = fpscr | (excepts & FE_ALL_EXCEPT);
+  if (new_fpscr != fpscr)
+    _FPU_SETCW (new_fpscr);
+
+  return 0;
+}

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [05/12] Add fesetexcept: hppa
  2016-08-11 20:57 [01/12] Add fesetexcept Joseph Myers
  2016-08-11 20:59 ` [02/12] Add fesetexcept: aarch64 Joseph Myers
  2016-08-11 20:59 ` [03/12] Add fesetexcept: alpha Joseph Myers
@ 2016-08-11 21:00 ` Joseph Myers
  2016-08-11 21:00 ` [04/12] Add fesetexcept: arm Joseph Myers
                   ` (8 subsequent siblings)
  11 siblings, 0 replies; 27+ messages in thread
From: Joseph Myers @ 2016-08-11 21:00 UTC (permalink / raw)
  To: libc-alpha; +Cc: carlos

This patch adds an HPPA version of fesetexcept.  Untested.

2016-08-11  Joseph Myers  <joseph@codesourcery.com>

	* sysdeps/hppa/fpu/fesetexcept.c: New file.

diff --git a/sysdeps/hppa/fpu/fesetexcept.c b/sysdeps/hppa/fpu/fesetexcept.c
new file mode 100644
index 0000000..f1eb2e5
--- /dev/null
+++ b/sysdeps/hppa/fpu/fesetexcept.c
@@ -0,0 +1,35 @@
+/* Set given exception flags.  HPPA version.
+   Copyright (C) 2016 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/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+fesetexcept (int excepts)
+{
+  fpu_control_t fpsr;
+  fpu_control_t fpsr_new;
+
+  _FPU_GETCW (fpsr);
+  excepts &= FE_ALL_EXCEPT;
+  fpsr_new = fpsr | (excepts << _FPU_HPPA_SHIFT_FLAGS);
+  if (fpsr != fpsr_new)
+    _FPU_SETCW (fpsr_new);
+
+  return 0;
+}

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [06/12] Add fesetexcept: ia64
  2016-08-11 20:57 [01/12] Add fesetexcept Joseph Myers
                   ` (4 preceding siblings ...)
  2016-08-11 21:01 ` [07/12] Add fesetexcept: m68k Joseph Myers
@ 2016-08-11 21:01 ` Joseph Myers
  2016-08-11 21:02 ` [09/12] Add fesetexcept: powerpc Joseph Myers
                   ` (5 subsequent siblings)
  11 siblings, 0 replies; 27+ messages in thread
From: Joseph Myers @ 2016-08-11 21:01 UTC (permalink / raw)
  To: libc-alpha; +Cc: vapier

This patch adds an IA64 version of fesetexcept.  Untested.

2016-08-11  Joseph Myers  <joseph@codesourcery.com>

	* sysdeps/ia64/fpu/fesetexcept.c: New file.

diff --git a/sysdeps/ia64/fpu/fesetexcept.c b/sysdeps/ia64/fpu/fesetexcept.c
new file mode 100644
index 0000000..d6004b6
--- /dev/null
+++ b/sysdeps/ia64/fpu/fesetexcept.c
@@ -0,0 +1,31 @@
+/* Set given exception flags.  IA64 version.
+   Copyright (C) 2016 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/>.  */
+
+#include <fenv.h>
+
+int
+fesetexcept (int excepts)
+{
+  fenv_t fpsr;
+
+  __asm__ __volatile__ ("mov.m %0=ar.fpsr" : "=r" (fpsr));
+  fpsr |= ((excepts & FE_ALL_EXCEPT) << 13);
+  __asm__ __volatile__ ("mov.m ar.fpsr=%0" :: "r" (fpsr) : "memory");
+
+  return 0;
+}

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [07/12] Add fesetexcept: m68k
  2016-08-11 20:57 [01/12] Add fesetexcept Joseph Myers
                   ` (3 preceding siblings ...)
  2016-08-11 21:00 ` [04/12] Add fesetexcept: arm Joseph Myers
@ 2016-08-11 21:01 ` Joseph Myers
  2016-08-11 21:01 ` [06/12] Add fesetexcept: ia64 Joseph Myers
                   ` (6 subsequent siblings)
  11 siblings, 0 replies; 27+ messages in thread
From: Joseph Myers @ 2016-08-11 21:01 UTC (permalink / raw)
  To: libc-alpha; +Cc: schwab

This patch adds an M68K version of fesetexcept.  Untested.

2016-08-11  Joseph Myers  <joseph@codesourcery.com>

	* sysdeps/m68k/fpu/fesetexcept.c: New file.

diff --git a/sysdeps/m68k/fpu/fesetexcept.c b/sysdeps/m68k/fpu/fesetexcept.c
new file mode 100644
index 0000000..bad05a9
--- /dev/null
+++ b/sysdeps/m68k/fpu/fesetexcept.c
@@ -0,0 +1,31 @@
+/* Set given exception flags.  M68K version.
+   Copyright (C) 2016 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/>.  */
+
+#include <fenv.h>
+
+int
+fesetexcept (int excepts)
+{
+  fexcept_t fpsr;
+
+  __asm__ ("fmove%.l %/fpsr,%0" : "=dm" (fpsr));
+  fpsr |= excepts & FE_ALL_EXCEPT;
+  __asm__ __volatile__ ("fmove%.l %0,%/fpsr" : : "dm" (fpsr));
+
+  return 0;
+}

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [09/12] Add fesetexcept: powerpc
  2016-08-11 20:57 [01/12] Add fesetexcept Joseph Myers
                   ` (5 preceding siblings ...)
  2016-08-11 21:01 ` [06/12] Add fesetexcept: ia64 Joseph Myers
@ 2016-08-11 21:02 ` Joseph Myers
  2016-08-12 16:18   ` Paul E. Murphy
  2016-08-11 21:02 ` [08/12] Add fesetexcept: mips Joseph Myers
                   ` (4 subsequent siblings)
  11 siblings, 1 reply; 27+ messages in thread
From: Joseph Myers @ 2016-08-11 21:02 UTC (permalink / raw)
  To: libc-alpha

This patch adds PowerPC versions of fesetexcept.

2016-08-11  Joseph Myers  <joseph@codesourcery.com>

	* sysdeps/powerpc/fpu/fesetexcept.c: New file.
	* sysdeps/powerpc/nofpu/fesetexcept.c: Likewise.
	* sysdeps/powerpc/powerpc32/e500/nofpu/fesetexcept.c: Likewise.

diff --git a/sysdeps/powerpc/fpu/fesetexcept.c b/sysdeps/powerpc/fpu/fesetexcept.c
new file mode 100644
index 0000000..b7f2e06
--- /dev/null
+++ b/sysdeps/powerpc/fpu/fesetexcept.c
@@ -0,0 +1,41 @@
+/* Set given exception flags.  PowerPC version.
+   Copyright (C) 2016 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/>.  */
+
+#include <fenv_libc.h>
+
+int
+fesetexcept (int excepts)
+{
+  fenv_union_t u, n;
+
+  u.fenv = fegetenv_register ();
+  n.l = (u.l
+	 | (excepts & FPSCR_STICKY_BITS)
+	 | (excepts >> ((31 - FPSCR_VX) - (31 - FPSCR_VXSOFT))
+	    & FE_INVALID_SOFTWARE));
+  if (n.l != u.l)
+    {
+      fesetenv_register (n.fenv);
+
+      /* Deal with FE_INVALID_SOFTWARE not being implemented on some chips.  */
+      if (excepts & FE_INVALID)
+	feraiseexcept (FE_INVALID);
+    }
+
+  return 0;
+}
diff --git a/sysdeps/powerpc/nofpu/fesetexcept.c b/sysdeps/powerpc/nofpu/fesetexcept.c
new file mode 100644
index 0000000..3b19665
--- /dev/null
+++ b/sysdeps/powerpc/nofpu/fesetexcept.c
@@ -0,0 +1,28 @@
+/* Set given exception flags.  PowerPC soft-float version.
+   Copyright (C) 2016 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/>.  */
+
+#include "soft-supp.h"
+
+int
+fesetexcept (int excepts)
+{
+  __sim_exceptions_thread |= (excepts & FE_ALL_EXCEPT);
+  SIM_SET_GLOBAL (__sim_exceptions_global, __sim_exceptions_thread);
+
+  return 0;
+}
diff --git a/sysdeps/powerpc/powerpc32/e500/nofpu/fesetexcept.c b/sysdeps/powerpc/powerpc32/e500/nofpu/fesetexcept.c
new file mode 100644
index 0000000..ff82f22
--- /dev/null
+++ b/sysdeps/powerpc/powerpc32/e500/nofpu/fesetexcept.c
@@ -0,0 +1,37 @@
+/* Set given exception flags.  e500 version.
+   Copyright (C) 2016 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/>.  */
+
+#include <fenv_libc.h>
+
+int
+fesetexcept (int excepts)
+{
+  unsigned long old_spefscr, spefscr;
+  int excepts_spe = __fexcepts_to_spe (excepts);
+
+  old_spefscr = fegetenv_register ();
+  spefscr = old_spefscr | excepts_spe;
+  fesetenv_register (spefscr);
+
+  /* If the state of the "invalid" or "underflow" flag has changed,
+     inform the kernel.  */
+  if (((spefscr ^ old_spefscr) & (SPEFSCR_FINVS | SPEFSCR_FUNFS)) != 0)
+    __fe_note_change ();
+
+  return 0;
+}

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [08/12] Add fesetexcept: mips
  2016-08-11 20:57 [01/12] Add fesetexcept Joseph Myers
                   ` (6 preceding siblings ...)
  2016-08-11 21:02 ` [09/12] Add fesetexcept: powerpc Joseph Myers
@ 2016-08-11 21:02 ` Joseph Myers
  2016-08-11 21:03 ` [10/12] Add fesetexcept: s390 Joseph Myers
                   ` (3 subsequent siblings)
  11 siblings, 0 replies; 27+ messages in thread
From: Joseph Myers @ 2016-08-11 21:02 UTC (permalink / raw)
  To: libc-alpha

This patch adds a MIPS version of fesetexcept.

2016-08-11  Joseph Myers  <joseph@codesourcery.com>

	* sysdeps/mips/fpu/fesetexcept.c: New file.

diff --git a/sysdeps/mips/fpu/fesetexcept.c b/sysdeps/mips/fpu/fesetexcept.c
new file mode 100644
index 0000000..1c3d91a
--- /dev/null
+++ b/sysdeps/mips/fpu/fesetexcept.c
@@ -0,0 +1,32 @@
+/* Set given exception flags.  MIPS version.
+   Copyright (C) 2016 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/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+fesetexcept (int excepts)
+{
+  fpu_control_t temp;
+
+  _FPU_GETCW (temp);
+  temp |= excepts & FE_ALL_EXCEPT;
+  _FPU_SETCW (temp);
+
+  return 0;
+}

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [10/12] Add fesetexcept: s390
  2016-08-11 20:57 [01/12] Add fesetexcept Joseph Myers
                   ` (7 preceding siblings ...)
  2016-08-11 21:02 ` [08/12] Add fesetexcept: mips Joseph Myers
@ 2016-08-11 21:03 ` Joseph Myers
  2016-08-15  8:07   ` Stefan Liebler
  2016-08-11 21:04 ` [12/12] Add fesetexcept: sparc Joseph Myers
                   ` (2 subsequent siblings)
  11 siblings, 1 reply; 27+ messages in thread
From: Joseph Myers @ 2016-08-11 21:03 UTC (permalink / raw)
  To: libc-alpha; +Cc: stli

This patch adds an S/390 version of fesetexcept.  Untested.

2016-08-11  Joseph Myers  <joseph@codesourcery.com>

	* sysdeps/s390/fpu/fesetexcept.c: New file.

diff --git a/sysdeps/s390/fpu/fesetexcept.c b/sysdeps/s390/fpu/fesetexcept.c
new file mode 100644
index 0000000..4728f3e
--- /dev/null
+++ b/sysdeps/s390/fpu/fesetexcept.c
@@ -0,0 +1,32 @@
+/* Set given exception flags.  S/390 version.
+   Copyright (C) 2016 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/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+fesetexcept (int excepts)
+{
+  fexcept_t temp, newexcepts;
+
+  _FPU_GETCW (temp);
+  temp |= (excepts & FE_ALL_EXCEPT) << FPC_FLAGS_SHIFT;
+  _FPU_SETCW (temp);
+
+  return 0;
+}

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [11/12] Add fesetexcept: sh
  2016-08-11 20:57 [01/12] Add fesetexcept Joseph Myers
                   ` (9 preceding siblings ...)
  2016-08-11 21:04 ` [12/12] Add fesetexcept: sparc Joseph Myers
@ 2016-08-11 21:04 ` Joseph Myers
  2016-08-12 15:49 ` [01/12] Add fesetexcept Paul E. Murphy
  11 siblings, 0 replies; 27+ messages in thread
From: Joseph Myers @ 2016-08-11 21:04 UTC (permalink / raw)
  To: libc-alpha

This patch adds an SH version of fesetexcept.  Untested.

2016-08-11  Joseph Myers  <joseph@codesourcery.com>

	* sysdeps/sh/sh4/fpu/fesetexcept.c: New file.

diff --git a/sysdeps/sh/sh4/fpu/fesetexcept.c b/sysdeps/sh/sh4/fpu/fesetexcept.c
new file mode 100644
index 0000000..6be9494
--- /dev/null
+++ b/sysdeps/sh/sh4/fpu/fesetexcept.c
@@ -0,0 +1,32 @@
+/* Set given exception flags.  SH4 version.
+   Copyright (C) 2016 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/>.  */
+
+#include <fenv.h>
+#include <fpu_control.h>
+
+int
+fesetexcept (int excepts)
+{
+  fpu_control_t temp;
+
+  _FPU_GETCW (temp);
+  temp |= (excepts & FE_ALL_EXCEPT);
+  _FPU_SETCW (temp);
+
+  return 0;
+}

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [12/12] Add fesetexcept: sparc
  2016-08-11 20:57 [01/12] Add fesetexcept Joseph Myers
                   ` (8 preceding siblings ...)
  2016-08-11 21:03 ` [10/12] Add fesetexcept: s390 Joseph Myers
@ 2016-08-11 21:04 ` Joseph Myers
  2016-08-12  7:32   ` Jose E. Marchesi
  2016-08-11 21:04 ` [11/12] Add fesetexcept: sh Joseph Myers
  2016-08-12 15:49 ` [01/12] Add fesetexcept Paul E. Murphy
  11 siblings, 1 reply; 27+ messages in thread
From: Joseph Myers @ 2016-08-11 21:04 UTC (permalink / raw)
  To: libc-alpha; +Cc: davem

This patch adds a SPARC version of fesetexcept.  Untested.

2016-08-11  Joseph Myers  <joseph@codesourcery.com>

	* sysdeps/sparc/fpu/fesetexcept.c: New file.

diff --git a/sysdeps/sparc/fpu/fesetexcept.c b/sysdeps/sparc/fpu/fesetexcept.c
new file mode 100644
index 0000000..ef1c5de
--- /dev/null
+++ b/sysdeps/sparc/fpu/fesetexcept.c
@@ -0,0 +1,31 @@
+/* Set given exception flags.  SPARC version.
+   Copyright (C) 2016 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/>.  */
+
+#include <fenv.h>
+
+int
+fesetexcept (int excepts)
+{
+  fenv_t tmp;
+
+  __fenv_stfsr (tmp);
+  tmp |= excepts & FE_ALL_EXCEPT;
+  __fenv_ldfsr (tmp);
+
+  return 0;
+}

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [02/12] Add fesetexcept: aarch64
  2016-08-11 20:59 ` [02/12] Add fesetexcept: aarch64 Joseph Myers
@ 2016-08-11 21:45   ` Paul Eggert
  2016-08-11 23:30     ` Joseph Myers
  0 siblings, 1 reply; 27+ messages in thread
From: Paul Eggert @ 2016-08-11 21:45 UTC (permalink / raw)
  To: Joseph Myers, libc-alpha; +Cc: marcus.shawcroft

Thanks, that patch series looks good, though I have one minor question and/or 
quibble.

> +  if (fpsr != fpsr_new)
> +    _FPU_SETFPSR (fpsr_new);

I assume that the 'if (fpsr != fpsr_new)' is present purely for performance 
reasons, i.e., that the code would be correct if '_FPU_SETFPSR (fpsr_new)' were 
executed unconditionally. Are practical programs likely to see a performance 
improvement because of the 'if (fpsr != fpsr_new)'? My guess is no, because 
typically programs will use fesetexcept to change settings. If my guess is 
right, I'd omit the 'if (fpsr != fpsr_new)' test, on the grounds of simplicity.

Similarly for arm, hppa, powerpc.

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [02/12] Add fesetexcept: aarch64
  2016-08-11 21:45   ` Paul Eggert
@ 2016-08-11 23:30     ` Joseph Myers
  0 siblings, 0 replies; 27+ messages in thread
From: Joseph Myers @ 2016-08-11 23:30 UTC (permalink / raw)
  To: Paul Eggert; +Cc: libc-alpha, marcus.shawcroft

On Thu, 11 Aug 2016, Paul Eggert wrote:

> Thanks, that patch series looks good, though I have one minor question and/or
> quibble.
> 
> > +  if (fpsr != fpsr_new)
> > +    _FPU_SETFPSR (fpsr_new);
> 
> I assume that the 'if (fpsr != fpsr_new)' is present purely for performance
> reasons, i.e., that the code would be correct if '_FPU_SETFPSR (fpsr_new)'
> were executed unconditionally. Are practical programs likely to see a
> performance improvement because of the 'if (fpsr != fpsr_new)'? My guess is
> no, because typically programs will use fesetexcept to change settings. If my
> guess is right, I'd omit the 'if (fpsr != fpsr_new)' test, on the grounds of
> simplicity.

I'm deliberately following the fesetexceptflag implementations for each 
architecture, as the most similar C99/C11 function.  If those have this 
optimization, then I'm including it in fesetexcept as well.  Doing 
otherwise would make fesetexcept for AArch64 inconsistent with all the 
other <fenv.h> function implementations for AArch64, which systematically 
use this optimization (either directly, or in the <fenv_private.h> 
functions they call).

Similarly, when I implement fesetmode, that will have this optimization on 
architectures where fesetenv does.

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [12/12] Add fesetexcept: sparc
  2016-08-11 21:04 ` [12/12] Add fesetexcept: sparc Joseph Myers
@ 2016-08-12  7:32   ` Jose E. Marchesi
  2016-08-12 11:15     ` Joseph Myers
  0 siblings, 1 reply; 27+ messages in thread
From: Jose E. Marchesi @ 2016-08-12  7:32 UTC (permalink / raw)
  To: Joseph Myers; +Cc: libc-alpha, davem


    +int
    +fesetexcept (int excepts)
    +{
    +  fenv_t tmp;
    +
    +  __fenv_stfsr (tmp);
    +  tmp |= excepts & FE_ALL_EXCEPT;
    +  __fenv_ldfsr (tmp);

Aren't these stfsr and ldfsr reversed?

    +
    +  return 0;
    +}

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [12/12] Add fesetexcept: sparc
  2016-08-12  7:32   ` Jose E. Marchesi
@ 2016-08-12 11:15     ` Joseph Myers
  2016-08-13  8:32       ` Jose E. Marchesi
  0 siblings, 1 reply; 27+ messages in thread
From: Joseph Myers @ 2016-08-12 11:15 UTC (permalink / raw)
  To: Jose E. Marchesi; +Cc: libc-alpha, davem

On Fri, 12 Aug 2016, Jose E. Marchesi wrote:

> 
>     +int
>     +fesetexcept (int excepts)
>     +{
>     +  fenv_t tmp;
>     +
>     +  __fenv_stfsr (tmp);
>     +  tmp |= excepts & FE_ALL_EXCEPT;
>     +  __fenv_ldfsr (tmp);
> 
> Aren't these stfsr and ldfsr reversed?

They are in the same order as in fesetexceptflag.  __fenv_stfsr = store 
status register to memory, __fenv_ldfsr = load status register from 
memory.

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [01/12] Add fesetexcept
  2016-08-11 20:57 [01/12] Add fesetexcept Joseph Myers
                   ` (10 preceding siblings ...)
  2016-08-11 21:04 ` [11/12] Add fesetexcept: sh Joseph Myers
@ 2016-08-12 15:49 ` Paul E. Murphy
  2016-08-12 16:20   ` Joseph Myers
  11 siblings, 1 reply; 27+ messages in thread
From: Paul E. Murphy @ 2016-08-12 15:49 UTC (permalink / raw)
  To: Joseph Myers, libc-alpha
  Cc: marcus.shawcroft, rth, carlos, vapier, schwab, stli, davem



On 08/11/2016 03:57 PM, Joseph Myers wrote:
> +++ b/math/test-fesetexcept-traps.c
> @@ -0,0 +1,68 @@
> +/* Test fesetexcept: exception traps enabled.
> +   Copyright (C) 2016 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/>.  */
> +
> +#include <fenv.h>
> +#include <stdio.h>
> +#include <math-tests.h>
> +
> +static int
> +do_test (void)
> +{
> +  int result = 0;
> +
> +  fedisableexcept (FE_ALL_EXCEPT);
> +  int ret = feenableexcept (FE_ALL_EXCEPT);
> +  if (!EXCEPTION_ENABLE_SUPPORTED (FE_ALL_EXCEPT) && (ret == -1))
> +    {
> +      puts ("feenableexcept (FE_ALL_EXCEPT) not supported, cannot test");
> +      return 77;
> +    }
> +  else if (ret != 0)
> +    {
> +      puts ("feenableexcept (FE_ALL_EXCEPT) failed");
> +      result = 1;
> +      return result;
> +    }
> +
> +  if (EXCEPTION_SET_FORCES_TRAP)
> +    {
> +      puts ("setting exceptions traps, cannot test on this architecture");
> +      return 77;
> +    }
> +  /* The test is that this does not cause exception traps.  */

This is the test description.  It would improve readability by reworking
it into the file description at the top.

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [09/12] Add fesetexcept: powerpc
  2016-08-11 21:02 ` [09/12] Add fesetexcept: powerpc Joseph Myers
@ 2016-08-12 16:18   ` Paul E. Murphy
  2016-08-12 16:30     ` Joseph Myers
  0 siblings, 1 reply; 27+ messages in thread
From: Paul E. Murphy @ 2016-08-12 16:18 UTC (permalink / raw)
  To: Joseph Myers, libc-alpha



On 08/11/2016 04:02 PM, Joseph Myers wrote:
> This patch adds PowerPC versions of fesetexcept.
> 
> 2016-08-11  Joseph Myers  <joseph@codesourcery.com>
> 
> 	* sysdeps/powerpc/fpu/fesetexcept.c: New file.
> 	* sysdeps/powerpc/nofpu/fesetexcept.c: Likewise.
> 	* sysdeps/powerpc/powerpc32/e500/nofpu/fesetexcept.c: Likewise.
> 
> diff --git a/sysdeps/powerpc/fpu/fesetexcept.c b/sysdeps/powerpc/fpu/fesetexcept.c
> new file mode 100644
> index 0000000..b7f2e06
> --- /dev/null
> +++ b/sysdeps/powerpc/fpu/fesetexcept.c
> @@ -0,0 +1,41 @@
> +/* Set given exception flags.  PowerPC version.
> +   Copyright (C) 2016 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/>.  */
> +
> +#include <fenv_libc.h>
> +
> +int
> +fesetexcept (int excepts)
> +{
> +  fenv_union_t u, n;
> +
> +  u.fenv = fegetenv_register ();
> +  n.l = (u.l
> +	 | (excepts & FPSCR_STICKY_BITS)
> +	 | (excepts >> ((31 - FPSCR_VX) - (31 - FPSCR_VXSOFT))
> +	    & FE_INVALID_SOFTWARE));

This should also preserve a comment about transforming
FE_INVALID into FE_INVALID_SOFTWARE.  Otherwise, this patch
looks OK to me.

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [01/12] Add fesetexcept
  2016-08-12 15:49 ` [01/12] Add fesetexcept Paul E. Murphy
@ 2016-08-12 16:20   ` Joseph Myers
  2016-08-12 17:25     ` Paul E. Murphy
  0 siblings, 1 reply; 27+ messages in thread
From: Joseph Myers @ 2016-08-12 16:20 UTC (permalink / raw)
  To: Paul E. Murphy
  Cc: libc-alpha, marcus.shawcroft, rth, carlos, vapier, schwab, stli, davem

On Fri, 12 Aug 2016, Paul E. Murphy wrote:

> > +  /* The test is that this does not cause exception traps.  */
> 
> This is the test description.  It would improve readability by reworking
> it into the file description at the top.

This comment is specifically intended to relate to the following line of 
code (to explain why nothing is checked about exception flags after that 
call, for example).  I don't think moving that information away from the 
potentially trapping function call would be an improvement.

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [09/12] Add fesetexcept: powerpc
  2016-08-12 16:18   ` Paul E. Murphy
@ 2016-08-12 16:30     ` Joseph Myers
  2016-08-12 16:47       ` Paul E. Murphy
  0 siblings, 1 reply; 27+ messages in thread
From: Joseph Myers @ 2016-08-12 16:30 UTC (permalink / raw)
  To: Paul E. Murphy; +Cc: libc-alpha

On Fri, 12 Aug 2016, Paul E. Murphy wrote:

> > +  n.l = (u.l
> > +	 | (excepts & FPSCR_STICKY_BITS)
> > +	 | (excepts >> ((31 - FPSCR_VX) - (31 - FPSCR_VXSOFT))
> > +	    & FE_INVALID_SOFTWARE));
> 
> This should also preserve a comment about transforming
> FE_INVALID into FE_INVALID_SOFTWARE.  Otherwise, this patch
> looks OK to me.

I don't see such a comment in sysdeps/powerpc/fpu/fsetexcptflg.c to 
preserve (all these function implementations follow those of 
fesetexceptflag).  I did preserve the comment "Deal with 
FE_INVALID_SOFTWARE not being implemented on some chips." (while trying 
not to duplicate all the completely routine comments in various 
fesetexceptflag implementations that say no more than repeating the plain 
semantics of individual lines of C code).

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [09/12] Add fesetexcept: powerpc
  2016-08-12 16:30     ` Joseph Myers
@ 2016-08-12 16:47       ` Paul E. Murphy
  2016-08-12 17:50         ` Joseph Myers
  0 siblings, 1 reply; 27+ messages in thread
From: Paul E. Murphy @ 2016-08-12 16:47 UTC (permalink / raw)
  To: Joseph Myers; +Cc: libc-alpha



On 08/12/2016 11:30 AM, Joseph Myers wrote:
> On Fri, 12 Aug 2016, Paul E. Murphy wrote:
> 
>>> +  n.l = (u.l
>>> +	 | (excepts & FPSCR_STICKY_BITS)
>>> +	 | (excepts >> ((31 - FPSCR_VX) - (31 - FPSCR_VXSOFT))
>>> +	    & FE_INVALID_SOFTWARE));
>>
>> This should also preserve a comment about transforming
>> FE_INVALID into FE_INVALID_SOFTWARE.  Otherwise, this patch
>> looks OK to me.
> 
> I don't see such a comment in sysdeps/powerpc/fpu/fsetexcptflg.c to 
> preserve (all these function implementations follow those of 
> fesetexceptflag).  I did preserve the comment "Deal with 
> FE_INVALID_SOFTWARE not being implemented on some chips." (while trying 
> not to duplicate all the completely routine comments in various 
> fesetexceptflag implementations that say no more than repeating the plain 
> semantics of individual lines of C code).
> 

I don't like the naked constants.  I am not faulting the patch for them.
But in trying to understand them, I had to do some digging.  A similar
snippet shows up in three places in ppc code.  fpu/fraiseexcpt.c
seems to contain the only useful comment.  Both clear and succinct.
It would be nice to clean up the usage, but such should be done in a
separate patch, and needn't by you.

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [01/12] Add fesetexcept
  2016-08-12 16:20   ` Joseph Myers
@ 2016-08-12 17:25     ` Paul E. Murphy
  2016-08-12 17:39       ` Joseph Myers
  0 siblings, 1 reply; 27+ messages in thread
From: Paul E. Murphy @ 2016-08-12 17:25 UTC (permalink / raw)
  To: Joseph Myers
  Cc: libc-alpha, marcus.shawcroft, rth, carlos, vapier, schwab, stli, davem



On 08/12/2016 11:20 AM, Joseph Myers wrote:
> On Fri, 12 Aug 2016, Paul E. Murphy wrote:
> 
>>> +  /* The test is that this does not cause exception traps.  */
>>
>> This is the test description.  It would improve readability by reworking
>> it into the file description at the top.
> 
> This comment is specifically intended to relate to the following line of 
> code (to explain why nothing is checked about exception flags after that 
> call, for example).  I don't think moving that information away from the 
> potentially trapping function call would be an improvement.


At least, please simplify the comment. e.g

/* Verify fesetexcept does not cause exception traps.  */

reads better.

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [01/12] Add fesetexcept
  2016-08-12 17:25     ` Paul E. Murphy
@ 2016-08-12 17:39       ` Joseph Myers
  0 siblings, 0 replies; 27+ messages in thread
From: Joseph Myers @ 2016-08-12 17:39 UTC (permalink / raw)
  To: Paul E. Murphy
  Cc: libc-alpha, marcus.shawcroft, rth, carlos, vapier, schwab, stli, davem

On Fri, 12 Aug 2016, Paul E. Murphy wrote:

> At least, please simplify the comment. e.g
> 
> /* Verify fesetexcept does not cause exception traps.  */
> 
> reads better.

OK, I've made that change.

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [09/12] Add fesetexcept: powerpc
  2016-08-12 16:47       ` Paul E. Murphy
@ 2016-08-12 17:50         ` Joseph Myers
  0 siblings, 0 replies; 27+ messages in thread
From: Joseph Myers @ 2016-08-12 17:50 UTC (permalink / raw)
  To: Paul E. Murphy; +Cc: libc-alpha

On Fri, 12 Aug 2016, Paul E. Murphy wrote:

> I don't like the naked constants.  I am not faulting the patch for them.
> But in trying to understand them, I had to do some digging.  A similar
> snippet shows up in three places in ppc code.  fpu/fraiseexcpt.c
> seems to contain the only useful comment.  Both clear and succinct.

I've added that comment to fsetexcptflg.c and will add it to fesetexcept.c 
in my patch.

2016-08-12  Joseph Myers  <joseph@codesourcery.com>

	* sysdeps/powerpc/fpu/fsetexcptflg.c (__fesetexceptflag): Add
	comment from fraiseexcpt.c.

diff --git a/sysdeps/powerpc/fpu/fsetexcptflg.c b/sysdeps/powerpc/fpu/fsetexcptflg.c
index cb440d5..70dd07c 100644
--- a/sysdeps/powerpc/fpu/fsetexcptflg.c
+++ b/sysdeps/powerpc/fpu/fsetexcptflg.c
@@ -36,6 +36,7 @@ __fesetexceptflag (const fexcept_t *flagp, int excepts)
     excepts_mask |= FE_ALL_INVALID;
   n.l = ((u.l & ~excepts_mask)
 	 | (flag & FPSCR_STICKY_BITS)
+	 /* Turn FE_INVALID into FE_INVALID_SOFTWARE.  */
 	 | (flag >> ((31 - FPSCR_VX) - (31 - FPSCR_VXSOFT))
 	    & FE_INVALID_SOFTWARE));
 

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [12/12] Add fesetexcept: sparc
  2016-08-12 11:15     ` Joseph Myers
@ 2016-08-13  8:32       ` Jose E. Marchesi
  0 siblings, 0 replies; 27+ messages in thread
From: Jose E. Marchesi @ 2016-08-13  8:32 UTC (permalink / raw)
  To: Joseph Myers; +Cc: libc-alpha, davem


    >     +int
    >     +fesetexcept (int excepts)
    >     +{
    >     +  fenv_t tmp;
    >     +
    >     +  __fenv_stfsr (tmp);
    >     +  tmp |= excepts & FE_ALL_EXCEPT;
    >     +  __fenv_ldfsr (tmp);
    > 
    > Aren't these stfsr and ldfsr reversed?
    
    They are in the same order as in fesetexceptflag.  __fenv_stfsr = store 
    status register to memory, __fenv_ldfsr = load status register from 
    memory.

Ah right, nevermind :)

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [10/12] Add fesetexcept: s390
  2016-08-11 21:03 ` [10/12] Add fesetexcept: s390 Joseph Myers
@ 2016-08-15  8:07   ` Stefan Liebler
  2016-08-15 20:52     ` Joseph Myers
  0 siblings, 1 reply; 27+ messages in thread
From: Stefan Liebler @ 2016-08-15  8:07 UTC (permalink / raw)
  To: libc-alpha

On 08/11/2016 11:03 PM, Joseph Myers wrote:
> This patch adds an S/390 version of fesetexcept.  Untested.
>
> 2016-08-11  Joseph Myers  <joseph@codesourcery.com>
>
> 	* sysdeps/s390/fpu/fesetexcept.c: New file.
>
> diff --git a/sysdeps/s390/fpu/fesetexcept.c b/sysdeps/s390/fpu/fesetexcept.c
> new file mode 100644
> index 0000000..4728f3e
> --- /dev/null
> +++ b/sysdeps/s390/fpu/fesetexcept.c
> @@ -0,0 +1,32 @@
> +/* Set given exception flags.  S/390 version.
> +   Copyright (C) 2016 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/>.  */
> +
> +#include <fenv.h>
> +#include <fpu_control.h>
> +
> +int
> +fesetexcept (int excepts)
> +{
> +  fexcept_t temp, newexcepts;
> +
> +  _FPU_GETCW (temp);
> +  temp |= (excepts & FE_ALL_EXCEPT) << FPC_FLAGS_SHIFT;
> +  _FPU_SETCW (temp);
> +
> +  return 0;
> +}
>
Hi Joseph,

the macro FPC_FLAGS_SHIFT is defined in fenv_libc.h, which is not 
included. The variable newexcepts is unused.
See diff below.

Afterwards the new tests are succeeding on s390x / s390.

Thanks.
Stefan


--
diff --git a/sysdeps/s390/fpu/fesetexcept.c b/sysdeps/s390/fpu/fesetexcept.c
index 4728f3e..e875f13 100644
--- a/sysdeps/s390/fpu/fesetexcept.c
+++ b/sysdeps/s390/fpu/fesetexcept.c
@@ -18,11 +18,12 @@

  #include <fenv.h>
  #include <fpu_control.h>
+#include <fenv_libc.h>

  int
  fesetexcept (int excepts)
  {
-  fexcept_t temp, newexcepts;
+  fexcept_t temp;

    _FPU_GETCW (temp);
    temp |= (excepts & FE_ALL_EXCEPT) << FPC_FLAGS_SHIFT;

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [10/12] Add fesetexcept: s390
  2016-08-15  8:07   ` Stefan Liebler
@ 2016-08-15 20:52     ` Joseph Myers
  0 siblings, 0 replies; 27+ messages in thread
From: Joseph Myers @ 2016-08-15 20:52 UTC (permalink / raw)
  To: Stefan Liebler; +Cc: libc-alpha

On Mon, 15 Aug 2016, Stefan Liebler wrote:

> Hi Joseph,
> 
> the macro FPC_FLAGS_SHIFT is defined in fenv_libc.h, which is not included.
> The variable newexcepts is unused.
> See diff below.

Thanks, I'll include this fix when I commit.

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 27+ messages in thread

end of thread, other threads:[~2016-08-15 20:52 UTC | newest]

Thread overview: 27+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-08-11 20:57 [01/12] Add fesetexcept Joseph Myers
2016-08-11 20:59 ` [02/12] Add fesetexcept: aarch64 Joseph Myers
2016-08-11 21:45   ` Paul Eggert
2016-08-11 23:30     ` Joseph Myers
2016-08-11 20:59 ` [03/12] Add fesetexcept: alpha Joseph Myers
2016-08-11 21:00 ` [05/12] Add fesetexcept: hppa Joseph Myers
2016-08-11 21:00 ` [04/12] Add fesetexcept: arm Joseph Myers
2016-08-11 21:01 ` [07/12] Add fesetexcept: m68k Joseph Myers
2016-08-11 21:01 ` [06/12] Add fesetexcept: ia64 Joseph Myers
2016-08-11 21:02 ` [09/12] Add fesetexcept: powerpc Joseph Myers
2016-08-12 16:18   ` Paul E. Murphy
2016-08-12 16:30     ` Joseph Myers
2016-08-12 16:47       ` Paul E. Murphy
2016-08-12 17:50         ` Joseph Myers
2016-08-11 21:02 ` [08/12] Add fesetexcept: mips Joseph Myers
2016-08-11 21:03 ` [10/12] Add fesetexcept: s390 Joseph Myers
2016-08-15  8:07   ` Stefan Liebler
2016-08-15 20:52     ` Joseph Myers
2016-08-11 21:04 ` [12/12] Add fesetexcept: sparc Joseph Myers
2016-08-12  7:32   ` Jose E. Marchesi
2016-08-12 11:15     ` Joseph Myers
2016-08-13  8:32       ` Jose E. Marchesi
2016-08-11 21:04 ` [11/12] Add fesetexcept: sh Joseph Myers
2016-08-12 15:49 ` [01/12] Add fesetexcept Paul E. Murphy
2016-08-12 16:20   ` Joseph Myers
2016-08-12 17:25     ` Paul E. Murphy
2016-08-12 17:39       ` Joseph Myers

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).