picorv32.h 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #ifndef PICORV32_H
  2. #define PICORV32_H
  3. #ifndef __ASSEMBLY__
  4. static inline unsigned int p_getq(unsigned int qr)
  5. {
  6. unsigned int rd;
  7. asm volatile(".insn r 0x0b, 0, 0, %0, x%1, zero"
  8. : "=r" (rd) : "K" (qr));
  9. return rd;
  10. }
  11. static inline void p_setq(unsigned int qr, unsigned int val)
  12. {
  13. asm volatile(".insn r 0x0b, 0, 1, x%1, %0, zero"
  14. : : "r" (val), "K" (qr));
  15. }
  16. static inline void p_retirq(void)
  17. {
  18. asm volatile(".insn r 0x0b, 0, 2, zero, zero, zero");
  19. __builtin_unreachable();
  20. }
  21. static inline unsigned int p_maskirq(unsigned int newmask)
  22. {
  23. unsigned int oldmask;
  24. asm volatile(".insn r 0x0b, 0, 3, %0, %1, zero"
  25. : "=r" (oldmask) : "r" (newmask));
  26. return oldmask;
  27. }
  28. static inline unsigned int p_waitirq(void)
  29. {
  30. unsigned int pending_mask;
  31. asm volatile(".insn r 0x0b, 0, 4, %0, zero, zero"
  32. : "=r" (pending_mask));
  33. return pending_mask;
  34. }
  35. static inline unsigned int p_timer(unsigned int newval)
  36. {
  37. unsigned int oldval;
  38. asm volatile(".insn 0x0b, 0, 5, %0, %1, zero"
  39. : "=r" (oldval) : "r" (newval));
  40. }
  41. #else /* __ASSEMBLY__ */
  42. #define q0 x0
  43. #define q1 x1
  44. #define q2 x2
  45. #define q3 x3
  46. .macro getq rd, qs
  47. .insn r 0x0b, 0, 0, \rd, \qs, zero
  48. .endm
  49. .macro setq qd, rs
  50. .insn r 0x0b, 0, 1, \qd, \rs, zero
  51. .endm
  52. .macro retirq
  53. .insn r 0x0b, 0, 2, zero, zero, zero
  54. .endm
  55. .macro maskirq rd, rs
  56. .insn r 0x0b, 0, 3, \rd, \rs, zero
  57. .endm
  58. .macro waitirq rd
  59. .insn r 0x0b, 0, 4, \rd, zero, zero
  60. .endm
  61. .macro timer rd, rs
  62. .insn r 0x0b, 0, 5, \rd, \rs, zero
  63. .endm
  64. #endif /* __ASSEMBLY__ */
  65. #endif /* PICORV32_H */