#ifndef PICORV32_H #define PICORV32_H #ifndef __ASSEMBLY__ static inline unsigned int p_getq(unsigned int qr) { unsigned int rd; asm volatile(".insn r 0x0b, 0, 0, %0, x%1, zero" : "=r" (rd) : "K" (qr)); return rd; } static inline void p_setq(unsigned int qr, unsigned int val) { asm volatile(".insn r 0x0b, 0, 1, x%1, %0, zero" : : "r" (val), "K" (qr)); } static inline void p_retirq(void) { asm volatile(".insn r 0x0b, 0, 2, zero, zero, zero"); __builtin_unreachable(); } static inline unsigned int p_maskirq(unsigned int newmask) { unsigned int oldmask; asm volatile(".insn r 0x0b, 0, 3, %0, %1, zero" : "=r" (oldmask) : "r" (newmask)); return oldmask; } static inline unsigned int p_waitirq(void) { unsigned int pending_mask; asm volatile(".insn r 0x0b, 0, 4, %0, zero, zero" : "=r" (pending_mask)); return pending_mask; } static inline unsigned int p_timer(unsigned int newval) { unsigned int oldval; asm volatile(".insn 0x0b, 0, 5, %0, %1, zero" : "=r" (oldval) : "r" (newval)); } #else /* __ASSEMBLY__ */ #define q0 x0 #define q1 x1 #define q2 x2 #define q3 x3 .macro getq rd, qs .insn r 0x0b, 0, 0, \rd, \qs, zero .endm .macro setq qd, rs .insn r 0x0b, 0, 1, \qd, \rs, zero .endm .macro retirq .insn r 0x0b, 0, 2, zero, zero, zero .endm .macro maskirq rd, rs .insn r 0x0b, 0, 3, \rd, \rs, zero .endm .macro waitirq rd .insn r 0x0b, 0, 4, \rd, zero, zero .endm .macro timer rd, rs .insn r 0x0b, 0, 5, \rd, \rs, zero .endm #endif /* __ASSEMBLY__ */ #endif /* PICORV32_H */