dynarmic/include/biscuit/assembler.hpp
Merry e4a733d5b2 Squashed 'externals/biscuit/' content from commit 1d53c9e6
git-subtree-dir: externals/biscuit
git-subtree-split: 1d53c9e6cfe56544982200a5bac15a5de064936b
2024-03-02 19:36:24 +00:00

1475 lines
68 KiB
C++

#pragma once
#include <biscuit/code_buffer.hpp>
#include <biscuit/csr.hpp>
#include <biscuit/isa.hpp>
#include <biscuit/label.hpp>
#include <biscuit/registers.hpp>
#include <biscuit/vector.hpp>
#include <cstddef>
#include <cstdint>
namespace biscuit {
/**
* Defines the set of features that a particular assembler instance
* would like to assemble for.
*
* This allows for assertions and extra logic checking to be done.
*
* It can also affect various behaviors as well. e.g. LI, shifts, etc
* will take these into account to adjust for emission on different
* environments transparently.
*/
enum class ArchFeature : uint32_t {
RV32, //< 32-bit RISC-V
RV64, //< 64-bit RISC-V
RV128, //< 128-bit RISC-V
};
/**
* Code generator for RISC-V code.
*
* User code may inherit from this in order to make use of
* the API more convenient, or use it separately if desired.
*/
class Assembler {
public:
/**
* Constructor
*
* Initializes the underlying code buffer to be able to hold `capacity` bytes.
*
* @param capacity The capacity for the underlying code buffer in bytes.
* If no capacity is specified, then the underlying buffer
* will be 4KB in size.
*
* @note Will assume to be assembling for RV64 unless changed.
*/
[[nodiscard]] explicit Assembler(size_t capacity = CodeBuffer::default_capacity);
/**
* Constructor
*
* @param buffer A non-null pointer to an allocated buffer of size `capacity`.
* @param capacity The capacity of the memory pointed to by `buffer`.
* @param features Architectural features to make the assembler aware of.
*
* @pre The given memory buffer must not be null.
* @pre The given memory buffer must be at minimum `capacity` bytes in size.
*
* @note The caller is responsible for managing the lifetime of the given memory.
* CodeBuffer will *not* free the memory once it goes out of scope.
*/
[[nodiscard]] explicit Assembler(uint8_t* buffer, size_t capacity,
ArchFeature features = ArchFeature::RV64);
// Copy constructor and assignment.
Assembler(const Assembler&) = delete;
Assembler& operator=(const Assembler&) = delete;
// Move constructor and assignment.
Assembler(Assembler&&) = default;
Assembler& operator=(Assembler&&) = default;
// Destructor
virtual ~Assembler();
/**
* Tells the assembler what features to take into account.
*
* Will alter how some code is emitted and also enforce asserts suitable
* for those particular features.
*/
void SetArchFeatures(ArchFeature features) noexcept {
m_features = features;
}
/// Gets the underlying code buffer being managed by this assembler.
CodeBuffer& GetCodeBuffer();
/**
* Allows swapping out the code buffer used by the assembler.
*
* @param buffer The new buffer for the assembler to emit code into.
*
* @returns The old buffer that the assembler made use of.
*/
CodeBuffer SwapCodeBuffer(CodeBuffer&& buffer) noexcept;
/**
* Allows rewinding of the code buffer cursor.
*
* @param offset The offset to rewind the cursor by.
*
* @note If no offset is provided, then this function rewinds the
* cursor to the beginning of the buffer.
*
* @note The offset may not be larger than the current cursor offset
* and may not be less than the current buffer starting address.
*/
void RewindBuffer(ptrdiff_t offset = 0) {
m_buffer.RewindCursor(offset);
}
/// Retrieves the cursor pointer for the underlying code buffer.
[[nodiscard]] uint8_t* GetCursorPointer() noexcept {
return m_buffer.GetCursorPointer();
}
/// Retrieves the cursor for the underlying code buffer.
[[nodiscard]] const uint8_t* GetCursorPointer() const noexcept {
return m_buffer.GetCursorPointer();
}
/// Retrieves the pointer to an arbitrary location within the underlying code buffer.
[[nodiscard]] uint8_t* GetBufferPointer(ptrdiff_t offset) noexcept {
return m_buffer.GetOffsetPointer(offset);
}
/// Retrieves the pointer to an arbitrary location within the underlying code buffer.
[[nodiscard]] const uint8_t* GetBufferPointer(ptrdiff_t offset) const noexcept {
return m_buffer.GetOffsetPointer(offset);
}
/**
* Binds a label to the current offset within the code buffer
*
* @param label A non-null valid label to bind.
*/
void Bind(Label* label);
// RV32I Instructions
void ADD(GPR rd, GPR lhs, GPR rhs) noexcept;
void ADDI(GPR rd, GPR rs, int32_t imm) noexcept;
void AND(GPR rd, GPR lhs, GPR rhs) noexcept;
void ANDI(GPR rd, GPR rs, uint32_t imm) noexcept;
void AUIPC(GPR rd, int32_t imm) noexcept;
void BEQ(GPR rs1, GPR rs2, Label* label) noexcept;
void BEQZ(GPR rs, Label* label) noexcept;
void BGE(GPR rs1, GPR rs2, Label* label) noexcept;
void BGEU(GPR rs1, GPR rs2, Label* label) noexcept;
void BGEZ(GPR rs, Label* label) noexcept;
void BGT(GPR rs, GPR rt, Label* label) noexcept;
void BGTU(GPR rs, GPR rt, Label* label) noexcept;
void BGTZ(GPR rs, Label* label) noexcept;
void BLE(GPR rs, GPR rt, Label* label) noexcept;
void BLEU(GPR rs, GPR rt, Label* label) noexcept;
void BLEZ(GPR rs, Label* label) noexcept;
void BLT(GPR rs1, GPR rs2, Label* label) noexcept;
void BLTU(GPR rs1, GPR rs2, Label* label) noexcept;
void BLTZ(GPR rs, Label* label) noexcept;
void BNE(GPR rs1, GPR rs2, Label* label) noexcept;
void BNEZ(GPR rs, Label* label) noexcept;
void BEQ(GPR rs1, GPR rs2, int32_t imm) noexcept;
void BEQZ(GPR rs, int32_t imm) noexcept;
void BGE(GPR rs1, GPR rs2, int32_t imm) noexcept;
void BGEU(GPR rs1, GPR rs2, int32_t imm) noexcept;
void BGEZ(GPR rs, int32_t imm) noexcept;
void BGT(GPR rs, GPR rt, int32_t imm) noexcept;
void BGTU(GPR rs, GPR rt, int32_t imm) noexcept;
void BGTZ(GPR rs, int32_t imm) noexcept;
void BLE(GPR rs, GPR rt, int32_t imm) noexcept;
void BLEU(GPR rs, GPR rt, int32_t imm) noexcept;
void BLEZ(GPR rs, int32_t imm) noexcept;
void BLT(GPR rs1, GPR rs2, int32_t imm) noexcept;
void BLTU(GPR rs1, GPR rs2, int32_t imm) noexcept;
void BLTZ(GPR rs, int32_t imm) noexcept;
void BNE(GPR rs1, GPR rs2, int32_t imm) noexcept;
void BNEZ(GPR rs, int32_t imm) noexcept;
void CALL(int32_t offset) noexcept;
void EBREAK() noexcept;
void ECALL() noexcept;
void FENCE() noexcept;
void FENCE(FenceOrder pred, FenceOrder succ) noexcept;
void FENCEI(GPR rd = x0, GPR rs = x0, uint32_t imm = 0) noexcept;
void FENCETSO() noexcept;
void J(Label* label) noexcept;
void JAL(Label* label) noexcept;
void JAL(GPR rd, Label* label) noexcept;
void J(int32_t imm) noexcept;
void JAL(int32_t imm) noexcept;
void JAL(GPR rd, int32_t imm) noexcept;
void JALR(GPR rs) noexcept;
void JALR(GPR rd, int32_t imm, GPR rs1) noexcept;
void JR(GPR rs) noexcept;
void LB(GPR rd, int32_t imm, GPR rs) noexcept;
void LBU(GPR rd, int32_t imm, GPR rs) noexcept;
void LH(GPR rd, int32_t imm, GPR rs) noexcept;
void LHU(GPR rd, int32_t imm, GPR rs) noexcept;
void LI(GPR rd, uint64_t imm) noexcept;
void LUI(GPR rd, uint32_t imm) noexcept;
void LW(GPR rd, int32_t imm, GPR rs) noexcept;
void MV(GPR rd, GPR rs) noexcept;
void NEG(GPR rd, GPR rs) noexcept;
void NOP() noexcept;
void NOT(GPR rd, GPR rs) noexcept;
void OR(GPR rd, GPR lhs, GPR rhs) noexcept;
void ORI(GPR rd, GPR rs, uint32_t imm) noexcept;
void PAUSE() noexcept;
void RET() noexcept;
void SB(GPR rs2, int32_t imm, GPR rs1) noexcept;
void SH(GPR rs2, int32_t imm, GPR rs1) noexcept;
void SW(GPR rs2, int32_t imm, GPR rs1) noexcept;
void SEQZ(GPR rd, GPR rs) noexcept;
void SGTZ(GPR rd, GPR rs) noexcept;
void SLL(GPR rd, GPR lhs, GPR rhs) noexcept;
void SLLI(GPR rd, GPR rs, uint32_t shift) noexcept;
void SLT(GPR rd, GPR lhs, GPR rhs) noexcept;
void SLTI(GPR rd, GPR rs, int32_t imm) noexcept;
void SLTIU(GPR rd, GPR rs, int32_t imm) noexcept;
void SLTU(GPR rd, GPR lhs, GPR rhs) noexcept;
void SLTZ(GPR rd, GPR rs) noexcept;
void SNEZ(GPR rd, GPR rs) noexcept;
void SRA(GPR rd, GPR lhs, GPR rhs) noexcept;
void SRAI(GPR rd, GPR rs, uint32_t shift) noexcept;
void SRL(GPR rd, GPR lhs, GPR rhs) noexcept;
void SRLI(GPR rd, GPR rs, uint32_t shift) noexcept;
void SUB(GPR rd, GPR lhs, GPR rhs) noexcept;
void XOR(GPR rd, GPR lhs, GPR rhs) noexcept;
void XORI(GPR rd, GPR rs, uint32_t imm) noexcept;
// RV64I Base Instruction Set
void ADDIW(GPR rd, GPR rs, int32_t imm) noexcept;
void ADDW(GPR rd, GPR lhs, GPR rhs) noexcept;
void LD(GPR rd, int32_t imm, GPR rs) noexcept;
void LWU(GPR rd, int32_t imm, GPR rs) noexcept;
void SD(GPR rs2, int32_t imm, GPR rs1) noexcept;
void SLLIW(GPR rd, GPR rs, uint32_t shift) noexcept;
void SRAIW(GPR rd, GPR rs, uint32_t shift) noexcept;
void SRLIW(GPR rd, GPR rs, uint32_t shift) noexcept;
void SLLW(GPR rd, GPR lhs, GPR rhs) noexcept;
void SRAW(GPR rd, GPR lhs, GPR rhs) noexcept;
void SRLW(GPR rd, GPR lhs, GPR rhs) noexcept;
void SUBW(GPR rd, GPR lhs, GPR rhs) noexcept;
// Zawrs Extension Instructions
void WRS_NTO() noexcept;
void WRS_STO() noexcept;
// Zacas Extension Instructions
//
// NOTE: If targeting RV32 and using AMOCAS.D, rd and rs2 must be even-numbered
// registers, since they both indicate a register pair.
//
// On RV64, even and odd numbered registers can be used,
//
// On both RV32 and RV64, AMOCAS.Q requires rd and rs2 to be even-numbered
// since it also treats them like their own register pairs.
void AMOCAS_D(Ordering ordering, GPR rd, GPR rs2, GPR rs1) noexcept;
void AMOCAS_Q(Ordering ordering, GPR rd, GPR rs2, GPR rs1) noexcept;
void AMOCAS_W(Ordering ordering, GPR rd, GPR rs2, GPR rs1) noexcept;
// Zicond Extension Instructions
void CZERO_EQZ(GPR rd, GPR value, GPR condition) noexcept;
void CZERO_NEZ(GPR rd, GPR value, GPR condition) noexcept;
// Zicsr Extension Instructions
void CSRRC(GPR rd, CSR csr, GPR rs) noexcept;
void CSRRCI(GPR rd, CSR csr, uint32_t imm) noexcept;
void CSRRS(GPR rd, CSR csr, GPR rs) noexcept;
void CSRRSI(GPR rd, CSR csr, uint32_t imm) noexcept;
void CSRRW(GPR rd, CSR csr, GPR rs) noexcept;
void CSRRWI(GPR rd, CSR csr, uint32_t imm) noexcept;
void CSRR(GPR rd, CSR csr) noexcept;
void CSWR(CSR csr, GPR rs) noexcept;
void CSRS(CSR csr, GPR rs) noexcept;
void CSRC(CSR csr, GPR rs) noexcept;
void CSRCI(CSR csr, uint32_t imm) noexcept;
void CSRSI(CSR csr, uint32_t imm) noexcept;
void CSRWI(CSR csr, uint32_t imm) noexcept;
void FRCSR(GPR rd) noexcept;
void FSCSR(GPR rd, GPR rs) noexcept;
void FSCSR(GPR rs) noexcept;
void FRRM(GPR rd) noexcept;
void FSRM(GPR rd, GPR rs) noexcept;
void FSRM(GPR rs) noexcept;
void FSRMI(GPR rd, uint32_t imm) noexcept;
void FSRMI(uint32_t imm) noexcept;
void FRFLAGS(GPR rd) noexcept;
void FSFLAGS(GPR rd, GPR rs) noexcept;
void FSFLAGS(GPR rs) noexcept;
void FSFLAGSI(GPR rd, uint32_t imm) noexcept;
void FSFLAGSI(uint32_t imm) noexcept;
void RDCYCLE(GPR rd) noexcept;
void RDCYCLEH(GPR rd) noexcept;
void RDINSTRET(GPR rd) noexcept;
void RDINSTRETH(GPR rd) noexcept;
void RDTIME(GPR rd) noexcept;
void RDTIMEH(GPR rd) noexcept;
// Zihintntl Extension Instructions
void C_NTL_ALL() noexcept;
void C_NTL_S1() noexcept;
void C_NTL_P1() noexcept;
void C_NTL_PALL() noexcept;
void NTL_ALL() noexcept;
void NTL_S1() noexcept;
void NTL_P1() noexcept;
void NTL_PALL() noexcept;
// RV32M Extension Instructions
void DIV(GPR rd, GPR rs1, GPR rs2) noexcept;
void DIVU(GPR rd, GPR rs1, GPR rs2) noexcept;
void MUL(GPR rd, GPR rs1, GPR rs2) noexcept;
void MULH(GPR rd, GPR rs1, GPR rs2) noexcept;
void MULHSU(GPR rd, GPR rs1, GPR rs2) noexcept;
void MULHU(GPR rd, GPR rs1, GPR rs2) noexcept;
void REM(GPR rd, GPR rs1, GPR rs2) noexcept;
void REMU(GPR rd, GPR rs1, GPR rs2) noexcept;
// RV64M Extension Instructions
void DIVW(GPR rd, GPR rs1, GPR rs2) noexcept;
void DIVUW(GPR rd, GPR rs1, GPR rs2) noexcept;
void MULW(GPR rd, GPR rs1, GPR rs2) noexcept;
void REMW(GPR rd, GPR rs1, GPR rs2) noexcept;
void REMUW(GPR rd, GPR rs1, GPR rs2) noexcept;
// RV32A Extension Instructions
void AMOADD_W(Ordering ordering, GPR rd, GPR rs2, GPR rs1) noexcept;
void AMOAND_W(Ordering ordering, GPR rd, GPR rs2, GPR rs1) noexcept;
void AMOMAX_W(Ordering ordering, GPR rd, GPR rs2, GPR rs1) noexcept;
void AMOMAXU_W(Ordering ordering, GPR rd, GPR rs2, GPR rs1) noexcept;
void AMOMIN_W(Ordering ordering, GPR rd, GPR rs2, GPR rs1) noexcept;
void AMOMINU_W(Ordering ordering, GPR rd, GPR rs2, GPR rs1) noexcept;
void AMOOR_W(Ordering ordering, GPR rd, GPR rs2, GPR rs1) noexcept;
void AMOSWAP_W(Ordering ordering, GPR rd, GPR rs2, GPR rs1) noexcept;
void AMOXOR_W(Ordering ordering, GPR rd, GPR rs2, GPR rs1) noexcept;
void LR_W(Ordering ordering, GPR rd, GPR rs) noexcept;
void SC_W(Ordering ordering, GPR rd, GPR rs2, GPR rs1) noexcept;
// RV64A Extension Instructions
void AMOADD_D(Ordering ordering, GPR rd, GPR rs2, GPR rs1) noexcept;
void AMOAND_D(Ordering ordering, GPR rd, GPR rs2, GPR rs1) noexcept;
void AMOMAX_D(Ordering ordering, GPR rd, GPR rs2, GPR rs1) noexcept;
void AMOMAXU_D(Ordering ordering, GPR rd, GPR rs2, GPR rs1) noexcept;
void AMOMIN_D(Ordering ordering, GPR rd, GPR rs2, GPR rs1) noexcept;
void AMOMINU_D(Ordering ordering, GPR rd, GPR rs2, GPR rs1) noexcept;
void AMOOR_D(Ordering ordering, GPR rd, GPR rs2, GPR rs1) noexcept;
void AMOSWAP_D(Ordering ordering, GPR rd, GPR rs2, GPR rs1) noexcept;
void AMOXOR_D(Ordering ordering, GPR rd, GPR rs2, GPR rs1) noexcept;
void LR_D(Ordering ordering, GPR rd, GPR rs) noexcept;
void SC_D(Ordering ordering, GPR rd, GPR rs2, GPR rs1) noexcept;
// RV32F Extension Instructions
void FADD_S(FPR rd, FPR rs1, FPR rs2, RMode rmode = RMode::DYN) noexcept;
void FCLASS_S(GPR rd, FPR rs1) noexcept;
void FCVT_S_W(FPR rd, GPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_S_WU(FPR rd, GPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_W_S(GPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_WU_S(GPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FDIV_S(FPR rd, FPR rs1, FPR rs2, RMode rmode = RMode::DYN) noexcept;
void FEQ_S(GPR rd, FPR rs1, FPR rs2) noexcept;
void FLE_S(GPR rd, FPR rs1, FPR rs2) noexcept;
void FLT_S(GPR rd, FPR rs1, FPR rs2) noexcept;
void FLW(FPR rd, int32_t offset, GPR rs) noexcept;
void FMADD_S(FPR rd, FPR rs1, FPR rs2, FPR rs3, RMode rmode = RMode::DYN) noexcept;
void FMAX_S(FPR rd, FPR rs1, FPR rs2) noexcept;
void FMIN_S(FPR rd, FPR rs1, FPR rs2) noexcept;
void FMSUB_S(FPR rd, FPR rs1, FPR rs2, FPR rs3, RMode rmode = RMode::DYN) noexcept;
void FMUL_S(FPR rd, FPR rs1, FPR rs2, RMode rmode = RMode::DYN) noexcept;
void FMV_W_X(FPR rd, GPR rs1) noexcept;
void FMV_X_W(GPR rd, FPR rs1) noexcept;
void FNMADD_S(FPR rd, FPR rs1, FPR rs2, FPR rs3, RMode rmode = RMode::DYN) noexcept;
void FNMSUB_S(FPR rd, FPR rs1, FPR rs2, FPR rs3, RMode rmode = RMode::DYN) noexcept;
void FSGNJ_S(FPR rd, FPR rs1, FPR rs2) noexcept;
void FSGNJN_S(FPR rd, FPR rs1, FPR rs2) noexcept;
void FSGNJX_S(FPR rd, FPR rs1, FPR rs2) noexcept;
void FSQRT_S(FPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FSUB_S(FPR rd, FPR rs1, FPR rs2, RMode rmode = RMode::DYN) noexcept;
void FSW(FPR rs2, int32_t offset, GPR rs1) noexcept;
void FABS_S(FPR rd, FPR rs) noexcept;
void FMV_S(FPR rd, FPR rs) noexcept;
void FNEG_S(FPR rd, FPR rs) noexcept;
// RV64F Extension Instructions
void FCVT_L_S(GPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_LU_S(GPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_S_L(FPR rd, GPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_S_LU(FPR rd, GPR rs1, RMode rmode = RMode::DYN) noexcept;
// RV32D Extension Instructions
void FADD_D(FPR rd, FPR rs1, FPR rs2, RMode rmode = RMode::DYN) noexcept;
void FCLASS_D(GPR rd, FPR rs1) noexcept;
void FCVT_D_W(FPR rd, GPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_D_WU(FPR rd, GPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_W_D(GPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_WU_D(GPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_D_S(FPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_S_D(FPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FDIV_D(FPR rd, FPR rs1, FPR rs2, RMode rmode = RMode::DYN) noexcept;
void FEQ_D(GPR rd, FPR rs1, FPR rs2) noexcept;
void FLE_D(GPR rd, FPR rs1, FPR rs2) noexcept;
void FLT_D(GPR rd, FPR rs1, FPR rs2) noexcept;
void FLD(FPR rd, int32_t offset, GPR rs) noexcept;
void FMADD_D(FPR rd, FPR rs1, FPR rs2, FPR rs3, RMode rmode = RMode::DYN) noexcept;
void FMAX_D(FPR rd, FPR rs1, FPR rs2) noexcept;
void FMIN_D(FPR rd, FPR rs1, FPR rs2) noexcept;
void FMSUB_D(FPR rd, FPR rs1, FPR rs2, FPR rs3, RMode rmode = RMode::DYN) noexcept;
void FMUL_D(FPR rd, FPR rs1, FPR rs2, RMode rmode = RMode::DYN) noexcept;
void FNMADD_D(FPR rd, FPR rs1, FPR rs2, FPR rs3, RMode rmode = RMode::DYN) noexcept;
void FNMSUB_D(FPR rd, FPR rs1, FPR rs2, FPR rs3, RMode rmode = RMode::DYN) noexcept;
void FSGNJ_D(FPR rd, FPR rs1, FPR rs2) noexcept;
void FSGNJN_D(FPR rd, FPR rs1, FPR rs2) noexcept;
void FSGNJX_D(FPR rd, FPR rs1, FPR rs2) noexcept;
void FSQRT_D(FPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FSUB_D(FPR rd, FPR rs1, FPR rs2, RMode rmode = RMode::DYN) noexcept;
void FSD(FPR rs2, int32_t offset, GPR rs1) noexcept;
void FABS_D(FPR rd, FPR rs) noexcept;
void FMV_D(FPR rd, FPR rs) noexcept;
void FNEG_D(FPR rd, FPR rs) noexcept;
// RV64D Extension Instructions
void FCVT_L_D(GPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_LU_D(GPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_D_L(FPR rd, GPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_D_LU(FPR rd, GPR rs1, RMode rmode = RMode::DYN) noexcept;
void FMV_D_X(FPR rd, GPR rs1) noexcept;
void FMV_X_D(GPR rd, FPR rs1) noexcept;
// RV32Q Extension Instructions
void FADD_Q(FPR rd, FPR rs1, FPR rs2, RMode rmode = RMode::DYN) noexcept;
void FCLASS_Q(GPR rd, FPR rs1) noexcept;
void FCVT_Q_W(FPR rd, GPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_Q_WU(FPR rd, GPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_W_Q(GPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_WU_Q(GPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_Q_D(FPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_D_Q(FPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_Q_S(FPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_S_Q(FPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FDIV_Q(FPR rd, FPR rs1, FPR rs2, RMode rmode = RMode::DYN) noexcept;
void FEQ_Q(GPR rd, FPR rs1, FPR rs2) noexcept;
void FLE_Q(GPR rd, FPR rs1, FPR rs2) noexcept;
void FLT_Q(GPR rd, FPR rs1, FPR rs2) noexcept;
void FLQ(FPR rd, int32_t offset, GPR rs) noexcept;
void FMADD_Q(FPR rd, FPR rs1, FPR rs2, FPR rs3, RMode rmode = RMode::DYN) noexcept;
void FMAX_Q(FPR rd, FPR rs1, FPR rs2) noexcept;
void FMIN_Q(FPR rd, FPR rs1, FPR rs2) noexcept;
void FMSUB_Q(FPR rd, FPR rs1, FPR rs2, FPR rs3, RMode rmode = RMode::DYN) noexcept;
void FMUL_Q(FPR rd, FPR rs1, FPR rs2, RMode rmode = RMode::DYN) noexcept;
void FNMADD_Q(FPR rd, FPR rs1, FPR rs2, FPR rs3, RMode rmode = RMode::DYN) noexcept;
void FNMSUB_Q(FPR rd, FPR rs1, FPR rs2, FPR rs3, RMode rmode = RMode::DYN) noexcept;
void FSGNJ_Q(FPR rd, FPR rs1, FPR rs2) noexcept;
void FSGNJN_Q(FPR rd, FPR rs1, FPR rs2) noexcept;
void FSGNJX_Q(FPR rd, FPR rs1, FPR rs2) noexcept;
void FSQRT_Q(FPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FSUB_Q(FPR rd, FPR rs1, FPR rs2, RMode rmode = RMode::DYN) noexcept;
void FSQ(FPR rs2, int32_t offset, GPR rs1) noexcept;
void FABS_Q(FPR rd, FPR rs) noexcept;
void FMV_Q(FPR rd, FPR rs) noexcept;
void FNEG_Q(FPR rd, FPR rs) noexcept;
// RV64Q Extension Instructions
void FCVT_L_Q(GPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_LU_Q(GPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_Q_L(FPR rd, GPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_Q_LU(FPR rd, GPR rs1, RMode rmode = RMode::DYN) noexcept;
// RV32Zfh Extension Instructions
void FADD_H(FPR rd, FPR rs1, FPR rs2, RMode rmode = RMode::DYN) noexcept;
void FCLASS_H(GPR rd, FPR rs1) noexcept;
void FCVT_D_H(FPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_H_D(FPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_H_Q(FPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_H_S(FPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_H_W(FPR rd, GPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_H_WU(FPR rd, GPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_Q_H(FPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_S_H(FPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_W_H(GPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_WU_H(GPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FDIV_H(FPR rd, FPR rs1, FPR rs2, RMode rmode = RMode::DYN) noexcept;
void FEQ_H(GPR rd, FPR rs1, FPR rs2) noexcept;
void FLE_H(GPR rd, FPR rs1, FPR rs2) noexcept;
void FLH(FPR rd, int32_t offset, GPR rs) noexcept;
void FLT_H(GPR rd, FPR rs1, FPR rs2) noexcept;
void FMADD_H(FPR rd, FPR rs1, FPR rs2, FPR rs3, RMode rmode = RMode::DYN) noexcept;
void FMAX_H(FPR rd, FPR rs1, FPR rs2) noexcept;
void FMIN_H(FPR rd, FPR rs1, FPR rs2) noexcept;
void FMSUB_H(FPR rd, FPR rs1, FPR rs2, FPR rs3, RMode rmode = RMode::DYN) noexcept;
void FMUL_H(FPR rd, FPR rs1, FPR rs2, RMode rmode = RMode::DYN) noexcept;
void FMV_H_X(FPR rd, GPR rs1) noexcept;
void FMV_X_H(GPR rd, FPR rs1) noexcept;
void FNMADD_H(FPR rd, FPR rs1, FPR rs2, FPR rs3, RMode rmode = RMode::DYN) noexcept;
void FNMSUB_H(FPR rd, FPR rs1, FPR rs2, FPR rs3, RMode rmode = RMode::DYN) noexcept;
void FSGNJ_H(FPR rd, FPR rs1, FPR rs2) noexcept;
void FSGNJN_H(FPR rd, FPR rs1, FPR rs2) noexcept;
void FSGNJX_H(FPR rd, FPR rs1, FPR rs2) noexcept;
void FSH(FPR rs2, int32_t offset, GPR rs1) noexcept;
void FSQRT_H(FPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FSUB_H(FPR rd, FPR rs1, FPR rs2, RMode rmode = RMode::DYN) noexcept;
// RV64Zfh Extension Instructions
void FCVT_L_H(GPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_LU_H(GPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_H_L(FPR rd, GPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVT_H_LU(FPR rd, GPR rs1, RMode rmode = RMode::DYN) noexcept;
// Zfa Extension Instructions
void FLI_D(FPR rd, double value) noexcept;
void FLI_H(FPR rd, double value) noexcept;
void FLI_S(FPR rd, double value) noexcept;
void FMINM_D(FPR rd, FPR rs1, FPR rs2) noexcept;
void FMINM_H(FPR rd, FPR rs1, FPR rs2) noexcept;
void FMINM_Q(FPR rd, FPR rs1, FPR rs2) noexcept;
void FMINM_S(FPR rd, FPR rs1, FPR rs2) noexcept;
void FMAXM_D(FPR rd, FPR rs1, FPR rs2) noexcept;
void FMAXM_H(FPR rd, FPR rs1, FPR rs2) noexcept;
void FMAXM_Q(FPR rd, FPR rs1, FPR rs2) noexcept;
void FMAXM_S(FPR rd, FPR rs1, FPR rs2) noexcept;
void FROUND_D(FPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FROUND_H(FPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FROUND_Q(FPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FROUND_S(FPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FROUNDNX_D(FPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FROUNDNX_H(FPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FROUNDNX_Q(FPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FROUNDNX_S(FPR rd, FPR rs1, RMode rmode = RMode::DYN) noexcept;
void FCVTMOD_W_D(GPR rd, FPR rs1) noexcept;
void FMVH_X_D(GPR rd, FPR rs1) noexcept;
void FMVH_X_Q(GPR rd, FPR rs1) noexcept;
void FMVP_D_X(FPR rd, GPR rs1, GPR rs2) noexcept;
void FMVP_Q_X(FPR rd, GPR rs1, GPR rs2) noexcept;
void FLEQ_D(GPR rd, FPR rs1, FPR rs2) noexcept;
void FLTQ_D(GPR rd, FPR rs1, FPR rs2) noexcept;
void FLEQ_H(GPR rd, FPR rs1, FPR rs2) noexcept;
void FLTQ_H(GPR rd, FPR rs1, FPR rs2) noexcept;
void FLEQ_Q(GPR rd, FPR rs1, FPR rs2) noexcept;
void FLTQ_Q(GPR rd, FPR rs1, FPR rs2) noexcept;
void FLEQ_S(GPR rd, FPR rs1, FPR rs2) noexcept;
void FLTQ_S(GPR rd, FPR rs1, FPR rs2) noexcept;
// Zfbfmin Extension Instructions
void FCVT_BF16_S(FPR rd, FPR rs, RMode rmode = RMode::DYN) noexcept;
void FCVT_S_BF16(FPR rd, FPR rs, RMode rmode = RMode::DYN) noexcept;
// RVB Extension Instructions (plus scalar crypto bit operations)
void ADDUW(GPR rd, GPR rs1, GPR rs2) noexcept;
void ANDN(GPR rd, GPR rs1, GPR rs2) noexcept;
void BCLR(GPR rd, GPR rs1, GPR rs2) noexcept;
void BCLRI(GPR rd, GPR rs, uint32_t bit) noexcept;
void BEXT(GPR rd, GPR rs1, GPR rs2) noexcept;
void BEXTI(GPR rd, GPR rs, uint32_t bit) noexcept;
void BINV(GPR rd, GPR rs1, GPR rs2) noexcept;
void BINVI(GPR rd, GPR rs, uint32_t bit) noexcept;
void BREV8(GPR rd, GPR rs) noexcept;
void BSET(GPR rd, GPR rs1, GPR rs2) noexcept;
void BSETI(GPR rd, GPR rs, uint32_t bit) noexcept;
void CLMUL(GPR rd, GPR rs1, GPR rs2) noexcept;
void CLMULH(GPR rd, GPR rs1, GPR rs2) noexcept;
void CLMULR(GPR rd, GPR rs1, GPR rs2) noexcept;
void CLZ(GPR rd, GPR rs) noexcept;
void CLZW(GPR rd, GPR rs) noexcept;
void CPOP(GPR rd, GPR rs) noexcept;
void CPOPW(GPR rd, GPR rs) noexcept;
void CTZ(GPR rd, GPR rs) noexcept;
void CTZW(GPR rd, GPR rs) noexcept;
void MAX(GPR rd, GPR rs1, GPR rs2) noexcept;
void MAXU(GPR rd, GPR rs1, GPR rs2) noexcept;
void MIN(GPR rd, GPR rs1, GPR rs2) noexcept;
void MINU(GPR rd, GPR rs1, GPR rs2) noexcept;
void ORCB(GPR rd, GPR rs) noexcept;
void ORN(GPR rd, GPR rs1, GPR rs2) noexcept;
void PACK(GPR rd, GPR rs1, GPR rs2) noexcept;
void PACKH(GPR rd, GPR rs1, GPR rs2) noexcept;
void PACKW(GPR rd, GPR rs1, GPR rs2) noexcept;
void REV8(GPR rd, GPR rs) noexcept;
void ROL(GPR rd, GPR rs1, GPR rs2) noexcept;
void ROLW(GPR rd, GPR rs1, GPR rs2) noexcept;
void ROR(GPR rd, GPR rs1, GPR rs2) noexcept;
void RORI(GPR rd, GPR rs, uint32_t rotate_amount) noexcept;
void RORIW(GPR rd, GPR rs, uint32_t rotate_amount) noexcept;
void RORW(GPR rd, GPR rs1, GPR rs2) noexcept;
void SEXTB(GPR rd, GPR rs) noexcept;
void SEXTH(GPR rd, GPR rs) noexcept;
void SH1ADD(GPR rd, GPR rs1, GPR rs2) noexcept;
void SH1ADDUW(GPR rd, GPR rs1, GPR rs2) noexcept;
void SH2ADD(GPR rd, GPR rs1, GPR rs2) noexcept;
void SH2ADDUW(GPR rd, GPR rs1, GPR rs2) noexcept;
void SH3ADD(GPR rd, GPR rs1, GPR rs2) noexcept;
void SH3ADDUW(GPR rd, GPR rs1, GPR rs2) noexcept;
void SLLIUW(GPR rd, GPR rs, uint32_t shift_amount) noexcept;
void UNZIP(GPR rd, GPR rs) noexcept;
void XNOR(GPR rd, GPR rs1, GPR rs2) noexcept;
void XPERM4(GPR rd, GPR rs1, GPR rs2) noexcept;
void XPERM8(GPR rd, GPR rs1, GPR rs2) noexcept;
void ZEXTH(GPR rd, GPR rs) noexcept;
void ZEXTW(GPR rd, GPR rs) noexcept;
void ZIP(GPR rd, GPR rs) noexcept;
// Scalar Cryptography (RVK) instructions
void AES32DSI(GPR rd, GPR rs1, GPR rs2, uint32_t bs) noexcept;
void AES32DSMI(GPR rd, GPR rs1, GPR rs2, uint32_t bs) noexcept;
void AES32ESI(GPR rd, GPR rs1, GPR rs2, uint32_t bs) noexcept;
void AES32ESMI(GPR rd, GPR rs1, GPR rs2, uint32_t bs) noexcept;
void AES64DS(GPR rd, GPR rs1, GPR rs2) noexcept;
void AES64DSM(GPR rd, GPR rs1, GPR rs2) noexcept;
void AES64ES(GPR rd, GPR rs1, GPR rs2) noexcept;
void AES64ESM(GPR rd, GPR rs1, GPR rs2) noexcept;
void AES64IM(GPR rd, GPR rs) noexcept;
void AES64KS1I(GPR rd, GPR rs, uint32_t rnum) noexcept;
void AES64KS2(GPR rd, GPR rs1, GPR rs2) noexcept;
void SHA256SIG0(GPR rd, GPR rs) noexcept;
void SHA256SIG1(GPR rd, GPR rs) noexcept;
void SHA256SUM0(GPR rd, GPR rs) noexcept;
void SHA256SUM1(GPR rd, GPR rs) noexcept;
void SHA512SIG0(GPR rd, GPR rs) noexcept;
void SHA512SIG0H(GPR rd, GPR rs1, GPR rs2) noexcept;
void SHA512SIG0L(GPR rd, GPR rs1, GPR rs2) noexcept;
void SHA512SIG1(GPR rd, GPR rs) noexcept;
void SHA512SIG1H(GPR rd, GPR rs1, GPR rs2) noexcept;
void SHA512SIG1L(GPR rd, GPR rs1, GPR rs2) noexcept;
void SHA512SUM0(GPR rd, GPR rs) noexcept;
void SHA512SUM0R(GPR rd, GPR rs1, GPR rs2) noexcept;
void SHA512SUM1(GPR rd, GPR rs) noexcept;
void SHA512SUM1R(GPR rd, GPR rs1, GPR rs2) noexcept;
void SM3P0(GPR rd, GPR rs) noexcept;
void SM3P1(GPR rd, GPR rs) noexcept;
void SM4ED(GPR rd, GPR rs1, GPR rs2, uint32_t bs) noexcept;
void SM4KS(GPR rd, GPR rs1, GPR rs2, uint32_t bs) noexcept;
// RVC Extension Instructions
void C_ADD(GPR rd, GPR rs) noexcept;
void C_ADDI(GPR rd, int32_t imm) noexcept;
void C_ADDIW(GPR rd, int32_t imm) noexcept;
void C_ADDI4SPN(GPR rd, uint32_t imm) noexcept;
void C_ADDI16SP(int32_t imm) noexcept;
void C_ADDW(GPR rd, GPR rs) noexcept;
void C_AND(GPR rd, GPR rs) noexcept;
void C_ANDI(GPR rd, uint32_t imm) noexcept;
void C_BEQZ(GPR rs, int32_t offset) noexcept;
void C_BEQZ(GPR rs, Label* label) noexcept;
void C_BNEZ(GPR rs, int32_t offset) noexcept;
void C_BNEZ(GPR rs, Label* label) noexcept;
void C_EBREAK() noexcept;
void C_FLD(FPR rd, uint32_t imm, GPR rs) noexcept;
void C_FLDSP(FPR rd, uint32_t imm) noexcept;
void C_FLW(FPR rd, uint32_t imm, GPR rs) noexcept;
void C_FLWSP(FPR rd, uint32_t imm) noexcept;
void C_FSD(FPR rs2, uint32_t imm, GPR rs1) noexcept;
void C_FSDSP(FPR rs, uint32_t imm) noexcept;
void C_FSW(FPR rs2, uint32_t imm, GPR rs1) noexcept;
void C_FSWSP(FPR rs, uint32_t imm) noexcept;
void C_J(int32_t offset) noexcept;
void C_J(Label* label) noexcept;
void C_JAL(Label* label) noexcept;
void C_JAL(int32_t offset) noexcept;
void C_JALR(GPR rs) noexcept;
void C_JR(GPR rs) noexcept;
void C_LD(GPR rd, uint32_t imm, GPR rs) noexcept;
void C_LDSP(GPR rd, uint32_t imm) noexcept;
void C_LI(GPR rd, int32_t imm) noexcept;
void C_LQ(GPR rd, uint32_t imm, GPR rs) noexcept;
void C_LQSP(GPR rd, uint32_t imm) noexcept;
void C_LUI(GPR rd, uint32_t imm) noexcept;
void C_LW(GPR rd, uint32_t imm, GPR rs) noexcept;
void C_LWSP(GPR rd, uint32_t imm) noexcept;
void C_MV(GPR rd, GPR rs) noexcept;
void C_NOP() noexcept;
void C_OR(GPR rd, GPR rs) noexcept;
void C_SD(GPR rs2, uint32_t imm, GPR rs1) noexcept;
void C_SDSP(GPR rs, uint32_t imm) noexcept;
void C_SLLI(GPR rd, uint32_t shift) noexcept;
void C_SQ(GPR rs2, uint32_t imm, GPR rs1) noexcept;
void C_SQSP(GPR rs, uint32_t imm) noexcept;
void C_SRAI(GPR rd, uint32_t shift) noexcept;
void C_SRLI(GPR rd, uint32_t shift) noexcept;
void C_SUB(GPR rd, GPR rs) noexcept;
void C_SUBW(GPR rd, GPR rs) noexcept;
void C_SW(GPR rs2, uint32_t imm, GPR rs1) noexcept;
void C_SWSP(GPR rs, uint32_t imm) noexcept;
void C_UNDEF() noexcept;
void C_XOR(GPR rd, GPR rs) noexcept;
// Zc Extension Instructions
void C_LBU(GPR rd, uint32_t uimm, GPR rs) noexcept;
void C_LH(GPR rd, uint32_t uimm, GPR rs) noexcept;
void C_LHU(GPR rd, uint32_t uimm, GPR rs) noexcept;
void C_SB(GPR rs2, uint32_t uimm, GPR rs1) noexcept;
void C_SH(GPR rs2, uint32_t uimm, GPR rs1) noexcept;
void C_SEXT_B(GPR rd) noexcept;
void C_SEXT_H(GPR rd) noexcept;
void C_ZEXT_B(GPR rd) noexcept;
void C_ZEXT_H(GPR rd) noexcept;
void C_ZEXT_W(GPR rd) noexcept;
void C_MUL(GPR rsd, GPR rs2) noexcept;
void C_NOT(GPR rd) noexcept;
void CM_MVA01S(GPR r1s, GPR r2s) noexcept;
void CM_MVSA01(GPR r1s, GPR r2s) noexcept;
void CM_POP(PushPopList reg_list, int32_t stack_adj) noexcept;
void CM_POPRET(PushPopList reg_list, int32_t stack_adj) noexcept;
void CM_POPRETZ(PushPopList reg_list, int32_t stack_adj) noexcept;
void CM_PUSH(PushPopList reg_list, int32_t stack_adj) noexcept;
void CM_JALT(uint32_t index) noexcept;
void CM_JT(uint32_t index) noexcept;
// Cache Management Operation Extension Instructions
void CBO_CLEAN(GPR rs) noexcept;
void CBO_FLUSH(GPR rs) noexcept;
void CBO_INVAL(GPR rs) noexcept;
void CBO_ZERO(GPR rs) noexcept;
void PREFETCH_I(GPR rs, int32_t offset = 0) noexcept;
void PREFETCH_R(GPR rs, int32_t offset = 0) noexcept;
void PREFETCH_W(GPR rs, int32_t offset = 0) noexcept;
// Privileged Instructions
void HFENCE_GVMA(GPR rs1, GPR rs2) noexcept;
void HFENCE_VVMA(GPR rs1, GPR rs2) noexcept;
void HINVAL_GVMA(GPR rs1, GPR rs2) noexcept;
void HINVAL_VVMA(GPR rs1, GPR rs2) noexcept;
void HLV_B(GPR rd, GPR rs) noexcept;
void HLV_BU(GPR rd, GPR rs) noexcept;
void HLV_D(GPR rd, GPR rs) noexcept;
void HLV_H(GPR rd, GPR rs) noexcept;
void HLV_HU(GPR rd, GPR rs) noexcept;
void HLV_W(GPR rd, GPR rs) noexcept;
void HLV_WU(GPR rd, GPR rs) noexcept;
void HLVX_HU(GPR rd, GPR rs) noexcept;
void HLVX_WU(GPR rd, GPR rs) noexcept;
void HSV_B(GPR rs2, GPR rs1) noexcept;
void HSV_D(GPR rs2, GPR rs1) noexcept;
void HSV_H(GPR rs2, GPR rs1) noexcept;
void HSV_W(GPR rs2, GPR rs1) noexcept;
void MRET() noexcept;
void SFENCE_INVAL_IR() noexcept;
void SFENCE_VMA(GPR rs1, GPR rs2) noexcept;
void SFENCE_W_INVAL() noexcept;
void SINVAL_VMA(GPR rs1, GPR rs2) noexcept;
void SRET() noexcept;
void URET() noexcept;
void WFI() noexcept;
// Vector Extension Instructions
// Vector Integer Instructions
void VAADD(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VAADD(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VAADDU(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VAADDU(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VADC(Vec vd, Vec vs2, Vec vs1) noexcept;
void VADC(Vec vd, Vec vs2, GPR rs1) noexcept;
void VADC(Vec vd, Vec vs2, int32_t simm) noexcept;
void VADD(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VADD(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VADD(Vec vd, Vec vs2, int32_t simm, VecMask mask = VecMask::No) noexcept;
void VAND(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VAND(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VAND(Vec vd, Vec vs2, int32_t simm, VecMask mask = VecMask::No) noexcept;
void VASUB(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VASUB(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VASUBU(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VASUBU(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VCOMPRESS(Vec vd, Vec vs2, Vec vs1) noexcept;
void VDIV(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VDIV(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VDIVU(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VDIVU(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VFIRST(GPR rd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VID(Vec vd, VecMask mask = VecMask::No) noexcept;
void VIOTA(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VMACC(Vec vd, Vec vs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VMACC(Vec vd, GPR rs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VMADC(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VMADC(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VMADC(Vec vd, Vec vs2, int32_t simm, VecMask mask = VecMask::No) noexcept;
void VMADD(Vec vd, Vec vs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VMADD(Vec vd, GPR rs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VMAND(Vec vd, Vec vs2, Vec vs1) noexcept;
void VMANDNOT(Vec vd, Vec vs2, Vec vs1) noexcept;
void VMNAND(Vec vd, Vec vs2, Vec vs1) noexcept;
void VMNOR(Vec vd, Vec vs2, Vec vs1) noexcept;
void VMOR(Vec vd, Vec vs2, Vec vs1) noexcept;
void VMORNOT(Vec vd, Vec vs2, Vec vs1) noexcept;
void VMXNOR(Vec vd, Vec vs2, Vec vs1) noexcept;
void VMXOR(Vec vd, Vec vs2, Vec vs1) noexcept;
void VMAX(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VMAX(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VMAXU(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VMAXU(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VMERGE(Vec vd, Vec vs2, Vec vs1) noexcept;
void VMERGE(Vec vd, Vec vs2, GPR rs1) noexcept;
void VMERGE(Vec vd, Vec vs2, int32_t simm) noexcept;
void VMIN(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VMIN(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VMINU(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VMINU(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VMSBC(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VMSBC(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VMSBF(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VMSIF(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VMSOF(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VMSEQ(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VMSEQ(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VMSEQ(Vec vd, Vec vs2, int32_t simm, VecMask mask = VecMask::No) noexcept;
void VMSGT(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VMSGT(Vec vd, Vec vs2, int32_t simm, VecMask mask = VecMask::No) noexcept;
void VMSGTU(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VMSGTU(Vec vd, Vec vs2, int32_t simm, VecMask mask = VecMask::No) noexcept;
void VMSLE(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VMSLE(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VMSLE(Vec vd, Vec vs2, int32_t simm, VecMask mask = VecMask::No) noexcept;
void VMSLEU(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VMSLEU(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VMSLEU(Vec vd, Vec vs2, int32_t simm, VecMask mask = VecMask::No) noexcept;
void VMSLT(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VMSLT(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VMSLTU(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VMSLTU(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VMSNE(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VMSNE(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VMSNE(Vec vd, Vec vs2, int32_t simm, VecMask mask = VecMask::No) noexcept;
void VMUL(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VMUL(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VMULH(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VMULH(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VMULHSU(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VMULHSU(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VMULHU(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VMULHU(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VMV(Vec vd, Vec vs1) noexcept;
void VMV(Vec vd, GPR rs1) noexcept;
void VMV(Vec vd, int32_t simm) noexcept;
void VMV1R(Vec vd, Vec vs) noexcept;
void VMV2R(Vec vd, Vec vs) noexcept;
void VMV4R(Vec vd, Vec vs) noexcept;
void VMV8R(Vec vd, Vec vs) noexcept;
void VMV_SX(Vec vd, GPR rs) noexcept;
void VMV_XS(GPR rd, Vec vs) noexcept;
void VNCLIP(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VNCLIP(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VNCLIP(Vec vd, Vec vs2, uint32_t uimm, VecMask mask = VecMask::No) noexcept;
void VNCLIPU(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VNCLIPU(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VNCLIPU(Vec vd, Vec vs2, uint32_t uimm, VecMask mask = VecMask::No) noexcept;
void VNMSAC(Vec vd, Vec vs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VNMSAC(Vec vd, GPR rs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VNMSUB(Vec vd, Vec vs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VNMSUB(Vec vd, GPR rs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VNSRA(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VNSRA(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VNSRA(Vec vd, Vec vs2, uint32_t uimm, VecMask mask = VecMask::No) noexcept;
void VNSRL(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VNSRL(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VNSRL(Vec vd, Vec vs2, uint32_t uimm, VecMask mask = VecMask::No) noexcept;
void VOR(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VOR(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VOR(Vec vd, Vec vs2, int32_t simm, VecMask mask = VecMask::No) noexcept;
void VPOPC(GPR rd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VREDAND(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VREDMAX(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VREDMAXU(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VREDMIN(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VREDMINU(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VREDOR(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VREDSUM(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VREDXOR(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VREM(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VREM(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VREMU(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VREMU(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VRGATHER(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VRGATHER(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VRGATHER(Vec vd, Vec vs2, uint32_t uimm, VecMask mask = VecMask::No) noexcept;
void VRGATHEREI16(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VRSUB(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VRSUB(Vec vd, Vec vs2, int32_t simm, VecMask mask = VecMask::No) noexcept;
void VSADD(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VSADD(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VSADD(Vec vd, Vec vs2, int32_t simm, VecMask mask = VecMask::No) noexcept;
void VSADDU(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VSADDU(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VSADDU(Vec vd, Vec vs2, int32_t simm, VecMask mask = VecMask::No) noexcept;
void VSBC(Vec vd, Vec vs2, Vec vs1) noexcept;
void VSBC(Vec vd, Vec vs2, GPR rs1) noexcept;
void VSEXTVF2(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VSEXTVF4(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VSEXTVF8(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VSLIDE1DOWN(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VSLIDEDOWN(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VSLIDEDOWN(Vec vd, Vec vs2, uint32_t uimm, VecMask mask = VecMask::No) noexcept;
void VSLIDE1UP(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VSLIDEUP(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VSLIDEUP(Vec vd, Vec vs2, uint32_t uimm, VecMask mask = VecMask::No) noexcept;
void VSLL(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VSLL(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VSLL(Vec vd, Vec vs2, uint32_t uimm, VecMask mask = VecMask::No) noexcept;
void VSMUL(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VSMUL(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VSRA(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VSRA(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VSRA(Vec vd, Vec vs2, uint32_t uimm, VecMask mask = VecMask::No) noexcept;
void VSRL(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VSRL(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VSRL(Vec vd, Vec vs2, uint32_t uimm, VecMask mask = VecMask::No) noexcept;
void VSSRA(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VSSRA(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VSSRA(Vec vd, Vec vs2, uint32_t uimm, VecMask mask = VecMask::No) noexcept;
void VSSRL(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VSSRL(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VSSRL(Vec vd, Vec vs2, uint32_t uimm, VecMask mask = VecMask::No) noexcept;
void VSSUB(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VSSUB(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VSSUBU(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VSSUBU(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VSUB(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VSUB(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VWADD(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VWADD(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VWADDW(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VWADDW(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VWADDU(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VWADDU(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VWADDUW(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VWADDUW(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VWMACC(Vec vd, Vec vs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VWMACC(Vec vd, GPR rs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VWMACCSU(Vec vd, Vec vs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VWMACCSU(Vec vd, GPR rs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VWMACCU(Vec vd, Vec vs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VWMACCU(Vec vd, GPR rs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VWMACCUS(Vec vd, GPR rs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VWMUL(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VWMUL(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VWMULSU(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VWMULSU(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VWMULU(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VWMULU(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VWREDSUM(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VWREDSUMU(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VWSUB(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VWSUB(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VWSUBW(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VWSUBW(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VWSUBU(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VWSUBU(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VWSUBUW(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VWSUBUW(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VXOR(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VXOR(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VXOR(Vec vd, Vec vs2, int32_t simm, VecMask mask = VecMask::No) noexcept;
void VZEXTVF2(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VZEXTVF4(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VZEXTVF8(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
// Vector Floating-Point Instructions
void VFADD(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VFADD(Vec vd, Vec vs2, FPR rs1, VecMask mask = VecMask::No) noexcept;
void VFCLASS(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VFCVT_F_X(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VFCVT_F_XU(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VFCVT_RTZ_X_F(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VFCVT_RTZ_XU_F(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VFCVT_X_F(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VFCVT_XU_F(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VFNCVT_F_F(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VFNCVT_F_X(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VFNCVT_F_XU(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VFNCVT_ROD_F_F(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VFNCVT_RTZ_X_F(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VFNCVT_RTZ_XU_F(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VFNCVT_X_F(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VFNCVT_XU_F(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VFWCVT_F_F(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VFWCVT_F_X(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VFWCVT_F_XU(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VFWCVT_RTZ_X_F(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VFWCVT_RTZ_XU_F(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VFWCVT_X_F(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VFWCVT_XU_F(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VFDIV(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VFDIV(Vec vd, Vec vs2, FPR rs1, VecMask mask = VecMask::No) noexcept;
void VFRDIV(Vec vd, Vec vs2, FPR rs1, VecMask mask = VecMask::No) noexcept;
void VFREDMAX(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VFREDMIN(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VFREDSUM(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VFREDOSUM(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VFMACC(Vec vd, Vec vs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VFMACC(Vec vd, FPR rs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VFMADD(Vec vd, Vec vs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VFMADD(Vec vd, FPR rs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VFMAX(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VFMAX(Vec vd, Vec vs2, FPR rs1, VecMask mask = VecMask::No) noexcept;
void VFMERGE(Vec vd, Vec vs2, FPR rs1) noexcept;
void VFMIN(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VFMIN(Vec vd, Vec vs2, FPR rs1, VecMask mask = VecMask::No) noexcept;
void VFMSAC(Vec vd, Vec vs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VFMSAC(Vec vd, FPR rs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VFMSUB(Vec vd, Vec vs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VFMSUB(Vec vd, FPR rs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VFMUL(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VFMUL(Vec vd, Vec vs2, FPR rs1, VecMask mask = VecMask::No) noexcept;
void VFMV(Vec vd, FPR rs) noexcept;
void VFMV_FS(FPR rd, Vec vs) noexcept;
void VFMV_SF(Vec vd, FPR rs) noexcept;
void VFNMACC(Vec vd, Vec vs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VFNMACC(Vec vd, FPR rs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VFNMADD(Vec vd, Vec vs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VFNMADD(Vec vd, FPR rs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VFNMSAC(Vec vd, Vec vs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VFNMSAC(Vec vd, FPR rs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VFNMSUB(Vec vd, Vec vs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VFNMSUB(Vec vd, FPR rs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VFREC7(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VFSGNJ(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VFSGNJ(Vec vd, Vec vs2, FPR rs1, VecMask mask = VecMask::No) noexcept;
void VFSGNJN(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VFSGNJN(Vec vd, Vec vs2, FPR rs1, VecMask mask = VecMask::No) noexcept;
void VFSGNJX(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VFSGNJX(Vec vd, Vec vs2, FPR rs1, VecMask mask = VecMask::No) noexcept;
void VFSQRT(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VFRSQRT7(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VFSLIDE1DOWN(Vec vd, Vec vs2, FPR rs1, VecMask mask = VecMask::No) noexcept;
void VFSLIDE1UP(Vec vd, Vec vs2, FPR rs1, VecMask mask = VecMask::No) noexcept;
void VFSUB(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VFSUB(Vec vd, Vec vs2, FPR rs1, VecMask mask = VecMask::No) noexcept;
void VFRSUB(Vec vd, Vec vs2, FPR rs1, VecMask mask = VecMask::No) noexcept;
void VFWADD(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VFWADD(Vec vd, Vec vs2, FPR rs1, VecMask mask = VecMask::No) noexcept;
void VFWADDW(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VFWADDW(Vec vd, Vec vs2, FPR rs1, VecMask mask = VecMask::No) noexcept;
void VFWMACC(Vec vd, Vec vs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VFWMACC(Vec vd, FPR rs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VFWMUL(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VFWMUL(Vec vd, Vec vs2, FPR rs1, VecMask mask = VecMask::No) noexcept;
void VFWNMACC(Vec vd, Vec vs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VFWNMACC(Vec vd, FPR rs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VFWNMSAC(Vec vd, Vec vs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VFWNMSAC(Vec vd, FPR rs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VFWREDSUM(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VFWREDOSUM(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VFWMSAC(Vec vd, Vec vs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VFWMSAC(Vec vd, FPR rs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VFWSUB(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VFWSUB(Vec vd, Vec vs2, FPR rs1, VecMask mask = VecMask::No) noexcept;
void VFWSUBW(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VFWSUBW(Vec vd, Vec vs2, FPR rs1, VecMask mask = VecMask::No) noexcept;
void VMFEQ(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VMFEQ(Vec vd, Vec vs2, FPR rs1, VecMask mask = VecMask::No) noexcept;
void VMFGE(Vec vd, Vec vs2, FPR rs1, VecMask mask = VecMask::No) noexcept;
void VMFGT(Vec vd, Vec vs2, FPR rs1, VecMask mask = VecMask::No) noexcept;
void VMFLE(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VMFLE(Vec vd, Vec vs2, FPR rs1, VecMask mask = VecMask::No) noexcept;
void VMFLT(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VMFLT(Vec vd, Vec vs2, FPR rs1, VecMask mask = VecMask::No) noexcept;
void VMFNE(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VMFNE(Vec vd, Vec vs2, FPR rs1, VecMask mask = VecMask::No) noexcept;
// Vector Load/Store Instructions
void VLE8(Vec vd, GPR rs, VecMask mask = VecMask::No) noexcept;
void VLE16(Vec vd, GPR rs, VecMask mask = VecMask::No) noexcept;
void VLE32(Vec vd, GPR rs, VecMask mask = VecMask::No) noexcept;
void VLE64(Vec vd, GPR rs, VecMask mask = VecMask::No) noexcept;
void VLM(Vec vd, GPR rs) noexcept;
void VLSE8(Vec vd, GPR rs1, GPR rs2, VecMask mask = VecMask::No) noexcept;
void VLSE16(Vec vd, GPR rs1, GPR rs2, VecMask mask = VecMask::No) noexcept;
void VLSE32(Vec vd, GPR rs1, GPR rs2, VecMask mask = VecMask::No) noexcept;
void VLSE64(Vec vd, GPR rs1, GPR rs2, VecMask mask = VecMask::No) noexcept;
void VLOXEI8(Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VLOXEI16(Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VLOXEI32(Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VLOXEI64(Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VLUXEI8(Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VLUXEI16(Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VLUXEI32(Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VLUXEI64(Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VLE8FF(Vec vd, GPR rs, VecMask mask = VecMask::No) noexcept;
void VLE16FF(Vec vd, GPR rs, VecMask mask = VecMask::No) noexcept;
void VLE32FF(Vec vd, GPR rs, VecMask mask = VecMask::No) noexcept;
void VLE64FF(Vec vd, GPR rs, VecMask mask = VecMask::No) noexcept;
void VLSEGE8(uint32_t num_segments, Vec vd, GPR rs, VecMask mask = VecMask::No) noexcept;
void VLSEGE16(uint32_t num_segments, Vec vd, GPR rs, VecMask mask = VecMask::No) noexcept;
void VLSEGE32(uint32_t num_segments, Vec vd, GPR rs, VecMask mask = VecMask::No) noexcept;
void VLSEGE64(uint32_t num_segments, Vec vd, GPR rs, VecMask mask = VecMask::No) noexcept;
void VLSSEGE8(uint32_t num_segments, Vec vd, GPR rs1, GPR rs2, VecMask mask = VecMask::No) noexcept;
void VLSSEGE16(uint32_t num_segments, Vec vd, GPR rs1, GPR rs2, VecMask mask = VecMask::No) noexcept;
void VLSSEGE32(uint32_t num_segments, Vec vd, GPR rs1, GPR rs2, VecMask mask = VecMask::No) noexcept;
void VLSSEGE64(uint32_t num_segments, Vec vd, GPR rs1, GPR rs2, VecMask mask = VecMask::No) noexcept;
void VLOXSEGEI8(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VLOXSEGEI16(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VLOXSEGEI32(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VLOXSEGEI64(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VLUXSEGEI8(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VLUXSEGEI16(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VLUXSEGEI32(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VLUXSEGEI64(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VLRE8(uint32_t num_registers, Vec vd, GPR rs) noexcept;
void VL1RE8(Vec vd, GPR rs) noexcept;
void VL2RE8(Vec vd, GPR rs) noexcept;
void VL4RE8(Vec vd, GPR rs) noexcept;
void VL8RE8(Vec vd, GPR rs) noexcept;
void VLRE16(uint32_t num_registers, Vec vd, GPR rs) noexcept;
void VL1RE16(Vec vd, GPR rs) noexcept;
void VL2RE16(Vec vd, GPR rs) noexcept;
void VL4RE16(Vec vd, GPR rs) noexcept;
void VL8RE16(Vec vd, GPR rs) noexcept;
void VLRE32(uint32_t num_registers, Vec vd, GPR rs) noexcept;
void VL1RE32(Vec vd, GPR rs) noexcept;
void VL2RE32(Vec vd, GPR rs) noexcept;
void VL4RE32(Vec vd, GPR rs) noexcept;
void VL8RE32(Vec vd, GPR rs) noexcept;
void VLRE64(uint32_t num_registers, Vec vd, GPR rs) noexcept;
void VL1RE64(Vec vd, GPR rs) noexcept;
void VL2RE64(Vec vd, GPR rs) noexcept;
void VL4RE64(Vec vd, GPR rs) noexcept;
void VL8RE64(Vec vd, GPR rs) noexcept;
void VSE8(Vec vs, GPR rs, VecMask mask = VecMask::No) noexcept;
void VSE16(Vec vs, GPR rs, VecMask mask = VecMask::No) noexcept;
void VSE32(Vec vs, GPR rs, VecMask mask = VecMask::No) noexcept;
void VSE64(Vec vs, GPR rs, VecMask mask = VecMask::No) noexcept;
void VSM(Vec vs, GPR rs) noexcept;
void VSSE8(Vec vs, GPR rs1, GPR rs2, VecMask mask = VecMask::No) noexcept;
void VSSE16(Vec vs, GPR rs1, GPR rs2, VecMask mask = VecMask::No) noexcept;
void VSSE32(Vec vs, GPR rs1, GPR rs2, VecMask mask = VecMask::No) noexcept;
void VSSE64(Vec vs, GPR rs1, GPR rs2, VecMask mask = VecMask::No) noexcept;
void VSOXEI8(Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VSOXEI16(Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VSOXEI32(Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VSOXEI64(Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VSUXEI8(Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VSUXEI16(Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VSUXEI32(Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VSUXEI64(Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VSSEGE8(uint32_t num_segments, Vec vs, GPR rs, VecMask mask = VecMask::No) noexcept;
void VSSEGE16(uint32_t num_segments, Vec vs, GPR rs, VecMask mask = VecMask::No) noexcept;
void VSSEGE32(uint32_t num_segments, Vec vs, GPR rs, VecMask mask = VecMask::No) noexcept;
void VSSEGE64(uint32_t num_segments, Vec vs, GPR rs, VecMask mask = VecMask::No) noexcept;
void VSSSEGE8(uint32_t num_segments, Vec vs, GPR rs1, GPR rs2, VecMask mask = VecMask::No) noexcept;
void VSSSEGE16(uint32_t num_segments, Vec vs, GPR rs1, GPR rs2, VecMask mask = VecMask::No) noexcept;
void VSSSEGE32(uint32_t num_segments, Vec vs, GPR rs1, GPR rs2, VecMask mask = VecMask::No) noexcept;
void VSSSEGE64(uint32_t num_segments, Vec vs, GPR rs1, GPR rs2, VecMask mask = VecMask::No) noexcept;
void VSOXSEGEI8(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VSOXSEGEI16(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VSOXSEGEI32(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VSOXSEGEI64(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VSUXSEGEI8(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VSUXSEGEI16(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VSUXSEGEI32(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VSUXSEGEI64(uint32_t num_segments, Vec vd, GPR rs, Vec vs, VecMask mask = VecMask::No) noexcept;
void VSR(uint32_t num_registers, Vec vs, GPR rs) noexcept;
void VS1R(Vec vs, GPR rs) noexcept;
void VS2R(Vec vs, GPR rs) noexcept;
void VS4R(Vec vs, GPR rs) noexcept;
void VS8R(Vec vs, GPR rs) noexcept;
// Vector Configuration Setting Instructions
void VSETIVLI(GPR rd, uint32_t imm, SEW sew, LMUL lmul = LMUL::M1, VTA vta = VTA::No, VMA vma = VMA::No) noexcept;
void VSETVL(GPR rd, GPR rs1, GPR rs2) noexcept;
void VSETVLI(GPR rd, GPR rs, SEW sew, LMUL lmul = LMUL::M1, VTA vta = VTA::No, VMA vma = VMA::No) noexcept;
// Vector Cryptography Instructions
void VANDN(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VANDN(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VBREV(Vec vd, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VBREV8(Vec vd, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VREV8(Vec vd, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VCLZ(Vec vd, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VCTZ(Vec vd, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VCPOP(Vec vd, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VROL(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VROL(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VROR(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VROR(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VROR(Vec vd, Vec vs2, uint32_t uimm, VecMask mask = VecMask::No) noexcept;
void VWSLL(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VWSLL(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VWSLL(Vec vd, Vec vs2, uint32_t uimm, VecMask mask = VecMask::No) noexcept;
void VCLMUL(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VCLMUL(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VCLMULH(Vec vd, Vec vs2, Vec vs1, VecMask mask = VecMask::No) noexcept;
void VCLMULH(Vec vd, Vec vs2, GPR rs1, VecMask mask = VecMask::No) noexcept;
void VGHSH(Vec vd, Vec vs2, Vec vs1) noexcept;
void VGMUL(Vec vd, Vec vs2) noexcept;
void VAESDF_VV(Vec vd, Vec vs2) noexcept;
void VAESDF_VS(Vec vd, Vec vs2) noexcept;
void VAESDM_VV(Vec vd, Vec vs2) noexcept;
void VAESDM_VS(Vec vd, Vec vs2) noexcept;
void VAESEF_VV(Vec vd, Vec vs2) noexcept;
void VAESEF_VS(Vec vd, Vec vs2) noexcept;
void VAESEM_VV(Vec vd, Vec vs2) noexcept;
void VAESEM_VS(Vec vd, Vec vs2) noexcept;
void VAESKF1(Vec vd, Vec vs2, uint32_t uimm) noexcept;
void VAESKF2(Vec vd, Vec vs2, uint32_t uimm) noexcept;
void VAESZ(Vec vd, Vec vs2) noexcept;
void VSHA2MS(Vec vd, Vec vs2, Vec vs1) noexcept;
void VSHA2CH(Vec vd, Vec vs2, Vec vs1) noexcept;
void VSHA2CL(Vec vd, Vec vs2, Vec vs1) noexcept;
void VSM4K(Vec vd, Vec vs2, uint32_t uimm) noexcept;
void VSM4R_VV(Vec vd, Vec vs2) noexcept;
void VSM4R_VS(Vec vd, Vec vs2) noexcept;
void VSM3C(Vec vd, Vec vs2, uint32_t uimm) noexcept;
void VSM3ME(Vec vd, Vec vs2, Vec vs1) noexcept;
// Zvfbfmin, Zvfbfwma Extension Instructions
void VFNCVTBF16_F_F_W(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VFWCVTBF16_F_F_V(Vec vd, Vec vs, VecMask mask = VecMask::No) noexcept;
void VFWMACCBF16(Vec vd, FPR rs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
void VFWMACCBF16(Vec vd, Vec vs1, Vec vs2, VecMask mask = VecMask::No) noexcept;
private:
// Binds a label to a given offset.
void BindToOffset(Label* label, Label::LocationOffset offset);
// Links the given label and returns the offset to it.
ptrdiff_t LinkAndGetOffset(Label* label);
// Resolves all label offsets and patches any necessary
// branch offsets into the branch instructions that
// requires them.
void ResolveLabelOffsets(Label* label);
CodeBuffer m_buffer;
ArchFeature m_features = ArchFeature::RV64;
};
} // namespace biscuit