[09/12] Add fesetexcept: powerpc

Message ID alpine.DEB.2.20.1608112102170.1591@digraph.polyomino.org.uk
State Committed
Headers

Commit Message

Joseph Myers Aug. 11, 2016, 9:02 p.m. UTC
  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.
  

Comments

Paul E. Murphy Aug. 12, 2016, 4:18 p.m. UTC | #1
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.
  
Joseph Myers Aug. 12, 2016, 4:30 p.m. UTC | #2
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).
  
Paul E. Murphy Aug. 12, 2016, 4:46 p.m. UTC | #3
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.
  

Patch

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;
+}