fenv.c 767 B

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