41#ifndef neorv32_intrinsics_h
42#define neorv32_intrinsics_h
91asm(
".set regnum_x0 , 0");
92asm(
".set regnum_x1 , 1");
93asm(
".set regnum_x2 , 2");
94asm(
".set regnum_x3 , 3");
95asm(
".set regnum_x4 , 4");
96asm(
".set regnum_x5 , 5");
97asm(
".set regnum_x6 , 6");
98asm(
".set regnum_x7 , 7");
99asm(
".set regnum_x8 , 8");
100asm(
".set regnum_x9 , 9");
101asm(
".set regnum_x10 , 10");
102asm(
".set regnum_x11 , 11");
103asm(
".set regnum_x12 , 12");
104asm(
".set regnum_x13 , 13");
105asm(
".set regnum_x14 , 14");
106asm(
".set regnum_x15 , 15");
107asm(
".set regnum_x16 , 16");
108asm(
".set regnum_x17 , 17");
109asm(
".set regnum_x18 , 18");
110asm(
".set regnum_x19 , 19");
111asm(
".set regnum_x20 , 20");
112asm(
".set regnum_x21 , 21");
113asm(
".set regnum_x22 , 22");
114asm(
".set regnum_x23 , 23");
115asm(
".set regnum_x24 , 24");
116asm(
".set regnum_x25 , 25");
117asm(
".set regnum_x26 , 26");
118asm(
".set regnum_x27 , 27");
119asm(
".set regnum_x28 , 28");
120asm(
".set regnum_x29 , 29");
121asm(
".set regnum_x30 , 30");
122asm(
".set regnum_x31 , 31");
124asm(
".set regnum_zero, 0");
125asm(
".set regnum_ra , 1");
126asm(
".set regnum_sp , 2");
127asm(
".set regnum_gp , 3");
128asm(
".set regnum_tp , 4");
129asm(
".set regnum_t0 , 5");
130asm(
".set regnum_t1 , 6");
131asm(
".set regnum_t2 , 7");
132asm(
".set regnum_s0 , 8");
133asm(
".set regnum_s1 , 9");
134asm(
".set regnum_a0 , 10");
135asm(
".set regnum_a1 , 11");
136asm(
".set regnum_a2 , 12");
137asm(
".set regnum_a3 , 13");
138asm(
".set regnum_a4 , 14");
139asm(
".set regnum_a5 , 15");
140asm(
".set regnum_a6 , 16");
141asm(
".set regnum_a7 , 17");
142asm(
".set regnum_s2 , 18");
143asm(
".set regnum_s3 , 19");
144asm(
".set regnum_s4 , 20");
145asm(
".set regnum_s5 , 21");
146asm(
".set regnum_s6 , 22");
147asm(
".set regnum_s7 , 23");
148asm(
".set regnum_s8 , 24");
149asm(
".set regnum_s9 , 25");
150asm(
".set regnum_s10 , 26");
151asm(
".set regnum_s11 , 27");
152asm(
".set regnum_t3 , 28");
153asm(
".set regnum_t4 , 29");
154asm(
".set regnum_t5 , 30");
155asm(
".set regnum_t6 , 31");
158asm(
".set RISCV_OPCODE_CUSTOM0 , 0b0001011");
159asm(
".set RISCV_OPCODE_CUSTOM1 , 0b0101011");
160asm(
".set RISCV_OPCODE_CUSTOM2 , 0b1011011");
161asm(
".set RISCV_OPCODE_CUSTOM3 , 0b1111011");
168#define CUSTOM_INSTR_R2_TYPE(funct7, funct5, rs1, funct3, opcode) \
173 : [output] "=r" (__return) \
174 : [input_i] "r" (rs1) \
178 (((" #funct7 ") & 0x7f) << 25) | \
179 (((" #funct5 ") & 0x1f) << 20) | \
180 ((( regnum_%1 ) & 0x1f) << 15) | \
181 (((" #funct3 ") & 0x07) << 12) | \
182 ((( regnum_%0 ) & 0x1f) << 7) | \
183 (((" #opcode ") & 0x7f) << 0) \
185 : [rd] "=r" (__return) \
195#define CUSTOM_INSTR_R3_TYPE(funct7, rs2, rs1, funct3, opcode) \
200 : [output] "=r" (__return) \
201 : [input_i] "r" (rs1), \
202 [input_j] "r" (rs2) \
206 (((" #funct7 ") & 0x7f) << 25) | \
207 ((( regnum_%2 ) & 0x1f) << 20) | \
208 ((( regnum_%1 ) & 0x1f) << 15) | \
209 (((" #funct3 ") & 0x07) << 12) | \
210 ((( regnum_%0 ) & 0x1f) << 7) | \
211 (((" #opcode ") & 0x7f) << 0) \
213 : [rd] "=r" (__return) \
224#define CUSTOM_INSTR_R4_TYPE(rs3, rs2, rs1, funct3, opcode) \
229 : [output] "=r" (__return) \
230 : [input_i] "r" (rs1), \
231 [input_j] "r" (rs2), \
232 [input_k] "r" (rs3) \
236 ((( regnum_%3 ) & 0x1f) << 27) | \
237 ((( regnum_%2 ) & 0x1f) << 20) | \
238 ((( regnum_%1 ) & 0x1f) << 15) | \
239 (((" #funct3 ") & 0x07) << 12) | \
240 ((( regnum_%0 ) & 0x1f) << 7) | \
241 (((" #opcode ") & 0x7f) << 0) \
243 : [rd] "=r" (__return) \
256#define CUSTOM_INSTR_R5_TYPE(rs4, rs3, rs2, rs1, opcode) \
261 : [output] "=r" (__return) \
262 : [input_i] "r" (rs1), \
263 [input_j] "r" (rs2), \
264 [input_k] "r" (rs3), \
265 [input_l] "r" (rs4) \
269 ((( regnum_%3 ) & 0x1f) << 27) | \
270 (((( regnum_%4 ) >> 3) & 0x03) << 25) | \
271 ((( regnum_%2 ) & 0x1f) << 20) | \
272 ((( regnum_%1 ) & 0x1f) << 15) | \
273 ((( regnum_%4 ) & 0x07) << 12) | \
274 ((( regnum_%0 ) & 0x1f) << 7) | \
275 (((" #opcode ") & 0x7f) << 0) \
277 : [rd] "=r" (__return) \
290#define CUSTOM_INSTR_I_TYPE(imm12, rs1, funct3, opcode) \
295 : [output] "=r" (__return) \
296 : [input_i] "r" (rs1) \
300 (((" #imm12 ") & 0xfff) << 20) | \
301 ((( regnum_%1 ) & 0x1f) << 15) | \
302 (((" #funct3 ") & 0x07) << 12) | \
303 ((( regnum_%0 ) & 0x1f) << 7) | \
304 (((" #opcode ") & 0x7f) << 0) \
306 : [rd] "=r" (__return) \
316#define CUSTOM_INSTR_S_TYPE(imm12, rs2, rs1, funct3, opcode) \
321 : [input_i] "r" (rs1), \
322 [input_j] "r" (rs2) \
326 ((((" #imm12 ") >> 5) & 0x7f) << 25) | \
327 ((( regnum_%1 ) & 0x1f) << 20) | \
328 ((( regnum_%0 ) & 0x1f) << 15) | \
329 (((" #funct3 ") & 0x07) << 12) | \
330 (((" #imm12 ") & 0x1f) << 7) | \
331 (((" #opcode ") & 0x7f) << 0) \