Skip to content

Commit 90d42bc

Browse files
authored
Merge pull request managarm#1664 from no92/fenv
fenv unstubbing + improvements
2 parents 8bce3fb + 105f09f commit 90d42bc

File tree

5 files changed

+33
-17
lines changed

5 files changed

+33
-17
lines changed

options/ansi/generic/fenv.cpp

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,30 @@
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.
78
extern "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

2430
int 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
}

options/internal/aarch64/setjmp.S

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
// vim: ft=arm64asm
22

3+
#include "mlibc-asm/helpers.h"
4+
35
.extern __sigsetjmp
46

57
.type __setjmp, "function"
@@ -63,5 +65,6 @@ _longjmp:
6365
cmp w1, 0
6466
csinc w0, w1, wzr, ne
6567
br x30
66-
.section .note.GNU-stack,"",%progbits
68+
69+
GNU_STACK_NOTE()
6770

options/internal/m68k/fenv.S

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#include <bits/ansi/fenv.h>
22

3+
#include "mlibc-asm/helpers.h"
4+
35
.global feclearexcept
46
.type feclearexcept,@function
57
feclearexcept:
@@ -108,4 +110,4 @@ fetestexcept:
108110
and.l 4(%sp), %d0
109111
rts
110112

111-
.section .note.GNU-stack,"",%progbits
113+
GNU_STACK_NOTE()

options/internal/x86/fenv.S

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#include "mlibc-asm/helpers.h"
2+
13
# The functions below are taken from musl.
24

35
.hidden __hwcap
@@ -165,4 +167,4 @@ fetestexcept:
165167
1: and %ecx,%eax
166168
ret
167169

168-
.section .note.GNU-stack,"",%progbits
170+
GNU_STACK_NOTE()

options/internal/x86_64/fenv.S

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#include "mlibc-asm/helpers.h"
2+
13
# The functions below are taken from musl.
24
.global feclearexcept
35
.type feclearexcept,@function
@@ -98,5 +100,4 @@ fetestexcept:
98100
and %edi,%eax
99101
ret
100102

101-
.section .note.GNU-stack,"",%progbits
102-
103+
GNU_STACK_NOTE()

0 commit comments

Comments
 (0)