diff options
author | Wilco <wdijkstr@arm.com> | 2014-05-15 15:21:55 +0100 |
---|---|---|
committer | Marcus Shawcroft <marcus.shawcroft@arm.com> | 2014-05-15 15:23:27 +0100 |
commit | c0c08d02c82275353f5c556f935a1a01714d9d7f (patch) | |
tree | c850cda3edb23e165d7d96eb9d82fdc74b5554f1 /sysdeps/arm/feupdateenv.c | |
parent | 1a2f40e5d14ed6450696feacf04fca5eeceae7ef (diff) | |
download | glibc-c0c08d02c82275353f5c556f935a1a01714d9d7f.zip glibc-c0c08d02c82275353f5c556f935a1a01714d9d7f.tar.gz glibc-c0c08d02c82275353f5c556f935a1a01714d9d7f.tar.bz2 |
ARM: Improve fenv implementation
Diffstat (limited to 'sysdeps/arm/feupdateenv.c')
-rw-r--r-- | sysdeps/arm/feupdateenv.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/sysdeps/arm/feupdateenv.c b/sysdeps/arm/feupdateenv.c index 55a1502..2a7b3ec 100644 --- a/sysdeps/arm/feupdateenv.c +++ b/sysdeps/arm/feupdateenv.c @@ -17,27 +17,35 @@ License along with the GNU C Library. If not, see <http://www.gnu.org/licenses/>. */ -#include <fenv.h> -#include <fpu_control.h> +#include <fenv_private.h> #include <arm-features.h> int feupdateenv (const fenv_t *envp) { - fpu_control_t fpscr; + fenv_t fenv; /* Fail if a VFP unit isn't present. */ if (!ARM_HAVE_VFP) return 1; - _FPU_GETCW (fpscr); + if ((envp == FE_DFL_ENV) || (envp == FE_NOMASK_ENV)) + { + fpu_control_t fpscr; - /* Install new environment. */ - fesetenv (envp); + _FPU_GETCW (fpscr); - /* Raise the saved exceptions. */ - feraiseexcept (fpscr & FE_ALL_EXCEPT); + /* Preserve the reserved FPSCR flags. */ + fpscr &= _FPU_RESERVED; + fpscr |= (envp == FE_DFL_ENV) ? _FPU_DEFAULT : _FPU_IEEE; + + /* Create a valid fenv to pass to libc_feupdateenv_vfp. */ + fenv.__cw = fpscr; + envp = &fenv; + } + + libc_feupdateenv_vfp (envp); return 0; } libm_hidden_def (feupdateenv) |