Skip to content

Commit ebbadac

Browse files
committed
improved <fenv.h> standards conformance
1 parent d44c4fe commit ebbadac

2 files changed

Lines changed: 186 additions & 33 deletions

File tree

src/libc/fenv.c

Lines changed: 55 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,58 @@
33
const fenv_t __fe_dfl_env = FE_TONEAREST;
44
fenv_t __fe_cur_env = __fe_dfl_env;
55

6-
extern inline int feclearexcept(int __excepts);
7-
8-
extern inline int fegetexceptflag(fexcept_t *__flagp, int __excepts);
9-
10-
extern inline int feraiseexcept(int __excepts);
11-
12-
extern inline int fesetexceptflag(const fexcept_t *__flagp, int __excepts);
13-
14-
extern inline int fetestexcept(int __excepts);
15-
16-
extern inline int fegetround(void);
17-
18-
extern inline int fesetround(int __rounding_mode);
19-
20-
extern inline int fegetenv(fenv_t *__envp);
21-
22-
extern inline int feholdexcept(fenv_t *__envp);
23-
24-
extern inline int fesetenv(const fenv_t *__envp);
25-
26-
extern inline int feupdateenv(const fenv_t *__envp);
6+
#undef feclearexcept
7+
#undef fegetexceptflag
8+
#undef feraiseexcept
9+
#undef fesetexceptflag
10+
#undef fetestexcept
11+
#undef fegetround
12+
#undef fesetround
13+
#undef fegetenv
14+
#undef feholdexcept
15+
#undef fesetenv
16+
#undef feupdateenv
17+
18+
int feclearexcept(int __excepts) {
19+
return __feclearexcept(__excepts);
20+
}
21+
22+
int fegetexceptflag(fexcept_t *__flagp, int __excepts) {
23+
return __fegetexceptflag(__flagp, __excepts);
24+
}
25+
26+
int feraiseexcept(int __excepts) {
27+
return __feraiseexcept(__excepts);
28+
}
29+
30+
int fesetexceptflag(const fexcept_t *__flagp, int __excepts) {
31+
return __fesetexceptflag(__flagp, __excepts);
32+
}
33+
34+
int fetestexcept(int __excepts) {
35+
return __fetestexcept(__excepts);
36+
}
37+
38+
int fegetround(void) {
39+
return __fegetround();
40+
}
41+
42+
int fesetround(int __rounding_mode) {
43+
return __fesetround(__rounding_mode);
44+
}
45+
46+
int fegetenv(fenv_t *__envp) {
47+
return __fegetenv(__envp);
48+
}
49+
50+
int feholdexcept(fenv_t *__envp) {
51+
return __feholdexcept(__envp);
52+
}
53+
54+
int fesetenv(const fenv_t *__envp) {
55+
return __fesetenv(__envp);
56+
}
57+
58+
int feupdateenv(const fenv_t *__envp) {
59+
return __feupdateenv(__envp);
60+
}

src/libc/include/fenv.h

Lines changed: 131 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,52 +34,171 @@ typedef unsigned char fexcept_t;
3434
extern const fenv_t __fe_dfl_env;
3535
#define FE_DFL_ENV (&__fe_dfl_env)
3636

37-
__BEGIN_DECLS
37+
//------------------------------------------------------------------------------
38+
// functions
39+
//------------------------------------------------------------------------------
3840

39-
inline int feclearexcept(int __excepts) {
41+
static inline __attribute__((__always_inline__))
42+
int __feclearexcept(int __excepts) {
4043
return (__fe_cur_env &= ~((__excepts) & FE_ALL_EXCEPT), 0);
4144
}
4245

43-
inline int fegetexceptflag(fexcept_t *__flagp, int __excepts) {
46+
static inline __attribute__((__always_inline__))
47+
int __fegetexceptflag(fexcept_t *__flagp, int __excepts) {
4448
return (*(__flagp) = __fe_cur_env & (__excepts) & FE_ALL_EXCEPT, 0);
4549
}
4650

47-
inline int feraiseexcept(int __excepts) {
51+
static inline __attribute__((__always_inline__))
52+
int __feraiseexcept(int __excepts) {
4853
return (__fe_cur_env |= (__excepts) & FE_ALL_EXCEPT, 0);
4954
}
5055

51-
inline int fesetexceptflag(const fexcept_t *__flagp, int __excepts) {
56+
static inline __attribute__((__always_inline__))
57+
int __fesetexceptflag(const fexcept_t *__flagp, int __excepts) {
5258
return (__fe_cur_env = (__fe_cur_env & ~((__excepts) & FE_ALL_EXCEPT)) | (*(__flagp) & (__excepts) & FE_ALL_EXCEPT), 0);
5359
}
5460

55-
inline int fetestexcept(int __excepts) {
61+
static inline __attribute__((__always_inline__))
62+
int __fetestexcept(int __excepts) {
5663
return (__fe_cur_env & (__excepts) & FE_ALL_EXCEPT);
5764
}
5865

59-
inline int fegetround(void) {
66+
static inline __attribute__((__always_inline__))
67+
int __fegetround(void) {
6068
return (__fe_cur_env & 3);
6169
}
6270

63-
inline int fesetround(int __rounding_mode) {
71+
static inline __attribute__((__always_inline__))
72+
int __fesetround(int __rounding_mode) {
6473
return (__fe_cur_env = (__fe_cur_env & ~3) | ((__rounding_mode) & 3), 0);
6574
}
6675

67-
inline int fegetenv(fenv_t *__envp) {
76+
static inline __attribute__((__always_inline__))
77+
int __fegetenv(fenv_t *__envp) {
6878
return (*(__envp) = __fe_cur_env, 0);
6979
}
7080

71-
inline int feholdexcept(fenv_t *__envp) {
81+
static inline __attribute__((__always_inline__))
82+
int __feholdexcept(fenv_t *__envp) {
7283
return (*(__envp) = __fe_cur_env, __fe_cur_env &= ~FE_ALL_EXCEPT, 0);
7384
}
7485

75-
inline int fesetenv(const fenv_t *__envp) {
86+
static inline __attribute__((__always_inline__))
87+
int __fesetenv(const fenv_t *__envp) {
7688
return (__fe_cur_env = *(__envp), 0);
7789
}
7890

79-
inline int feupdateenv(const fenv_t *__envp) {
91+
static inline __attribute__((__always_inline__))
92+
int __feupdateenv(const fenv_t *__envp) {
8093
return (__fe_cur_env = (__fe_cur_env & FE_ALL_EXCEPT) | *(__envp), 0);
8194
}
8295

96+
//------------------------------------------------------------------------------
97+
// prototypes
98+
//------------------------------------------------------------------------------
99+
100+
__BEGIN_DECLS
101+
102+
int feclearexcept(int __excepts) __NOEXCEPT;
103+
104+
int fegetexceptflag(fexcept_t *__flagp, int __excepts) __NOEXCEPT;
105+
106+
int feraiseexcept(int __excepts) __NOEXCEPT;
107+
108+
int fesetexceptflag(const fexcept_t *__flagp, int __excepts) __NOEXCEPT;
109+
110+
int fetestexcept(int __excepts) __NOEXCEPT_PURE;
111+
112+
int fegetround(void) __NOEXCEPT_PURE;
113+
114+
int fesetround(int __rounding_mode) __NOEXCEPT;
115+
116+
int fegetenv(fenv_t *__envp) __NOEXCEPT;
117+
118+
int feholdexcept(fenv_t *__envp) __NOEXCEPT;
119+
120+
int fesetenv(const fenv_t *__envp) __NOEXCEPT;
121+
122+
int feupdateenv(const fenv_t *__envp) __NOEXCEPT;
123+
124+
#ifdef __cplusplus
125+
126+
inline int feclearexcept(int __excepts) __NOEXCEPT {
127+
return __feclearexcept(__excepts);
128+
}
129+
130+
inline int fegetexceptflag(fexcept_t *__flagp, int __excepts) __NOEXCEPT {
131+
return __fegetexceptflag(__flagp, __excepts);
132+
}
133+
134+
inline int feraiseexcept(int __excepts) __NOEXCEPT {
135+
return __feraiseexcept(__excepts);
136+
}
137+
138+
inline int fesetexceptflag(const fexcept_t *__flagp, int __excepts) __NOEXCEPT {
139+
return __fesetexceptflag(__flagp, __excepts);
140+
}
141+
142+
inline int fetestexcept(int __excepts) __NOEXCEPT {
143+
return __fetestexcept(__excepts);
144+
}
145+
146+
inline int fegetround(void) __NOEXCEPT {
147+
return __fegetround();
148+
}
149+
150+
inline int fesetround(int __rounding_mode) __NOEXCEPT {
151+
return __fesetround(__rounding_mode);
152+
}
153+
154+
inline int fegetenv(fenv_t *__envp) __NOEXCEPT {
155+
return __fegetenv(__envp);
156+
}
157+
158+
inline int feholdexcept(fenv_t *__envp) __NOEXCEPT {
159+
return __feholdexcept(__envp);
160+
}
161+
162+
inline int fesetenv(const fenv_t *__envp) __NOEXCEPT {
163+
return __fesetenv(__envp);
164+
}
165+
166+
inline int feupdateenv(const fenv_t *__envp) __NOEXCEPT {
167+
return __feupdateenv(__envp);
168+
}
169+
170+
#endif /* __cplusplus */
171+
83172
__END_DECLS
84173

174+
//------------------------------------------------------------------------------
175+
// macros
176+
//------------------------------------------------------------------------------
177+
178+
#ifndef __cplusplus
179+
180+
#define feclearexcept(excepts) __feclearexcept(excepts)
181+
182+
#define fegetexceptflag(flagp, excepts) __fegetexceptflag(flagp, excepts)
183+
184+
#define feraiseexcept(excepts) __feraiseexcept(excepts)
185+
186+
#define fesetexceptflag(flagp, excepts) __fesetexceptflag(flagp, excepts)
187+
188+
#define fetestexcept(excepts) __fetestexcept(excepts)
189+
190+
#define fegetround() __fegetround()
191+
192+
#define fesetround(rounding_mode) __fesetround(rounding_mode)
193+
194+
#define fegetenv(envp) __fegetenv(envp)
195+
196+
#define feholdexcept(envp) __feholdexcept(envp)
197+
198+
#define fesetenv(envp) __fesetenv(envp)
199+
200+
#define feupdateenv(envp) __feupdateenv(envp)
201+
202+
#endif /* __cplusplus */
203+
85204
#endif /* _FENV_H */

0 commit comments

Comments
 (0)