This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 1/4 v3] [SH/SH4]: Add support fedisableexcept, feenableexcept, fegetexcept and feupdateenv


Hi!

On Sun, 20 May 2012 22:08:40 +0900, Kaz Kojima <kkojima@rr.iij4u.or.jp> wrote:
> > Good point.  Thanks!  Rewriting such _FPU_GETCW/_FPU_SETCW
> > pairs with int variables might be less intrusive.  I'll try
> > both way.
> 
> And here is a patch with the 2nd way.  [...]

It turns out there already is a data type defined to be used for this:
fpu_control_t.

Here is a patch based on Kaz' (and revisiting all SH files that invoke
_FPU_GETCW), that completely makes math/test-fenv pass for the SH7785
that I'm testing on.  Kaz, Nobuhiro, OK?

	* sysdeps/sh/sh4/fpu/fraiseexcpt.c (feraiseexcept): Restore
	fpscr flag fields.

	* sysdeps/sh/sh4/fpu/fclrexcpt.c (feclearexcept): Use fpu_control_t for
	the temporary FPU control word.
	* sysdeps/sh/sh4/fpu/fedisblxcpt.c (fedisableexcept): Likewise.
	* sysdeps/sh/sh4/fpu/feenablxcpt.c (feenableexcept): Likewise.
	* sysdeps/sh/sh4/fpu/fegetenv.c (fegetenv): Likewise.
	* sysdeps/sh/sh4/fpu/fegetexcept.c (fegetexcept): Likewise.
	* sysdeps/sh/sh4/fpu/fegetround.c (fegetround): Likewise.
	* sysdeps/sh/sh4/fpu/feholdexcpt.c (feholdexcept): Likewise.
	* sysdeps/sh/sh4/fpu/fesetenv.c (fesetenv): Likewise.
	* sysdeps/sh/sh4/fpu/fesetround.c (fesetround): Likewise.
	* sysdeps/sh/sh4/fpu/feupdateenv.c (feupdateenv): Likewise.
	* sysdeps/sh/sh4/fpu/fsetexcptflg.c (fesetexceptflag): Likewise.
	* sysdeps/sh/sh4/fpu/ftestexcept.c (fetestexcept): Likewise.

diff --git a/sysdeps/sh/sh4/fpu/fclrexcpt.c b/sysdeps/sh/sh4/fpu/fclrexcpt.c
index c2df162..b4b2ead 100644
--- a/sysdeps/sh/sh4/fpu/fclrexcpt.c
+++ b/sysdeps/sh/sh4/fpu/fclrexcpt.c
@@ -1,5 +1,5 @@
 /* Clear given exceptions in current floating-point environment.
-   Copyright (C) 1998, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1998-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Andreas Jaeger <aj@arthur.rhein-neckar.de>, 1998.
 
@@ -23,7 +23,7 @@
 int
 feclearexcept (int excepts)
 {
-  int cw;
+  fpu_control_t cw;
 
   /* Mask out unsupported bits/exceptions.  */
   excepts &= FE_ALL_EXCEPT;
diff --git a/sysdeps/sh/sh4/fpu/fedisblxcpt.c b/sysdeps/sh/sh4/fpu/fedisblxcpt.c
index 029fcc3..b2938ba 100644
--- a/sysdeps/sh/sh4/fpu/fedisblxcpt.c
+++ b/sysdeps/sh/sh4/fpu/fedisblxcpt.c
@@ -23,7 +23,7 @@
 int
 fedisableexcept (int excepts)
 {
-  unsigned int temp, old_exc;
+  fpu_control_t temp, old_exc;
 
   /* Get the current control register contents.  */
   _FPU_GETCW (temp);
diff --git a/sysdeps/sh/sh4/fpu/feenablxcpt.c b/sysdeps/sh/sh4/fpu/feenablxcpt.c
index 93fa749..6d92c12 100644
--- a/sysdeps/sh/sh4/fpu/feenablxcpt.c
+++ b/sysdeps/sh/sh4/fpu/feenablxcpt.c
@@ -23,7 +23,7 @@
 int
 feenableexcept (int excepts)
 {
-  unsigned int temp, old_flag;
+  fpu_control_t temp, old_flag;
 
   /* Get current exceptions.  */
   _FPU_GETCW (temp);
diff --git a/sysdeps/sh/sh4/fpu/fegetenv.c b/sysdeps/sh/sh4/fpu/fegetenv.c
index 3103316..ca7de16 100644
--- a/sysdeps/sh/sh4/fpu/fegetenv.c
+++ b/sysdeps/sh/sh4/fpu/fegetenv.c
@@ -22,7 +22,7 @@
 int
 fegetenv (fenv_t *envp)
 {
-  unsigned long int temp;
+  fpu_control_t temp;
   _FPU_GETCW (temp);
   /* When read fpscr, this was initialized.
      We need to rewrite value of temp. */
diff --git a/sysdeps/sh/sh4/fpu/fegetexcept.c b/sysdeps/sh/sh4/fpu/fegetexcept.c
index a849a17..a2faaac 100644
--- a/sysdeps/sh/sh4/fpu/fegetexcept.c
+++ b/sysdeps/sh/sh4/fpu/fegetexcept.c
@@ -23,7 +23,7 @@
 int
 fegetexcept (void)
 {
-  unsigned int temp;
+  fpu_control_t temp;
 
   /* Get current exceptions.  */
   _FPU_GETCW (temp);
diff --git a/sysdeps/sh/sh4/fpu/fegetround.c b/sysdeps/sh/sh4/fpu/fegetround.c
index 9108e97..7368383 100644
--- a/sysdeps/sh/sh4/fpu/fegetround.c
+++ b/sysdeps/sh/sh4/fpu/fegetround.c
@@ -1,5 +1,5 @@
 /* Return current rounding direction.
-   Copyright (C) 1998, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1998-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Andreas Jaeger <aj@arthur.rhein-neckar.de>, 1998.
 
@@ -23,7 +23,7 @@
 int
 fegetround (void)
 {
-  int cw;
+  fpu_control_t cw;
 
   /* Get control word.  */
   _FPU_GETCW (cw);
diff --git a/sysdeps/sh/sh4/fpu/feholdexcpt.c b/sysdeps/sh/sh4/fpu/feholdexcpt.c
index 2b6b9bd..40a58e1 100644
--- a/sysdeps/sh/sh4/fpu/feholdexcpt.c
+++ b/sysdeps/sh/sh4/fpu/feholdexcpt.c
@@ -1,6 +1,5 @@
 /* Store current floating-point environment and clear exceptions.
-   Copyright (C) 1997, 1998, 1999, 2000, 2005, 2010
-   Free Software Foundation, Inc.
+   Copyright (C) 1997-2012 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
@@ -23,7 +22,7 @@
 int
 feholdexcept (fenv_t *envp)
 {
-  unsigned long int temp;
+  fpu_control_t temp;
 
   /* Store the environment.  */
   _FPU_GETCW (temp);
diff --git a/sysdeps/sh/sh4/fpu/fesetenv.c b/sysdeps/sh/sh4/fpu/fesetenv.c
index 34d3461..55fd1f6 100644
--- a/sysdeps/sh/sh4/fpu/fesetenv.c
+++ b/sysdeps/sh/sh4/fpu/fesetenv.c
@@ -1,5 +1,5 @@
 /* Install given floating-point environment.
-   Copyright (C) 1997, 1998, 1999, 2000, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1997-2012 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
@@ -26,7 +26,7 @@ fesetenv (const fenv_t *envp)
       _FPU_SETCW (_FPU_DEFAULT);
   else
     {
-      unsigned long int temp = envp->__fpscr;
+      fpu_control_t temp = envp->__fpscr;
       _FPU_SETCW (temp);
     }
   return 0;
diff --git a/sysdeps/sh/sh4/fpu/fesetround.c b/sysdeps/sh/sh4/fpu/fesetround.c
index 3269199..4edf9c5 100644
--- a/sysdeps/sh/sh4/fpu/fesetround.c
+++ b/sysdeps/sh/sh4/fpu/fesetround.c
@@ -23,7 +23,7 @@
 int
 fesetround (int round)
 {
-  unsigned int cw;
+  fpu_control_t cw;
 
   if ((round & ~0x3) != 0)
     /* ROUND is no valid rounding mode.  */
diff --git a/sysdeps/sh/sh4/fpu/feupdateenv.c b/sysdeps/sh/sh4/fpu/feupdateenv.c
index 96a6979..41fb8a5 100644
--- a/sysdeps/sh/sh4/fpu/feupdateenv.c
+++ b/sysdeps/sh/sh4/fpu/feupdateenv.c
@@ -23,7 +23,7 @@
 int
 feupdateenv (const fenv_t *envp)
 {
-  unsigned int temp;
+  fpu_control_t temp;
 
   _FPU_GETCW (temp);
   temp = (temp & FE_ALL_EXCEPT);
diff --git a/sysdeps/sh/sh4/fpu/fraiseexcpt.c b/sysdeps/sh/sh4/fpu/fraiseexcpt.c
index a555b10..729e8bf 100644
--- a/sysdeps/sh/sh4/fpu/fraiseexcpt.c
+++ b/sysdeps/sh/sh4/fpu/fraiseexcpt.c
@@ -60,6 +60,14 @@ feraiseexcept (int excepts)
     __asm__ __volatile__ ("fmul %1, %0" : "+d" (d) : "d" (x));
   }
 
+  {
+    /* Restore flag fields.  */
+    fpu_control_t cw;
+    _FPU_GETCW (cw);
+    cw |= (excepts & FE_ALL_EXCEPT);
+    _FPU_SETCW (cw);
+  }
+
   return 0;
 }
 libm_hidden_def (feraiseexcept)
diff --git a/sysdeps/sh/sh4/fpu/fsetexcptflg.c b/sysdeps/sh/sh4/fpu/fsetexcptflg.c
index 40cd5ea..ffed4b1 100644
--- a/sysdeps/sh/sh4/fpu/fsetexcptflg.c
+++ b/sysdeps/sh/sh4/fpu/fsetexcptflg.c
@@ -1,5 +1,5 @@
 /* Set floating-point environment exception handling.
-   Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1997-2012 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
@@ -23,7 +23,7 @@
 int
 fesetexceptflag (const fexcept_t *flagp, int excepts)
 {
-  fexcept_t temp;
+  fpu_control_t temp;
 
   /* Get the current environment.  */
   _FPU_GETCW (temp);
diff --git a/sysdeps/sh/sh4/fpu/ftestexcept.c b/sysdeps/sh/sh4/fpu/ftestexcept.c
index c2e1772..c61af4c 100644
--- a/sysdeps/sh/sh4/fpu/ftestexcept.c
+++ b/sysdeps/sh/sh4/fpu/ftestexcept.c
@@ -1,5 +1,5 @@
 /* Test exception in current environment.
-   Copyright (C) 1997, 1998, 2000, 2010 Free Software Foundation, Inc.
+   Copyright (C) 1997-2012 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
@@ -22,7 +22,7 @@
 int
 fetestexcept (int excepts)
 {
-  fexcept_t temp;
+  fpu_control_t temp;
 
   /* Get current exceptions.  */
   _FPU_GETCW (temp);


GrÃÃe,
 Thomas

Attachment: pgp00000.pgp
Description: PGP signature


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]