12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- #ifndef PICORV32_H
- #define PICORV32_H
- #ifndef __ASSEMBLY__
- #include "compiler.h"
- 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 keepmask)
- {
- unsigned int oldmask;
- asm volatile(".insn r 0x0b, 0, 3, %0, %z1, %z2"
- : "=r" (oldmask)
- : "Jr" (newmask), "Jr" (keepmask));
- return oldmask;
- }
- static inline unsigned int
- p_waitirq(unsigned int andmask, unsigned int ormask)
- {
- unsigned int pending_mask;
- asm volatile(".insn r 0x0b, 0, 4, %0, %z1, %z2"
- : "=r" (pending_mask)
- : "Jr" (andmask), "Jr" (ormask));
- return pending_mask;
- }
- static inline unsigned int p_timer(unsigned int newval)
- {
- unsigned int oldval;
- asm volatile(".insn 0x0b, 0, 5, %0, %z1, %z2"
- : "=r" (oldval)
- : "Jr" (newval), "Jr" (0));
- return oldval;
- }
- static inline unsigned int
- p_pollirq(unsigned int mask, unsigned int already)
- {
- unsigned int irqs;
- asm volatile(".insn 0x0b, 0, 6, %0, %z1, %z2"
- : "=r" (irqs)
- : "Jr" (mask), "Jr" (already));
- return irqs;
- }
- #else
- #define q0 x0
- #define q1 x1
- #define q2 x2
- #define q3 x3
- .macro addqxi qd, rs, imm
- .insn i 0x0b, 0x02, \qd, \rs, \imm
- .endm
- .macro addxqi rd, qs, imm
- .insn i 0x0b, 0x03, \rd, \qs, \imm
- .endm
- .macro retirq
- .insn r 0x0b, 0, 2, zero, zero, zero
- .endm
- .macro maskirq rd, rs1, rs2
- .insn r 0x0b, 0, 3, \rd, \rs1, \rs2
- .endm
- .macro waitirq rd, andmask, ormask
- .insn r 0x0b, 0, 4, \rd, \andmask, \ormask
- .endm
- .macro timer rd, rs
- .insn r 0x0b, 0, 5, \rd, \rs, zero
- .endm
- .macro pollirq rd, mask, already
- .insn r 0x0b, 0, 6, \rd, \mask, \already
- .endm
- #endif
- #endif
|