1 /* Install given floating-point environment and raise exceptions.
2 Copyright (C) 1997-2018 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
4 Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
6 The GNU C Library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library. If not, see
18 <http://www.gnu.org/licenses/>. */
21 #include <fpu_control.h>
22 #include <arm-features.h>
26 __feupdateenv (const fenv_t
*envp
)
28 fpu_control_t fpscr
, new_fpscr
, updated_fpscr
;
31 /* Fail if a VFP unit isn't present. */
36 excepts
= fpscr
& FE_ALL_EXCEPT
;
38 if ((envp
!= FE_DFL_ENV
) && (envp
!= FE_NOMASK_ENV
))
40 /* Merge current exception flags with the saved fenv. */
41 new_fpscr
= envp
->__cw
| excepts
;
43 /* Write new FPSCR if different (ignoring NZCV flags). */
44 if (((fpscr
^ new_fpscr
) & ~_FPU_MASK_NZCV
) != 0)
45 _FPU_SETCW (new_fpscr
);
47 /* Raise the exceptions if enabled in the new FP state. */
48 if (excepts
& (new_fpscr
>> FE_EXCEPT_SHIFT
))
49 return __feraiseexcept (excepts
);
54 /* Preserve the reserved FPSCR flags. */
55 new_fpscr
= fpscr
& (_FPU_RESERVED
| FE_ALL_EXCEPT
);
56 new_fpscr
|= (envp
== FE_DFL_ENV
) ? _FPU_DEFAULT
: _FPU_IEEE
;
58 if (((new_fpscr
^ fpscr
) & ~_FPU_MASK_NZCV
) != 0)
60 _FPU_SETCW (new_fpscr
);
62 /* Not all VFP architectures support trapping exceptions, so
63 test whether the relevant bits were set and fail if not. */
64 _FPU_GETCW (updated_fpscr
);
66 if (new_fpscr
& ~updated_fpscr
)
70 /* Raise the exceptions if enabled in the new FP state. */
71 if (excepts
& (new_fpscr
>> FE_EXCEPT_SHIFT
))
72 return __feraiseexcept (excepts
);
76 libm_hidden_def (__feupdateenv
)
77 weak_alias (__feupdateenv
, feupdateenv
)
78 libm_hidden_weak (feupdateenv
)