mcrfs.c 620 B

123456789101112131415161718192021222324252627282930313233
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <linux/types.h>
  3. #include <linux/errno.h>
  4. #include <linux/uaccess.h>
  5. #include <asm/sfp-machine.h>
  6. #include <math-emu/soft-fp.h>
  7. int
  8. mcrfs(u32 *ccr, u32 crfD, u32 crfS)
  9. {
  10. u32 value, clear;
  11. #ifdef DEBUG
  12. printk("%s: %p (%08x) %d %d\n", __func__, ccr, *ccr, crfD, crfS);
  13. #endif
  14. clear = 15 << ((7 - crfS) << 2);
  15. if (!crfS)
  16. clear = 0x90000000;
  17. value = (__FPU_FPSCR >> ((7 - crfS) << 2)) & 15;
  18. __FPU_FPSCR &= ~(clear);
  19. *ccr &= ~(15 << ((7 - crfD) << 2));
  20. *ccr |= (value << ((7 - crfD) << 2));
  21. #ifdef DEBUG
  22. printk("CR: %08x\n", __func__, *ccr);
  23. #endif
  24. return 0;
  25. }