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");
166#define CUSTOM_INSTR_R1_TYPE(funct7, funct5, rs1, funct3, opcode) \
168 register uint32_t __return; \
171 : [output] "=r" (__return) \
172 : [input_i] "r" (rs1) \
176 (((" #funct7 ") & 0x7f) << 25) | \
177 (((" #funct5 ") & 0x1f) << 20) | \
178 ((( regnum_%1 ) & 0x1f) << 15) | \
179 (((" #funct3 ") & 0x07) << 12) | \
180 ((( regnum_%0 ) & 0x1f) << 7) | \
181 (((" #opcode ") & 0x7f) << 0) \
183 : [rd] "=r" (__return) \
193#define CUSTOM_INSTR_R2_TYPE(funct7, rs2, rs1, funct3, opcode) \
195 register uint32_t __return; \
198 : [output] "=r" (__return) \
199 : [input_i] "r" (rs1), \
200 [input_j] "r" (rs2) \
204 (((" #funct7 ") & 0x7f) << 25) | \
205 ((( regnum_%2 ) & 0x1f) << 20) | \
206 ((( regnum_%1 ) & 0x1f) << 15) | \
207 (((" #funct3 ") & 0x07) << 12) | \
208 ((( regnum_%0 ) & 0x1f) << 7) | \
209 (((" #opcode ") & 0x7f) << 0) \
211 : [rd] "=r" (__return) \
222#define CUSTOM_INSTR_R3_TYPE(rs3, rs2, rs1, funct3, opcode) \
224 register uint32_t __return; \
227 : [output] "=r" (__return) \
228 : [input_i] "r" (rs1), \
229 [input_j] "r" (rs2), \
230 [input_k] "r" (rs3) \
234 ((( regnum_%3 ) & 0x1f) << 25) | \
235 ((( regnum_%2 ) & 0x1f) << 20) | \
236 ((( regnum_%1 ) & 0x1f) << 15) | \
237 (((" #funct3 ") & 0x07) << 12) | \
238 ((( regnum_%0 ) & 0x1f) << 7) | \
239 (((" #opcode ") & 0x7f) << 0) \
241 : [rd] "=r" (__return) \
253#define CUSTOM_INSTR_I_TYPE(imm12, rs1, funct3, opcode) \
255 register uint32_t __return; \
258 : [output] "=r" (__return) \
259 : [input_i] "r" (rs1) \
263 (((" #imm12 ") & 0xfff) << 20) | \
264 ((( regnum_%1 ) & 0x1f) << 15) | \
265 (((" #funct3 ") & 0x07) << 12) | \
266 ((( regnum_%0 ) & 0x1f) << 7) | \
267 (((" #opcode ") & 0x7f) << 0) \
269 : [rd] "=r" (__return) \