7#ifndef _HARDWARE_HAZARD3_INSTRUCTIONS_H
8#define _HARDWARE_HAZARD3_INSTRUCTIONS_H
36.macro h3.bextm rd rs1 rs2 nbits
37.if (\nbits < 1) || (\nbits > 8)
40#ifdef __hazard3_extension_xh3bextm
41 .insn r 0x0b, 0x4, (((\nbits - 1) & 0x7 ) << 1), \rd, \rs1, \rs2
44 andi \rd, \rd, ((1 << \nbits) - 1)
54.macro h3.bextmi rd rs1 shamt nbits
55.if (\nbits < 1) || (\nbits > 8)
58.
if (\shamt < 0) || (\shamt > 31)
61#ifdef __hazard3_extension_xh3bextm
62 .insn i 0x0b, 0x4, \rd, \rs1, (\shamt & 0x1f) | (((\nbits - 1) & 0x7 ) << 6)
64 srli \rd, \rs1, \shamt
65 andi \rd, \rd, ((1 << \nbits) - 1)
77#ifdef __hazard3_extension_xh3power
91#ifdef __hazard3_extension_xh3power
107#ifdef __hazard3_extension_xh3bextm
108#define __hazard3_bextm(nbits, rs1, rs2) ({\
109 uint32_t __h3_bextm_rd; \
110 asm (".insn r 0x0b, 0, %3, %0, %1, %2"\
111 : "=r" (__h3_bextm_rd) \
112 : "r" (rs1), "r" (rs2), "i" ((((nbits) - 1) & 0x7) << 1)\
117#define __hazard3_bextm(nbits, rs1, rs2) (((rs1) >> ((rs2) & 0x1f)) & (0xffu >> (7 - (((nbits) - 1) & 0x7))))
121#ifdef __hazard3_extension_xh3bextm
122#define __hazard3_bextmi(nbits, rs1, shamt) ({\
123 uint32_t __h3_bextmi_rd; \
124 asm (".insn i 0x0b, 0x4, %0, %1, %2"\
125 : "=r" (__h3_bextmi_rd) \
126 : "r" (rs1), "i" ((((nbits) - 1) & 0x7) << 6 | ((shamt) & 0x1f)) \
131#define __hazard3_bextmi(nbits, rs1, rs2) (((rs1) >> ((shamt) & 0x1f)) & (0xffu >> (7 - (((nbits) - 1) & 0x7))))
134#ifdef __hazard3_extension_xh3power
135#define __hazard3_block() asm volatile ("slt x0, x0, x0" : : : "memory")
137#define __hazard3_block() do {} while (0)
140#ifdef __hazard3_extension_xh3power
141#define __hazard3_unblock() asm volatile ("slt x0, x0, x1" : : : "memory")
143#define __hazard3_unblock() do {} while (0)