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


2012/5/23 Thomas Schwinge <thomas@codesourcery.com>:
> 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);
>
>
Looks good to me.

Thanks!

Nobuhiro

-- 
Nobuhiro Iwamatsu
?? iwamatsu at {nigauri.org / debian.org}
?? GPG ID: 40AD1FA6


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