mtfsf.c 752 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. #include <linux/types.h>
  2. #include <linux/errno.h>
  3. #include <asm/uaccess.h>
  4. #include "soft-fp.h"
  5. int
  6. mtfsf(unsigned int FM, u32 *frB)
  7. {
  8. u32 mask;
  9. if (FM == 0)
  10. return 0;
  11. if (FM == 0xff)
  12. mask = 0x9fffffff;
  13. else {
  14. mask = 0;
  15. if (FM & (1 << 0))
  16. mask |= 0x90000000;
  17. if (FM & (1 << 1))
  18. mask |= 0x0f000000;
  19. if (FM & (1 << 2))
  20. mask |= 0x00f00000;
  21. if (FM & (1 << 3))
  22. mask |= 0x000f0000;
  23. if (FM & (1 << 4))
  24. mask |= 0x0000f000;
  25. if (FM & (1 << 5))
  26. mask |= 0x00000f00;
  27. if (FM & (1 << 6))
  28. mask |= 0x000000f0;
  29. if (FM & (1 << 7))
  30. mask |= 0x0000000f;
  31. }
  32. __FPU_FPSCR &= ~(mask);
  33. __FPU_FPSCR |= (frB[1] & mask);
  34. #ifdef DEBUG
  35. printk("%s: %02x %p: %08lx\n", __FUNCTION__, FM, frB, __FPU_FPSCR);
  36. #endif
  37. return 0;
  38. }