Lines Matching refs:insn
1 /* $NetBSD: insn.h,v 1.5 2024/02/02 22:00:33 andvar Exp $ */
160 #define INSN_SIZE_IS_16(insn) (((insn) & 0b11) != 0b11)
161 #define INSN_SIZE_IS_32(insn) (((insn) & 0b11100) != 0b11100)
162 #define INSN_SIZE_IS_48(insn) (((insn) & 0b100000) != 0b100000)
163 #define INSN_SIZE_IS_64(insn) (((insn) & 0b1000000) != 0b1000000)
166 #define INSN_HALFWORDS(insn) \
167 (INSN_SIZE_IS_16(insn) ? 1 : \
168 INSN_SIZE_IS_32(insn) ? 2 : \
169 INSN_SIZE_IS_48(insn) ? 3 : \
170 INSN_SIZE_IS_64(insn) ? 4 : \
173 #define INSN_SIZE(insn) (INSN_HALFWORDS(insn) * sizeof(uint16_t))
187 #define INSN_OPCODE32(insn) (((insn) & 0x0000007f) >> 2)
188 #define INSN_RD(insn) (((insn) & 0x00000f80) >> 7)
189 #define INSN_FUNCT3(insn) (((insn) & 0x00007000) >> 12)
190 #define INSN_RS1(insn) (((insn) & 0x000f8000) >> 15)
191 #define INSN_RS2(insn) (((insn) & 0x01f00000) >> 20)
192 #define INSN_FUNCT7(insn) (((insn) & 0xfe000000) >> 25)
195 #define INSN_IMM_U(insn) ((insn) & 0xfffff000)
198 #define INSN_IMM_I(insn) SIGNEXT32(((insn) & 0xfff00000) >> 20, 12)
201 #define INSN_IMM_S_raw(insn) ((INSN_FUNCT7(insn) << 5) | INSN_RD(insn))
202 #define INSN_IMM_S(insn) SIGNEXT32(INSN_IMM_S_raw(insn), 12)
205 #define INSN_IMM_B_raw(insn) \
206 (((insn & 0x80000000) >> (31-12)) | \
207 ((insn & 0x00000080) << (11-7)) | \
208 ((insn & 0x7e000000) >> (25-5)) | \
209 ((insn & 0x00000f00) >> (8-1)))
210 #define INSN_IMM_B(insn) SIGNEXT32(INSN_IMM_B_raw(insn), 13)
213 #define INSN_IMM_J_raw(insn) \
214 (((insn & 0x80000000) >> (31-20)) | \
215 ((insn & 0x000ff000) >> (12-12)) | \
216 ((insn & 0x00100000) >> (20-11)) | \
217 ((insn & 0x7fe00000) >> (21-1)))
218 #define INSN_IMM_J(insn) SIGNEXT32(INSN_IMM_J_raw(insn), 21)
224 #define INSN16_QUADRANT(insn) ((insn) & 0b11)
244 #define INSN16_FUNCT3(insn) (((insn) & 0xe000) >> 13)
245 #define INSN16_FUNCT2a(insn) (((insn) & 0x0c00) >> 10)
246 #define INSN16_FUNCT1b(insn) (((insn) & 0x1000) >> 12)
247 #define INSN16_FUNCT2b(insn) (((insn) & 0x0060) >> 5)
248 #define INSN16_FUNCT3c(insn) \
249 ((INSN16_FUNCT1b(insn) << 2) | INSN16_FUNCT2b(insn))
252 #define INSN16_RS1(insn) (((insn) & 0x0f80) >> 7) /* bits 7-11 */
253 #define INSN16_RS2(insn) (((insn) & 0x007c) >> 2) /* bits 2-6 */
256 #define INSN16_RS1x(insn) ((((insn) & 0x0380) >> 7) + 8) /* bits 7-9 */
257 #define INSN16_RS2x(insn) ((((insn) & 0x001c) >> 2) + 8) /* bits 2-4 */
260 #define INSN16_IMM_CI_W(insn) \
261 ((((insn) & 0b0001000000000000) >> (12-5)) | \
262 (((insn) & 0b0000000001110000) >> (4-2)) | \
263 (((insn) & 0b0000000000001100) << (6-2)))
264 #define INSN16_IMM_CI_D(insn) \
265 ((((insn) & 0b0001000000000000) >> (12-5)) | \
266 (((insn) & 0b0000000001100000) >> (4-2)) | \
267 (((insn) & 0b0000000000011100) << (6-2)))
268 #define INSN16_IMM_CI_Q(insn) \
269 ((((insn) & 0b0001000000000000) >> (12-5)) | \
270 (((insn) & 0b0000000001000000) >> (4-2)) | \
271 (((insn) & 0b0000000000111100) << (6-2)))
274 #define INSN16_IMM_CI_K_raw(insn) \
275 ((((insn) & 0b0001000000000000) >> (12-5)) | \
276 (((insn) & 0b0000000001111100) >> (2-0)))
277 #define INSN16_IMM_CI_K(insn) SIGNEXT32(INSN16_IMM_CI_K_raw(insn), 6)
278 #define INSN16_IMM_CI_K12(insn) SIGNEXT32(INSN16_IMM_CI_K_raw(insn) << 12, 18)
281 #define INSN16_IMM_CI_K4_raw(insn) \
282 ((((insn) & 0b0001000000000000) >> (12-9)) | \
283 (((insn) & 0b0000000001000000) >> (6-4)) | \
284 (((insn) & 0b0000000000100000) << (6-5)) | \
285 (((insn) & 0b0000000000011000) << (7-3)) | \
286 (((insn) & 0b0000000000000100) << (5-2)))
287 #define INSN16_IMM_CI_K4(insn) SIGNEXT32(INSN16_IMM_CI_K4_raw(insn), 10)
291 #define INSN16_IMM_CSS_W(insn) \
292 ((((insn) & 0b0001111000000000) >> (9-2)) | \
293 (((insn) & 0b0000000110000000) >> (7-6)))
294 #define INSN16_IMM_CSS_D(insn) \
295 ((((insn) & 0b0001110000000000) >> (9-2)) | \
296 (((insn) & 0b0000001110000000) >> (7-6)))
297 #define INSN16_IMM_CSS_Q(insn) \
298 ((((insn) & 0b0001100000000000) >> (9-2)) | \
299 (((insn) & 0b0000011110000000) >> (7-6)))
302 #define INSN16_IMM_CL_W(insn) \
303 ((((insn) & 0b0001110000000000) >> (10-3)) | \
304 (((insn) & 0b0000000001000000) >> (6-2)) | \
305 (((insn) & 0b0000000000100000) << (6-5)))
306 #define INSN16_IMM_CL_D(insn) \
307 ((((insn) & 0b0001110000000000) >> (10-3)) | \
308 (((insn) & 0b0000000001100000) << (6-5)))
309 #define INSN16_IMM_CL_Q(insn) \
310 ((((insn) & 0b0001100000000000) >> (11-4)) | \
311 (((insn) & 0b0000010000000000) >> (10-8)) | \
312 (((insn) & 0b0000000001100000) << (6-5)))
315 #define INSN16_IMM_CS_W(insn) INSN16_IMM_CL_W(insn)
316 #define INSN16_IMM_CS_D(insn) INSN16_IMM_CL_D(insn)
317 #define INSN16_IMM_CS_Q(insn) INSN16_IMM_CL_Q(insn)
320 #define INSN16_IMM_CJ_raw(insn) \
321 ((((insn) & 0b0001000000000000) >> (12-11)) | \
322 (((insn) & 0b0000100000000000) >> (11-4)) | \
323 (((insn) & 0b0000011000000000) >> (9-8)) | \
324 (((insn) & 0b0000000100000000) << (10-8)) | \
325 (((insn) & 0b0000000010000000) >> (7-6)) | \
326 (((insn) & 0b0000000001000000) << (7-6)) | \
327 (((insn) & 0b0000000000111000) >> (3-1)) | \
328 (((insn) & 0b0000000000000100) << (5-2)))
329 #define INSN16_IMM_CJ(insn) SIGNEXT32(INSN16_IMM_CJ_raw(insn), 12)
332 #define INSN16_IMM_CB_raw(insn) \
333 ((((insn) & 0b0001000000000000) >> (12-8)) | \
334 (((insn) & 0b0000110000000000) >> (10-3)) | \
335 (((insn) & 0b0000000001100000) << (6-5)) | \
336 (((insn) & 0b0000000000011000) >> (3-1)) | \
337 (((insn) & 0b0000000000000100) << (5-2)))
338 #define INSN16_IMM_CB(insn) SIGNEXT32(INSN16_IMM_CB_raw(insn), 9)
343 #define INSN16_IMM_CIW(insn) \
344 ((((insn) & 0b0001100000000000) >> (11-4)) | \
345 (((insn) & 0b0000011110000000) >> (7-6)) | \
346 (((insn) & 0b0000000001000000) >> (6-2)) | \
347 (((insn) & 0b0000000000100000) >> (5-3)))