public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [06/12] Add femode_t functions: ia64
@ 2016-09-02 21:57 Joseph Myers
  2016-09-03 14:26 ` Yury Norov
  0 siblings, 1 reply; 3+ messages in thread
From: Joseph Myers @ 2016-09-02 21:57 UTC (permalink / raw)
  To: libc-alpha; +Cc: vapier

This patch adds IA64 versions of fegetmode and fesetmode.  Untested.

2016-09-02  Joseph Myers  <joseph@codesourcery.com>

	* sysdeps/ia64/fpu/fegetmode.c: New file.
	* sysdeps/ia64/fpu/fesetmode.c: Likewise.

diff --git a/sysdeps/ia64/fpu/fegetmode.c b/sysdeps/ia64/fpu/fegetmode.c
new file mode 100644
index 0000000..0ccaa8f
--- /dev/null
+++ b/sysdeps/ia64/fpu/fegetmode.c
@@ -0,0 +1,26 @@
+/* Store current floating-point control modes.  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
+fegetmode (femode_t *modep)
+{
+  __asm__ __volatile__ ("mov.m %0=ar.fpsr" : "=r" (*modep));
+  return 0;
+}
diff --git a/sysdeps/ia64/fpu/fesetmode.c b/sysdeps/ia64/fpu/fesetmode.c
new file mode 100644
index 0000000..11187e9
--- /dev/null
+++ b/sysdeps/ia64/fpu/fesetmode.c
@@ -0,0 +1,42 @@
+/* Install given floating-point control modes.  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>
+
+#define FPSR_STATUS 0x1f80UL
+#define FPSR_STATUS_ALL ((FPSR_STATUS << 6) | (FPSR_STATUS << 19) \
+			 | (FPSR_STATUS << 32) | (FPSR_STATUS << 45))
+
+int
+fesetmode (const femode_t *modep)
+{
+  femode_t mode;
+
+  /* As in fesetenv.  */
+  if (((fenv_t) modep >> 62) == 0x03)
+    mode = (femode_t) modep & 0x3fffffffffffffffUL;
+  else
+    mode = *modep;
+
+  femode_t fpsr;
+  __asm__ __volatile__ ("mov.m %0=ar.fpsr" : "=r" (fpsr));
+  fpsr = (fpsr & FPSR_STATUS_ALL) | (mode & ~FPSR_STATUS_ALL);
+  __asm__ __volatile__ ("mov.m ar.fpsr=%0;;" :: "r" (fpsr));
+
+  return 0;
+}

-- 
Joseph S. Myers
joseph@codesourcery.com

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

* Re: [06/12] Add femode_t functions: ia64
  2016-09-02 21:57 [06/12] Add femode_t functions: ia64 Joseph Myers
@ 2016-09-03 14:26 ` Yury Norov
  2016-09-05 15:24   ` Joseph Myers
  0 siblings, 1 reply; 3+ messages in thread
From: Yury Norov @ 2016-09-03 14:26 UTC (permalink / raw)
  To: Joseph Myers; +Cc: libc-alpha, vapier

On Fri, Sep 02, 2016 at 09:56:42PM +0000, Joseph Myers wrote:

[...]

> diff --git a/sysdeps/ia64/fpu/fesetmode.c b/sysdeps/ia64/fpu/fesetmode.c
> new file mode 100644
> index 0000000..11187e9
> --- /dev/null
> +++ b/sysdeps/ia64/fpu/fesetmode.c
> @@ -0,0 +1,42 @@
> +/* Install given floating-point control modes.  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>
> +
> +#define FPSR_STATUS 0x1f80UL
> +#define FPSR_STATUS_ALL ((FPSR_STATUS << 6) | (FPSR_STATUS << 19) \
> +			 | (FPSR_STATUS << 32) | (FPSR_STATUS << 45))
> +

Hi Josepf,

Is it possible to #define offsets to avoid magic numbers, or drop the
link to specification?

Yury.

> +int
> +fesetmode (const femode_t *modep)
> +{
> +  femode_t mode;
> +
> +  /* As in fesetenv.  */
> +  if (((fenv_t) modep >> 62) == 0x03)
> +    mode = (femode_t) modep & 0x3fffffffffffffffUL;
> +  else
> +    mode = *modep;
> +
> +  femode_t fpsr;
> +  __asm__ __volatile__ ("mov.m %0=ar.fpsr" : "=r" (fpsr));
> +  fpsr = (fpsr & FPSR_STATUS_ALL) | (mode & ~FPSR_STATUS_ALL);
> +  __asm__ __volatile__ ("mov.m ar.fpsr=%0;;" :: "r" (fpsr));
> +
> +  return 0;
> +}
> 
> -- 
> Joseph S. Myers
> joseph@codesourcery.com

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

* Re: [06/12] Add femode_t functions: ia64
  2016-09-03 14:26 ` Yury Norov
@ 2016-09-05 15:24   ` Joseph Myers
  0 siblings, 0 replies; 3+ messages in thread
From: Joseph Myers @ 2016-09-05 15:24 UTC (permalink / raw)
  To: Yury Norov; +Cc: libc-alpha, vapier

On Sat, 3 Sep 2016, Yury Norov wrote:

> > +#define FPSR_STATUS 0x1f80UL
> > +#define FPSR_STATUS_ALL ((FPSR_STATUS << 6) | (FPSR_STATUS << 19) \
> > +			 | (FPSR_STATUS << 32) | (FPSR_STATUS << 45))
> > +
> 
> Hi Josepf,
> 
> Is it possible to #define offsets to avoid magic numbers, or drop the
> link to specification?

I think defining extra macros (which would be used only once each) for the 
offsets of the four status/control fields would make the code less 
readable, not more, in this case (like the recent rejected Linux kernel 
patches to use symbolic names for file access modes).  It's clear to 
readers of the code what those offsets are meant to be (I think it's 
reasonable to expect readers of ia64 floating-point code to have a general 
awareness of the four status/control fields, with instructions being able 
to choose which one is applied to that instruction), and anyone checking 
the precise values of offsets and bit-masks has to refer to architecture 
manuals, with or without macros involved.

-- 
Joseph S. Myers
joseph@codesourcery.com

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

end of thread, other threads:[~2016-09-05 15:24 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-09-02 21:57 [06/12] Add femode_t functions: ia64 Joseph Myers
2016-09-03 14:26 ` Yury Norov
2016-09-05 15:24   ` 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).