7#ifndef _HARDWARE_HAZARD3_
8#define _HARDWARE_HAZARD3_
12#include "hardware/regs/rvcsr.h"
23#define __hazard3_extension_xh3power
24#define __hazard3_extension_xh3bextm
25#define __hazard3_extension_xh3irq
26#define __hazard3_extension_xh3pmpm
39.macro h3.bextm rd rs1 rs2 nbits
40.if (\nbits < 1) || (\nbits > 8)
43#ifdef __hazard3_extension_xh3bextm
44 .insn r 0x0b, 0x4, (((\nbits - 1) & 0x7 ) << 1), \rd, \rs1, \rs2
47 andi \rd, \rd, ((1 << \nbits) - 1)
57.macro h3.bextmi rd rs1 shamt nbits
58.if (\nbits < 1) || (\nbits > 8)
61.
if (\shamt < 0) || (\shamt > 31)
64#ifdef __hazard3_extension_xh3bextm
65 .insn i 0x0b, 0x4, \rd, \rs1, (\shamt & 0x1f) | (((\nbits - 1) & 0x7 ) << 6)
67 srli \rd, \rs1, \shamt
68 andi \rd, \rd, ((1 << \nbits) - 1)
80#ifdef __hazard3_extension_xh3power
94#ifdef __hazard3_extension_xh3power
107#ifdef __hazard3_extension_xh3irq
108#define hazard3_irqarray_read(csr, index) (riscv_read_set_csr(csr, (index)) >> 16)
110#define hazard3_irqarray_read(csr, index)
static_assert(
false,
"Not supported: Xh3irq extension")
113#ifdef __hazard3_extension_xh3irq
114#define hazard3_irqarray_write(csr, index, data) (riscv_write_csr(csr, (index) | ((uint32_t)(data) << 16)))
116#define hazard3_irqarray_write(csr, index, data)
static_assert(
false,
"Not supported: Xh3irq extension")
119#ifdef __hazard3_extension_xh3irq
120#define hazard3_irqarray_set(csr, index, data) (riscv_set_csr(csr, (index) | ((uint32_t)(data) << 16)))
122#define hazard3_irqarray_set(csr, index, data)
static_assert(
false,
"Not supported: Xh3irq extension")
125#ifdef __hazard3_extension_xh3irq
126#define hazard3_irqarray_clear(csr, index, data) (riscv_clear_csr(csr, (index) | ((uint32_t)(data) << 16)))
128#define hazard3_irqarray_clear(csr, index, data)
static_assert(
false,
"Not supported: Xh3irq extension")
133#ifdef __hazard3_extension_xh3bextm
134#define __hazard3_bextm(nbits, rs1, rs2) ({\
135 uint32_t __h3_bextm_rd; \
136 asm (
".insn r 0x0b, 0, %3, %0, %1, %2"\
137 :
"=r" (__h3_bextm_rd) \
138 :
"r" (rs1),
"r" (rs2),
"i" ((((nbits) - 1) & 0x7) << 1)\
143#define __hazard3_bextm(nbits, rs1, rs2) (((rs1) >> ((rs2) & 0x1f)) & (0xffu >> (7 - (((nbits) - 1) & 0x7))))
147#ifdef __hazard3_extension_xh3bextm
148#define __hazard3_bextmi(nbits, rs1, shamt) ({\
149 uint32_t __h3_bextmi_rd; \
150 asm (".insn i 0x0b, 0x4, %0, %1, %2"\
151 : "=r" (__h3_bextmi_rd) \
152 : "r" (rs1), "i" ((((nbits) - 1) & 0x7) << 6 | ((shamt) & 0x1f)) \
157#define __hazard3_bextm(nbits, rs1, rs2) (((rs1) >> ((shamt) & 0x1f)) & (0xffu >> (7 - (((nbits) - 1) & 0x7))))
160#ifdef __hazard3_extension_xh3power
161#define __hazard3_block() asm volatile ("slt x0, x0, x0" : : : "memory")
163#define __hazard3_block() do {} while (0)
166#ifdef __hazard3_extension_xh3power
167#define __hazard3_unblock() asm volatile ("slt x0, x0, x1" : : : "memory")
169#define __hazard3_unblock() do {} while (0)