aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/arm/feupdateenv.c
diff options
context:
space:
mode:
authorWilco <wdijkstr@arm.com>2014-05-15 15:21:55 +0100
committerMarcus Shawcroft <marcus.shawcroft@arm.com>2014-05-15 15:23:27 +0100
commitc0c08d02c82275353f5c556f935a1a01714d9d7f (patch)
treec850cda3edb23e165d7d96eb9d82fdc74b5554f1 /sysdeps/arm/feupdateenv.c
parent1a2f40e5d14ed6450696feacf04fca5eeceae7ef (diff)
downloadglibc-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.c24
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)