mtfsf.c 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #include <linux/types.h>
  2. #include <linux/errno.h>
  3. #include <asm/uaccess.h>
  4. #include <asm/sfp-machine.h>
  5. #include <math-emu/soft-fp.h>
  6. int
  7. mtfsf(unsigned int FM, u32 *frB)
  8. {
  9. u32 mask;
  10. u32 fpscr;
  11. if (FM == 0)
  12. return 0;
  13. if (FM == 0xff)
  14. mask = 0x9fffffff;
  15. else {
  16. mask = 0;
  17. if (FM & (1 << 0))
  18. mask |= 0x90000000;
  19. if (FM & (1 << 1))
  20. mask |= 0x0f000000;
  21. if (FM & (1 << 2))
  22. mask |= 0x00f00000;
  23. if (FM & (1 << 3))
  24. mask |= 0x000f0000;
  25. if (FM & (1 << 4))
  26. mask |= 0x0000f000;
  27. if (FM & (1 << 5))
  28. mask |= 0x00000f00;
  29. if (FM & (1 << 6))
  30. mask |= 0x000000f0;
  31. if (FM & (1 << 7))
  32. mask |= 0x0000000f;
  33. }
  34. __FPU_FPSCR &= ~(mask);
  35. __FPU_FPSCR |= (frB[1] & mask);
  36. __FPU_FPSCR &= ~(FPSCR_VX);
  37. if (__FPU_FPSCR & (FPSCR_VXSNAN | FPSCR_VXISI | FPSCR_VXIDI |
  38. FPSCR_VXZDZ | FPSCR_VXIMZ | FPSCR_VXVC |
  39. FPSCR_VXSOFT | FPSCR_VXSQRT | FPSCR_VXCVI))
  40. __FPU_FPSCR |= FPSCR_VX;
  41. fpscr = __FPU_FPSCR;
  42. fpscr &= ~(FPSCR_FEX);
  43. if (((fpscr & FPSCR_VX) && (fpscr & FPSCR_VE)) ||
  44. ((fpscr & FPSCR_OX) && (fpscr & FPSCR_OE)) ||
  45. ((fpscr & FPSCR_UX) && (fpscr & FPSCR_UE)) ||
  46. ((fpscr & FPSCR_ZX) && (fpscr & FPSCR_ZE)) ||
  47. ((fpscr & FPSCR_XX) && (fpscr & FPSCR_XE)))
  48. fpscr |= FPSCR_FEX;
  49. __FPU_FPSCR = fpscr;
  50. #ifdef DEBUG
  51. printk("%s: %02x %p: %08lx\n", __func__, FM, frB, __FPU_FPSCR);
  52. #endif
  53. return 0;
  54. }