github.com/afumu/libc@v0.0.6/musl/src/fenv/m68k/fenv.c (about) 1 #include <fenv.h> 2 #include <features.h> 3 4 #if __HAVE_68881__ || __mcffpu__ 5 6 static unsigned getsr() 7 { 8 unsigned v; 9 __asm__ __volatile__ ("fmove.l %%fpsr,%0" : "=dm"(v)); 10 return v; 11 } 12 13 static void setsr(unsigned v) 14 { 15 __asm__ __volatile__ ("fmove.l %0,%%fpsr" : : "dm"(v)); 16 } 17 18 static unsigned getcr() 19 { 20 unsigned v; 21 __asm__ __volatile__ ("fmove.l %%fpcr,%0" : "=dm"(v)); 22 return v; 23 } 24 25 static void setcr(unsigned v) 26 { 27 __asm__ __volatile__ ("fmove.l %0,%%fpcr" : : "dm"(v)); 28 } 29 30 int feclearexcept(int mask) 31 { 32 if (mask & ~FE_ALL_EXCEPT) return -1; 33 setsr(getsr() & ~mask); 34 return 0; 35 } 36 37 int feraiseexcept(int mask) 38 { 39 if (mask & ~FE_ALL_EXCEPT) return -1; 40 setsr(getsr() | mask); 41 return 0; 42 } 43 44 int fetestexcept(int mask) 45 { 46 return getsr() & mask; 47 } 48 49 int fegetround(void) 50 { 51 return getcr() & FE_UPWARD; 52 } 53 54 hidden int __fesetround(int r) 55 { 56 setcr((getcr() & ~FE_UPWARD) | r); 57 return 0; 58 } 59 60 int fegetenv(fenv_t *envp) 61 { 62 envp->__control_register = getcr(); 63 envp->__status_register = getsr(); 64 __asm__ __volatile__ ("fmove.l %%fpiar,%0" 65 : "=dm"(envp->__instruction_address)); 66 return 0; 67 } 68 69 int fesetenv(const fenv_t *envp) 70 { 71 static const fenv_t default_env = { 0 }; 72 if (envp == FE_DFL_ENV) 73 envp = &default_env; 74 setcr(envp->__control_register); 75 setsr(envp->__status_register); 76 __asm__ __volatile__ ("fmove.l %0,%%fpiar" 77 : : "dm"(envp->__instruction_address)); 78 return 0; 79 } 80 81 #else 82 83 #include "../fenv.c" 84 85 #endif