11
22#include < bits/ensure.h>
33#include < fenv.h>
4+ #include < type_traits>
45
56// The functions that are not in this file but are defined in the header
67// are implemented like musl does in assembly.
78extern " C" __attribute__((__visibility__(" hidden" ))) int __fesetround (int );
89
9- int fegetexceptflag (fexcept_t *, int ) {
10- __ensure (!" Not implemented" );
11- __builtin_unreachable ();
10+ // our implementation of fegetexceptflag requires that this holds.
11+ static_assert (std::is_integral_v<fexcept_t >);
12+
13+ int fegetexceptflag (fexcept_t *fe, int excepts) {
14+ *fe = fetestexcept (excepts);
15+ return 0 ;
1216}
1317
14- int feholdexcept (fenv_t *) {
15- __ensure (!" Not implemented" );
16- __builtin_unreachable ();
18+ int feholdexcept (fenv_t *fe) {
19+ fegetenv (fe);
20+ feclearexcept (FE_ALL_EXCEPT);
21+ return 0 ;
1722}
1823
19- int fesetexceptflag (const fexcept_t *, int ) {
20- __ensure (!" Not implemented" );
21- __builtin_unreachable ();
24+ int fesetexceptflag (const fexcept_t *fe, int mask) {
25+ feclearexcept (~*fe & mask);
26+ feraiseexcept (*fe & mask);
27+ return 0 ;
2228}
2329
2430int fesetround (int r) {
@@ -37,7 +43,9 @@ int fesetround(int r) {
3743 return __fesetround (r);
3844}
3945
40- int feupdateenv (const fenv_t *) {
41- __ensure (!" Not implemented" );
42- __builtin_unreachable ();
46+ int feupdateenv (const fenv_t *fe) {
47+ int e = fetestexcept (FE_ALL_EXCEPT);
48+ fesetenv (fe);
49+ feraiseexcept (e);
50+ return 0 ;
4351}
0 commit comments