fpu.h 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef __ASM_ALPHA_FPU_H
  3. #define __ASM_ALPHA_FPU_H
  4. #include <asm/special_insns.h>
  5. #include <uapi/asm/fpu.h>
  6. /* The following two functions don't need trapb/excb instructions
  7. around the mf_fpcr/mt_fpcr instructions because (a) the kernel
  8. never generates arithmetic faults and (b) call_pal instructions
  9. are implied trap barriers. */
  10. static inline unsigned long
  11. rdfpcr(void)
  12. {
  13. unsigned long tmp, ret;
  14. #if defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67)
  15. __asm__ __volatile__ (
  16. "ftoit $f0,%0\n\t"
  17. "mf_fpcr $f0\n\t"
  18. "ftoit $f0,%1\n\t"
  19. "itoft %0,$f0"
  20. : "=r"(tmp), "=r"(ret));
  21. #else
  22. __asm__ __volatile__ (
  23. "stt $f0,%0\n\t"
  24. "mf_fpcr $f0\n\t"
  25. "stt $f0,%1\n\t"
  26. "ldt $f0,%0"
  27. : "=m"(tmp), "=m"(ret));
  28. #endif
  29. return ret;
  30. }
  31. static inline void
  32. wrfpcr(unsigned long val)
  33. {
  34. unsigned long tmp;
  35. #if defined(CONFIG_ALPHA_EV6) || defined(CONFIG_ALPHA_EV67)
  36. __asm__ __volatile__ (
  37. "ftoit $f0,%0\n\t"
  38. "itoft %1,$f0\n\t"
  39. "mt_fpcr $f0\n\t"
  40. "itoft %0,$f0"
  41. : "=&r"(tmp) : "r"(val));
  42. #else
  43. __asm__ __volatile__ (
  44. "stt $f0,%0\n\t"
  45. "ldt $f0,%1\n\t"
  46. "mt_fpcr $f0\n\t"
  47. "ldt $f0,%0"
  48. : "=m"(tmp) : "m"(val));
  49. #endif
  50. }
  51. static inline unsigned long
  52. swcr_update_status(unsigned long swcr, unsigned long fpcr)
  53. {
  54. /* EV6 implements most of the bits in hardware. Collect
  55. the acrued exception bits from the real fpcr. */
  56. if (implver() == IMPLVER_EV6) {
  57. swcr &= ~IEEE_STATUS_MASK;
  58. swcr |= (fpcr >> 35) & IEEE_STATUS_MASK;
  59. }
  60. return swcr;
  61. }
  62. extern unsigned long alpha_read_fp_reg (unsigned long reg);
  63. extern void alpha_write_fp_reg (unsigned long reg, unsigned long val);
  64. extern unsigned long alpha_read_fp_reg_s (unsigned long reg);
  65. extern void alpha_write_fp_reg_s (unsigned long reg, unsigned long val);
  66. #endif /* __ASM_ALPHA_FPU_H */