FPcontrol-OpenBSD.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include "lib9.h"
  2. #include "mathi.h"
  3. void
  4. FPinit(void)
  5. {
  6. setfsr(0); /* Clear pending exceptions */
  7. setfcr(FPPDBL|FPRNR|FPINVAL|FPZDIV|FPUNFL|FPOVFL);
  8. }
  9. ulong
  10. getFPstatus(void)
  11. {
  12. ulong fsr = 0, fsr9 = getfsr();
  13. /* on specific machines, could be table lookup */
  14. if(fsr9&FPAINEX) fsr |= INEX;
  15. if(fsr9&FPAOVFL) fsr |= OVFL;
  16. if(fsr9&FPAUNFL) fsr |= UNFL;
  17. if(fsr9&FPAZDIV) fsr |= ZDIV;
  18. if(fsr9&FPAINVAL) fsr |= INVAL;
  19. return fsr;
  20. }
  21. ulong
  22. FPstatus(ulong fsr, ulong mask)
  23. {
  24. ulong fsr9 = 0;
  25. ulong old = getFPstatus();
  26. fsr = (fsr&mask) | (old&~mask);
  27. if(fsr&INEX) fsr9 |= FPAINEX;
  28. if(fsr&OVFL) fsr9 |= FPAOVFL;
  29. if(fsr&UNFL) fsr9 |= FPAUNFL;
  30. if(fsr&ZDIV) fsr9 |= FPAZDIV;
  31. if(fsr&INVAL) fsr9 |= FPAINVAL;
  32. setfsr(fsr9);
  33. return(old&mask);
  34. }
  35. ulong
  36. getFPcontrol(void)
  37. {
  38. ulong fcr = 0, fcr9 = getfcr();
  39. switch(fcr9&FPRMASK){
  40. case FPRNR: fcr = RND_NR; break;
  41. case FPRNINF: fcr = RND_NINF; break;
  42. case FPRPINF: fcr = RND_PINF; break;
  43. case FPRZ: fcr = RND_Z; break;
  44. }
  45. if(fcr9&FPINEX) fcr |= INEX;
  46. if(fcr9&FPOVFL) fcr |= OVFL;
  47. if(fcr9&FPUNFL) fcr |= UNFL;
  48. if(fcr9&FPZDIV) fcr |= ZDIV;
  49. if(fcr9&FPINVAL) fcr |= INVAL;
  50. return fcr;
  51. }
  52. ulong
  53. FPcontrol(ulong fcr, ulong mask)
  54. {
  55. ulong fcr9 = FPPDBL;
  56. ulong old = getFPcontrol();
  57. fcr = (fcr&mask) | (old&~mask);
  58. if(fcr&INEX) fcr9 |= FPINEX;
  59. if(fcr&OVFL) fcr9 |= FPOVFL;
  60. if(fcr&UNFL) fcr9 |= FPUNFL;
  61. if(fcr&ZDIV) fcr9 |= FPZDIV;
  62. if(fcr&INVAL) fcr9 |= FPINVAL;
  63. switch(fcr&RND_MASK){
  64. case RND_NR: fcr9 |= FPRNR; break;
  65. case RND_NINF: fcr9 |= FPRNINF; break;
  66. case RND_PINF: fcr9 |= FPRPINF; break;
  67. case RND_Z: fcr9 |= FPRZ; break;
  68. }
  69. setfcr(fcr9);
  70. return(old&mask);
  71. }