1 | #ifndef _FENV_H |
2 | #include <math/fenv.h> |
3 | |
4 | #ifndef _ISOMAC |
5 | # include <stdbool.h> |
6 | /* Now define the internal interfaces. */ |
7 | |
8 | extern int __feclearexcept (int __excepts); |
9 | extern int __fegetexcept (void); |
10 | extern int __fegetexceptflag (fexcept_t *__flagp, int __excepts); |
11 | extern int __feraiseexcept (int __excepts); |
12 | extern int __fesetexceptflag (const fexcept_t *__flagp, int __excepts); |
13 | extern int __fegetenv (fenv_t *__envp); |
14 | extern int __fesetenv (const fenv_t *__envp); |
15 | extern int __feupdateenv (const fenv_t *__envp); |
16 | extern __typeof (fegetround) __fegetround __attribute_pure__; |
17 | extern __typeof (feholdexcept) __feholdexcept; |
18 | extern __typeof (fesetround) __fesetround; |
19 | |
20 | libm_hidden_proto (feraiseexcept) |
21 | libm_hidden_proto (__feraiseexcept) |
22 | libm_hidden_proto (fegetenv) |
23 | libm_hidden_proto (__fegetenv) |
24 | libm_hidden_proto (fegetround) |
25 | libm_hidden_proto (__fegetround) |
26 | libm_hidden_proto (fesetenv) |
27 | libm_hidden_proto (__fesetenv) |
28 | libm_hidden_proto (fesetround) |
29 | libm_hidden_proto (__fesetround) |
30 | libm_hidden_proto (feholdexcept) |
31 | libm_hidden_proto (__feholdexcept) |
32 | libm_hidden_proto (feupdateenv) |
33 | libm_hidden_proto (__feupdateenv) |
34 | libm_hidden_proto (fetestexcept) |
35 | libm_hidden_proto (feclearexcept) |
36 | |
37 | /* Rounding mode context. This allows functions to set/restore rounding mode |
38 | only when the desired rounding mode is different from the current rounding |
39 | mode. */ |
40 | struct rm_ctx |
41 | { |
42 | fenv_t env; |
43 | bool updated_status; |
44 | }; |
45 | |
46 | /* Track whether rounding mode macros were defined, since |
47 | get-rounding-mode.h may define default versions if they weren't. |
48 | FE_TONEAREST must always be defined (even if no changes of rounding |
49 | mode are supported, glibc requires it to be defined to represent |
50 | the default rounding mode). */ |
51 | # ifndef FE_TONEAREST |
52 | # error "FE_TONEAREST not defined" |
53 | # endif |
54 | # if defined FE_DOWNWARD || defined FE_TOWARDZERO || defined FE_UPWARD |
55 | # define FE_HAVE_ROUNDING_MODES 1 |
56 | # else |
57 | # define FE_HAVE_ROUNDING_MODES 0 |
58 | # endif |
59 | |
60 | /* When no floating-point exceptions are defined in <fenv.h>, make |
61 | feraiseexcept ignore its argument so that unconditional |
62 | feraiseexcept calls do not cause errors for undefined exceptions. |
63 | Define it to expand to a void expression so that any calls testing |
64 | the result of feraiseexcept do produce errors. */ |
65 | # if FE_ALL_EXCEPT == 0 |
66 | # define feraiseexcept(excepts) ((void) 0) |
67 | # define __feraiseexcept(excepts) ((void) 0) |
68 | # endif |
69 | |
70 | /* Similarly, most <fenv.h> functions have trivial implementations in |
71 | the absence of support for floating-point exceptions and rounding |
72 | modes. */ |
73 | |
74 | # if !FE_HAVE_ROUNDING_MODES |
75 | # if FE_ALL_EXCEPT == 0 |
76 | extern inline int |
77 | fegetenv (fenv_t *__e) |
78 | { |
79 | return 0; |
80 | } |
81 | |
82 | extern inline int |
83 | __fegetenv (fenv_t *__e) |
84 | { |
85 | return 0; |
86 | } |
87 | |
88 | extern inline int |
89 | feholdexcept (fenv_t *__e) |
90 | { |
91 | return 0; |
92 | } |
93 | |
94 | extern inline int |
95 | __feholdexcept (fenv_t *__e) |
96 | { |
97 | return 0; |
98 | } |
99 | |
100 | extern inline int |
101 | fesetenv (const fenv_t *__e) |
102 | { |
103 | return 0; |
104 | } |
105 | |
106 | extern inline int |
107 | __fesetenv (const fenv_t *__e) |
108 | { |
109 | return 0; |
110 | } |
111 | |
112 | extern inline int |
113 | feupdateenv (const fenv_t *__e) |
114 | { |
115 | return 0; |
116 | } |
117 | |
118 | extern inline int |
119 | __feupdateenv (const fenv_t *__e) |
120 | { |
121 | return 0; |
122 | } |
123 | # endif |
124 | |
125 | extern inline int |
126 | fegetround (void) |
127 | { |
128 | return FE_TONEAREST; |
129 | } |
130 | |
131 | extern inline int |
132 | __fegetround (void) |
133 | { |
134 | return FE_TONEAREST; |
135 | } |
136 | |
137 | extern inline int |
138 | fesetround (int __d) |
139 | { |
140 | return 0; |
141 | } |
142 | |
143 | extern inline int |
144 | __fesetround (int __d) |
145 | { |
146 | return 0; |
147 | } |
148 | # endif |
149 | |
150 | #endif |
151 | |
152 | #endif |
153 | |