[09/12] Add fesetexcept: powerpc
Commit Message
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
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.
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).
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.
new file mode 100644
@@ -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;
+}
new file mode 100644
@@ -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;
+}
new file mode 100644
@@ -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;
+}