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