#include <assert.h>
#include <stddef.h>
#include <string.h>
#include <stdio.h>
#include <inttypes.h>

#include "rv64_printer.h"
#include "debug.h"

static const char gpr[32][9] = {
    "zero",
    "ra",
    "sp",
    "gp",
    "tp",
    "t0",
    "t1",
    "t2",
    "rbp_s0",
    "rsp_s1",
    "rdi_a0",
    "rsi_a1",
    "rdx_a2",
    "rcx_a3",
    "r8_a4",
    "r9_a5",
    "rax_a6",
    "x7_a7",
    "r12_s2",
    "r13_s3",
    "r14_s4",
    "r15_s5",
    "rip_s6",
    "flags_s7",
    "rbx_s8",
    "emu_s9",
    "r10_s10",
    "r11_s11",
    "t3",
    "t4",
    "t5",
    "t6",
};

static const char fpr[32][5] = {
    "f0",
    "f1",
    "f2",
    "f3",
    "f4",
    "f5",
    "f6",
    "f7",
    "f8",
    "f9",
    "f10",
    "f11",
    "f12",
    "f13",
    "f14",
    "f15",
    "f16",
    "f17",
    "f18",
    "f19",
    "f20",
    "f21",
    "f22",
    "f23",
    "f24",
    "f25",
    "f26",
    "f27",
    "f28",
    "f29",
    "f30",
    "f31",
};

static const char vpr[32][4] = {
    "v0",
    "v1",
    "v2",
    "v3",
    "v4",
    "v5",
    "v6",
    "v7",
    "v8",
    "v9",
    "v10",
    "v11",
    "v12",
    "v13",
    "v14",
    "v15",
    "v16",
    "v17",
    "v18",
    "v19",
    "v20",
    "v21",
    "v22",
    "v23",
    "v24",
    "v25",
    "v26",
    "v27",
    "v28",
    "v29",
    "v30",
    "v31",
};

static const char vm[2][5] = {
    "v0.t",
    "none",
};

static const char aq[4][5] = {
    "none",
    "aq",
};

static const char rl[4][5] = {
    "none",
    "rl",
};

static const char rm[8][4] = {
    "rne",
    "rtz",
    "rdn",
    "rup",
    "rmm",
    "n/a",
    "n/a",
    "dyn",
};

static const char nf[8][4] = {
    "1",
    "2",
    "3",
    "4",
    "5",
    "6",
    "7",
    "8",
};

#define BX(v, b)                 (((v) >> b) & 1)
#define FX(v, high, low)         (((v) >> low) & ((1ULL << (high - low + 1)) - 1))
#define SIGN_EXTEND(val, val_sz) (((int32_t)(val) << (32 - (val_sz))) >> (32 - (val_sz)))

typedef struct {
    int8_t rd;
    int8_t rs1;
    int8_t rs2;
    int8_t rs3;
    int8_t vd;
    int8_t vs1;
    int8_t vs2;
    int8_t vs3;
    int8_t aq;
    int8_t rl;
    int8_t vm;
    int8_t rm;
    int8_t nf;
    int16_t csr;

    int32_t imm;
    int32_t imm2;
    char* name;
} rv64_print_t;

const char* rv64_print(uint32_t opcode, uintptr_t addr)
{
    static char buff[200];
    rv64_print_t a;

    if (cpuext.xtheadba || cpuext.xtheadbb || cpuext.xtheadbs || cpuext.xtheadcondmov || cpuext.xtheadmempair) {

        /****************
         *  Generated by https://github.com/ksco/riscv-opcodes/tree/box64_printer
         *  Command: python parse.py -box64 rv_xtheadba rv_xtheadbb rv_xtheadbs rv_xtheadcondmov rv_xtheadmempair rv_xtheadmemidx > code.c
         *  Please do NOT edit the following code manually.
         */

        // rv_xtheadba, TH.ADDSL
        if ((opcode & 0xf800707f) == 0x100b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.rs2 = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.ADDSL", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadbb, TH.EXT
        if ((opcode & 0x707f) == 0x200b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.imm2 = FX(opcode, 31, 26);
            a.imm = FX(opcode, 25, 20);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), 0x%x(%d)", "TH.EXT", gpr[a.rd], gpr[a.rs1], a.imm2, a.imm2, a.imm, a.imm);
            return buff;
        }

        // rv_xtheadbb, TH.EXTU
        if ((opcode & 0x707f) == 0x300b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.imm2 = FX(opcode, 31, 26);
            a.imm = FX(opcode, 25, 20);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), 0x%x(%d)", "TH.EXTU", gpr[a.rd], gpr[a.rs1], a.imm2, a.imm2, a.imm, a.imm);
            return buff;
        }

        // rv_xtheadbb, TH.FF0
        if ((opcode & 0xfff0707f) == 0x8400100b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            snprintf(buff, sizeof(buff), "%-15s %s, %s", "TH.FF0", gpr[a.rd], gpr[a.rs1]);
            return buff;
        }

        // rv_xtheadbb, TH.FF1
        if ((opcode & 0xfff0707f) == 0x8600100b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            snprintf(buff, sizeof(buff), "%-15s %s, %s", "TH.FF1", gpr[a.rd], gpr[a.rs1]);
            return buff;
        }

        // rv_xtheadmemidx, TH.LBIA
        if ((opcode & 0xf800707f) == 0x1800400b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.imm = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), 0x%x(%d)", "TH.LBIA", gpr[a.rd], gpr[a.rs1], a.imm, a.imm, a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.LBUIA
        if ((opcode & 0xf800707f) == 0x9800400b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.imm = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), 0x%x(%d)", "TH.LBUIA", gpr[a.rd], gpr[a.rs1], a.imm, a.imm, a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmempair, TH.LDD
        if ((opcode & 0xf800707f) == 0xf800400b) {
            a.rd = FX(opcode, 11, 7);
            a.rs2 = FX(opcode, 24, 20);
            a.rs1 = FX(opcode, 19, 15);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.LDD", gpr[a.rd], gpr[a.rs2], gpr[a.rs1], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.LDIA
        if ((opcode & 0xf800707f) == 0x7800400b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.imm = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), 0x%x(%d)", "TH.LDIA", gpr[a.rd], gpr[a.rs1], a.imm, a.imm, a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.LHIA
        if ((opcode & 0xf800707f) == 0x3800400b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.imm = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), 0x%x(%d)", "TH.LHIA", gpr[a.rd], gpr[a.rs1], a.imm, a.imm, a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.LHUIA
        if ((opcode & 0xf800707f) == 0xb800400b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.imm = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), 0x%x(%d)", "TH.LHUIA", gpr[a.rd], gpr[a.rs1], a.imm, a.imm, a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.LRB
        if ((opcode & 0xf800707f) == 0x400b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.rs2 = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.LRB", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.LRBU
        if ((opcode & 0xf800707f) == 0x8000400b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.rs2 = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.LRBU", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.LRD
        if ((opcode & 0xf800707f) == 0x6000400b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.rs2 = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.LRD", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.LRH
        if ((opcode & 0xf800707f) == 0x2000400b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.rs2 = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.LRH", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.LRHU
        if ((opcode & 0xf800707f) == 0xa000400b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.rs2 = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.LRHU", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.LRW
        if ((opcode & 0xf800707f) == 0x4000400b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.rs2 = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.LRW", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.LRWU
        if ((opcode & 0xf800707f) == 0xc000400b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.rs2 = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.LRWU", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.LURB
        if ((opcode & 0xf800707f) == 0x1000400b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.rs2 = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.LURB", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.LURBU
        if ((opcode & 0xf800707f) == 0x9000400b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.rs2 = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.LURBU", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.LURD
        if ((opcode & 0xf800707f) == 0x7000400b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.rs2 = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.LURD", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.LURH
        if ((opcode & 0xf800707f) == 0x3000400b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.rs2 = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.LURH", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.LURHU
        if ((opcode & 0xf800707f) == 0xb000400b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.rs2 = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.LURHU", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.LURW
        if ((opcode & 0xf800707f) == 0x5000400b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.rs2 = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.LURW", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.LURWU
        if ((opcode & 0xf800707f) == 0xd000400b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.rs2 = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.LURWU", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmempair, TH.LWD
        if ((opcode & 0xf800707f) == 0xe000400b) {
            a.rd = FX(opcode, 11, 7);
            a.rs2 = FX(opcode, 24, 20);
            a.rs1 = FX(opcode, 19, 15);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.LWD", gpr[a.rd], gpr[a.rs2], gpr[a.rs1], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.LWIA
        if ((opcode & 0xf800707f) == 0x5800400b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.imm = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), 0x%x(%d)", "TH.LWIA", gpr[a.rd], gpr[a.rs1], a.imm, a.imm, a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmempair, TH.LWUD
        if ((opcode & 0xf800707f) == 0xf000400b) {
            a.rd = FX(opcode, 11, 7);
            a.rs2 = FX(opcode, 24, 20);
            a.rs1 = FX(opcode, 19, 15);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.LWUD", gpr[a.rd], gpr[a.rs2], gpr[a.rs1], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.LWUIA
        if ((opcode & 0xf800707f) == 0xd800400b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.imm = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), 0x%x(%d)", "TH.LWUIA", gpr[a.rd], gpr[a.rs1], a.imm, a.imm, a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadcondmov, TH.MVEQZ
        if ((opcode & 0xfe00707f) == 0x4000100b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.rs2 = FX(opcode, 24, 20);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "TH.MVEQZ", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
            return buff;
        }

        // rv_xtheadcondmov, TH.MVNEZ
        if ((opcode & 0xfe00707f) == 0x4200100b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.rs2 = FX(opcode, 24, 20);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "TH.MVNEZ", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
            return buff;
        }

        // rv_xtheadbb, TH.REV
        if ((opcode & 0xfff0707f) == 0x8200100b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            snprintf(buff, sizeof(buff), "%-15s %s, %s", "TH.REV", gpr[a.rd], gpr[a.rs1]);
            return buff;
        }

        // rv_xtheadbb, TH.REVW
        if ((opcode & 0xfff0707f) == 0x9000100b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            snprintf(buff, sizeof(buff), "%-15s %s, %s", "TH.REVW", gpr[a.rd], gpr[a.rs1]);
            return buff;
        }

        // rv_xtheadmemidx, TH.SBIB
        if ((opcode & 0xf800707f) == 0x800500b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.imm = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), 0x%x(%d)", "TH.SBIB", gpr[a.rd], gpr[a.rs1], a.imm, a.imm, a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmempair, TH.SDD
        if ((opcode & 0xf800707f) == 0xf800500b) {
            a.rd = FX(opcode, 11, 7);
            a.rs2 = FX(opcode, 24, 20);
            a.rs1 = FX(opcode, 19, 15);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.SDD", gpr[a.rd], gpr[a.rs2], gpr[a.rs1], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.SDIB
        if ((opcode & 0xf800707f) == 0x6800500b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.imm = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), 0x%x(%d)", "TH.SDIB", gpr[a.rd], gpr[a.rs1], a.imm, a.imm, a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.SHIB
        if ((opcode & 0xf800707f) == 0x2800500b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.imm = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), 0x%x(%d)", "TH.SHIB", gpr[a.rd], gpr[a.rs1], a.imm, a.imm, a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.SRB
        if ((opcode & 0xf800707f) == 0x500b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.rs2 = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.SRB", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.SRD
        if ((opcode & 0xf800707f) == 0x6000500b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.rs2 = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.SRD", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.SRH
        if ((opcode & 0xf800707f) == 0x2000500b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.rs2 = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.SRH", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadbb, TH.SRRI
        if ((opcode & 0xfc00707f) == 0x1000100b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.imm = FX(opcode, 25, 20);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "TH.SRRI", gpr[a.rd], gpr[a.rs1], a.imm, a.imm);
            return buff;
        }

        // rv_xtheadbb, TH.SRRIW
        if ((opcode & 0xfe00707f) == 0x1400100b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.imm = FX(opcode, 24, 20);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "TH.SRRIW", gpr[a.rd], gpr[a.rs1], a.imm, a.imm);
            return buff;
        }

        // rv_xtheadmemidx, TH.SRW
        if ((opcode & 0xf800707f) == 0x4000500b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.rs2 = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.SRW", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.SURB
        if ((opcode & 0xf800707f) == 0x1000500b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.rs2 = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.SURB", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.SURD
        if ((opcode & 0xf800707f) == 0x7000500b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.rs2 = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.SURD", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.SURH
        if ((opcode & 0xf800707f) == 0x3000500b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.rs2 = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.SURH", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.SURW
        if ((opcode & 0xf800707f) == 0x5000500b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.rs2 = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.SURW", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmempair, TH.SWD
        if ((opcode & 0xf800707f) == 0xe000500b) {
            a.rd = FX(opcode, 11, 7);
            a.rs2 = FX(opcode, 24, 20);
            a.rs1 = FX(opcode, 19, 15);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, 0x%x(%d)", "TH.SWD", gpr[a.rd], gpr[a.rs2], gpr[a.rs1], a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadmemidx, TH.SWIB
        if ((opcode & 0xf800707f) == 0x4800500b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.imm = FX(opcode, 24, 20);
            a.imm2 = FX(opcode, 26, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), 0x%x(%d)", "TH.SWIB", gpr[a.rd], gpr[a.rs1], a.imm, a.imm, a.imm2, a.imm2);
            return buff;
        }

        // rv_xtheadbs, TH.TST
        if ((opcode & 0xfc00707f) == 0x8800100b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.imm = FX(opcode, 25, 20);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "TH.TST", gpr[a.rd], gpr[a.rs1], a.imm, a.imm);
            return buff;
        }

        // rv_xtheadbb, TH.TSTNBZ
        if ((opcode & 0xfff0707f) == 0x8000100b) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            snprintf(buff, sizeof(buff), "%-15s %s, %s", "TH.TSTNBZ", gpr[a.rd], gpr[a.rs1]);
            return buff;
        }
    }

    if (cpuext.xtheadvector) {
        /* These are written by hand.... */

        //    rv_v, VSETVLI
        if ((opcode & 0x8000707f) == 0x7057) {
            a.imm = FX(opcode, 30, 20);
            a.rs1 = FX(opcode, 19, 15);
            a.rd = FX(opcode, 11, 7);
            const char *lmul_str, *sew_str;
            switch (a.imm & 0b11) {
                case 0b00: lmul_str = "m1"; break;
                case 0b01: lmul_str = "m2"; break;
                case 0b10: lmul_str = "m4"; break;
                case 0b11: lmul_str = "m8"; break;
                default: lmul_str = "reserved"; break;
            }
            switch ((a.imm & 0b0011100) >> 2) {
                case 0b000: sew_str = "e8"; break;
                case 0b001: sew_str = "e16"; break;
                case 0b010: sew_str = "e32"; break;
                case 0b011: sew_str = "e64"; break;
                default: sew_str = "reserved"; break;
            }

            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSETVLI", gpr[a.rd], gpr[a.rs1], sew_str, lmul_str);
            return buff;
        }

        //    rv_v, VLUXEI16.V
        if ((opcode & 0x1c00707f) == 0xC005007) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.rs1 = FX(opcode, 19, 15);
            a.vm = FX(opcode, 25, 25);
            a.nf = FX(opcode, 31, 29);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VLUXEI16.V", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
            return buff;
        }

        //    rv_v, VLUXEI32.V
        if ((opcode & 0x1c00707f) == 0xC006007) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.rs1 = FX(opcode, 19, 15);
            a.vm = FX(opcode, 25, 25);
            a.nf = FX(opcode, 31, 29);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VLUXEI32.V", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
            return buff;
        }

        //    rv_v, VLUXEI64.V
        if ((opcode & 0x1c00707f) == 0xC007007) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.rs1 = FX(opcode, 19, 15);
            a.vm = FX(opcode, 25, 25);
            a.nf = FX(opcode, 31, 29);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VLUXEI64.V", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
            return buff;
        }

        //    rv_v, VLUXEI8.V
        if ((opcode & 0x1c00707f) == 0xC000007) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.rs1 = FX(opcode, 19, 15);
            a.vm = FX(opcode, 25, 25);
            a.nf = FX(opcode, 31, 29);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VLUXEI8.V", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
            return buff;
        }

        //    rv_v, VSUXEI16.V
        if ((opcode & 0x1c00707f) == 0x1C005027) {
            a.vs3 = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.rs1 = FX(opcode, 19, 15);
            a.vm = FX(opcode, 25, 25);
            a.nf = FX(opcode, 31, 29);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VSUXEI16.V", vpr[a.vs3], vpr[a.vs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
            return buff;
        }

        //    rv_v, VSUXEI32.V
        if ((opcode & 0x1c00707f) == 0x1C006027) {
            a.vs3 = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.rs1 = FX(opcode, 19, 15);
            a.vm = FX(opcode, 25, 25);
            a.nf = FX(opcode, 31, 29);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VSUXEI32.V", vpr[a.vs3], vpr[a.vs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
            return buff;
        }

        //    rv_v, VSUXEI64.V
        if ((opcode & 0x1c00707f) == 0x1C007027) {
            a.vs3 = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.rs1 = FX(opcode, 19, 15);
            a.vm = FX(opcode, 25, 25);
            a.nf = FX(opcode, 31, 29);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VSUXEI64.V", vpr[a.vs3], vpr[a.vs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
            return buff;
        }

        //    rv_v, VSUXEI8.V
        if ((opcode & 0x1c00707f) == 0x1C000027) {
            a.vs3 = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.rs1 = FX(opcode, 19, 15);
            a.vm = FX(opcode, 25, 25);
            a.nf = FX(opcode, 31, 29);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VSUXEI8.V", vpr[a.vs3], vpr[a.vs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
            return buff;
        }

        //    rv_v, VFMV.S.F
        if ((opcode & 0xfff0707f) == 0x36005057) {
            a.vd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            snprintf(buff, sizeof(buff), "%-15s %s, %s", "VFMV.S.F", vpr[a.vd], fpr[a.rs1]);
            return buff;
        }

        //    rv_v, VFMV.F.S
        if ((opcode & 0xfe0ff07f) == 0x32001057) {
            a.rd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            snprintf(buff, sizeof(buff), "%-15s %s, %s", "VFMV.F.S", fpr[a.rd], vpr[a.vs2]);
            return buff;
        }

        //    rv_v, VFCVT.F.X.V
        if ((opcode & 0xfc0ff07f) == 0x88019057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFCVT.F.X.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VFCVT.F.XU.V
        if ((opcode & 0xfc0ff07f) == 0x88011057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFCVT.F.XU.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VFCVT.RTZ.X.F.V
        if ((opcode & 0xfc0ff07f) == 0x88039057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFCVT.RTZ.X.F.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VFCVT.RTZ.XU.F.V
        if ((opcode & 0xfc0ff07f) == 0x88031057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFCVT.RTZ.XU.F.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VFCVT.X.F.V
        if ((opcode & 0xfc0ff07f) == 0x88009057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFCVT.X.F.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VFCVT.XU.F.V
        if ((opcode & 0xfc0ff07f) == 0x88001057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFCVT.XU.F.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VFWCVT.F.F.V
        if ((opcode & 0xfc0ff07f) == 0x88061057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFWCVT.F.F.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VFWCVT.F.X.V
        if ((opcode & 0xfc0ff07f) == 0x88059057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFWCVT.F.X.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VFWCVT.F.XU.V
        if ((opcode & 0xfc0ff07f) == 0x88051057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFWCVT.F.XU.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VFWCVT.RTZ.X.F.V
        if ((opcode & 0xfc0ff07f) == 0x88079057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFWCVT.RTZ.X.F.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VFWCVT.RTZ.XU.F.V
        if ((opcode & 0xfc0ff07f) == 0x88071057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFWCVT.RTZ.XU.F.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VFWCVT.X.F.V
        if ((opcode & 0xfc0ff07f) == 0x88049057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFWCVT.X.F.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VFWCVT.XU.F.V
        if ((opcode & 0xfc0ff07f) == 0x88041057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFWCVT.XU.F.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VFNCVT.F.F.W
        if ((opcode & 0xfc0ff07f) == 0x880a1057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFNCVT.F.F.W", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VFNCVT.F.X.W
        if ((opcode & 0xfc0ff07f) == 0x88099057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFNCVT.F.X.W", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VFNCVT.F.XU.W
        if ((opcode & 0xfc0ff07f) == 0x88091057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFNCVT.F.XU.W", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VFNCVT.ROD.F.F.W
        if ((opcode & 0xfc0ff07f) == 0x880a9057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFNCVT.ROD.F.F.W", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VFNCVT.RTZ.X.F.W
        if ((opcode & 0xfc0ff07f) == 0x880b9057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFNCVT.RTZ.X.F.W", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VFNCVT.RTZ.XU.F.W
        if ((opcode & 0xfc0ff07f) == 0x880b1057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFNCVT.RTZ.XU.F.W", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VFNCVT.X.F.W
        if ((opcode & 0xfc0ff07f) == 0x88089057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFNCVT.X.F.W", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VFNCVT.XU.F.W
        if ((opcode & 0xfc0ff07f) == 0x88081057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFNCVT.XU.F.W", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VFSQRT.V
        if ((opcode & 0xfc0ff07f) == 0x8c001057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFSQRT.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VFCLASS.V
        if ((opcode & 0xfc0ff07f) == 0x8c081057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFCLASS.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VADC.VIM
        if ((opcode & 0xfe00707f) == 0x42003057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.imm = FX(opcode, 19, 15);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "VADC.VIM", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5));
            return buff;
        }

        //    rv_v, VADC.VVM
        if ((opcode & 0xfe00707f) == 0x42000057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vs1 = FX(opcode, 19, 15);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VADC.VVM", vpr[a.vd], vpr[a.vs2], vpr[a.vs1]);
            return buff;
        }

        //    rv_v, VADC.VXM
        if ((opcode & 0xfe00707f) == 0x42004057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.rs1 = FX(opcode, 19, 15);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VADC.VXM", vpr[a.vd], vpr[a.vs2], gpr[a.rs1]);
            return buff;
        }

        //    rv_v, VSBC.VVM
        if ((opcode & 0xfe00707f) == 0x4A000057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vs1 = FX(opcode, 19, 15);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VSBC.VVM", vpr[a.vd], vpr[a.vs2], vpr[a.vs1]);
            return buff;
        }

        //    rv_v, VSBC.VXM
        if ((opcode & 0xfe00707f) == 0x4A004057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.rs1 = FX(opcode, 19, 15);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VSBC.VXM", vpr[a.vd], vpr[a.vs2], gpr[a.rs1]);
            return buff;
        }

        //    rv_v, VMV.X.S
        if ((opcode & 0xfe0ff07f) == 0x32002057) {
            a.rd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            snprintf(buff, sizeof(buff), "%-15s %s, %s", "VMV.X.S", gpr[a.rd], vpr[a.vs2]);
            return buff;
        }

        //    rv_v, VMV.S.X
        if ((opcode & 0xfff0707f) == 0x36006057) {
            a.vd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            snprintf(buff, sizeof(buff), "%-15s %s, %s", "VMV.S.X", vpr[a.vd], gpr[a.rs1]);
            return buff;
        }

        //    rv_v, VMSBF.M
        if ((opcode & 0xfc0ff07f) == 0x5800a057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMSBF.M", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VMSOF.M
        if ((opcode & 0xfc0ff07f) == 0x58012057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMSOF.M", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VMSIF.M
        if ((opcode & 0xfc0ff07f) == 0x5801a057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMSIF.M", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VIOTA.M
        if ((opcode & 0xfc0ff07f) == 0x58082057) {
            a.vd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VIOTA.M", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VCPOP.M
        if ((opcode & 0xfc0ff07f) == 0x58082057) {
            a.rd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VCPOP.M", gpr[a.rd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VFIRST.M
        if ((opcode & 0xfc0ff07f) == 0x5808a057) {
            a.rd = FX(opcode, 11, 7);
            a.vs2 = FX(opcode, 24, 20);
            a.vm = FX(opcode, 25, 25);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFIRST.M", fpr[a.rd], vpr[a.vs2], vm[a.vm]);
            return buff;
        }

        //    rv_v, VEXT.X.V
        if ((opcode & 0xfe00707f) == 0x32002057) {
            a.rd = FX(opcode, 11, 7);
            a.rs1 = FX(opcode, 19, 15);
            a.vs2 = FX(opcode, 24, 20);
            snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VEXT.X.V", vpr[a.rd], vpr[a.vs2], gpr[a.rs1]);
            return buff;
        }
    }

    /****************
     * Hand-written pseudo instructions' printer
     */

    // NOP
    if (opcode == 0x00000013) {
        snprintf(buff, sizeof(buff), "%-15s", "NOP");
        return buff;
    }

    // MV
    if ((opcode & 0xfff0707f) == 0x00000013) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "MV", gpr[a.rd], gpr[a.rs1]);
        return buff;
    }

    // FMV.D
    if ((opcode & 0xfe00707f) == 0x22000053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        if (a.rs1 == a.rs2) {
            snprintf(buff, sizeof(buff), "%-15s %s, %s", "FMV.D", fpr[a.rd], fpr[a.rs1]);
            return buff;
        }
    }

    // FMV.S
    if ((opcode & 0xfe00707f) == 0x20000053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        if (a.rs1 == a.rs2) {
            snprintf(buff, sizeof(buff), "%-15s %s, %s", "FMV.S", fpr[a.rd], fpr[a.rs1]);
            return buff;
        }
    }

    /****************
     *  Generated by https://github.com/ksco/riscv-opcodes/tree/box64_printer
     *  Command: python parse.py -box64 rv_a rv_d rv_f rv_i rv_m rv_v rv_zba rv_zbb rv_zbc rv_zicsr rv_zbs rv64_a rv64_d rv64_f rv64_i rv64_m rv64_zba rv64_zbb rv64_zbs rv_zicond rv_zicbo > code.c
     *  Please do NOT edit the following code manually.
     */

    //    rv_i, ADD
    if ((opcode & 0xfe00707f) == 0x33) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "ADD", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    // rv64_zba, ADD.UW
    if ((opcode & 0xfe00707f) == 0x800003b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "ADD.UW", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //    rv_i, ADDI
    if ((opcode & 0x707f) == 0x13) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 31, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "ADDI", gpr[a.rd], gpr[a.rs1], SIGN_EXTEND(a.imm, 12), SIGN_EXTEND(a.imm, 12));
        return buff;
    }

    //  rv64_i, ADDIW
    if ((opcode & 0x707f) == 0x1b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 31, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "ADDIW", gpr[a.rd], gpr[a.rs1], SIGN_EXTEND(a.imm, 12), SIGN_EXTEND(a.imm, 12));
        return buff;
    }

    //  rv64_i, ADDW
    if ((opcode & 0xfe00707f) == 0x3b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "ADDW", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //  rv64_a, AMOADD.D
    if ((opcode & 0xf800707f) == 0x302f) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.aq = FX(opcode, 26, 26);
        a.rl = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "AMOADD.D", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], aq[a.aq], rl[a.rl]);
        return buff;
    }

    //    rv_a, AMOADD.W
    if ((opcode & 0xf800707f) == 0x202f) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.aq = FX(opcode, 26, 26);
        a.rl = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "AMOADD.W", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], aq[a.aq], rl[a.rl]);
        return buff;
    }

    //  rv64_a, AMOAND.D
    if ((opcode & 0xf800707f) == 0x6000302f) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.aq = FX(opcode, 26, 26);
        a.rl = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "AMOAND.D", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], aq[a.aq], rl[a.rl]);
        return buff;
    }

    //    rv_a, AMOAND.W
    if ((opcode & 0xf800707f) == 0x6000202f) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.aq = FX(opcode, 26, 26);
        a.rl = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "AMOAND.W", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], aq[a.aq], rl[a.rl]);
        return buff;
    }

    //  rv64_a, AMOMAX.D
    if ((opcode & 0xf800707f) == 0xa000302f) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.aq = FX(opcode, 26, 26);
        a.rl = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "AMOMAX.D", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], aq[a.aq], rl[a.rl]);
        return buff;
    }

    //    rv_a, AMOMAX.W
    if ((opcode & 0xf800707f) == 0xa000202f) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.aq = FX(opcode, 26, 26);
        a.rl = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "AMOMAX.W", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], aq[a.aq], rl[a.rl]);
        return buff;
    }

    //  rv64_a, AMOMAXU.D
    if ((opcode & 0xf800707f) == 0xe000302f) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.aq = FX(opcode, 26, 26);
        a.rl = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "AMOMAXU.D", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], aq[a.aq], rl[a.rl]);
        return buff;
    }

    //    rv_a, AMOMAXU.W
    if ((opcode & 0xf800707f) == 0xe000202f) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.aq = FX(opcode, 26, 26);
        a.rl = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "AMOMAXU.W", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], aq[a.aq], rl[a.rl]);
        return buff;
    }

    //  rv64_a, AMOMIN.D
    if ((opcode & 0xf800707f) == 0x8000302f) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.aq = FX(opcode, 26, 26);
        a.rl = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "AMOMIN.D", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], aq[a.aq], rl[a.rl]);
        return buff;
    }

    //    rv_a, AMOMIN.W
    if ((opcode & 0xf800707f) == 0x8000202f) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.aq = FX(opcode, 26, 26);
        a.rl = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "AMOMIN.W", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], aq[a.aq], rl[a.rl]);
        return buff;
    }

    //  rv64_a, AMOMINU.D
    if ((opcode & 0xf800707f) == 0xc000302f) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.aq = FX(opcode, 26, 26);
        a.rl = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "AMOMINU.D", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], aq[a.aq], rl[a.rl]);
        return buff;
    }

    //    rv_a, AMOMINU.W
    if ((opcode & 0xf800707f) == 0xc000202f) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.aq = FX(opcode, 26, 26);
        a.rl = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "AMOMINU.W", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], aq[a.aq], rl[a.rl]);
        return buff;
    }

    //  rv64_a, AMOOR.D
    if ((opcode & 0xf800707f) == 0x4000302f) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.aq = FX(opcode, 26, 26);
        a.rl = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "AMOOR.D", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], aq[a.aq], rl[a.rl]);
        return buff;
    }

    //    rv_a, AMOOR.W
    if ((opcode & 0xf800707f) == 0x4000202f) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.aq = FX(opcode, 26, 26);
        a.rl = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "AMOOR.W", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], aq[a.aq], rl[a.rl]);
        return buff;
    }

    //  rv64_a, AMOSWAP.D
    if ((opcode & 0xf800707f) == 0x800302f) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.aq = FX(opcode, 26, 26);
        a.rl = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "AMOSWAP.D", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], aq[a.aq], rl[a.rl]);
        return buff;
    }

    //    rv_a, AMOSWAP.W
    if ((opcode & 0xf800707f) == 0x800202f) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.aq = FX(opcode, 26, 26);
        a.rl = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "AMOSWAP.W", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], aq[a.aq], rl[a.rl]);
        return buff;
    }

    //  rv64_a, AMOXOR.D
    if ((opcode & 0xf800707f) == 0x2000302f) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.aq = FX(opcode, 26, 26);
        a.rl = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "AMOXOR.D", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], aq[a.aq], rl[a.rl]);
        return buff;
    }

    //    rv_a, AMOXOR.W
    if ((opcode & 0xf800707f) == 0x2000202f) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.aq = FX(opcode, 26, 26);
        a.rl = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "AMOXOR.W", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], aq[a.aq], rl[a.rl]);
        return buff;
    }

    //    rv_i, AND
    if ((opcode & 0xfe00707f) == 0x7033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "AND", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //    rv_i, ANDI
    if ((opcode & 0x707f) == 0x7013) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 31, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "ANDI", gpr[a.rd], gpr[a.rs1], SIGN_EXTEND(a.imm, 12), SIGN_EXTEND(a.imm, 12));
        return buff;
    }

    //  rv_zbb, ANDN
    if ((opcode & 0xfe00707f) == 0x40007033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "ANDN", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //    rv_i, AUIPC
    if ((opcode & 0x7f) == 0x17) {
        a.rd = FX(opcode, 11, 7);
        a.imm = FX(opcode, 31, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d)", "AUIPC", gpr[a.rd], a.imm << 12, a.imm << 12);
        return buff;
    }

    //  rv_zbs, BCLR
    if ((opcode & 0xfe00707f) == 0x48001033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "BCLR", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    // rv64_zbs, BCLRI
    if ((opcode & 0xfc00707f) == 0x48001013) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 25, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BCLRI", gpr[a.rd], gpr[a.rs1], a.imm, a.imm);
        return buff;
    }

    //    rv_i, BEQ
    if ((opcode & 0x707f) == 0x63) {
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.imm = BX(opcode, 31) << 12;
        a.imm |= BX(opcode, 7) << 11;
        a.imm |= FX(opcode, 30, 25) << 5;
        a.imm |= FX(opcode, 11, 8) << 1;
        a.imm = SIGN_EXTEND(a.imm, 13);

        int len = snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BEQ", gpr[a.rs1], gpr[a.rs2], a.imm, a.imm);
        snprintf(buff + len, sizeof(buff) - len, " # %+di(0x%lx)", a.imm >> 2, addr + (uintptr_t)a.imm);
        return buff;
    }

    //  rv_zbs, BEXT
    if ((opcode & 0xfe00707f) == 0x48005033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "BEXT", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    // rv64_zbs, BEXTI
    if ((opcode & 0xfc00707f) == 0x48005013) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 25, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BEXTI", gpr[a.rd], gpr[a.rs1], a.imm, a.imm);
        return buff;
    }

    //    rv_i, BGE
    if ((opcode & 0x707f) == 0x5063) {
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.imm = BX(opcode, 31) << 12;
        a.imm |= BX(opcode, 7) << 11;
        a.imm |= FX(opcode, 30, 25) << 5;
        a.imm |= FX(opcode, 11, 8) << 1;
        a.imm = SIGN_EXTEND(a.imm, 13);

        int len = snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BGE", gpr[a.rs1], gpr[a.rs2], a.imm, a.imm);
        snprintf(buff + len, sizeof(buff) - len, " # %+di(0x%lx)", a.imm >> 2, addr + (uintptr_t)a.imm);
        return buff;
    }

    //    rv_i, BGEU
    if ((opcode & 0x707f) == 0x7063) {
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.imm = BX(opcode, 31) << 12;
        a.imm |= BX(opcode, 7) << 11;
        a.imm |= FX(opcode, 30, 25) << 5;
        a.imm |= FX(opcode, 11, 8) << 1;
        a.imm = SIGN_EXTEND(a.imm, 13);

        int len = snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BGEU", gpr[a.rs1], gpr[a.rs2], a.imm, a.imm);
        snprintf(buff + len, sizeof(buff) - len, " # %+di(0x%lx)", a.imm >> 2, addr + (uintptr_t)a.imm);
        return buff;
    }

    //  rv_zbs, BINV
    if ((opcode & 0xfe00707f) == 0x68001033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "BINV", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    // rv64_zbs, BINVI
    if ((opcode & 0xfc00707f) == 0x68001013) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 25, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BINVI", gpr[a.rd], gpr[a.rs1], a.imm, a.imm);
        return buff;
    }

    //    rv_i, BLT
    if ((opcode & 0x707f) == 0x4063) {
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.imm = BX(opcode, 31) << 12;
        a.imm |= BX(opcode, 7) << 11;
        a.imm |= FX(opcode, 30, 25) << 5;
        a.imm |= FX(opcode, 11, 8) << 1;
        a.imm = SIGN_EXTEND(a.imm, 13);

        int len = snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BLT", gpr[a.rs1], gpr[a.rs2], a.imm, a.imm);
        snprintf(buff + len, sizeof(buff) - len, " # %+di(0x%lx)", a.imm >> 2, addr + (uintptr_t)a.imm);
        return buff;
    }

    //    rv_i, BLTU
    if ((opcode & 0x707f) == 0x6063) {
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.imm = BX(opcode, 31) << 12;
        a.imm |= BX(opcode, 7) << 11;
        a.imm |= FX(opcode, 30, 25) << 5;
        a.imm |= FX(opcode, 11, 8) << 1;
        a.imm = SIGN_EXTEND(a.imm, 13);

        int len = snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BLTU", gpr[a.rs1], gpr[a.rs2], a.imm, a.imm);
        snprintf(buff + len, sizeof(buff) - len, " # %+di(0x%lx)", a.imm >> 2, addr + (uintptr_t)a.imm);
        return buff;
    }

    //    rv_i, BNE
    if ((opcode & 0x707f) == 0x1063) {
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.imm = BX(opcode, 31) << 12;
        a.imm |= BX(opcode, 7) << 11;
        a.imm |= FX(opcode, 30, 25) << 5;
        a.imm |= FX(opcode, 11, 8) << 1;
        a.imm = SIGN_EXTEND(a.imm, 13);

        int len = snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BNE", gpr[a.rs1], gpr[a.rs2], a.imm, a.imm);
        snprintf(buff + len, sizeof(buff) - len, " # %+di(0x%lx)", a.imm >> 2, addr + (uintptr_t)a.imm);
        return buff;
    }

    //  rv_zbs, BSET
    if ((opcode & 0xfe00707f) == 0x28001033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "BSET", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    // rv64_zbs, BSETI
    if ((opcode & 0xfc00707f) == 0x28001013) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 25, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BSETI", gpr[a.rd], gpr[a.rs1], a.imm, a.imm);
        return buff;
    }

    // rv_zicbo, CBO.CLEAN
    if ((opcode & 0xfff07fff) == 0x10200f) {
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s", "CBO.CLEAN", gpr[a.rs1]);
        return buff;
    }

    // rv_zicbo, CBO.FLUSH
    if ((opcode & 0xfff07fff) == 0x20200f) {
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s", "CBO.FLUSH", gpr[a.rs1]);
        return buff;
    }

    // rv_zicbo, CBO.INVAL
    if ((opcode & 0xfff07fff) == 0x200f) {
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s", "CBO.INVAL", gpr[a.rs1]);
        return buff;
    }

    // rv_zicbo, CBO.ZERO
    if ((opcode & 0xfff07fff) == 0x40200f) {
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s", "CBO.ZERO", gpr[a.rs1]);
        return buff;
    }

    //  rv_zbc, CLMUL
    if ((opcode & 0xfe00707f) == 0xa001033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "CLMUL", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //  rv_zbc, CLMULH
    if ((opcode & 0xfe00707f) == 0xa003033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "CLMULH", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //  rv_zbc, CLMULR
    if ((opcode & 0xfe00707f) == 0xa002033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "CLMULR", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //  rv_zbb, CLZ
    if ((opcode & 0xfff0707f) == 0x60001013) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "CLZ", gpr[a.rd], gpr[a.rs1]);
        return buff;
    }

    // rv64_zbb, CLZW
    if ((opcode & 0xfff0707f) == 0x6000101b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "CLZW", gpr[a.rd], gpr[a.rs1]);
        return buff;
    }

    //  rv_zbb, CPOP
    if ((opcode & 0xfff0707f) == 0x60201013) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "CPOP", gpr[a.rd], gpr[a.rs1]);
        return buff;
    }

    // rv64_zbb, CPOPW
    if ((opcode & 0xfff0707f) == 0x6020101b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "CPOPW", gpr[a.rd], gpr[a.rs1]);
        return buff;
    }

    // rv_zicsr, CSRRC
    if ((opcode & 0x707f) == 0x3073) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.csr = FX(opcode, 31, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "CSRRC", gpr[a.rd], gpr[a.rs1], a.csr, a.csr);
        return buff;
    }

    // rv_zicsr, CSRRCI
    if ((opcode & 0x707f) == 0x7073) {
        a.rd = FX(opcode, 11, 7);
        a.csr = FX(opcode, 31, 20);
        a.imm = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), 0x%x(%d)", "CSRRCI", gpr[a.rd], a.csr, a.csr, a.imm, a.imm);
        return buff;
    }

    // rv_zicsr, CSRRS
    if ((opcode & 0x707f) == 0x2073) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.csr = FX(opcode, 31, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "CSRRS", gpr[a.rd], gpr[a.rs1], a.csr, a.csr);
        return buff;
    }

    // rv_zicsr, CSRRSI
    if ((opcode & 0x707f) == 0x6073) {
        a.rd = FX(opcode, 11, 7);
        a.csr = FX(opcode, 31, 20);
        a.imm = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), 0x%x(%d)", "CSRRSI", gpr[a.rd], a.csr, a.csr, a.imm, a.imm);
        return buff;
    }

    // rv_zicsr, CSRRW
    if ((opcode & 0x707f) == 0x1073) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.csr = FX(opcode, 31, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "CSRRW", gpr[a.rd], gpr[a.rs1], a.csr, a.csr);
        return buff;
    }

    // rv_zicsr, CSRRWI
    if ((opcode & 0x707f) == 0x5073) {
        a.rd = FX(opcode, 11, 7);
        a.csr = FX(opcode, 31, 20);
        a.imm = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), 0x%x(%d)", "CSRRWI", gpr[a.rd], a.csr, a.csr, a.imm, a.imm);
        return buff;
    }

    //  rv_zbb, CTZ
    if ((opcode & 0xfff0707f) == 0x60101013) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "CTZ", gpr[a.rd], gpr[a.rs1]);
        return buff;
    }

    // rv64_zbb, CTZW
    if ((opcode & 0xfff0707f) == 0x6010101b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "CTZW", gpr[a.rd], gpr[a.rs1]);
        return buff;
    }

    // rv_zicond, CZERO.EQZ
    if ((opcode & 0xfe00707f) == 0xe005033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "CZERO.EQZ", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    // rv_zicond, CZERO.NEZ
    if ((opcode & 0xfe00707f) == 0xe007033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "CZERO.NEZ", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //    rv_m, DIV
    if ((opcode & 0xfe00707f) == 0x2004033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "DIV", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //    rv_m, DIVU
    if ((opcode & 0xfe00707f) == 0x2005033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "DIVU", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //  rv64_m, DIVUW
    if ((opcode & 0xfe00707f) == 0x200503b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "DIVUW", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //  rv64_m, DIVW
    if ((opcode & 0xfe00707f) == 0x200403b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "DIVW", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //    rv_i, EBREAK
    if ((opcode & 0xffffffff) == 0x100073) {

        snprintf(buff, sizeof(buff), "%-15s ", "EBREAK");
        return buff;
    }

    //    rv_i, ECALL
    if ((opcode & 0xffffffff) == 0x73) {

        snprintf(buff, sizeof(buff), "%-15s ", "ECALL");
        return buff;
    }

    //    rv_d, FADD.D
    if ((opcode & 0xfe00007f) == 0x2000053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "FADD.D", fpr[a.rd], fpr[a.rs1], fpr[a.rs2], rm[a.rm]);
        return buff;
    }

    //    rv_f, FADD.S
    if ((opcode & 0xfe00007f) == 0x53) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "FADD.S", fpr[a.rd], fpr[a.rs1], fpr[a.rs2], rm[a.rm]);
        return buff;
    }

    //    rv_d, FCLASS.D
    if ((opcode & 0xfff0707f) == 0xe2001053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "FCLASS.D", gpr[a.rd], fpr[a.rs1]);
        return buff;
    }

    //    rv_f, FCLASS.S
    if ((opcode & 0xfff0707f) == 0xe0001053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "FCLASS.S", gpr[a.rd], fpr[a.rs1]);
        return buff;
    }

    //  rv64_d, FCVT.D.L
    if ((opcode & 0xfff0007f) == 0xd2200053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FCVT.D.L", fpr[a.rd], gpr[a.rs1], rm[a.rm]);
        return buff;
    }

    //  rv64_d, FCVT.D.LU
    if ((opcode & 0xfff0007f) == 0xd2300053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FCVT.D.LU", fpr[a.rd], gpr[a.rs1], rm[a.rm]);
        return buff;
    }

    //    rv_d, FCVT.D.S
    if ((opcode & 0xfff0007f) == 0x42000053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FCVT.D.S", fpr[a.rd], fpr[a.rs1], rm[a.rm]);
        return buff;
    }

    //    rv_d, FCVT.D.W
    if ((opcode & 0xfff0007f) == 0xd2000053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FCVT.D.W", fpr[a.rd], gpr[a.rs1], rm[a.rm]);
        return buff;
    }

    //    rv_d, FCVT.D.WU
    if ((opcode & 0xfff0007f) == 0xd2100053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FCVT.D.WU", fpr[a.rd], gpr[a.rs1], rm[a.rm]);
        return buff;
    }

    //  rv64_d, FCVT.L.D
    if ((opcode & 0xfff0007f) == 0xc2200053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FCVT.L.D", gpr[a.rd], fpr[a.rs1], rm[a.rm]);
        return buff;
    }

    //  rv64_f, FCVT.L.S
    if ((opcode & 0xfff0007f) == 0xc0200053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FCVT.L.S", gpr[a.rd], fpr[a.rs1], rm[a.rm]);
        return buff;
    }

    //  rv64_d, FCVT.LU.D
    if ((opcode & 0xfff0007f) == 0xc2300053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FCVT.LU.D", gpr[a.rd], fpr[a.rs1], rm[a.rm]);
        return buff;
    }

    //  rv64_f, FCVT.LU.S
    if ((opcode & 0xfff0007f) == 0xc0300053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FCVT.LU.S", gpr[a.rd], fpr[a.rs1], rm[a.rm]);
        return buff;
    }

    //    rv_d, FCVT.S.D
    if ((opcode & 0xfff0007f) == 0x40100053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FCVT.S.D", fpr[a.rd], fpr[a.rs1], rm[a.rm]);
        return buff;
    }

    //  rv64_f, FCVT.S.L
    if ((opcode & 0xfff0007f) == 0xd0200053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FCVT.S.L", fpr[a.rd], gpr[a.rs1], rm[a.rm]);
        return buff;
    }

    //  rv64_f, FCVT.S.LU
    if ((opcode & 0xfff0007f) == 0xd0300053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FCVT.S.LU", fpr[a.rd], gpr[a.rs1], rm[a.rm]);
        return buff;
    }

    //    rv_f, FCVT.S.W
    if ((opcode & 0xfff0007f) == 0xd0000053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FCVT.S.W", fpr[a.rd], gpr[a.rs1], rm[a.rm]);
        return buff;
    }

    //    rv_f, FCVT.S.WU
    if ((opcode & 0xfff0007f) == 0xd0100053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FCVT.S.WU", fpr[a.rd], gpr[a.rs1], rm[a.rm]);
        return buff;
    }

    //    rv_d, FCVT.W.D
    if ((opcode & 0xfff0007f) == 0xc2000053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FCVT.W.D", gpr[a.rd], fpr[a.rs1], rm[a.rm]);
        return buff;
    }

    //    rv_f, FCVT.W.S
    if ((opcode & 0xfff0007f) == 0xc0000053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FCVT.W.S", gpr[a.rd], fpr[a.rs1], rm[a.rm]);
        return buff;
    }

    //    rv_d, FCVT.WU.D
    if ((opcode & 0xfff0007f) == 0xc2100053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FCVT.WU.D", gpr[a.rd], fpr[a.rs1], rm[a.rm]);
        return buff;
    }

    //    rv_f, FCVT.WU.S
    if ((opcode & 0xfff0007f) == 0xc0100053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FCVT.WU.S", gpr[a.rd], fpr[a.rs1], rm[a.rm]);
        return buff;
    }

    //    rv_d, FDIV.D
    if ((opcode & 0xfe00007f) == 0x1a000053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "FDIV.D", fpr[a.rd], fpr[a.rs1], fpr[a.rs2], rm[a.rm]);
        return buff;
    }

    //    rv_f, FDIV.S
    if ((opcode & 0xfe00007f) == 0x18000053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "FDIV.S", fpr[a.rd], fpr[a.rs1], fpr[a.rs2], rm[a.rm]);
        return buff;
    }

    //    rv_i, FENCE
    if ((opcode & 0x707f) == 0xf) {
        snprintf(buff, sizeof(buff), "%-15s", "FENCE");
        return buff;
    }

    //    rv_d, FEQ.D
    if ((opcode & 0xfe00707f) == 0xa2002053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FEQ.D", gpr[a.rd], fpr[a.rs1], fpr[a.rs2]);
        return buff;
    }

    //    rv_f, FEQ.S
    if ((opcode & 0xfe00707f) == 0xa0002053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FEQ.S", gpr[a.rd], fpr[a.rs1], fpr[a.rs2]);
        return buff;
    }

    //    rv_d, FLD
    if ((opcode & 0x707f) == 0x3007) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 31, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "FLD", fpr[a.rd], gpr[a.rs1], SIGN_EXTEND(a.imm, 12), SIGN_EXTEND(a.imm, 12));
        return buff;
    }

    //    rv_d, FLE.D
    if ((opcode & 0xfe00707f) == 0xa2000053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FLE.D", gpr[a.rd], fpr[a.rs1], fpr[a.rs2]);
        return buff;
    }

    //    rv_f, FLE.S
    if ((opcode & 0xfe00707f) == 0xa0000053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FLE.S", gpr[a.rd], fpr[a.rs1], fpr[a.rs2]);
        return buff;
    }

    //    rv_d, FLT.D
    if ((opcode & 0xfe00707f) == 0xa2001053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FLT.D", gpr[a.rd], fpr[a.rs1], fpr[a.rs2]);
        return buff;
    }

    //    rv_f, FLT.S
    if ((opcode & 0xfe00707f) == 0xa0001053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FLT.S", gpr[a.rd], fpr[a.rs1], fpr[a.rs2]);
        return buff;
    }

    //    rv_f, FLW
    if ((opcode & 0x707f) == 0x2007) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 31, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "FLW", fpr[a.rd], gpr[a.rs1], SIGN_EXTEND(a.imm, 12), SIGN_EXTEND(a.imm, 12));
        return buff;
    }

    //    rv_d, FMADD.D
    if ((opcode & 0x600007f) == 0x2000043) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.rs3 = FX(opcode, 31, 27);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "FMADD.D", fpr[a.rd], fpr[a.rs1], fpr[a.rs2], fpr[a.rs3], rm[a.rm]);
        return buff;
    }

    //    rv_f, FMADD.S
    if ((opcode & 0x600007f) == 0x43) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.rs3 = FX(opcode, 31, 27);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "FMADD.S", fpr[a.rd], fpr[a.rs1], fpr[a.rs2], fpr[a.rs3], rm[a.rm]);
        return buff;
    }

    //    rv_d, FMAX.D
    if ((opcode & 0xfe00707f) == 0x2a001053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FMAX.D", fpr[a.rd], fpr[a.rs1], fpr[a.rs2]);
        return buff;
    }

    //    rv_f, FMAX.S
    if ((opcode & 0xfe00707f) == 0x28001053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FMAX.S", fpr[a.rd], fpr[a.rs1], fpr[a.rs2]);
        return buff;
    }

    //    rv_d, FMIN.D
    if ((opcode & 0xfe00707f) == 0x2a000053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FMIN.D", fpr[a.rd], fpr[a.rs1], fpr[a.rs2]);
        return buff;
    }

    //    rv_f, FMIN.S
    if ((opcode & 0xfe00707f) == 0x28000053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FMIN.S", fpr[a.rd], fpr[a.rs1], fpr[a.rs2]);
        return buff;
    }

    //    rv_d, FMSUB.D
    if ((opcode & 0x600007f) == 0x2000047) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.rs3 = FX(opcode, 31, 27);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "FMSUB.D", fpr[a.rd], fpr[a.rs1], fpr[a.rs2], fpr[a.rs3], rm[a.rm]);
        return buff;
    }

    //    rv_f, FMSUB.S
    if ((opcode & 0x600007f) == 0x47) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.rs3 = FX(opcode, 31, 27);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "FMSUB.S", fpr[a.rd], fpr[a.rs1], fpr[a.rs2], fpr[a.rs3], rm[a.rm]);
        return buff;
    }

    //    rv_d, FMUL.D
    if ((opcode & 0xfe00007f) == 0x12000053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "FMUL.D", fpr[a.rd], fpr[a.rs1], fpr[a.rs2], rm[a.rm]);
        return buff;
    }

    //    rv_f, FMUL.S
    if ((opcode & 0xfe00007f) == 0x10000053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "FMUL.S", fpr[a.rd], fpr[a.rs1], fpr[a.rs2], rm[a.rm]);
        return buff;
    }

    //  rv64_d, FMV.D.X
    if ((opcode & 0xfff0707f) == 0xf2000053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "FMV.D.X", fpr[a.rd], gpr[a.rs1]);
        return buff;
    }

    //    rv_f, FMV.W.X
    if ((opcode & 0xfff0707f) == 0xf0000053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "FMV.W.X", fpr[a.rd], gpr[a.rs1]);
        return buff;
    }

    //  rv64_d, FMV.X.D
    if ((opcode & 0xfff0707f) == 0xe2000053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "FMV.X.D", gpr[a.rd], fpr[a.rs1]);
        return buff;
    }

    //    rv_f, FMV.X.W
    if ((opcode & 0xfff0707f) == 0xe0000053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "FMV.X.W", gpr[a.rd], fpr[a.rs1]);
        return buff;
    }

    //    rv_d, FNMADD.D
    if ((opcode & 0x600007f) == 0x200004f) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.rs3 = FX(opcode, 31, 27);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "FNMADD.D", fpr[a.rd], fpr[a.rs1], fpr[a.rs2], fpr[a.rs3], rm[a.rm]);
        return buff;
    }

    //    rv_f, FNMADD.S
    if ((opcode & 0x600007f) == 0x4f) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.rs3 = FX(opcode, 31, 27);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "FNMADD.S", fpr[a.rd], fpr[a.rs1], fpr[a.rs2], fpr[a.rs3], rm[a.rm]);
        return buff;
    }

    //    rv_d, FNMSUB.D
    if ((opcode & 0x600007f) == 0x200004b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.rs3 = FX(opcode, 31, 27);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "FNMSUB.D", fpr[a.rd], fpr[a.rs1], fpr[a.rs2], fpr[a.rs3], rm[a.rm]);
        return buff;
    }

    //    rv_f, FNMSUB.S
    if ((opcode & 0x600007f) == 0x4b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.rs3 = FX(opcode, 31, 27);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "FNMSUB.S", fpr[a.rd], fpr[a.rs1], fpr[a.rs2], fpr[a.rs3], rm[a.rm]);
        return buff;
    }

    //    rv_d, FSD
    if ((opcode & 0x707f) == 0x3027) {
        a.rs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = (FX(opcode, 31, 25) << 5) | (FX(opcode, 11, 7));
        a.imm = SIGN_EXTEND(a.imm, 12);

        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "FSD", fpr[a.rs2], gpr[a.rs1], a.imm, a.imm);
        return buff;
    }

    //    rv_d, FSGNJ.D
    if ((opcode & 0xfe00707f) == 0x22000053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FSGNJ.D", fpr[a.rd], fpr[a.rs1], fpr[a.rs2]);
        return buff;
    }

    //    rv_f, FSGNJ.S
    if ((opcode & 0xfe00707f) == 0x20000053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FSGNJ.S", fpr[a.rd], fpr[a.rs1], fpr[a.rs2]);
        return buff;
    }

    //    rv_d, FSGNJN.D
    if ((opcode & 0xfe00707f) == 0x22001053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FSGNJN.D", fpr[a.rd], fpr[a.rs1], fpr[a.rs2]);
        return buff;
    }

    //    rv_f, FSGNJN.S
    if ((opcode & 0xfe00707f) == 0x20001053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FSGNJN.S", fpr[a.rd], fpr[a.rs1], fpr[a.rs2]);
        return buff;
    }

    //    rv_d, FSGNJX.D
    if ((opcode & 0xfe00707f) == 0x22002053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FSGNJX.D", fpr[a.rd], fpr[a.rs1], fpr[a.rs2]);
        return buff;
    }

    //    rv_f, FSGNJX.S
    if ((opcode & 0xfe00707f) == 0x20002053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FSGNJX.S", fpr[a.rd], fpr[a.rs1], fpr[a.rs2]);
        return buff;
    }

    //    rv_d, FSQRT.D
    if ((opcode & 0xfff0007f) == 0x5a000053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FSQRT.D", fpr[a.rd], fpr[a.rs1], rm[a.rm]);
        return buff;
    }

    //    rv_f, FSQRT.S
    if ((opcode & 0xfff0007f) == 0x58000053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "FSQRT.S", fpr[a.rd], fpr[a.rs1], rm[a.rm]);
        return buff;
    }

    //    rv_d, FSUB.D
    if ((opcode & 0xfe00007f) == 0xa000053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "FSUB.D", fpr[a.rd], fpr[a.rs1], fpr[a.rs2], rm[a.rm]);
        return buff;
    }

    //    rv_f, FSUB.S
    if ((opcode & 0xfe00007f) == 0x8000053) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.rm = FX(opcode, 14, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "FSUB.S", fpr[a.rd], fpr[a.rs1], fpr[a.rs2], rm[a.rm]);
        return buff;
    }

    //    rv_f, FSW
    if ((opcode & 0x707f) == 0x2027) {
        a.rs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = (FX(opcode, 31, 25) << 5) | (FX(opcode, 11, 7));
        a.imm = SIGN_EXTEND(a.imm, 12);

        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "FSW", fpr[a.rs2], gpr[a.rs1], a.imm, a.imm);
        return buff;
    }

    //    rv_i, JAL
    if ((opcode & 0x7f) == 0x6f) {
        a.rd = FX(opcode, 11, 7);
        a.imm = BX(opcode, 31) << 20;
        a.imm |= FX(opcode, 19, 12) << 12;
        a.imm |= BX(opcode, 20) << 11;
        a.imm |= FX(opcode, 30, 21) << 1;
        a.imm = SIGN_EXTEND(a.imm, 21);

        int len = snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d)", "JAL", gpr[a.rd], a.imm, a.imm);
        snprintf(buff + len, sizeof(buff) - len, " # %+di(0x%lx)", a.imm >> 2, addr + (uintptr_t)a.imm);
        return buff;
    }

    //    rv_i, JALR
    if ((opcode & 0x707f) == 0x67) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 31, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "JALR", gpr[a.rd], gpr[a.rs1], SIGN_EXTEND(a.imm, 12), SIGN_EXTEND(a.imm, 12));
        return buff;
    }

    //    rv_i, LB
    if ((opcode & 0x707f) == 0x3) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 31, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "LB", gpr[a.rd], gpr[a.rs1], SIGN_EXTEND(a.imm, 12), SIGN_EXTEND(a.imm, 12));
        return buff;
    }

    //    rv_i, LBU
    if ((opcode & 0x707f) == 0x4003) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 31, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "LBU", gpr[a.rd], gpr[a.rs1], SIGN_EXTEND(a.imm, 12), SIGN_EXTEND(a.imm, 12));
        return buff;
    }

    //  rv64_i, LD
    if ((opcode & 0x707f) == 0x3003) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 31, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "LD", gpr[a.rd], gpr[a.rs1], SIGN_EXTEND(a.imm, 12), SIGN_EXTEND(a.imm, 12));
        return buff;
    }

    //    rv_i, LH
    if ((opcode & 0x707f) == 0x1003) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 31, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "LH", gpr[a.rd], gpr[a.rs1], SIGN_EXTEND(a.imm, 12), SIGN_EXTEND(a.imm, 12));
        return buff;
    }

    //    rv_i, LHU
    if ((opcode & 0x707f) == 0x5003) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 31, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "LHU", gpr[a.rd], gpr[a.rs1], SIGN_EXTEND(a.imm, 12), SIGN_EXTEND(a.imm, 12));
        return buff;
    }

    //  rv64_a, LR.D
    if ((opcode & 0xf9f0707f) == 0x1000302f) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.aq = FX(opcode, 26, 26);
        a.rl = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "LR.D", gpr[a.rd], gpr[a.rs1], aq[a.aq], rl[a.rl]);
        return buff;
    }

    //    rv_a, LR.W
    if ((opcode & 0xf9f0707f) == 0x1000202f) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.aq = FX(opcode, 26, 26);
        a.rl = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "LR.W", gpr[a.rd], gpr[a.rs1], aq[a.aq], rl[a.rl]);
        return buff;
    }

    //    rv_i, LUI
    if ((opcode & 0x7f) == 0x37) {
        a.rd = FX(opcode, 11, 7);
        a.imm = FX(opcode, 31, 12);
        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d)", "LUI", gpr[a.rd], a.imm << 12, a.imm << 12);
        return buff;
    }

    //    rv_i, LW
    if ((opcode & 0x707f) == 0x2003) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 31, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "LW", gpr[a.rd], gpr[a.rs1], SIGN_EXTEND(a.imm, 12), SIGN_EXTEND(a.imm, 12));
        return buff;
    }

    //  rv64_i, LWU
    if ((opcode & 0x707f) == 0x6003) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 31, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "LWU", gpr[a.rd], gpr[a.rs1], SIGN_EXTEND(a.imm, 12), SIGN_EXTEND(a.imm, 12));
        return buff;
    }

    //  rv_zbb, MAX
    if ((opcode & 0xfe00707f) == 0xa006033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "MAX", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //  rv_zbb, MAXU
    if ((opcode & 0xfe00707f) == 0xa007033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "MAXU", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //  rv_zbb, MIN
    if ((opcode & 0xfe00707f) == 0xa004033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "MIN", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //  rv_zbb, MINU
    if ((opcode & 0xfe00707f) == 0xa005033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "MINU", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //    rv_m, MUL
    if ((opcode & 0xfe00707f) == 0x2000033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "MUL", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //    rv_m, MULH
    if ((opcode & 0xfe00707f) == 0x2001033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "MULH", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //    rv_m, MULHSU
    if ((opcode & 0xfe00707f) == 0x2002033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "MULHSU", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //    rv_m, MULHU
    if ((opcode & 0xfe00707f) == 0x2003033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "MULHU", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //  rv64_m, MULW
    if ((opcode & 0xfe00707f) == 0x200003b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "MULW", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //    rv_i, OR
    if ((opcode & 0xfe00707f) == 0x6033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "OR", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //  rv_zbb, ORC.B
    if ((opcode & 0xfff0707f) == 0x28705013) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "ORC.B", gpr[a.rd], gpr[a.rs1]);
        return buff;
    }

    //    rv_i, ORI
    if ((opcode & 0x707f) == 0x6013) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 31, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "ORI", gpr[a.rd], gpr[a.rs1], SIGN_EXTEND(a.imm, 12), SIGN_EXTEND(a.imm, 12));
        return buff;
    }

    //  rv_zbb, ORN
    if ((opcode & 0xfe00707f) == 0x40006033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "ORN", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //    rv_m, REM
    if ((opcode & 0xfe00707f) == 0x2006033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "REM", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //    rv_m, REMU
    if ((opcode & 0xfe00707f) == 0x2007033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "REMU", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //  rv64_m, REMUW
    if ((opcode & 0xfe00707f) == 0x200703b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "REMUW", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //  rv64_m, REMW
    if ((opcode & 0xfe00707f) == 0x200603b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "REMW", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    // rv64_zbb, REV8
    if ((opcode & 0xfff0707f) == 0x6b805013) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "REV8", gpr[a.rd], gpr[a.rs1]);
        return buff;
    }

    //  rv_zbb, ROL
    if ((opcode & 0xfe00707f) == 0x60001033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "ROL", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    // rv64_zbb, ROLW
    if ((opcode & 0xfe00707f) == 0x6000103b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "ROLW", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //  rv_zbb, ROR
    if ((opcode & 0xfe00707f) == 0x60005033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "ROR", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    // rv64_zbb, RORI
    if ((opcode & 0xfc00707f) == 0x60005013) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 25, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "RORI", gpr[a.rd], gpr[a.rs1], a.imm, a.imm);
        return buff;
    }

    // rv64_zbb, RORIW
    if ((opcode & 0xfe00707f) == 0x6000501b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "RORIW", gpr[a.rd], gpr[a.rs1], a.imm, a.imm);
        return buff;
    }

    // rv64_zbb, RORW
    if ((opcode & 0xfe00707f) == 0x6000503b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "RORW", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //    rv_i, SB
    if ((opcode & 0x707f) == 0x23) {
        a.rs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = (FX(opcode, 31, 25) << 5) | (FX(opcode, 11, 7));
        a.imm = SIGN_EXTEND(a.imm, 12);

        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "SB", gpr[a.rs2], gpr[a.rs1], a.imm, a.imm);
        return buff;
    }

    //  rv64_a, SC.D
    if ((opcode & 0xf800707f) == 0x1800302f) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.aq = FX(opcode, 26, 26);
        a.rl = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "SC.D", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], aq[a.aq], rl[a.rl]);
        return buff;
    }

    //    rv_a, SC.W
    if ((opcode & 0xf800707f) == 0x1800202f) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        a.aq = FX(opcode, 26, 26);
        a.rl = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "SC.W", gpr[a.rd], gpr[a.rs1], gpr[a.rs2], aq[a.aq], rl[a.rl]);
        return buff;
    }

    //  rv64_i, SD
    if ((opcode & 0x707f) == 0x3023) {
        a.rs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = (FX(opcode, 31, 25) << 5) | (FX(opcode, 11, 7));
        a.imm = SIGN_EXTEND(a.imm, 12);

        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "SD", gpr[a.rs2], gpr[a.rs1], a.imm, a.imm);
        return buff;
    }

    //  rv_zbb, SEXT.B
    if ((opcode & 0xfff0707f) == 0x60401013) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "SEXT.B", gpr[a.rd], gpr[a.rs1]);
        return buff;
    }

    //  rv_zbb, SEXT.H
    if ((opcode & 0xfff0707f) == 0x60501013) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "SEXT.H", gpr[a.rd], gpr[a.rs1]);
        return buff;
    }

    //    rv_i, SH
    if ((opcode & 0x707f) == 0x1023) {
        a.rs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = (FX(opcode, 31, 25) << 5) | (FX(opcode, 11, 7));
        a.imm = SIGN_EXTEND(a.imm, 12);

        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "SH", gpr[a.rs2], gpr[a.rs1], a.imm, a.imm);
        return buff;
    }

    //  rv_zba, SH1ADD
    if ((opcode & 0xfe00707f) == 0x20002033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "SH1ADD", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    // rv64_zba, SH1ADD.UW
    if ((opcode & 0xfe00707f) == 0x2000203b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "SH1ADD.UW", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //  rv_zba, SH2ADD
    if ((opcode & 0xfe00707f) == 0x20004033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "SH2ADD", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    // rv64_zba, SH2ADD.UW
    if ((opcode & 0xfe00707f) == 0x2000403b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "SH2ADD.UW", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //  rv_zba, SH3ADD
    if ((opcode & 0xfe00707f) == 0x20006033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "SH3ADD", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    // rv64_zba, SH3ADD.UW
    if ((opcode & 0xfe00707f) == 0x2000603b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "SH3ADD.UW", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //    rv_i, SLL
    if ((opcode & 0xfe00707f) == 0x1033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "SLL", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //  rv64_i, SLLI
    if ((opcode & 0xfc00707f) == 0x1013) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 25, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "SLLI", gpr[a.rd], gpr[a.rs1], a.imm, a.imm);
        return buff;
    }

    // rv64_zba, SLLI.UW
    if ((opcode & 0xfc00707f) == 0x800101b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 25, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "SLLI.UW", gpr[a.rd], gpr[a.rs1], a.imm, a.imm);
        return buff;
    }

    //  rv64_i, SLLIW
    if ((opcode & 0xfe00707f) == 0x101b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "SLLIW", gpr[a.rd], gpr[a.rs1], a.imm, a.imm);
        return buff;
    }

    //  rv64_i, SLLW
    if ((opcode & 0xfe00707f) == 0x103b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "SLLW", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //    rv_i, SLT
    if ((opcode & 0xfe00707f) == 0x2033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "SLT", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //    rv_i, SLTI
    if ((opcode & 0x707f) == 0x2013) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 31, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "SLTI", gpr[a.rd], gpr[a.rs1], SIGN_EXTEND(a.imm, 12), SIGN_EXTEND(a.imm, 12));
        return buff;
    }

    //    rv_i, SLTIU
    if ((opcode & 0x707f) == 0x3013) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 31, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "SLTIU", gpr[a.rd], gpr[a.rs1], SIGN_EXTEND(a.imm, 12), SIGN_EXTEND(a.imm, 12));
        return buff;
    }

    //    rv_i, SLTU
    if ((opcode & 0xfe00707f) == 0x3033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "SLTU", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //    rv_i, SRA
    if ((opcode & 0xfe00707f) == 0x40005033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "SRA", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //  rv64_i, SRAI
    if ((opcode & 0xfc00707f) == 0x40005013) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 25, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "SRAI", gpr[a.rd], gpr[a.rs1], a.imm, a.imm);
        return buff;
    }

    //  rv64_i, SRAIW
    if ((opcode & 0xfe00707f) == 0x4000501b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "SRAIW", gpr[a.rd], gpr[a.rs1], a.imm, a.imm);
        return buff;
    }

    //  rv64_i, SRAW
    if ((opcode & 0xfe00707f) == 0x4000503b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "SRAW", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //    rv_i, SRL
    if ((opcode & 0xfe00707f) == 0x5033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "SRL", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //  rv64_i, SRLI
    if ((opcode & 0xfc00707f) == 0x5013) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 25, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "SRLI", gpr[a.rd], gpr[a.rs1], a.imm, a.imm);
        return buff;
    }

    //  rv64_i, SRLIW
    if ((opcode & 0xfe00707f) == 0x501b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "SRLIW", gpr[a.rd], gpr[a.rs1], a.imm, a.imm);
        return buff;
    }

    //  rv64_i, SRLW
    if ((opcode & 0xfe00707f) == 0x503b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "SRLW", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //    rv_i, SUB
    if ((opcode & 0xfe00707f) == 0x40000033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "SUB", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //  rv64_i, SUBW
    if ((opcode & 0xfe00707f) == 0x4000003b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "SUBW", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //    rv_i, SW
    if ((opcode & 0x707f) == 0x2023) {
        a.rs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = (FX(opcode, 31, 25) << 5) | (FX(opcode, 11, 7));
        a.imm = SIGN_EXTEND(a.imm, 12);

        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "SW", gpr[a.rs2], gpr[a.rs1], a.imm, a.imm);
        return buff;
    }

    //    rv_v, VAADD.VV
    if ((opcode & 0xfc00707f) == 0x24002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VAADD.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VAADD.VX
    if ((opcode & 0xfc00707f) == 0x24006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VAADD.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VAADDU.VV
    if ((opcode & 0xfc00707f) == 0x20002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VAADDU.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VAADDU.VX
    if ((opcode & 0xfc00707f) == 0x20006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VAADDU.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VADC.VIM
    if ((opcode & 0xfe00707f) == 0x40003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "VADC.VIM", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5));
        return buff;
    }

    //    rv_v, VADC.VVM
    if ((opcode & 0xfe00707f) == 0x40000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VADC.VVM", vpr[a.vd], vpr[a.vs2], vpr[a.vs1]);
        return buff;
    }

    //    rv_v, VADC.VXM
    if ((opcode & 0xfe00707f) == 0x40004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VADC.VXM", vpr[a.vd], vpr[a.vs2], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VADD.VI
    if ((opcode & 0xfc00707f) == 0x3057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), %s", "VADD.VI", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vm[a.vm]);
        return buff;
    }

    //    rv_v, VADD.VV
    if ((opcode & 0xfc00707f) == 0x57) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VADD.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VADD.VX
    if ((opcode & 0xfc00707f) == 0x4057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VADD.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VAND.VI
    if ((opcode & 0xfc00707f) == 0x24003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), %s", "VAND.VI", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vm[a.vm]);
        return buff;
    }

    //    rv_v, VAND.VV
    if ((opcode & 0xfc00707f) == 0x24000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VAND.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VAND.VX
    if ((opcode & 0xfc00707f) == 0x24004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VAND.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VASUB.VV
    if ((opcode & 0xfc00707f) == 0x2c002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VASUB.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VASUB.VX
    if ((opcode & 0xfc00707f) == 0x2c006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VASUB.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VASUBU.VV
    if ((opcode & 0xfc00707f) == 0x28002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VASUBU.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VASUBU.VX
    if ((opcode & 0xfc00707f) == 0x28006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VASUBU.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VCOMPRESS.VM
    if ((opcode & 0xfe00707f) == 0x5e002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VCOMPRESS.VM", vpr[a.vd], vpr[a.vs2], vpr[a.vs1]);
        return buff;
    }

    //    rv_v, VCPOP.M
    if ((opcode & 0xfc0ff07f) == 0x40082057) {
        a.rd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VCPOP.M", gpr[a.rd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VDIV.VV
    if ((opcode & 0xfc00707f) == 0x84002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VDIV.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VDIV.VX
    if ((opcode & 0xfc00707f) == 0x84006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VDIV.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VDIVU.VV
    if ((opcode & 0xfc00707f) == 0x80002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VDIVU.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VDIVU.VX
    if ((opcode & 0xfc00707f) == 0x80006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VDIVU.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFADD.VF
    if ((opcode & 0xfc00707f) == 0x5057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFADD.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFADD.VV
    if ((opcode & 0xfc00707f) == 0x1057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFADD.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFCLASS.V
    if ((opcode & 0xfc0ff07f) == 0x4c081057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFCLASS.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFCVT.F.X.V
    if ((opcode & 0xfc0ff07f) == 0x48019057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFCVT.F.X.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFCVT.F.XU.V
    if ((opcode & 0xfc0ff07f) == 0x48011057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFCVT.F.XU.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFCVT.RTZ.X.F.V
    if ((opcode & 0xfc0ff07f) == 0x48039057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFCVT.RTZ.X.F.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFCVT.RTZ.XU.F.V
    if ((opcode & 0xfc0ff07f) == 0x48031057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFCVT.RTZ.XU.F.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFCVT.X.F.V
    if ((opcode & 0xfc0ff07f) == 0x48009057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFCVT.X.F.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFCVT.XU.F.V
    if ((opcode & 0xfc0ff07f) == 0x48001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFCVT.XU.F.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFDIV.VF
    if ((opcode & 0xfc00707f) == 0x80005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFDIV.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFDIV.VV
    if ((opcode & 0xfc00707f) == 0x80001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFDIV.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFIRST.M
    if ((opcode & 0xfc0ff07f) == 0x4008a057) {
        a.rd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFIRST.M", fpr[a.rd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFMACC.VF
    if ((opcode & 0xfc00707f) == 0xb0005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMACC.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFMACC.VV
    if ((opcode & 0xfc00707f) == 0xb0001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMACC.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFMADD.VF
    if ((opcode & 0xfc00707f) == 0xa0005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMADD.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFMADD.VV
    if ((opcode & 0xfc00707f) == 0xa0001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMADD.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFMAX.VF
    if ((opcode & 0xfc00707f) == 0x18005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMAX.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFMAX.VV
    if ((opcode & 0xfc00707f) == 0x18001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMAX.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFMERGE.VFM
    if ((opcode & 0xfe00707f) == 0x5c005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFMERGE.VFM", vpr[a.vd], vpr[a.vs2], fpr[a.rs1]);
        return buff;
    }

    //    rv_v, VFMIN.VF
    if ((opcode & 0xfc00707f) == 0x10005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMIN.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFMIN.VV
    if ((opcode & 0xfc00707f) == 0x10001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMIN.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFMSAC.VF
    if ((opcode & 0xfc00707f) == 0xb8005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMSAC.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFMSAC.VV
    if ((opcode & 0xfc00707f) == 0xb8001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMSAC.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFMSUB.VF
    if ((opcode & 0xfc00707f) == 0xa8005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMSUB.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFMSUB.VV
    if ((opcode & 0xfc00707f) == 0xa8001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMSUB.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFMUL.VF
    if ((opcode & 0xfc00707f) == 0x90005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMUL.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFMUL.VV
    if ((opcode & 0xfc00707f) == 0x90001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMUL.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFMV.F.S
    if ((opcode & 0xfe0ff07f) == 0x42001057) {
        a.rd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VFMV.F.S", fpr[a.rd], vpr[a.vs2]);
        return buff;
    }

    //    rv_v, VFMV.S.F
    if ((opcode & 0xfff0707f) == 0x42005057) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VFMV.S.F", vpr[a.vd], fpr[a.rs1]);
        return buff;
    }

    //    rv_v, VFMV.V.F
    if ((opcode & 0xfff0707f) == 0x5e005057) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VFMV.V.F", vpr[a.vd], fpr[a.rs1]);
        return buff;
    }

    //    rv_v, VFNCVT.F.F.W
    if ((opcode & 0xfc0ff07f) == 0x480a1057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFNCVT.F.F.W", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFNCVT.F.X.W
    if ((opcode & 0xfc0ff07f) == 0x48099057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFNCVT.F.X.W", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFNCVT.F.XU.W
    if ((opcode & 0xfc0ff07f) == 0x48091057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFNCVT.F.XU.W", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFNCVT.ROD.F.F.W
    if ((opcode & 0xfc0ff07f) == 0x480a9057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFNCVT.ROD.F.F.W", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFNCVT.RTZ.X.F.W
    if ((opcode & 0xfc0ff07f) == 0x480b9057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFNCVT.RTZ.X.F.W", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFNCVT.RTZ.XU.F.W
    if ((opcode & 0xfc0ff07f) == 0x480b1057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFNCVT.RTZ.XU.F.W", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFNCVT.X.F.W
    if ((opcode & 0xfc0ff07f) == 0x48089057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFNCVT.X.F.W", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFNCVT.XU.F.W
    if ((opcode & 0xfc0ff07f) == 0x48081057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFNCVT.XU.F.W", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFNMACC.VF
    if ((opcode & 0xfc00707f) == 0xb4005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFNMACC.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFNMACC.VV
    if ((opcode & 0xfc00707f) == 0xb4001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFNMACC.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFNMADD.VF
    if ((opcode & 0xfc00707f) == 0xa4005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFNMADD.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFNMADD.VV
    if ((opcode & 0xfc00707f) == 0xa4001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFNMADD.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFNMSAC.VF
    if ((opcode & 0xfc00707f) == 0xbc005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFNMSAC.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFNMSAC.VV
    if ((opcode & 0xfc00707f) == 0xbc001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFNMSAC.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFNMSUB.VF
    if ((opcode & 0xfc00707f) == 0xac005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFNMSUB.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFNMSUB.VV
    if ((opcode & 0xfc00707f) == 0xac001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFNMSUB.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFRDIV.VF
    if ((opcode & 0xfc00707f) == 0x84005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFRDIV.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFREC7.V
    if ((opcode & 0xfc0ff07f) == 0x4c029057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFREC7.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFREDMAX.VS
    if ((opcode & 0xfc00707f) == 0x1c001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFREDMAX.VS", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFREDMIN.VS
    if ((opcode & 0xfc00707f) == 0x14001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFREDMIN.VS", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFREDOSUM.VS
    if ((opcode & 0xfc00707f) == 0xc001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFREDOSUM.VS", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFREDUSUM.VS
    if ((opcode & 0xfc00707f) == 0x4001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFREDUSUM.VS", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFRSQRT7.V
    if ((opcode & 0xfc0ff07f) == 0x4c021057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFRSQRT7.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFRSUB.VF
    if ((opcode & 0xfc00707f) == 0x9c005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFRSUB.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFSGNJ.VF
    if ((opcode & 0xfc00707f) == 0x20005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFSGNJ.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFSGNJ.VV
    if ((opcode & 0xfc00707f) == 0x20001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFSGNJ.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFSGNJN.VF
    if ((opcode & 0xfc00707f) == 0x24005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFSGNJN.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFSGNJN.VV
    if ((opcode & 0xfc00707f) == 0x24001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFSGNJN.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFSGNJX.VF
    if ((opcode & 0xfc00707f) == 0x28005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFSGNJX.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFSGNJX.VV
    if ((opcode & 0xfc00707f) == 0x28001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFSGNJX.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFSLIDE1DOWN.VF
    if ((opcode & 0xfc00707f) == 0x3c005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFSLIDE1DOWN.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFSLIDE1UP.VF
    if ((opcode & 0xfc00707f) == 0x38005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFSLIDE1UP.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFSQRT.V
    if ((opcode & 0xfc0ff07f) == 0x4c001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFSQRT.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFSUB.VF
    if ((opcode & 0xfc00707f) == 0x8005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFSUB.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFSUB.VV
    if ((opcode & 0xfc00707f) == 0x8001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFSUB.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFWADD.VF
    if ((opcode & 0xfc00707f) == 0xc0005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWADD.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFWADD.VV
    if ((opcode & 0xfc00707f) == 0xc0001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWADD.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFWADD.WF
    if ((opcode & 0xfc00707f) == 0xd0005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWADD.WF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFWADD.WV
    if ((opcode & 0xfc00707f) == 0xd0001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWADD.WV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFWCVT.F.F.V
    if ((opcode & 0xfc0ff07f) == 0x48061057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFWCVT.F.F.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFWCVT.F.X.V
    if ((opcode & 0xfc0ff07f) == 0x48059057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFWCVT.F.X.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFWCVT.F.XU.V
    if ((opcode & 0xfc0ff07f) == 0x48051057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFWCVT.F.XU.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFWCVT.RTZ.X.F.V
    if ((opcode & 0xfc0ff07f) == 0x48079057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFWCVT.RTZ.X.F.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFWCVT.RTZ.XU.F.V
    if ((opcode & 0xfc0ff07f) == 0x48071057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFWCVT.RTZ.XU.F.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFWCVT.X.F.V
    if ((opcode & 0xfc0ff07f) == 0x48049057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFWCVT.X.F.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFWCVT.XU.F.V
    if ((opcode & 0xfc0ff07f) == 0x48041057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFWCVT.XU.F.V", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFWMACC.VF
    if ((opcode & 0xfc00707f) == 0xf0005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWMACC.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFWMACC.VV
    if ((opcode & 0xfc00707f) == 0xf0001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWMACC.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFWMSAC.VF
    if ((opcode & 0xfc00707f) == 0xf8005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWMSAC.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFWMSAC.VV
    if ((opcode & 0xfc00707f) == 0xf8001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWMSAC.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFWMUL.VF
    if ((opcode & 0xfc00707f) == 0xe0005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWMUL.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFWMUL.VV
    if ((opcode & 0xfc00707f) == 0xe0001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWMUL.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFWNMACC.VF
    if ((opcode & 0xfc00707f) == 0xf4005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWNMACC.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFWNMACC.VV
    if ((opcode & 0xfc00707f) == 0xf4001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWNMACC.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFWNMSAC.VF
    if ((opcode & 0xfc00707f) == 0xfc005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWNMSAC.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFWNMSAC.VV
    if ((opcode & 0xfc00707f) == 0xfc001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWNMSAC.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFWREDOSUM.VS
    if ((opcode & 0xfc00707f) == 0xcc001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWREDOSUM.VS", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFWREDUSUM.VS
    if ((opcode & 0xfc00707f) == 0xc4001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWREDUSUM.VS", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFWSUB.VF
    if ((opcode & 0xfc00707f) == 0xc8005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWSUB.VF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFWSUB.VV
    if ((opcode & 0xfc00707f) == 0xc8001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWSUB.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFWSUB.WF
    if ((opcode & 0xfc00707f) == 0xd8005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWSUB.WF", vpr[a.vd], vpr[a.vs2], fpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VFWSUB.WV
    if ((opcode & 0xfc00707f) == 0xd8001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWSUB.WV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VID.V
    if ((opcode & 0xfdfff07f) == 0x5008a057) {
        a.vd = FX(opcode, 11, 7);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VID.V", vpr[a.vd], vm[a.vm]);
        return buff;
    }

    //    rv_v, VIOTA.M
    if ((opcode & 0xfc0ff07f) == 0x50082057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VIOTA.M", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VL1RE16.V
    if ((opcode & 0xfff0707f) == 0x2805007) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VL1RE16.V", vpr[a.vd], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VL1RE32.V
    if ((opcode & 0xfff0707f) == 0x2806007) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VL1RE32.V", vpr[a.vd], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VL1RE64.V
    if ((opcode & 0xfff0707f) == 0x2807007) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VL1RE64.V", vpr[a.vd], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VL1RE8.V
    if ((opcode & 0xfff0707f) == 0x2800007) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VL1RE8.V", vpr[a.vd], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VL2RE16.V
    if ((opcode & 0xfff0707f) == 0x22805007) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VL2RE16.V", vpr[a.vd], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VL2RE32.V
    if ((opcode & 0xfff0707f) == 0x22806007) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VL2RE32.V", vpr[a.vd], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VL2RE64.V
    if ((opcode & 0xfff0707f) == 0x22807007) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VL2RE64.V", vpr[a.vd], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VL2RE8.V
    if ((opcode & 0xfff0707f) == 0x22800007) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VL2RE8.V", vpr[a.vd], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VL4RE16.V
    if ((opcode & 0xfff0707f) == 0x62805007) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VL4RE16.V", vpr[a.vd], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VL4RE32.V
    if ((opcode & 0xfff0707f) == 0x62806007) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VL4RE32.V", vpr[a.vd], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VL4RE64.V
    if ((opcode & 0xfff0707f) == 0x62807007) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VL4RE64.V", vpr[a.vd], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VL4RE8.V
    if ((opcode & 0xfff0707f) == 0x62800007) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VL4RE8.V", vpr[a.vd], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VL8RE16.V
    if ((opcode & 0xfff0707f) == 0xe2805007) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VL8RE16.V", vpr[a.vd], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VL8RE32.V
    if ((opcode & 0xfff0707f) == 0xe2806007) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VL8RE32.V", vpr[a.vd], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VL8RE64.V
    if ((opcode & 0xfff0707f) == 0xe2807007) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VL8RE64.V", vpr[a.vd], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VL8RE8.V
    if ((opcode & 0xfff0707f) == 0xe2800007) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VL8RE8.V", vpr[a.vd], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VLE16.V
    if ((opcode & 0x1df0707f) == 0x5007) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VLE16.V", vpr[a.vd], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VLE16FF.V
    if ((opcode & 0x1df0707f) == 0x1005007) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VLE16FF.V", vpr[a.vd], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VLE32.V
    if ((opcode & 0x1df0707f) == 0x6007) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VLE32.V", vpr[a.vd], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VLE32FF.V
    if ((opcode & 0x1df0707f) == 0x1006007) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VLE32FF.V", vpr[a.vd], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VLE64.V
    if ((opcode & 0x1df0707f) == 0x7007) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VLE64.V", vpr[a.vd], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VLE64FF.V
    if ((opcode & 0x1df0707f) == 0x1007007) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VLE64FF.V", vpr[a.vd], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VLE8.V
    if ((opcode & 0x1df0707f) == 0x7) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VLE8.V", vpr[a.vd], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VLE8FF.V
    if ((opcode & 0x1df0707f) == 0x1000007) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VLE8FF.V", vpr[a.vd], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VLM.V
    if ((opcode & 0xfff0707f) == 0x2b00007) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VLM.V", vpr[a.vd], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VLOXEI16.V
    if ((opcode & 0x1c00707f) == 0xc005007) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VLOXEI16.V", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VLOXEI32.V
    if ((opcode & 0x1c00707f) == 0xc006007) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VLOXEI32.V", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VLOXEI64.V
    if ((opcode & 0x1c00707f) == 0xc007007) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VLOXEI64.V", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VLOXEI8.V
    if ((opcode & 0x1c00707f) == 0xc000007) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VLOXEI8.V", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VLSE16.V
    if ((opcode & 0x1c00707f) == 0x8005007) {
        a.vd = FX(opcode, 11, 7);
        a.rs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VLSE16.V", vpr[a.vd], gpr[a.rs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VLSE32.V
    if ((opcode & 0x1c00707f) == 0x8006007) {
        a.vd = FX(opcode, 11, 7);
        a.rs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VLSE32.V", vpr[a.vd], gpr[a.rs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VLSE64.V
    if ((opcode & 0x1c00707f) == 0x8007007) {
        a.vd = FX(opcode, 11, 7);
        a.rs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VLSE64.V", vpr[a.vd], gpr[a.rs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VLSE8.V
    if ((opcode & 0x1c00707f) == 0x8000007) {
        a.vd = FX(opcode, 11, 7);
        a.rs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VLSE8.V", vpr[a.vd], gpr[a.rs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VLUXEI16.V
    if ((opcode & 0x1c00707f) == 0x4005007) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VLUXEI16.V", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VLUXEI32.V
    if ((opcode & 0x1c00707f) == 0x4006007) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VLUXEI32.V", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VLUXEI64.V
    if ((opcode & 0x1c00707f) == 0x4007007) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VLUXEI64.V", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VLUXEI8.V
    if ((opcode & 0x1c00707f) == 0x4000007) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VLUXEI8.V", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VMACC.VV
    if ((opcode & 0xfc00707f) == 0xb4002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMACC.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMACC.VX
    if ((opcode & 0xfc00707f) == 0xb4006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMACC.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMADC.VI
    if ((opcode & 0xfe00707f) == 0x46003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "VMADC.VI", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5));
        return buff;
    }

    //    rv_v, VMADC.VIM
    if ((opcode & 0xfe00707f) == 0x44003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "VMADC.VIM", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5));
        return buff;
    }

    //    rv_v, VMADC.VV
    if ((opcode & 0xfe00707f) == 0x46000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMADC.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1]);
        return buff;
    }

    //    rv_v, VMADC.VVM
    if ((opcode & 0xfe00707f) == 0x44000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMADC.VVM", vpr[a.vd], vpr[a.vs2], vpr[a.vs1]);
        return buff;
    }

    //    rv_v, VMADC.VX
    if ((opcode & 0xfe00707f) == 0x46004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMADC.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VMADC.VXM
    if ((opcode & 0xfe00707f) == 0x44004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMADC.VXM", vpr[a.vd], vpr[a.vs2], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VMADD.VV
    if ((opcode & 0xfc00707f) == 0xa4002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMADD.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMADD.VX
    if ((opcode & 0xfc00707f) == 0xa4006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMADD.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMAND.MM
    if ((opcode & 0xfe00707f) == 0x66002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMAND.MM", vpr[a.vd], vpr[a.vs2], vpr[a.vs1]);
        return buff;
    }

    //    rv_v, VMANDN.MM
    if ((opcode & 0xfe00707f) == 0x62002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMANDN.MM", vpr[a.vd], vpr[a.vs2], vpr[a.vs1]);
        return buff;
    }

    //    rv_v, VMAX.VV
    if ((opcode & 0xfc00707f) == 0x1c000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMAX.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMAX.VX
    if ((opcode & 0xfc00707f) == 0x1c004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMAX.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMAXU.VV
    if ((opcode & 0xfc00707f) == 0x18000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMAXU.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMAXU.VX
    if ((opcode & 0xfc00707f) == 0x18004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMAXU.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMERGE.VIM
    if ((opcode & 0xfe00707f) == 0x5c003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "VMERGE.VIM", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5));
        return buff;
    }

    //    rv_v, VMERGE.VVM
    if ((opcode & 0xfe00707f) == 0x5c000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMERGE.VVM", vpr[a.vd], vpr[a.vs2], vpr[a.vs1]);
        return buff;
    }

    //    rv_v, VMERGE.VXM
    if ((opcode & 0xfe00707f) == 0x5c004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMERGE.VXM", vpr[a.vd], vpr[a.vs2], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VMFEQ.VF
    if ((opcode & 0xfc00707f) == 0x60005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMFEQ.VF", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMFEQ.VV
    if ((opcode & 0xfc00707f) == 0x60001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMFEQ.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMFGE.VF
    if ((opcode & 0xfc00707f) == 0x7c005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMFGE.VF", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMFGT.VF
    if ((opcode & 0xfc00707f) == 0x74005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMFGT.VF", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMFLE.VF
    if ((opcode & 0xfc00707f) == 0x64005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMFLE.VF", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMFLE.VV
    if ((opcode & 0xfc00707f) == 0x64001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMFLE.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMFLT.VF
    if ((opcode & 0xfc00707f) == 0x6c005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMFLT.VF", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMFLT.VV
    if ((opcode & 0xfc00707f) == 0x6c001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMFLT.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMFNE.VF
    if ((opcode & 0xfc00707f) == 0x70005057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMFNE.VF", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMFNE.VV
    if ((opcode & 0xfc00707f) == 0x70001057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMFNE.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMIN.VV
    if ((opcode & 0xfc00707f) == 0x14000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMIN.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMIN.VX
    if ((opcode & 0xfc00707f) == 0x14004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMIN.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMINU.VV
    if ((opcode & 0xfc00707f) == 0x10000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMINU.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMINU.VX
    if ((opcode & 0xfc00707f) == 0x10004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMINU.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMNAND.MM
    if ((opcode & 0xfe00707f) == 0x76002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMNAND.MM", vpr[a.vd], vpr[a.vs2], vpr[a.vs1]);
        return buff;
    }

    //    rv_v, VMNOR.MM
    if ((opcode & 0xfe00707f) == 0x7a002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMNOR.MM", vpr[a.vd], vpr[a.vs2], vpr[a.vs1]);
        return buff;
    }

    //    rv_v, VMOR.MM
    if ((opcode & 0xfe00707f) == 0x6a002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMOR.MM", vpr[a.vd], vpr[a.vs2], vpr[a.vs1]);
        return buff;
    }

    //    rv_v, VMORN.MM
    if ((opcode & 0xfe00707f) == 0x72002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMORN.MM", vpr[a.vd], vpr[a.vs2], vpr[a.vs1]);
        return buff;
    }

    //    rv_v, VMSBC.VV
    if ((opcode & 0xfe00707f) == 0x4e000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMSBC.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1]);
        return buff;
    }

    //    rv_v, VMSBC.VVM
    if ((opcode & 0xfe00707f) == 0x4c000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMSBC.VVM", vpr[a.vd], vpr[a.vs2], vpr[a.vs1]);
        return buff;
    }

    //    rv_v, VMSBC.VX
    if ((opcode & 0xfe00707f) == 0x4e004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMSBC.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VMSBC.VXM
    if ((opcode & 0xfe00707f) == 0x4c004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMSBC.VXM", vpr[a.vd], vpr[a.vs2], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VMSBF.M
    if ((opcode & 0xfc0ff07f) == 0x5000a057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMSBF.M", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMSEQ.VI
    if ((opcode & 0xfc00707f) == 0x60003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), %s", "VMSEQ.VI", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vm[a.vm]);
        return buff;
    }

    //    rv_v, VMSEQ.VV
    if ((opcode & 0xfc00707f) == 0x60000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSEQ.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMSEQ.VX
    if ((opcode & 0xfc00707f) == 0x60004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSEQ.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMSGT.VI
    if ((opcode & 0xfc00707f) == 0x7c003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), %s", "VMSGT.VI", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vm[a.vm]);
        return buff;
    }

    //    rv_v, VMSGT.VX
    if ((opcode & 0xfc00707f) == 0x7c004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSGT.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMSGTU.VI
    if ((opcode & 0xfc00707f) == 0x78003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), %s", "VMSGTU.VI", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vm[a.vm]);
        return buff;
    }

    //    rv_v, VMSGTU.VX
    if ((opcode & 0xfc00707f) == 0x78004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSGTU.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMSIF.M
    if ((opcode & 0xfc0ff07f) == 0x5001a057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMSIF.M", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMSLE.VI
    if ((opcode & 0xfc00707f) == 0x74003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), %s", "VMSLE.VI", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vm[a.vm]);
        return buff;
    }

    //    rv_v, VMSLE.VV
    if ((opcode & 0xfc00707f) == 0x74000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSLE.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMSLE.VX
    if ((opcode & 0xfc00707f) == 0x74004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSLE.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMSLEU.VI
    if ((opcode & 0xfc00707f) == 0x70003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), %s", "VMSLEU.VI", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vm[a.vm]);
        return buff;
    }

    //    rv_v, VMSLEU.VV
    if ((opcode & 0xfc00707f) == 0x70000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSLEU.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMSLEU.VX
    if ((opcode & 0xfc00707f) == 0x70004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSLEU.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMSLT.VV
    if ((opcode & 0xfc00707f) == 0x6c000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSLT.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMSLT.VX
    if ((opcode & 0xfc00707f) == 0x6c004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSLT.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMSLTU.VV
    if ((opcode & 0xfc00707f) == 0x68000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSLTU.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMSLTU.VX
    if ((opcode & 0xfc00707f) == 0x68004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSLTU.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMSNE.VI
    if ((opcode & 0xfc00707f) == 0x64003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), %s", "VMSNE.VI", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vm[a.vm]);
        return buff;
    }

    //    rv_v, VMSNE.VV
    if ((opcode & 0xfc00707f) == 0x64000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSNE.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMSNE.VX
    if ((opcode & 0xfc00707f) == 0x64004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSNE.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMSOF.M
    if ((opcode & 0xfc0ff07f) == 0x50012057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMSOF.M", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMUL.VV
    if ((opcode & 0xfc00707f) == 0x94002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMUL.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMUL.VX
    if ((opcode & 0xfc00707f) == 0x94006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMUL.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMULH.VV
    if ((opcode & 0xfc00707f) == 0x9c002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMULH.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMULH.VX
    if ((opcode & 0xfc00707f) == 0x9c006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMULH.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMULHSU.VV
    if ((opcode & 0xfc00707f) == 0x98002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMULHSU.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMULHSU.VX
    if ((opcode & 0xfc00707f) == 0x98006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMULHSU.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMULHU.VV
    if ((opcode & 0xfc00707f) == 0x90002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMULHU.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMULHU.VX
    if ((opcode & 0xfc00707f) == 0x90006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMULHU.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VMV1R.V
    if ((opcode & 0xfe0ff07f) == 0x9e003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VMV1R.V", vpr[a.vd], vpr[a.vs2]);
        return buff;
    }

    //    rv_v, VMV2R.V
    if ((opcode & 0xfe0ff07f) == 0x9e00b057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VMV2R.V", vpr[a.vd], vpr[a.vs2]);
        return buff;
    }

    //    rv_v, VMV4R.V
    if ((opcode & 0xfe0ff07f) == 0x9e01b057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VMV4R.V", vpr[a.vd], vpr[a.vs2]);
        return buff;
    }

    //    rv_v, VMV8R.V
    if ((opcode & 0xfe0ff07f) == 0x9e03b057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VMV8R.V", vpr[a.vd], vpr[a.vs2]);
        return buff;
    }

    //    rv_v, VMV.S.X
    if ((opcode & 0xfff0707f) == 0x42006057) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VMV.S.X", vpr[a.vd], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VMV.V.I
    if ((opcode & 0xfff0707f) == 0x5e003057) {
        a.vd = FX(opcode, 11, 7);
        a.imm = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d)", "VMV.V.I", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5));
        return buff;
    }

    //    rv_v, VMV.V.V
    if ((opcode & 0xfff0707f) == 0x5e000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VMV.V.V", vpr[a.vd], vpr[a.vs1]);
        return buff;
    }

    //    rv_v, VMV.V.X
    if ((opcode & 0xfff0707f) == 0x5e004057) {
        a.vd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VMV.V.X", vpr[a.vd], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VMV.X.S
    if ((opcode & 0xfe0ff07f) == 0x42002057) {
        a.rd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VMV.X.S", gpr[a.rd], vpr[a.vs2]);
        return buff;
    }

    //    rv_v, VMXNOR.MM
    if ((opcode & 0xfe00707f) == 0x7e002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMXNOR.MM", vpr[a.vd], vpr[a.vs2], vpr[a.vs1]);
        return buff;
    }

    //    rv_v, VMXOR.MM
    if ((opcode & 0xfe00707f) == 0x6e002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMXOR.MM", vpr[a.vd], vpr[a.vs2], vpr[a.vs1]);
        return buff;
    }

    //    rv_v, VNCLIP.WI
    if ((opcode & 0xfc00707f) == 0xbc003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), %s", "VNCLIP.WI", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vm[a.vm]);
        return buff;
    }

    //    rv_v, VNCLIP.WV
    if ((opcode & 0xfc00707f) == 0xbc000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VNCLIP.WV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VNCLIP.WX
    if ((opcode & 0xfc00707f) == 0xbc004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VNCLIP.WX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VNCLIPU.WI
    if ((opcode & 0xfc00707f) == 0xb8003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), %s", "VNCLIPU.WI", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vm[a.vm]);
        return buff;
    }

    //    rv_v, VNCLIPU.WV
    if ((opcode & 0xfc00707f) == 0xb8000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VNCLIPU.WV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VNCLIPU.WX
    if ((opcode & 0xfc00707f) == 0xb8004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VNCLIPU.WX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VNMSAC.VV
    if ((opcode & 0xfc00707f) == 0xbc002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VNMSAC.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VNMSAC.VX
    if ((opcode & 0xfc00707f) == 0xbc006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VNMSAC.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VNMSUB.VV
    if ((opcode & 0xfc00707f) == 0xac002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VNMSUB.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VNMSUB.VX
    if ((opcode & 0xfc00707f) == 0xac006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VNMSUB.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VNSRA.WI
    if ((opcode & 0xfc00707f) == 0xb4003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), %s", "VNSRA.WI", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vm[a.vm]);
        return buff;
    }

    //    rv_v, VNSRA.WV
    if ((opcode & 0xfc00707f) == 0xb4000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VNSRA.WV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VNSRA.WX
    if ((opcode & 0xfc00707f) == 0xb4004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VNSRA.WX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VNSRL.WI
    if ((opcode & 0xfc00707f) == 0xb0003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), %s", "VNSRL.WI", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vm[a.vm]);
        return buff;
    }

    //    rv_v, VNSRL.WV
    if ((opcode & 0xfc00707f) == 0xb0000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VNSRL.WV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VNSRL.WX
    if ((opcode & 0xfc00707f) == 0xb0004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VNSRL.WX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VOR.VI
    if ((opcode & 0xfc00707f) == 0x28003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), %s", "VOR.VI", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vm[a.vm]);
        return buff;
    }

    //    rv_v, VOR.VV
    if ((opcode & 0xfc00707f) == 0x28000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VOR.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VOR.VX
    if ((opcode & 0xfc00707f) == 0x28004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VOR.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VREDAND.VS
    if ((opcode & 0xfc00707f) == 0x4002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VREDAND.VS", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VREDMAX.VS
    if ((opcode & 0xfc00707f) == 0x1c002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VREDMAX.VS", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VREDMAXU.VS
    if ((opcode & 0xfc00707f) == 0x18002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VREDMAXU.VS", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VREDMIN.VS
    if ((opcode & 0xfc00707f) == 0x14002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VREDMIN.VS", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VREDMINU.VS
    if ((opcode & 0xfc00707f) == 0x10002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VREDMINU.VS", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VREDOR.VS
    if ((opcode & 0xfc00707f) == 0x8002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VREDOR.VS", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VREDSUM.VS
    if ((opcode & 0xfc00707f) == 0x2057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VREDSUM.VS", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VREDXOR.VS
    if ((opcode & 0xfc00707f) == 0xc002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VREDXOR.VS", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VREM.VV
    if ((opcode & 0xfc00707f) == 0x8c002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VREM.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VREM.VX
    if ((opcode & 0xfc00707f) == 0x8c006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VREM.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VREMU.VV
    if ((opcode & 0xfc00707f) == 0x88002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VREMU.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VREMU.VX
    if ((opcode & 0xfc00707f) == 0x88006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VREMU.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VRGATHER.VI
    if ((opcode & 0xfc00707f) == 0x30003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), %s", "VRGATHER.VI", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vm[a.vm]);
        return buff;
    }

    //    rv_v, VRGATHER.VV
    if ((opcode & 0xfc00707f) == 0x30000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VRGATHER.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VRGATHER.VX
    if ((opcode & 0xfc00707f) == 0x30004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VRGATHER.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VRGATHEREI16.VV
    if ((opcode & 0xfc00707f) == 0x38000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VRGATHEREI16.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VRSUB.VI
    if ((opcode & 0xfc00707f) == 0xc003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), %s", "VRSUB.VI", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vm[a.vm]);
        return buff;
    }

    //    rv_v, VRSUB.VX
    if ((opcode & 0xfc00707f) == 0xc004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VRSUB.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VS1R.V
    if ((opcode & 0xfff0707f) == 0x2800027) {
        a.vs3 = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VS1R.V", vpr[a.vs3], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VS2R.V
    if ((opcode & 0xfff0707f) == 0x22800027) {
        a.vs3 = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VS2R.V", vpr[a.vs3], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VS4R.V
    if ((opcode & 0xfff0707f) == 0x62800027) {
        a.vs3 = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VS4R.V", vpr[a.vs3], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VS8R.V
    if ((opcode & 0xfff0707f) == 0xe2800027) {
        a.vs3 = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VS8R.V", vpr[a.vs3], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VSADD.VI
    if ((opcode & 0xfc00707f) == 0x84003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), %s", "VSADD.VI", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vm[a.vm]);
        return buff;
    }

    //    rv_v, VSADD.VV
    if ((opcode & 0xfc00707f) == 0x84000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSADD.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSADD.VX
    if ((opcode & 0xfc00707f) == 0x84004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSADD.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSADDU.VI
    if ((opcode & 0xfc00707f) == 0x80003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), %s", "VSADDU.VI", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vm[a.vm]);
        return buff;
    }

    //    rv_v, VSADDU.VV
    if ((opcode & 0xfc00707f) == 0x80000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSADDU.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSADDU.VX
    if ((opcode & 0xfc00707f) == 0x80004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSADDU.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSBC.VVM
    if ((opcode & 0xfe00707f) == 0x48000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VSBC.VVM", vpr[a.vd], vpr[a.vs2], vpr[a.vs1]);
        return buff;
    }

    //    rv_v, VSBC.VXM
    if ((opcode & 0xfe00707f) == 0x48004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VSBC.VXM", vpr[a.vd], vpr[a.vs2], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VSE16.V
    if ((opcode & 0x1df0707f) == 0x5027) {
        a.vs3 = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSE16.V", vpr[a.vs3], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VSE32.V
    if ((opcode & 0x1df0707f) == 0x6027) {
        a.vs3 = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSE32.V", vpr[a.vs3], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VSE64.V
    if ((opcode & 0x1df0707f) == 0x7027) {
        a.vs3 = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSE64.V", vpr[a.vs3], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VSE8.V
    if ((opcode & 0x1df0707f) == 0x27) {
        a.vs3 = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSE8.V", vpr[a.vs3], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VSETIVLI
    if ((opcode & 0xc000707f) == 0xc0007057) {
        a.imm = FX(opcode, 29, 20);
        a.imm2 = FX(opcode, 19, 15);
        a.rd = FX(opcode, 11, 7);
        const char *vta_str, *vma_str, *lmul_str, *sew_str;
        if (a.imm & 0b01000000)
            vta_str = "ta";
        else
            vta_str = "tu";
        if (a.imm & 0b10000000)
            vma_str = "ma";
        else
            vma_str = "mu";
        switch (a.imm & 0b00000111) {
            case 0b101: lmul_str = "mf8"; break;
            case 0b110: lmul_str = "mf4"; break;
            case 0b111: lmul_str = "mf2"; break;
            case 0b000: lmul_str = "m1"; break;
            case 0b001: lmul_str = "m2"; break;
            case 0b010: lmul_str = "m4"; break;
            case 0b011: lmul_str = "m8"; break;
            default: lmul_str = "reserved"; break;
        }
        switch ((a.imm & 0b00111000) >> 3) {
            case 0b000: sew_str = "e8"; break;
            case 0b001: sew_str = "e16"; break;
            case 0b010: sew_str = "e32"; break;
            case 0b011: sew_str = "e64"; break;
            default: sew_str = "reserved"; break;
        }

        snprintf(buff, sizeof(buff), "%-15s %s, %d, %s, %s, %s, %s", "VSETIVLI", gpr[a.rd], a.imm2, sew_str, lmul_str, vta_str, vma_str);
        return buff;
    }

    //    rv_v, VSETVL
    if ((opcode & 0xfe00707f) == 0x80007057) {
        a.rd = FX(opcode, 11, 7);
        a.rs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VSETVL", gpr[a.rd], gpr[a.rs2], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VSETVLI
    if ((opcode & 0x8000707f) == 0x7057) {
        a.imm = FX(opcode, 30, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.rd = FX(opcode, 11, 7);
        const char *vta_str, *vma_str, *lmul_str, *sew_str;
        if (a.imm & 0b01000000)
            vta_str = "ta";
        else
            vta_str = "tu";
        if (a.imm & 0b10000000)
            vma_str = "ma";
        else
            vma_str = "mu";
        switch (a.imm & 0b00000111) {
            case 0b101: lmul_str = "mf8"; break;
            case 0b110: lmul_str = "mf4"; break;
            case 0b111: lmul_str = "mf2"; break;
            case 0b000: lmul_str = "m1"; break;
            case 0b001: lmul_str = "m2"; break;
            case 0b010: lmul_str = "m4"; break;
            case 0b011: lmul_str = "m8"; break;
            default: lmul_str = "reserved"; break;
        }
        switch ((a.imm & 0b00111000) >> 3) {
            case 0b000: sew_str = "e8"; break;
            case 0b001: sew_str = "e16"; break;
            case 0b010: sew_str = "e32"; break;
            case 0b011: sew_str = "e64"; break;
            default: sew_str = "reserved"; break;
        }

        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s, %s", "VSETVLI", gpr[a.rd], gpr[a.rs1], sew_str, lmul_str, vta_str, vma_str);
        return buff;
    }

    //    rv_v, VSEXT.VF2
    if ((opcode & 0xfc0ff07f) == 0x4803a057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VSEXT.VF2", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSEXT.VF4
    if ((opcode & 0xfc0ff07f) == 0x4802a057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VSEXT.VF4", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSEXT.VF8
    if ((opcode & 0xfc0ff07f) == 0x4801a057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VSEXT.VF8", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSLIDE1DOWN.VX
    if ((opcode & 0xfc00707f) == 0x3c006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSLIDE1DOWN.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSLIDE1UP.VX
    if ((opcode & 0xfc00707f) == 0x38006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSLIDE1UP.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSLIDEDOWN.VI
    if ((opcode & 0xfc00707f) == 0x3c003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), %s", "VSLIDEDOWN.VI", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vm[a.vm]);
        return buff;
    }

    //    rv_v, VSLIDEDOWN.VX
    if ((opcode & 0xfc00707f) == 0x3c004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSLIDEDOWN.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSLIDEUP.VI
    if ((opcode & 0xfc00707f) == 0x38003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), %s", "VSLIDEUP.VI", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vm[a.vm]);
        return buff;
    }

    //    rv_v, VSLIDEUP.VX
    if ((opcode & 0xfc00707f) == 0x38004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSLIDEUP.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSLL.VI
    if ((opcode & 0xfc00707f) == 0x94003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), %s", "VSLL.VI", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vm[a.vm]);
        return buff;
    }

    //    rv_v, VSLL.VV
    if ((opcode & 0xfc00707f) == 0x94000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSLL.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSLL.VX
    if ((opcode & 0xfc00707f) == 0x94004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSLL.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSM.V
    if ((opcode & 0xfff0707f) == 0x2b00027) {
        a.vs3 = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "VSM.V", vpr[a.vs3], gpr[a.rs1]);
        return buff;
    }

    //    rv_v, VSMUL.VV
    if ((opcode & 0xfc00707f) == 0x9c000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSMUL.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSMUL.VX
    if ((opcode & 0xfc00707f) == 0x9c004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSMUL.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSOXEI16.V
    if ((opcode & 0x1c00707f) == 0xc005027) {
        a.vs3 = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VSOXEI16.V", vpr[a.vs3], vpr[a.vs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VSOXEI32.V
    if ((opcode & 0x1c00707f) == 0xc006027) {
        a.vs3 = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VSOXEI32.V", vpr[a.vs3], vpr[a.vs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VSOXEI64.V
    if ((opcode & 0x1c00707f) == 0xc007027) {
        a.vs3 = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VSOXEI64.V", vpr[a.vs3], vpr[a.vs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VSOXEI8.V
    if ((opcode & 0x1c00707f) == 0xc000027) {
        a.vs3 = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VSOXEI8.V", vpr[a.vs3], vpr[a.vs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VSRA.VI
    if ((opcode & 0xfc00707f) == 0xa4003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), %s", "VSRA.VI", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vm[a.vm]);
        return buff;
    }

    //    rv_v, VSRA.VV
    if ((opcode & 0xfc00707f) == 0xa4000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSRA.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSRA.VX
    if ((opcode & 0xfc00707f) == 0xa4004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSRA.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSRL.VI
    if ((opcode & 0xfc00707f) == 0xa0003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), %s", "VSRL.VI", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vm[a.vm]);
        return buff;
    }

    //    rv_v, VSRL.VV
    if ((opcode & 0xfc00707f) == 0xa0000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSRL.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSRL.VX
    if ((opcode & 0xfc00707f) == 0xa0004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSRL.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSSE16.V
    if ((opcode & 0x1c00707f) == 0x8005027) {
        a.vs3 = FX(opcode, 11, 7);
        a.rs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VSSE16.V", vpr[a.vs3], gpr[a.rs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VSSE32.V
    if ((opcode & 0x1c00707f) == 0x8006027) {
        a.vs3 = FX(opcode, 11, 7);
        a.rs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VSSE32.V", vpr[a.vs3], gpr[a.rs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VSSE64.V
    if ((opcode & 0x1c00707f) == 0x8007027) {
        a.vs3 = FX(opcode, 11, 7);
        a.rs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VSSE64.V", vpr[a.vs3], gpr[a.rs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VSSE8.V
    if ((opcode & 0x1c00707f) == 0x8000027) {
        a.vs3 = FX(opcode, 11, 7);
        a.rs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VSSE8.V", vpr[a.vs3], gpr[a.rs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VSSRA.VI
    if ((opcode & 0xfc00707f) == 0xac003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), %s", "VSSRA.VI", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vm[a.vm]);
        return buff;
    }

    //    rv_v, VSSRA.VV
    if ((opcode & 0xfc00707f) == 0xac000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSSRA.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSSRA.VX
    if ((opcode & 0xfc00707f) == 0xac004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSSRA.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSSRL.VI
    if ((opcode & 0xfc00707f) == 0xa8003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), %s", "VSSRL.VI", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vm[a.vm]);
        return buff;
    }

    //    rv_v, VSSRL.VV
    if ((opcode & 0xfc00707f) == 0xa8000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSSRL.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSSRL.VX
    if ((opcode & 0xfc00707f) == 0xa8004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSSRL.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSSUB.VV
    if ((opcode & 0xfc00707f) == 0x8c000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSSUB.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSSUB.VX
    if ((opcode & 0xfc00707f) == 0x8c004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSSUB.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSSUBU.VV
    if ((opcode & 0xfc00707f) == 0x88000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSSUBU.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSSUBU.VX
    if ((opcode & 0xfc00707f) == 0x88004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSSUBU.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSUB.VV
    if ((opcode & 0xfc00707f) == 0x8000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSUB.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSUB.VX
    if ((opcode & 0xfc00707f) == 0x8004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSUB.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VSUXEI16.V
    if ((opcode & 0x1c00707f) == 0x4005027) {
        a.vs3 = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VSUXEI16.V", vpr[a.vs3], vpr[a.vs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VSUXEI32.V
    if ((opcode & 0x1c00707f) == 0x4006027) {
        a.vs3 = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VSUXEI32.V", vpr[a.vs3], vpr[a.vs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VSUXEI64.V
    if ((opcode & 0x1c00707f) == 0x4007027) {
        a.vs3 = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VSUXEI64.V", vpr[a.vs3], vpr[a.vs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VSUXEI8.V
    if ((opcode & 0x1c00707f) == 0x4000027) {
        a.vs3 = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        a.nf = FX(opcode, 31, 29);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s, %s", "VSUXEI8.V", vpr[a.vs3], vpr[a.vs2], gpr[a.rs1], vm[a.vm], nf[a.nf]);
        return buff;
    }

    //    rv_v, VWADD.VV
    if ((opcode & 0xfc00707f) == 0xc4002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWADD.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWADD.VX
    if ((opcode & 0xfc00707f) == 0xc4006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWADD.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWADD.WV
    if ((opcode & 0xfc00707f) == 0xd4002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWADD.WV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWADD.WX
    if ((opcode & 0xfc00707f) == 0xd4006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWADD.WX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWADDU.VV
    if ((opcode & 0xfc00707f) == 0xc0002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWADDU.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWADDU.VX
    if ((opcode & 0xfc00707f) == 0xc0006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWADDU.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWADDU.WV
    if ((opcode & 0xfc00707f) == 0xd0002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWADDU.WV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWADDU.WX
    if ((opcode & 0xfc00707f) == 0xd0006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWADDU.WX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWMACC.VV
    if ((opcode & 0xfc00707f) == 0xf4002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWMACC.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWMACC.VX
    if ((opcode & 0xfc00707f) == 0xf4006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWMACC.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWMACCSU.VV
    if ((opcode & 0xfc00707f) == 0xfc002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWMACCSU.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWMACCSU.VX
    if ((opcode & 0xfc00707f) == 0xfc006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWMACCSU.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWMACCU.VV
    if ((opcode & 0xfc00707f) == 0xf0002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWMACCU.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWMACCU.VX
    if ((opcode & 0xfc00707f) == 0xf0006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWMACCU.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWMACCUS.VX
    if ((opcode & 0xfc00707f) == 0xf8006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWMACCUS.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWMUL.VV
    if ((opcode & 0xfc00707f) == 0xec002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWMUL.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWMUL.VX
    if ((opcode & 0xfc00707f) == 0xec006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWMUL.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWMULSU.VV
    if ((opcode & 0xfc00707f) == 0xe8002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWMULSU.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWMULSU.VX
    if ((opcode & 0xfc00707f) == 0xe8006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWMULSU.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWMULU.VV
    if ((opcode & 0xfc00707f) == 0xe0002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWMULU.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWMULU.VX
    if ((opcode & 0xfc00707f) == 0xe0006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWMULU.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWREDSUM.VS
    if ((opcode & 0xfc00707f) == 0xc4000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWREDSUM.VS", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWREDSUMU.VS
    if ((opcode & 0xfc00707f) == 0xc0000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWREDSUMU.VS", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWSUB.VV
    if ((opcode & 0xfc00707f) == 0xcc002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWSUB.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWSUB.VX
    if ((opcode & 0xfc00707f) == 0xcc006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWSUB.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWSUB.WV
    if ((opcode & 0xfc00707f) == 0xdc002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWSUB.WV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWSUB.WX
    if ((opcode & 0xfc00707f) == 0xdc006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWSUB.WX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWSUBU.VV
    if ((opcode & 0xfc00707f) == 0xc8002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWSUBU.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWSUBU.VX
    if ((opcode & 0xfc00707f) == 0xc8006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWSUBU.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWSUBU.WV
    if ((opcode & 0xfc00707f) == 0xd8002057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWSUBU.WV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VWSUBU.WX
    if ((opcode & 0xfc00707f) == 0xd8006057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWSUBU.WX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VXOR.VI
    if ((opcode & 0xfc00707f) == 0x2c003057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.imm = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d), %s", "VXOR.VI", vpr[a.vd], vpr[a.vs2], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vm[a.vm]);
        return buff;
    }

    //    rv_v, VXOR.VV
    if ((opcode & 0xfc00707f) == 0x2c000057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VXOR.VV", vpr[a.vd], vpr[a.vs2], vpr[a.vs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VXOR.VX
    if ((opcode & 0xfc00707f) == 0x2c004057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.rs1 = FX(opcode, 19, 15);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VXOR.VX", vpr[a.vd], vpr[a.vs2], gpr[a.rs1], vm[a.vm]);
        return buff;
    }

    //    rv_v, VZEXT.VF2
    if ((opcode & 0xfc0ff07f) == 0x48032057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VZEXT.VF2", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VZEXT.VF4
    if ((opcode & 0xfc0ff07f) == 0x48022057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VZEXT.VF4", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //    rv_v, VZEXT.VF8
    if ((opcode & 0xfc0ff07f) == 0x48012057) {
        a.vd = FX(opcode, 11, 7);
        a.vs2 = FX(opcode, 24, 20);
        a.vm = FX(opcode, 25, 25);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VZEXT.VF8", vpr[a.vd], vpr[a.vs2], vm[a.vm]);
        return buff;
    }

    //  rv_zbb, XNOR
    if ((opcode & 0xfe00707f) == 0x40004033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "XNOR", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //    rv_i, XOR
    if ((opcode & 0xfe00707f) == 0x4033) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.rs2 = FX(opcode, 24, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "XOR", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
        return buff;
    }

    //    rv_i, XORI
    if ((opcode & 0x707f) == 0x4013) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        a.imm = FX(opcode, 31, 20);
        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "XORI", gpr[a.rd], gpr[a.rs1], SIGN_EXTEND(a.imm, 12), SIGN_EXTEND(a.imm, 12));
        return buff;
    }

    // rv64_zbb, ZEXT.H
    if ((opcode & 0xfff0707f) == 0x800403b) {
        a.rd = FX(opcode, 11, 7);
        a.rs1 = FX(opcode, 19, 15);
        snprintf(buff, sizeof(buff), "%-15s %s, %s", "ZEXT.H", gpr[a.rd], gpr[a.rs1]);
        return buff;
    }


    snprintf(buff, sizeof(buff), "%08X ???", __builtin_bswap32(opcode));
    return buff;
}
