1#include <fenv.h>
2
3static inline unsigned get_fpc(void)
4{
5	unsigned fpc;
6	__asm__ __volatile__("efpc %0" : "=r"(fpc));
7	return fpc;
8}
9
10static inline void set_fpc(unsigned fpc)
11{
12	__asm__ __volatile__("sfpc %0" :: "r"(fpc));
13}
14
15int feclearexcept(int mask)
16{
17	mask &= FE_ALL_EXCEPT;
18	set_fpc(get_fpc() & ~mask);
19	return 0;
20}
21
22int feraiseexcept(int mask)
23{
24	mask &= FE_ALL_EXCEPT;
25	set_fpc(get_fpc() | mask);
26	return 0;
27}
28
29int fetestexcept(int mask)
30{
31	return get_fpc() & mask & FE_ALL_EXCEPT;
32}
33
34int fegetround(void)
35{
36	return get_fpc() & 3;
37}
38
39int __fesetround(int r)
40{
41	set_fpc(get_fpc() & ~3L | r);
42	return 0;
43}
44
45int fegetenv(fenv_t *envp)
46{
47	*envp = get_fpc();
48	return 0;
49}
50
51int fesetenv(const fenv_t *envp)
52{
53	set_fpc(envp != FE_DFL_ENV ? *envp : 0);
54	return 0;
55}
56