3 #if __HAVE_68881__ || __mcffpu__
5 static unsigned getsr()
8 __asm__ __volatile__ ("fmove.l %%fpsr,%0" : "=dm"(v));
12 static void setsr(unsigned v)
14 __asm__ __volatile__ ("fmove.l %0,%%fpsr" : : "dm"(v));
17 static unsigned getcr()
20 __asm__ __volatile__ ("fmove.l %%fpcr,%0" : "=dm"(v));
24 static void setcr(unsigned v)
26 __asm__ __volatile__ ("fmove.l %0,%%fpcr" : : "dm"(v));
29 int feclearexcept(int mask)
31 if (mask & ~FE_ALL_EXCEPT) return -1;
32 setsr(getsr() & ~mask);
36 int feraiseexcept(int mask)
38 if (mask & ~FE_ALL_EXCEPT) return -1;
39 setsr(getsr() | mask);
43 int fetestexcept(int mask)
45 return getsr() & mask;
50 return getcr() & FE_UPWARD;
53 int __fesetround(int r)
55 setcr((getcr() & ~FE_UPWARD) | r);
59 int fegetenv(fenv_t *envp)
61 envp->__control_register = getcr();
62 envp->__status_register = getsr();
63 __asm__ __volatile__ ("fmove.l %%fpiar,%0"
64 : "=dm"(envp->__instruction_address));
68 int fesetenv(const fenv_t *envp)
70 static const fenv_t default_env = { 0 };
71 if (envp == FE_DFL_ENV)
73 setcr(envp->__control_register);
74 setsr(envp->__status_register);
75 __asm__ __volatile__ ("fmove.l %0,%%fpiar"
76 : : "dm"(envp->__instruction_address));