about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/dynarec/rv64/rv64_printer.c7364
1 files changed, 5634 insertions, 1730 deletions
diff --git a/src/dynarec/rv64/rv64_printer.c b/src/dynarec/rv64/rv64_printer.c
index 54f1ad51..1b84ea7c 100644
--- a/src/dynarec/rv64/rv64_printer.c
+++ b/src/dynarec/rv64/rv64_printer.c
@@ -7,1783 +7,5687 @@
 #include "rv64_printer.h"
 #include "debug.h"
 
+static const char gpr[32][9] = {
+    "zero",
+    "ra",
+    "sp",
+    "gp",
+    "tp",
+    "t0_mask",
+    "t1",
+    "t2_rip",
+    "s0_flags",
+    "s1",
+    "a0",
+    "a1",
+    "a2",
+    "a3",
+    "a4",
+    "a5",
+    "a6_rax",
+    "a7_rcx",
+    "s2_rdx",
+    "s3_rbx",
+    "s4_rsp",
+    "s5_rbp",
+    "s6_rsi",
+    "s7_rdi",
+    "s8_r8",
+    "s9_r9",
+    "s10_r10",
+    "s11_r11",
+    "t3_r12",
+    "t4_r13",
+    "t5_r14",
+    "t6_r15",
+};
+
+static const char fpr[32][5] = {
+    "ft0",
+    "ft1",
+    "ft2",
+    "ft3",
+    "ft4",
+    "ft5",
+    "ft6",
+    "ft7",
+    "fs0",
+    "fs1",
+    "fa0",
+    "fa1",
+    "fa2",
+    "fa3",
+    "fa4",
+    "fa5",
+    "fa6",
+    "fa7",
+    "fs2",
+    "fs3",
+    "fs4",
+    "fs5",
+    "fs6",
+    "fs7",
+    "fs8",
+    "fs9",
+    "fs10",
+    "fs11",
+    "ft8",
+    "ft9",
+    "ft10",
+    "ft11",
+};
+
+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;
+
     int32_t imm;
     int32_t imm2;
-    uint16_t csr;
-    char *name;
-    bool rvc;
-    bool f;
-} insn_t;
-
-static const char gpnames[32][9] = {
-    "zero", "ra",   "sp",   "gp",   "tp",   "t0_mask",   "t1",   "t2_rip",
-    "s0_flags",   "s1",   "a0",   "a1",   "a2",   "a3",   "a4",   "a5",
-    "a6_rax",   "a7_rcx",   "s2_rdx",   "s3_rbx",   "s4_rsp",   "s5_rbp",   "s6_rsi",   "s7_rdi",
-    "s8_r8",   "s9_r9",   "s10_r10",  "s11_r11",  "t3_r12",   "t4_r13",   "t5_r14",   "t6_r15",
-};
+    char* name;
+} rv64_print_t;
 
-static const char fpnames[32][5] = {
-    "ft0",  "ft1",  "ft2",  "ft3",  "ft4",  "ft5",  "ft6",  "ft7",
-    "fs0",  "fs1",  "fa0",  "fa1",  "fa2",  "fa3",  "fa4",  "fa5",
-    "fa6",  "fa7",  "fs2",  "fs3",  "fs4",  "fs5",  "fs6",  "fs7",
-    "fs8",  "fs9",  "fs10", "fs11", "ft8",  "ft9",  "ft10", "ft11",
-};
-
-#define QUADRANT(data) (((data) >>  0) & 0x3 )
-
-/**
- * normal types
-*/
-#define OPCODE(data)    (((data) >>  2) & 0x1f)
-#define RD(data)        (((data) >>  7) & 0x1f)
-#define RS1(data)       (((data) >> 15) & 0x1f)
-#define RS2(data)       (((data) >> 20) & 0x1f)
-#define RS3(data)       (((data) >> 27) & 0x1f)
-#define FUNCT2(data)    (((data) >> 25) & 0x3)
-#define FUNCT3(data)    (((data) >> 12) & 0x7)
-#define FUNCT7(data)    (((data) >> 25) & 0x7f)
-#define IMM116(data)    (((data) >> 26) & 0x3f)
-#define AQ(data)        (((data) >> 26) & 0x1)
-#define RL(data)        (((data) >> 25) & 0x1)
-#define THIMM2(data)    (((data) >> 20) & 0x3f)
-#define THFUNCT12(data) (((data) >> 20) & 0xfff)
-#define THFUNCT5(data)  (((data) >> 27) & 0x1f)
-
-static inline insn_t insn_utype_read(uint32_t data)
+const char* rv64_print(uint32_t opcode, uintptr_t addr)
 {
-    return (insn_t) {
-        .imm = (int32_t)data & 0xfffff000,
-        .rd = RD(data),
-    };
-}
+    static char buff[200];
+    rv64_print_t a;
 
-static inline insn_t insn_itype_read(uint32_t data)
-{
-    return (insn_t) {
-        .imm = (int32_t)data >> 20,
-        .rs1 = RS1(data),
-        .rd = RD(data),
-    };
-}
+    /****************
+     *  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 > code.c
+     *  Please do NOT edit the following code manually.
+     */
 
-static inline insn_t insn_jtype_read(uint32_t data)
-{
-    uint32_t imm20   = (data >> 31) & 0x1;
-    uint32_t imm101  = (data >> 21) & 0x3ff;
-    uint32_t imm11   = (data >> 20) & 0x1;
-    uint32_t imm1912 = (data >> 12) & 0xff;
-
-    int32_t imm = (imm20 << 20) | (imm1912 << 12) | (imm11 << 11) | (imm101 << 1);
-    imm = (imm << 11) >> 11;
-
-    return (insn_t) {
-        .imm = imm,
-        .rd = RD(data),
-    };
-}
+    //    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;
+    }
 
-static inline insn_t insn_btype_read(uint32_t data)
-{
-    uint32_t imm12  = (data >> 31) & 0x1;
-    uint32_t imm105 = (data >> 25) & 0x3f;
-    uint32_t imm41  = (data >>  8) & 0xf;
-    uint32_t imm11  = (data >>  7) & 0x1;
-
-    int32_t imm = (imm12 << 12) | (imm11 << 11) |(imm105 << 5) | (imm41 << 1);
-    imm = (imm << 19) >> 19;
-
-    return (insn_t) {
-        .imm = imm,
-        .rs1 = RS1(data),
-        .rs2 = RS2(data),
-    };
-}
+    // 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;
+    }
 
-static inline insn_t insn_rtype_read(uint32_t data)
-{
-    return (insn_t) {
-        .rs1 = RS1(data),
-        .rs2 = RS2(data),
-        .rd = RD(data),
-    };
-}
+    //    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;
+    }
 
-static inline insn_t insn_stype_read(uint32_t data)
-{
-    uint32_t imm115 = (data >> 25) & 0x7f;
-    uint32_t imm40  = (data >>  7) & 0x1f;
-
-    int32_t imm = (imm115 << 5) | imm40;
-    imm = (imm << 20) >> 20;
-    return (insn_t) {
-        .imm = imm,
-        .rs1 = RS1(data),
-        .rs2 = RS2(data),
-    };
-}
+    //  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;
+    }
 
-static inline insn_t insn_csrtype_read(uint32_t data)
-{
-    return (insn_t) {
-        .csr = data >> 20,
-        .rs1 = RS1(data),
-        .rd =  RD(data),
-    };
-}
+    //  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;
+    }
 
-static inline insn_t insn_fprtype_read(uint32_t data)
-{
-    return (insn_t) {
-        .rs1 = RS1(data),
-        .rs2 = RS2(data),
-        .rs3 = RS3(data),
-        .rd =  RD(data),
-    };
-}
+    //  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;
+    }
 
-/**
- * compressed types
-*/
-#define COPCODE(data)     (((data) >> 13) & 0x7 )
-#define CFUNCT1(data)     (((data) >> 12) & 0x1 )
-#define CFUNCT2LOW(data)  (((data) >>  5) & 0x3 )
-#define CFUNCT2HIGH(data) (((data) >> 10) & 0x3 )
-#define RP1(data)         (((data) >>  7) & 0x7 )
-#define RP2(data)         (((data) >>  2) & 0x7 )
-#define RC1(data)         (((data) >>  7) & 0x1f)
-#define RC2(data)         (((data) >>  2) & 0x1f)
-
-static inline insn_t insn_catype_read(uint16_t data)
-{
-    return (insn_t) {
-        .rd = RP1(data) + 8,
-        .rs2 = RP2(data) + 8,
-        .rvc = true,
-    };
-}
+    //    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;
+    }
 
-static inline insn_t insn_crtype_read(uint16_t data)
-{
-    return (insn_t) {
-        .rs1 = RC1(data),
-        .rs2 = RC2(data),
-        .rvc = true,
-    };
-}
+    //  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;
+    }
 
-static inline insn_t insn_citype_read(uint16_t data)
-{
-    uint32_t imm40 = (data >>  2) & 0x1f;
-    uint32_t imm5  = (data >> 12) & 0x1;
-    int32_t imm = (imm5 << 5) | imm40;
-    imm = (imm << 26) >> 26;
-
-    return (insn_t) {
-        .imm = imm,
-        .rd = RC1(data),
-        .rvc = true,
-    };
-}
+    //    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;
+    }
 
-static inline insn_t insn_citype_read2(uint16_t data)
-{
-    uint32_t imm86 = (data >>  2) & 0x7;
-    uint32_t imm43 = (data >>  5) & 0x3;
-    uint32_t imm5  = (data >> 12) & 0x1;
+    //  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;
+    }
 
-    int32_t imm = (imm86 << 6) | (imm43 << 3) | (imm5 << 5);
+    //    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;
+    }
 
-    return (insn_t) {
-        .imm = imm,
-        .rd = RC1(data),
-        .rvc = true,
-    };
-}
+    //  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;
+    }
 
-static inline insn_t insn_citype_read3(uint16_t data)
-{
-    uint32_t imm5  = (data >>  2) & 0x1;
-    uint32_t imm87 = (data >>  3) & 0x3;
-    uint32_t imm6  = (data >>  5) & 0x1;
-    uint32_t imm4  = (data >>  6) & 0x1;
-    uint32_t imm9  = (data >> 12) & 0x1;
-
-    int32_t imm = (imm5 << 5) | (imm87 << 7) | (imm6 << 6) | (imm4 << 4) | (imm9 << 9);
-    imm = (imm << 22) >> 22;
-
-    return (insn_t) {
-        .imm = imm,
-        .rd = RC1(data),
-        .rvc = true,
-    };
-}
+    //    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;
+    }
 
-static inline insn_t insn_citype_read4(uint16_t data)
-{
-    uint32_t imm5  = (data >> 12) & 0x1;
-    uint32_t imm42 = (data >>  4) & 0x7;
-    uint32_t imm76 = (data >>  2) & 0x3;
+    //  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;
+    }
 
-    int32_t imm = (imm5 << 5) | (imm42 << 2) | (imm76 << 6);
+    //    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;
+    }
 
-    return (insn_t) {
-        .imm = imm,
-        .rd = RC1(data),
-        .rvc = true,
-    };
-}
+    //  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;
+    }
 
-static inline insn_t insn_citype_read5(uint16_t data)
-{
-    uint32_t imm1612 = (data >>  2) & 0x1f;
-    uint32_t imm17   = (data >> 12) & 0x1;
-
-    int32_t imm = (imm1612 << 12) | (imm17 << 17);
-    imm = (imm << 14) >> 14;
-    return (insn_t) {
-        .imm = imm,
-        .rd = RC1(data),
-        .rvc = true,
-    };
-}
+    //    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;
+    }
 
-static inline insn_t insn_cbtype_read(uint16_t data)
-{
-    uint32_t imm5  = (data >>  2) & 0x1;
-    uint32_t imm21 = (data >>  3) & 0x3;
-    uint32_t imm76 = (data >>  5) & 0x3;
-    uint32_t imm43 = (data >> 10) & 0x3;
-    uint32_t imm8  = (data >> 12) & 0x1;
-
-    int32_t imm = (imm8 << 8) | (imm76 << 6) | (imm5 << 5) | (imm43 << 3) | (imm21 << 1);
-    imm = (imm << 23) >> 23;
-
-    return (insn_t) {
-        .imm = imm,
-        .rs1 = RP1(data) + 8,
-        .rvc = true,
-    };
-}
+    //  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;
+    }
 
-static inline insn_t insn_cbtype_read2(uint16_t data)
-{
-    uint32_t imm40 = (data >>  2) & 0x1f;
-    uint32_t imm5  = (data >> 12) & 0x1;
-    int32_t imm = (imm5 << 5) | imm40;
-    imm = (imm << 26) >> 26;
-
-    return (insn_t) {
-        .imm = imm,
-        .rd = RP1(data) + 8,
-        .rvc = true,
-    };
-}
+    //    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;
+    }
 
-static inline insn_t insn_cstype_read(uint16_t data)
-{
-    uint32_t imm76 = (data >>  5) & 0x3;
-    uint32_t imm53 = (data >> 10) & 0x7;
+    //  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;
+    }
 
-    int32_t imm = ((imm76 << 6) | (imm53 << 3));
+    //    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;
+    }
 
-    return (insn_t) {
-        .imm = imm,
-        .rs1 = RP1(data) + 8,
-        .rs2 = RP2(data) + 8,
-        .rvc = true,
-    };
-}
+    //  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;
+    }
 
-static inline insn_t insn_cstype_read2(uint16_t data)
-{
-    uint32_t imm6  = (data >>  5) & 0x1;
-    uint32_t imm2  = (data >>  6) & 0x1;
-    uint32_t imm53 = (data >> 10) & 0x7;
-
-    int32_t imm = ((imm6 << 6) | (imm2 << 2) | (imm53 << 3));
-
-    return (insn_t) {
-        .imm = imm,
-        .rs1 = RP1(data) + 8,
-        .rs2 = RP2(data) + 8,
-        .rvc = true,
-    };
-}
+    //    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;
+    }
 
-static inline insn_t insn_cjtype_read(uint16_t data)
-{
-    uint32_t imm5  = (data >>  2) & 0x1;
-    uint32_t imm31 = (data >>  3) & 0x7;
-    uint32_t imm7  = (data >>  6) & 0x1;
-    uint32_t imm6  = (data >>  7) & 0x1;
-    uint32_t imm10 = (data >>  8) & 0x1;
-    uint32_t imm98 = (data >>  9) & 0x3;
-    uint32_t imm4  = (data >> 11) & 0x1;
-    uint32_t imm11 = (data >> 12) & 0x1;
-
-    int32_t imm = ((imm5 << 5) | (imm31 << 1) | (imm7 << 7) | (imm6 << 6) |
-               (imm10 << 10) | (imm98 << 8) | (imm4 << 4) | (imm11 << 11));
-    imm = (imm << 20) >> 20;
-    return (insn_t) {
-        .imm = imm,
-        .rvc = true,
-    };
-}
+    //    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;
+    }
 
-static inline insn_t insn_cltype_read(uint16_t data)
-{
-    uint32_t imm6  = (data >>  5) & 0x1;
-    uint32_t imm2  = (data >>  6) & 0x1;
-    uint32_t imm53 = (data >> 10) & 0x7;
-
-    int32_t imm = (imm6 << 6) | (imm2 << 2) | (imm53 << 3);
-
-    return (insn_t) {
-        .imm = imm,
-        .rs1 = RP1(data) + 8,
-        .rd  = RP2(data) + 8,
-        .rvc = true,
-    };
-}
+    //    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;
+    }
 
-static inline insn_t insn_cltype_read2(uint16_t data)
-{
-    uint32_t imm76 = (data >>  5) & 0x3;
-    uint32_t imm53 = (data >> 10) & 0x7;
+    //  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;
+    }
 
-    int32_t imm = (imm76 << 6) | (imm53 << 3);
+    //    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], SIGN_EXTEND(a.imm, 20), SIGN_EXTEND(a.imm, 20));
+        return buff;
+    }
 
-    return (insn_t) {
-        .imm = imm,
-        .rs1 = RP1(data) + 8,
-        .rd  = RP2(data) + 8,
-        .rvc = true,
-    };
-}
+    //  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;
+    }
 
-static inline insn_t insn_csstype_read(uint16_t data)
-{
-    uint32_t imm86 = (data >>  7) & 0x7;
-    uint32_t imm53 = (data >> 10) & 0x7;
+    // 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;
+    }
 
-    int32_t imm = (imm86 << 6) | (imm53 << 3);
+    //    rv_i, BEQ
+    if ((opcode & 0x707f) == 0x63) {
+        a.rs1 = FX(opcode, 19, 15);
+        a.rs2 = FX(opcode, 24, 20);
+        a.imm = 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);
 
-    return (insn_t) {
-        .imm = imm,
-        .rs2 = RC2(data),
-        .rvc = true,
-    };
-}
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BEQ", gpr[a.rs1], gpr[a.rs2], a.imm, a.imm);
+        return buff;
+    }
 
-static inline insn_t insn_csstype_read2(uint16_t data)
-{
-    uint32_t imm76 = (data >> 7) & 0x3;
-    uint32_t imm52 = (data >> 9) & 0xf;
+    //  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;
+    }
 
-    int32_t imm = (imm76 << 6) | (imm52 << 2);
+    // 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;
+    }
 
-    return (insn_t) {
-        .imm = imm,
-        .rs2 = RC2(data),
-        .rvc = true,
-    };
-}
+    //    rv_i, BGE
+    if ((opcode & 0x707f) == 0x5063) {
+        a.rs1 = FX(opcode, 19, 15);
+        a.rs2 = FX(opcode, 24, 20);
+        a.imm = 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);
 
-static inline insn_t insn_ciwtype_read(uint16_t data)
-{
-    uint32_t imm3  = (data >>  5) & 0x1;
-    uint32_t imm2  = (data >>  6) & 0x1;
-    uint32_t imm96 = (data >>  7) & 0xf;
-    uint32_t imm54 = (data >> 11) & 0x3;
-
-    int32_t imm = (imm3 << 3) | (imm2 << 2) | (imm96 << 6) | (imm54 << 4);
-
-    return (insn_t) {
-        .imm = imm,
-        .rd = RP2(data) + 8,
-        .rvc = true,
-    };
-}
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BGE", gpr[a.rs1], gpr[a.rs2], a.imm, a.imm);
+        return buff;
+    }
 
-static inline insn_t insn_th1type_read(uint32_t data)
-{
-    return (insn_t) {
-        .rs1 = RS1(data),
-        .rs2 = RS2(data),
-        .rd = RD(data),
-        .imm = FUNCT2(data),
-    };
-}
+    //    rv_i, BGEU
+    if ((opcode & 0x707f) == 0x7063) {
+        a.rs1 = FX(opcode, 19, 15);
+        a.rs2 = FX(opcode, 24, 20);
+        a.imm = 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);
 
-static inline insn_t insn_th2type_read(uint32_t data)
-{
-    return (insn_t) {
-        .rs1 = RS1(data),
-        .rd = RD(data),
-        .imm = IMM116(data),
-        .imm2 = THIMM2(data),
-    };
-}
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BGEU", gpr[a.rs1], gpr[a.rs2], a.imm, a.imm);
+        return buff;
+    }
 
-#define RN(r) insn.f ? fpnames[insn.r] : gpnames[insn.r]
-
-#define PRINT_none() snprintf(buff, sizeof(buff), "%s", insn.name); return buff
-#define PRINT_rd_rs1() snprintf(buff, sizeof(buff), "%s\t%s, %s", insn.name, RN(rd), RN(rs1)); return buff
-#define PRINT_rd_rs1_rs2() snprintf(buff, sizeof(buff), "%s\t%s, %s, %s", insn.name, RN(rd), RN(rs1), RN(rs2)); return buff
-#define PRINT_rd_rs1_rs2_rs3() snprintf(buff, sizeof(buff), "%s\t%s, %s, %s, %s", insn.name, RN(rd), RN(rs1), RN(rs2), RN(rs3)); return buff
-#define PRINT_rd_rs1_imm() snprintf(buff, sizeof(buff), "%s\t%s, %s, %s0x%x", insn.name, RN(rd), RN(rs1), insn.imm>=0?"":"-", insn.imm>=0?insn.imm:-insn.imm); return buff
-#define PRINT_rd_rs1_immx() snprintf(buff, sizeof(buff), "%s\t%s, %s, 0x%x", insn.name, RN(rd), RN(rs1), insn.imm); return buff
-#define PRINT_rd_imm_rs1() snprintf(buff, sizeof(buff), "%s\t%s, %s0x%x(%s)", insn.name, RN(rd), insn.imm>=0?"":"-", insn.imm>=0?insn.imm:-insn.imm, gpnames[insn.rs1]); return buff
-#define PRINT_rs2_imm_rs1() snprintf(buff, sizeof(buff), "%s\t%s, %s0x%x(%s)", insn.name, RN(rs2), insn.imm>=0?"":"-", insn.imm>=0?insn.imm:-insn.imm, gpnames[insn.rs1]); return buff
-#define PRINT_rd_imm() snprintf(buff, sizeof(buff), "%s\t%s, %s0x%x", insn.name, RN(rd), insn.imm>=0?"":"-", insn.imm>=0?insn.imm:-insn.imm); return buff
-#define PRINT_rd_imm_rel() snprintf(buff, sizeof(buff), "%s\t%s, pc%s0x%x # 0x%"PRIx64, insn.name, RN(rd), insn.imm>=0?"+":"-", insn.imm>=0?insn.imm:-insn.imm, insn.imm+(uint64_t)addr); return buff
-#define PRINT_imm_rel() snprintf(buff, sizeof(buff), "%s\tpc%s0x%x # 0x%"PRIx64, insn.name, insn.imm>=0?"+":"-", insn.imm>=0?insn.imm:-insn.imm, insn.imm+(uint64_t)addr); return buff
-#define PRINT_rd_immx() snprintf(buff, sizeof(buff), "%s\t%s, 0x%x", insn.name, RN(rd), insn.imm); return buff
-#define PRINT_rs1_rs2_imm() snprintf(buff, sizeof(buff), "%s\t%s, %s, %s0x%x", insn.name, RN(rs1), RN(rs2), insn.imm>=0?"":"-", insn.imm>=0?insn.imm:-insn.imm); return buff
-#define PRINT_rs1_rs2_imm_rel() snprintf(buff, sizeof(buff), "%s\t%s, %s, pc%s0x%x # 0x%"PRIx64, insn.name, RN(rs1), RN(rs2), insn.imm>=0?"+":"-", insn.imm>=0?insn.imm:-insn.imm, insn.imm+(uint64_t)addr); return buff
-#define PRINT_fd_fs1() snprintf(buff, sizeof(buff), "%s\t%s, %s", insn.name, fpnames[insn.rd], fpnames[insn.rs1]); return buff
-#define PRINT_xd_fs1() snprintf(buff, sizeof(buff), "%s\t%s, %s", insn.name, gpnames[insn.rd], fpnames[insn.rs1]); return buff
-#define PRINT_fd_xs1() snprintf(buff, sizeof(buff), "%s\t%s, %s", insn.name, fpnames[insn.rd], gpnames[insn.rs1]); return buff
-#define PRINT_rd_fs1_fs2() snprintf(buff, sizeof(buff), "%s\t%s, %s, %s", insn.name, gpnames[insn.rd], RN(rs1), RN(rs2)); return buff
-#define PRINT_rd_rs1_aqrl() snprintf(buff, sizeof(buff), "%s%s%s\t%s, (%s)", insn.name, aq?".aq":"", rl?".rl":"", gpnames[insn.rd], gpnames[insn.rs1]); return buff
-#define PRINT_rd_rs1_rs2_aqrl() snprintf(buff, sizeof(buff), "%s%s%s\t%s, %s, (%s)", insn.name, aq?".aq":"", rl?".rl":"", gpnames[insn.rd], gpnames[insn.rs2], gpnames[insn.rs1]); return buff
-#define PRINT_rd_rs1_rs2_imm() snprintf(buff, sizeof(buff), "%s\t%s, %s, %s, %s0x%x", insn.name, RN(rd), RN(rs1), RN(rs2), insn.imm>=0?"":"-", insn.imm>=0?insn.imm:-insn.imm); return buff
-#define PRINT_rd_rs1_imm1_imm2() snprintf(buff, sizeof(buff), "%s\t%s, %s, %s0x%x, %s0x%x", insn.name, RN(rd), RN(rs1), insn.imm>=0?"":"-", insn.imm>=0?insn.imm:-insn.imm, insn.imm2>=0?"":"-", insn.imm2>=0?insn.imm2:-insn.imm2); return buff
-#define PRINT_rd1_rd2_rs1_imm_4() snprintf(buff, sizeof(buff), "%s\t%s, %s, (%s), %s0x%x, 4", insn.name, RN(rd), RN(rs2), RN(rs1), insn.imm>=0?"":"-", insn.imm>=0?insn.imm:-insn.imm); return buff
-
-// TODO: display csr name
-#define PRINT_rd_csr_rs1() snprintf(buff, sizeof(buff), "%s\t%s, %d, %s", insn.name, RN(rd), insn.csr, RN(rs1)); return buff
-#define PRINT_rd_csr_uimm() snprintf(buff, sizeof(buff), "%s\t%s, %d, %d", insn.name, RN(rd), insn.csr, (uint32_t)insn.imm); return buff
-
-const char* rv64_print(uint32_t data, uintptr_t addr)
-{
-    static char buff[200] = {0};
-
-    insn_t insn = { 0 };
-    uint32_t quadrant = QUADRANT(data);
-    switch (quadrant) {
-    case 0x0: {
-        uint32_t copcode = COPCODE(data);
-
-        switch (copcode) {
-        case 0x0:
-            insn =  insn_ciwtype_read(data);
-            insn.rs1 = 2;
-            insn.name = "addi";
-            assert(insn.imm != 0);
-            PRINT_rd_rs1_imm();
-        case 0x1:
-            insn =  insn_cltype_read2(data);
-            insn.name = "fld";
-            insn.f = true;
-            PRINT_rd_imm_rs1();
-        case 0x2:
-            insn =  insn_cltype_read(data);
-            insn.name = "lw";
-            PRINT_rd_imm_rs1();
-        case 0x3:
-            insn =  insn_cltype_read2(data);
-            insn.name = "ld";
-            PRINT_rd_imm_rs1();
-        case 0x5:
-            insn =  insn_cstype_read(data);
-            insn.name = "fsd";
-            insn.f = true;
-            PRINT_rs2_imm_rs1();
-        case 0x6:
-            insn =  insn_cstype_read2(data);
-            insn.name = "sw";
-            PRINT_rd_imm_rs1();
-        case 0x7:
-            insn =  insn_cstype_read(data);
-            insn.name = "sd";
-            PRINT_rs2_imm_rs1();
-        }
-    }
-    case 0x1: {
-        uint32_t copcode = COPCODE(data);
-
-        switch (copcode) {
-        case 0x0:
-            insn =  insn_citype_read(data);
-            insn.rs1 = insn.rd;
-            insn.name = "addi";
-            PRINT_rd_rs1_imm();
-        case 0x1:
-            insn =  insn_citype_read(data);
-            assert(insn.rd != 0);
-            insn.rs1 = insn.rd;
-            insn.name = "addiw";
-            PRINT_rd_rs1_imm();
-        case 0x2:
-            insn =  insn_citype_read(data);
-            insn.rs1 = 0;
-            insn.name = "addi";
-            PRINT_rd_rs1_imm();
-        case 0x3: {
-            int32_t rd = RC1(data);
-            if (rd == 2) {
-                insn =  insn_citype_read3(data);
-                assert(insn.imm != 0);
-                insn.rs1 = insn.rd;
-                insn.name = "addi";
-                PRINT_rd_rs1_imm();
-            } else {
-                insn =  insn_citype_read5(data);
-                assert(insn.imm != 0);
-                insn.name = "lui";
-                PRINT_rd_immx();
-            }
-        }
-        case 0x4: {
-            uint32_t cfunct2high = CFUNCT2HIGH(data);
-
-            switch (cfunct2high) {
-            case 0x0:  
-            case 0x1:  
-            case 0x2: {
-                insn =  insn_cbtype_read2(data);
-                insn.rs1 = insn.rd;
-
-                if (cfunct2high == 0x0) {
-                    insn.name = "srli";
-                } else if (cfunct2high == 0x1) {
-                    insn.name = "srai";
-                } else {
-                    insn.name = "andi";
-                }
-                PRINT_rd_rs1_imm();
-            }
-            case 0x3: {
-                uint32_t cfunct1 = CFUNCT1(data);
-
-                switch (cfunct1) {
-                case 0x0: {
-                    uint32_t cfunct2low = CFUNCT2LOW(data);
-
-                    insn =  insn_catype_read(data);
-                    insn.rs1 = insn.rd;
-
-                    switch (cfunct2low) {
-                    case 0x0:
-                        insn.name = "sub";
-                        break;
-                    case 0x1:
-                        insn.name = "xor";
-                        break;
-                    case 0x2:
-                        insn.name = "or";
-                        break;
-                    case 0x3:
-                        insn.name = "and";
-                        break;
-                    }
-                    break;
-                }
-                case 0x1: {
-                    uint32_t cfunct2low = CFUNCT2LOW(data);
-
-                    insn =  insn_catype_read(data);
-                    insn.rs1 = insn.rd;
-
-                    switch (cfunct2low) {
-                    case 0x0:
-                        insn.name = "subw";
-                        break;
-                    case 0x1:
-                        insn.name = "addw";
-                        break;
-                    default:
-                        goto unknown;
-                    }
-                    break;
-                }
-                }
-                PRINT_rd_rs1_rs2();
-            }
-            }
-        }
-        case 0x5:
-            insn =  insn_cjtype_read(data);
-            insn.rd = 0;
-            insn.name = "jal";
-            PRINT_rd_imm();
-        case 0x6:
-        case 0x7:
-            insn =  insn_cbtype_read(data);
-            insn.rs2 = 0;
-            insn.name = copcode == 0x6 ? "beq" : "bne";
-            PRINT_rs1_rs2_imm();
-        }
-    }
-    case 0x2: {
-        uint32_t copcode = COPCODE(data);
-        switch (copcode) {
-        case 0x0:
-            insn =  insn_citype_read(data);
-            insn.rs1 = insn.rd;
-            insn.name = "slli";
-            PRINT_rd_rs1_imm();
-        case 0x1:
-            insn =  insn_citype_read2(data);
-            insn.rs1 = 2;
-            insn.f = true;
-            insn.name = "fld";
-            PRINT_rd_imm_rs1();
-        case 0x2:
-            insn =  insn_citype_read4(data);
-            assert(insn.rd != 0);
-            insn.rs1 = 2;
-            insn.name = "lw";
-            PRINT_rd_imm_rs1();
-        case 0x3:
-            insn =  insn_citype_read2(data);
-            assert(insn.rd != 0);
-            insn.rs1 = 2;
-            insn.name = "ld";
-            PRINT_rd_imm_rs1();
-        case 0x4: {
-            uint32_t cfunct1 = CFUNCT1(data);
-
-            switch (cfunct1) {
-            case 0x0: {
-                insn =  insn_crtype_read(data);
-
-                if (insn.rs2 == 0) {
-                    assert(insn.rs1 != 0);
-                    insn.rd = 0;
-                    insn.name = "jalr";
-                    PRINT_rd_imm_rs1();
-                } else {
-                    insn.rd = insn.rs1;
-                    insn.rs1 = 0;
-                    insn.name = "add";
-                    PRINT_rd_rs1_rs2();
-                }
-            }
-            case 0x1: {
-                insn =  insn_crtype_read(data);
-                if (insn.rs1 == 0 && insn.rs2 == 0) {
-                    insn.name = "ebreak";
-                    PRINT_none();
-                } else if (insn.rs2 == 0) {
-                    insn.rd = 1;
-                    insn.name = "jalr";
-                    PRINT_rd_imm_rs1();
-                } else {
-                    insn.rd = insn.rs1;
-                    insn.name = "add";
-                    PRINT_rd_rs1_rs2();
-                }
-            }
-            }
-        }
-        case 0x5:
-            insn =  insn_csstype_read(data);
-            insn.rs1 = 2;
-            insn.f = true;
-            insn.name = "fsd";
-            PRINT_rs2_imm_rs1();
-        case 0x6:
-            insn =  insn_csstype_read2(data);
-            insn.rs1 = 2;
-            insn.name = "sw";
-            PRINT_rs2_imm_rs1();
-        case 0x7:
-            insn =  insn_csstype_read(data);
-            insn.rs1 = 2;
-            insn.name = "sd";
-            PRINT_rs2_imm_rs1();
-        }
-    }
-    case 0x3: {
-        uint32_t opcode = OPCODE(data);
-        switch (opcode) {
-        case 0x0: {
-            uint32_t funct3 = FUNCT3(data);
-
-            insn =  insn_itype_read(data);
-            switch (funct3) {
-            case 0x0:
-                insn.name = "lb";
-                break;
-            case 0x1:
-                insn.name = "lh";
-                break;
-            case 0x2:
-                insn.name = "lw";
-                break;
-            case 0x3:
-                insn.name = "ld";
-                break;
-            case 0x4:
-                insn.name = "lbu";
-                break;
-            case 0x5:
-                insn.name = "lhu";
-                break;
-            case 0x6:
-                insn.name = "lwu";
-                break;
-            default:
-                goto unknown;
-            }
-            PRINT_rd_imm_rs1();
-        }
-        case 0x1: {
-            uint32_t funct3 = FUNCT3(data);
-
-            insn =  insn_itype_read(data);
-            switch (funct3) {
-            case 0x2:
-                insn.name = "flw";
-                insn.f = true;
-                break;
-            case 0x3:
-                insn.name = "fld";
-                insn.f = true;
-                break;
-            default:
-                goto unknown;
-            }
-            PRINT_rd_imm_rs1();
-        }
-        case 0x2: { /* thead custom-0 */
-            uint32_t funct3 = FUNCT3(data);
-
-            switch (funct3) {
-            case 0x1: {
-                if (RS3(data) == 0x0) {
-                    insn = insn_th1type_read(data);
-                    insn.name = "th.addsl";
-                    PRINT_rd_rs1_rs2_imm();
-                } else if (IMM116(data) == 0x4) {
-                    insn = insn_itype_read(data);
-                    insn.name = "th.srri";
-                    insn.imm &= 0b111111;
-                    PRINT_rd_rs1_imm();
-                } else if (IMM116(data) == 0x22) {
-                    insn = insn_itype_read(data);
-                    insn.name = "th.tst";
-                    insn.imm &= 0b111111;
-                    PRINT_rd_rs1_imm();
-                } else if (FUNCT7(data) == 0xa) {
-                    insn = insn_itype_read(data);
-                    insn.name = "th.srriw";
-                    insn.imm &= 0b11111;
-                    PRINT_rd_rs1_imm();
-                } else if (THFUNCT12(data) == 0x840) {
-                    insn = insn_rtype_read(data);
-                    insn.name = "th.ff0";
-                    PRINT_rd_rs1();
-                } else if (THFUNCT12(data) == 0x860) {
-                    insn = insn_rtype_read(data);
-                    insn.name = "th.ff1";
-                    PRINT_rd_rs1();
-                } else if (THFUNCT12(data) == 0x820) {
-                    insn = insn_rtype_read(data);
-                    insn.name = "th.rev";
-                    PRINT_rd_rs1();
-                } else if (THFUNCT12(data) == 0x900) {
-                    insn = insn_rtype_read(data);
-                    insn.name = "th.revw";
-                    PRINT_rd_rs1();
-                } else if (THFUNCT12(data) == 0x800) {
-                    insn = insn_rtype_read(data);
-                    insn.name = "th.tstnbz";
-                    PRINT_rd_rs1();
-                }
-                goto unknown;
-            }
-            case 0x2: {
-                insn = insn_th2type_read(data);
-                insn.name = "th.ext";
-                PRINT_rd_rs1_imm1_imm2();
-            }
-            case 0x3: {
-                insn = insn_th2type_read(data);
-                insn.name = "th.extu";
-                PRINT_rd_rs1_imm1_imm2();
-            }
-            case 0x4: {
-                switch (THFUNCT5(data)) {
-                case 0x1f: {
-                    insn = insn_th1type_read(data);
-                    insn.name = "th.ldd";
-                    PRINT_rd1_rd2_rs1_imm_4();
-                }
-                default:
-                    goto unknown;
-                }
-            }
-            case 0x5: {
-                switch (THFUNCT5(data)) {
-                case 0x1f: {
-                    insn = insn_th1type_read(data);
-                    insn.name = "th.sdd";
-                    PRINT_rd1_rd2_rs1_imm_4();
-                }
-                default:
-                    goto unknown;
-                }
-            }
-            default:
-                goto unknown;
-            }
-            break;
-        }
-        case 0x3: {
-            uint32_t funct3 = FUNCT3(data);
-
-            switch (funct3) {
-            case 0x0: {
-                insn.name = "fence";
-                // TODO: handle pred succ
-                PRINT_none();
-            }
-            case 0x1: {
-                insn.name = "fence.i";
-                PRINT_none();
-            }
-            default:
-                goto unknown;
-            }
-        }
-        case 0x4: {
-            int hex = 0;
-            int mv_alias = 0;
-            int nop_alias = 0;
-            int not_alias = 0;
-            uint32_t funct3 = FUNCT3(data);
-
-            insn =  insn_itype_read(data);
-            switch (funct3) {
-            case 0x0:
-                insn.name = "addi";
-                if (insn.imm == 0) {
-                    if (insn.rd == 0 && insn.rs1 == 0) {
-                        nop_alias = 1;
-                        insn.name = "nop";
-                    } else {
-                        mv_alias = 1;
-                        insn.name = "mv";
-                    }
-                }
-                break;
-            case 0x1: {
-                uint32_t imm116 = IMM116(data);
-                switch (imm116) {
-                case 0x0:
-                    insn.name = "slli";
-                    break;
-                case 0x18: {
-                    uint32_t rs2 = RS2(data);
-                    switch (rs2) {
-                    case 0x0:
-                        insn.name = "clz";
-                        break;
-                    case 0x1:
-                        insn.name = "ctz";
-                        break;
-                    case 0x2:
-                        insn.name = "cpop";
-                        break;
-                    case 0x4:
-                        insn.name = "sext.b";
-                        break;
-                    case 0x5:
-                        insn.name = "sext.h";
-                        break;
-                    default:
-                        goto unknown;
-                    }
-                    PRINT_rd_rs1();
-                }
-                default:
-                    goto unknown;
-                }
-                break;
-            }
-            case 0x2:
-                insn.name = "slti";
-                break;
-            case 0x3:
-                insn.name = "sltiu";
-                break;
-            case 0x4:
-                insn.name = "xori";
-                hex = 1;
-                if (insn.imm == -1) {
-                    not_alias = 1;
-                    insn.name = "not";
-                }
-                break;
-            case 0x5: {
-                uint32_t imm116 = IMM116(data);
-
-                if (imm116 == 0x0) {
-                    insn.name = "srli";
-                } else if (imm116 == 0x10) {
-                    insn.name = "srai";
-                    insn.imm &= 0b111111;
-                } else if (imm116 == 0x12) {
-                    insn.name = "bexti";
-                    insn.imm &= 0b111111;
-                } else if (imm116 == 0x18) {
-                    insn.name = "rori";
-                    insn.imm &= 0b111111;
-                } else if (insn.imm==0b011010111000) {
-                    insn.name = "rev8";
-                    PRINT_rd_rs1();
-                }
-                break;
-            }
-            case 0x6:
-                insn.name = "ori";
-                hex = 1;
-                break;
-            case 0x7:
-                insn.name = "andi";
-                hex = 1;
-                break;
-            }
-            if (not_alias) {
-                PRINT_rd_rs1();
-            } else if (nop_alias) {
-                PRINT_none();
-            } else if (mv_alias) {
-                PRINT_rd_rs1();
-            } else if(hex) {
-                PRINT_rd_rs1_immx();
-            } else {
-                PRINT_rd_rs1_imm();
-            }
-        }
-        case 0x5: {
-            insn =  insn_utype_read(data);
-            insn.name = "auipc";
-            PRINT_rd_imm_rel();
-        }
-        case 0x6: {
-            uint32_t funct3 = FUNCT3(data);
-            uint32_t funct7 = FUNCT7(data);
-
-            insn =  insn_itype_read(data);
-
-            switch (funct3) {
-            case 0x0:
-                insn.name = "addiw";
-                break;
-            case 0x1:
-                switch (funct7) {
-                case 0x0:
-                    insn.name = "slliw";
-                    break;
-                case 0x4:
-                    insn.name = "slli.uw";
-                    break;
-                case 0x30: {
-                    uint32_t rs2 = RS2(data);
-                    switch (rs2) {
-                    case 0x0:
-                        insn.name = "clzw";
-                        break;
-                    case 0x1:
-                        insn.name = "ctzw";
-                        break;
-                    case 0x2:
-                        insn.name = "cpopw";
-                        break;
-                    default:
-                        goto unknown;
-                    }
-                    PRINT_rd_rs1();
-                }
-                default:
-                    goto unknown;
-                }
-                break;
-            case 0x5: {
-                switch (funct7) {
-                case 0x0:
-                    insn.name = "srliw";
-                    break;
-                case 0x20:
-                    insn.name = "sraiw";
-                    insn.imm &= 0b11111;
-                    break;
-                case 0x30:
-                    insn.name = "roriw";
-                    insn.imm &= 0b11111;
-                    break;
-                default:
-                    goto unknown;
-                }
-                break;
-            }
-            default:
-                goto unknown;
-            }
-            PRINT_rd_rs1_imm();
-        }
-        case 0x8: {
-            uint32_t funct3 = FUNCT3(data);
-
-            insn =  insn_stype_read(data);
-            switch (funct3) {
-            case 0x0:
-                insn.name = "sb";
-                break;
-            case 0x1:
-                insn.name = "sh";
-                break;
-            case 0x2:
-                insn.name = "sw";
-                break;
-            case 0x3:
-                insn.name = "sd";
-                break;
-            default:
-                goto unknown;
-            }
-            PRINT_rs2_imm_rs1();
-        }
-        case 0x9: {
-            uint32_t funct3 = FUNCT3(data);
-
-            insn =  insn_stype_read(data);
-            switch (funct3) {
-            case 0x2:
-                insn.name = "fsw";
-                insn.f = true;
-                break;
-            case 0x3:
-                insn.name = "fsd";
-                insn.f = true;
-                break;
-            default:
-                goto unknown;
-            }
-            PRINT_rs2_imm_rs1();
-        }
-        case 0xb: {
-            uint32_t funct3 = FUNCT3(data);
-            uint32_t rs1 = RS3(data);
-            bool aq = AQ(data), rl = RL(data);
-            insn =  insn_rtype_read(data);
-            switch(funct3) {
-            case 0x2:
-                switch (rs1) {
-                case 0x2:
-                    insn.name = "lr.w";
-                    PRINT_rd_rs1_aqrl();
-                case 0x3:
-                    insn.name = "sc.w";
-                    PRINT_rd_rs1_rs2_aqrl();
-                }
-            case 0x3:
-                switch (rs1) {
-                case 0x2:
-                    insn.name = "lr.d";
-                    PRINT_rd_rs1_aqrl();
-                case 0x3:
-                    insn.name = "sc.d";
-                    PRINT_rd_rs1_rs2_aqrl();
-                }
-            default:
-                goto unknown;
-            }
-        }
-        case 0xc: {
-            insn =  insn_rtype_read(data);
-
-            uint32_t funct3 = FUNCT3(data);
-            uint32_t funct7 = FUNCT7(data);
-
-            switch (funct7) {
-            case 0x0: {
-                switch (funct3) {
-                case 0x0:
-                    insn.name = "add";
-                    break;
-                case 0x1:
-                    insn.name = "sll";
-                    break;
-                case 0x2:
-                    insn.name = "slt";
-                    break;
-                case 0x3:
-                    insn.name = "sltu";
-                    break;
-                case 0x4:
-                    insn.name = "xor";
-                    break;
-                case 0x5:
-                    insn.name = "srl";
-                    break;
-                case 0x6:
-                    insn.name = "or";
-                    break;
-                case 0x7:
-                    insn.name = "and";
-                    break;
-                }
-            }
-            break;
-            case 0x1: {
-                switch (funct3) {
-                case 0x0:
-                    insn.name = "mul";
-                    break;
-                case 0x1:
-                    insn.name = "mulh";
-                    break;
-                case 0x2:
-                    insn.name = "mulhsu";
-                    break;
-                case 0x3:
-                    insn.name = "mulhu";
-                    break;
-                case 0x4:
-                    insn.name = "div";
-                    break;
-                case 0x5:
-                    insn.name = "divu";
-                    break;
-                case 0x6:
-                    insn.name = "rem";
-                    break;
-                case 0x7:
-                    insn.name = "remu";
-                    break;
-                }
-            }
-            break;
-            case 0x5: {
-                switch (funct3) {
-                case 0x4:
-                    insn.name = "min";
-                    break;
-                case 0x5:
-                    insn.name = "minu";
-                    break;
-                case 0x6:
-                    insn.name = "max";
-                    break;
-                case 0x7:
-                    insn.name = "maxu";
-                    break;
-                default:
-                    goto unknown;
-                }
-            }
-            break;
-            case 0x10: {
-                switch (funct3) {
-                case 0x2:
-                    insn.name = "sh1add";
-                    break;
-                case 0x4:
-                    insn.name = "sh2add";
-                    break;
-                case 0x6:
-                    insn.name = "sh3add";
-                    break;
-                default:
-                    goto unknown;
-                }
-            }
-            break;
-            case 0x20: {
-                switch (funct3) {
-                case 0x0:
-                    insn.name = "sub";
-                    break;
-                case 0x4:
-                    insn.name = "xnor";
-                    break;
-                case 0x5:
-                    insn.name = "sra";
-                    break;
-                case 0x6:
-                    insn.name = "orn";
-                    break;
-                case 0x7:
-                    insn.name = "andn";
-                    break;
-                default:
-                    goto unknown;
-                }
-                break;
-            }
-            case 0x24: {
-                switch (funct3) {
-                case 0x5:
-                    insn.name = "bext";
-                    break;
-                default:
-                    goto unknown;
-                }
-                break;
-            }
-            case 0x30: {
-                switch (funct3) {
-                case 0x1:
-                    insn.name = "rol";
-                    break;
-                case 0x5:
-                    insn.name = "ror";
-                    break;
-                default:
-                    goto unknown;
-                }
-            }
-            default:
-                goto unknown;
-            }
-            PRINT_rd_rs1_rs2();
-        }
-        case 0xd: {
-            insn =  insn_utype_read(data);
-            insn.name = "lui";
-            PRINT_rd_immx();
-        }
-        case 0xe: {
-            insn =  insn_rtype_read(data);
-
-            uint32_t funct3 = FUNCT3(data);
-            uint32_t funct7 = FUNCT7(data);
-
-            switch (funct7) {
-            case 0x0: {
-                switch (funct3) {
-                case 0x0:
-                    insn.name = "addw";
-                    break;
-                case 0x1:
-                    insn.name = "sllw";
-                    break;
-                case 0x5:
-                    insn.name = "srlw";
-                    break;
-                default:
-                    goto unknown;
-                }
-            }
-            break;
-            case 0x1: {
-                switch (funct3) {
-                case 0x0:
-                    insn.name = "mulw";
-                    break;
-                case 0x4:
-                    insn.name = "divw";
-                    break;
-                case 0x5:
-                    insn.name = "divuw";
-                    break;
-                case 0x6:
-                    insn.name = "remw";
-                    break;
-                case 0x7:
-                    insn.name = "remuw";
-                    break;
-                default:
-                    goto unknown;
-                }
-            }
-            break;
-            case 0x4: {
-                switch (funct3) {
-                    case 0x0:
-                        insn.name = "add.uw";
-                        break;
-                    case 0x4:
-                        assert(insn.rs2 == 0);
-                        insn.name = "zext.h";
-                        PRINT_rd_rs1();
-                    default:
-                        goto unknown;
-                }
-            }
-            break;
-            case 0x10: {
-                switch (funct3) {
-                    case 0x2:
-                        insn.name = "sh1add.uw";
-                        break;
-                    case 0x4:
-                        insn.name = "sh2add.uw";
-                        break;
-                    case 0x6:
-                        insn.name = "sh3add.uw";
-                        break;
-                    default:
-                        goto unknown;
-                }
-            }
-            break;
-            case 0x20: {
-                switch (funct3) {
-                case 0x0:
-                    insn.name = "subw";
-                    break;
-                case 0x5:
-                    insn.name = "sraw";
-                    break;
-                default:
-                    goto unknown;
-                }
-            }
-            break;
-            case 0x30: {
-                switch (funct3) {
-                case 0x1:
-                    insn.name = "rolw";
-                    break;
-                case 0x5:
-                    insn.name = "rorw";
-                    break;
-                default:
-                    goto unknown;
-                }
-            }
-            default:
-                goto unknown;
-            }
-            PRINT_rd_rs1_rs2();
-        }
-        case 0x10: {
-            uint32_t funct2 = FUNCT2(data);
-
-            insn =  insn_fprtype_read(data);
-            switch (funct2) {
-            case 0x0:
-                insn.name = "fmadd.s";
-                insn.f = true;
-                break;
-            case 0x1:
-                insn.name = "fmadd.d";
-                insn.f = true;
-                break;
-            default:
-                goto unknown;
-            }
-            PRINT_rd_rs1_rs2();
-        }
-        case 0x11: {
-            uint32_t funct2 = FUNCT2(data);
-
-            insn =  insn_fprtype_read(data);
-            switch (funct2) {
-            case 0x0:
-                insn.name = "fmsub.s";
-                insn.f = true;
-                break;
-            case 0x1:
-                insn.name = "fmsub.d";
-                insn.f = true;
-                break;
-            default:
-                goto unknown;
-            }
-            PRINT_rd_rs1_rs2();
-        }
-        case 0x12: {
-            uint32_t funct2 = FUNCT2(data);
-
-            insn =  insn_fprtype_read(data);
-            switch (funct2) {
-            case 0x0:
-                insn.name = "fnmsub.s";
-                insn.f = true;
-                break;
-            case 0x1:
-                insn.name = "fnmsub.d";
-                insn.f = true;
-                break;
-            default:
-                goto unknown;
-            }
-            PRINT_rd_rs1_rs2_rs3();
-        }
-        case 0x13: {
-            uint32_t funct2 = FUNCT2(data);
-
-            insn =  insn_fprtype_read(data);
-            switch (funct2) {
-            case 0x0:
-                insn.name = "fnmadd.s";
-                insn.f = true;
-                break;
-            case 0x1:
-                insn.name = "fnmadd.d";
-                insn.f = true;
-                break;
-            default:
-                goto unknown;
-            }
-            PRINT_rd_rs1_rs2_rs3();
-        }
-        case 0x14: {
-            uint32_t funct7 = FUNCT7(data);
-
-            insn =  insn_rtype_read(data);
-            insn.f = true;
-            switch (funct7) {
-            case 0x0: 
-                insn.name = "fadd.s";
-                PRINT_rd_rs1_rs2();
-            case 0x1: 
-                insn.name = "fadd.d";
-                PRINT_rd_rs1_rs2();
-            case 0x4: 
-                insn.name = "fsub.s";
-                PRINT_rd_rs1_rs2();
-            case 0x5: 
-                insn.name = "fsub.d";
-                PRINT_rd_rs1_rs2();
-            case 0x8: 
-                insn.name = "fmul.s";
-                PRINT_rd_rs1_rs2();
-            case 0x9: 
-                insn.name = "fmul.d";
-                PRINT_rd_rs1_rs2();
-            case 0xc: 
-                insn.name = "fdiv.s";
-                PRINT_rd_rs1_rs2();
-            case 0xd: 
-                insn.name = "fdiv.d";
-                PRINT_rd_rs1_rs2();
-            case 0x10: {
-                uint32_t funct3 = FUNCT3(data);
-
-                switch (funct3) {
-                case 0x0:
-                    insn.name = "fsgnj.s";
-                    break;
-                case 0x1:
-                    insn.name = "fsgnjn.s";
-                    break;
-                case 0x2:
-                    insn.name = "fsgnjx.s";
-                    break;
-                default:
-                    goto unknown;
-                }
-                PRINT_rd_rs1_rs2();
-            }
-            case 0x11: {
-                uint32_t funct3 = FUNCT3(data);
-
-                switch (funct3) {
-                case 0x0:
-                    insn.name = "fsgnj.d";
-                    break;
-                case 0x1:
-                    insn.name = "fsgnjn.d";
-                    break;
-                case 0x2:
-                    insn.name = "fsgnjx.d";
-                    break;
-                default:
-                    goto unknown;
-                }
-                PRINT_rd_rs1_rs2();
-            }
-            case 0x14: {
-                uint32_t funct3 = FUNCT3(data);
-
-                switch (funct3) {
-                case 0x0:
-                    insn.name = "fmin.s";
-                    break;
-                case 0x1:
-                    insn.name = "fmax.s";
-                    break;
-                default:
-                    goto unknown;
-                }
-                PRINT_rd_rs1_rs2();
-            }
-            case 0x15: {
-                uint32_t funct3 = FUNCT3(data);
-
-                switch (funct3) {
-                case 0x0:
-                    insn.name = "fmin.d";
-                    break;
-                case 0x1:
-                    insn.name = "fmax.d";
-                    break;
-                default:
-                    goto unknown;
-                }
-                PRINT_rd_rs1_rs2();
-            }
-            case 0x20:
-                assert(RS2(data) == 1);
-                insn.name = "fcvt.s.d";
-                PRINT_fd_fs1();
-            case 0x21:
-                assert(RS2(data) == 0);
-                insn.name = "fcvt.d.s";
-                PRINT_fd_fs1();
-            case 0x2c:
-                assert(insn.rs2 == 0);
-                insn.name = "fsqrt.s";
-                PRINT_fd_fs1();
-            case 0x2d:
-                assert(insn.rs2 == 0);
-                insn.name = "fsqrt.d";
-                PRINT_fd_fs1();
-            case 0x50: {
-                uint32_t funct3 = FUNCT3(data);
-
-                switch (funct3) {
-                case 0x0:
-                    insn.name = "fle.s";
-                    break;
-                case 0x1:
-                    insn.name = "flt.s";
-                    break;
-                case 0x2:
-                    insn.name = "feq.s";
-                    break;
-                default:
-                    goto unknown;
-                }
-                PRINT_rd_fs1_fs2();
-            }
-            case 0x51: {
-                uint32_t funct3 = FUNCT3(data);
-
-                switch (funct3) {
-                case 0x0:
-                    insn.name = "fle.d";
-                    break;
-                case 0x1:
-                    insn.name = "flt.d";
-                    break;
-                case 0x2:
-                    insn.name = "feq.d";
-                    break;
-                default:
-                    goto unknown;
-                }
-                PRINT_rd_fs1_fs2();
-            }
-            case 0x60: {
-                uint32_t rs2 = RS2(data);
-
-                switch (rs2) {
-                case 0x0:
-                    insn.name = "fcvt.w.s";
-                    break;
-                case 0x1:
-                    insn.name = "fcvt.wu.s";
-                    break;
-                case 0x2:
-                    insn.name = "fcvt.l.s";
-                    break;
-                case 0x3:
-                    insn.name = "fcvt.lu.s";
-                    break;
-                default:
-                    goto unknown;
-                }
-                PRINT_xd_fs1();
-            }
-            case 0x61: {
-                uint32_t rs2 = RS2(data);
-
-                switch (rs2) {
-                case 0x0:
-                    insn.name = "fcvt.w.d";
-                    break;
-                case 0x1:
-                    insn.name = "fcvt.wu.d";
-                    break;
-                case 0x2:
-                    insn.name = "fcvt.l.d";
-                    break;
-                case 0x3:
-                    insn.name = "fcvt.lu.d";
-                    break;
-                default:
-                    goto unknown;
-                }
-                PRINT_xd_fs1();
-            }
-            case 0x68: {
-                uint32_t rs2 = RS2(data);
-
-                switch (rs2) {
-                case 0x0:
-                    insn.name = "fcvt.s.w";
-                    break;
-                case 0x1:
-                    insn.name = "fcvt.s.wu";
-                    break;
-                case 0x2:
-                    insn.name = "fcvt.s.l";
-                    break;
-                case 0x3:
-                    insn.name = "fcvt.s.lu";
-                    break;
-                default:
-                    goto unknown;
-                }
-                PRINT_fd_xs1();
-            }
-            case 0x69: {
-                uint32_t rs2 = RS2(data);
-
-                switch (rs2) {
-                case 0x0:
-                    insn.name = "fcvt.d.w";
-                    break;
-                case 0x1:
-                    insn.name = "fcvt.d.wu";
-                    break;
-                case 0x2:
-                    insn.name = "fcvt.d.l";
-                    break;
-                case 0x3:
-                    insn.name = "fcvt.d.lu";
-                    break;
-                default:
-                    goto unknown;
-                }
-                PRINT_fd_xs1();
-            }
-            case 0x70: {
-                assert(RS2(data) == 0);
-                uint32_t funct3 = FUNCT3(data);
-
-                switch (funct3) {
-                case 0x0:
-                    insn.name = "fmv.x.w";
-                    break;
-                case 0x1:
-                    insn.name = "fclass.s";
-                    break;
-                default:
-                    goto unknown;
-                }
-                PRINT_xd_fs1();
-            }
-            case 0x71: {
-                assert(RS2(data) == 0);
-                uint32_t funct3 = FUNCT3(data);
-
-                switch (funct3) {
-                case 0x0:
-                    insn.name = "fmv.x.d";
-                    break;
-                case 0x1:
-                    insn.name = "fclass.d";
-                    break;
-                default:
-                    goto unknown;
-                }
-                PRINT_xd_fs1();
-            }
-            case 0x78:
-                assert(RS2(data) == 0 && FUNCT3(data) == 0);
-                insn.name = "fmv.w.x";
-                PRINT_fd_xs1();
-            case 0x79:
-                assert(RS2(data) == 0 && FUNCT3(data) == 0);
-                insn.name = "fmv.d.x";
-                PRINT_fd_xs1();
-            }
-            default:
-                goto unknown;
-        }
-        case 0x18: {
-            insn =  insn_btype_read(data);
-
-            uint32_t funct3 = FUNCT3(data);
-            switch (funct3) {
-            case 0x0:
-                insn.name = "beq";
-                break;
-            case 0x1:
-                insn.name = "bne";
-                break;
-            case 0x4:
-                insn.name = "blt";
-                break;
-            case 0x5:
-                insn.name = "bge";
-                break;
-            case 0x6:
-                insn.name = "bltu";
-                break;
-            case 0x7:
-                insn.name = "bgeu";
-                break;
-            default:
-                goto unknown;
-            }
-
-            PRINT_rs1_rs2_imm_rel();
-        }
-        case 0x19: {
-            insn =  insn_itype_read(data);
-            insn.name = "jalr";
-            PRINT_rd_imm_rs1();
-        }
-        case 0x1b: {
-            insn =  insn_jtype_read(data);
-            if (insn.rd != 0) {
-                insn.name = "jal";
-                PRINT_rd_imm_rel();
-            } else {
-                insn.name = "j";
-                PRINT_imm_rel();
-            }
-        }
-        case 0x1c: {
-            if (data == 0x73) {
-                insn.name = "ecall";
-                PRINT_none();
-            }
-
-            uint32_t funct3 = FUNCT3(data);
-            insn =  insn_csrtype_read(data);
-            switch(funct3) {
-            case 0x1:
-                insn.name = "csrrw";
-                PRINT_rd_csr_rs1();
-            case 0x2:
-                insn.name = "csrrs";
-                PRINT_rd_csr_rs1();
-            case 0x3:
-                insn.name = "csrrc";
-                PRINT_rd_csr_rs1();
-            case 0x5:
-                insn.name = "csrrwi";
-                PRINT_rd_csr_uimm();
-            case 0x6:
-                insn.name = "csrrsi";
-                PRINT_rd_csr_uimm();
-            case 0x7:
-                insn.name = "csrrci";
-                PRINT_rd_csr_uimm();
-            }
-        }
-        }
-    }
-    }
-
-unknown:
-    snprintf(buff, sizeof(buff), "%08X ???", __builtin_bswap32(data));
+    //  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 = 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);
+
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BLT", gpr[a.rs1], gpr[a.rs2], a.imm, 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 = 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);
+
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BLTU", gpr[a.rs1], gpr[a.rs2], a.imm, 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 = 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);
+
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "BNE", gpr[a.rs1], gpr[a.rs2], a.imm, 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_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.imm = FX(opcode, 31, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "CSRRC", gpr[a.rd], gpr[a.rs1], a.imm, a.imm);
+        return buff;
+    }
+
+    // rv_zicsr, CSRRCI
+    if ((opcode & 0x707f) == 0x7073) {
+        a.rd = FX(opcode, 11, 7);
+        a.imm = 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.imm, a.imm, 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.imm = FX(opcode, 31, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "CSRRS", gpr[a.rd], gpr[a.rs1], a.imm, a.imm);
+        return buff;
+    }
+
+    // rv_zicsr, CSRRSI
+    if ((opcode & 0x707f) == 0x6073) {
+        a.rd = FX(opcode, 11, 7);
+        a.imm = 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.imm, a.imm, 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.imm = FX(opcode, 31, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "CSRRW", gpr[a.rd], gpr[a.rs1], a.imm, a.imm);
+        return buff;
+    }
+
+    // rv_zicsr, CSRRWI
+    if ((opcode & 0x707f) == 0x5073) {
+        a.rd = FX(opcode, 11, 7);
+        a.imm = 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.imm, a.imm, 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_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 = 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 = 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 = 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);
+
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d)", "JAL", gpr[a.rd], SIGN_EXTEND(a.imm, 20), SIGN_EXTEND(a.imm, 20));
+        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], SIGN_EXTEND(a.imm, 20), SIGN_EXTEND(a.imm, 20));
+        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 = 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 = 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 = 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 = 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.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VAADD.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VAADD.VX
+    if ((opcode & 0xfc00707f) == 0x24006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VAADD.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VAADDU.VV
+    if ((opcode & 0xfc00707f) == 0x20002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VAADDU.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VAADDU.VX
+    if ((opcode & 0xfc00707f) == 0x20006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VAADDU.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VADC.VIM
+    if ((opcode & 0xfe00707f) == 0x40003057) {
+        a.vd = FX(opcode, 11, 7);
+        a.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s", "VADC.VIM", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2]);
+        return buff;
+    }
+
+    //    rv_v, VADC.VVM
+    if ((opcode & 0xfe00707f) == 0x40000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VADC.VVM", vpr[a.vd], vpr[a.vs1], vpr[a.vs2]);
+        return buff;
+    }
+
+    //    rv_v, VADC.VXM
+    if ((opcode & 0xfe00707f) == 0x40004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VADC.VXM", vpr[a.vd], gpr[a.rs1], vpr[a.vs2]);
+        return buff;
+    }
+
+    //    rv_v, VADD.VI
+    if ((opcode & 0xfc00707f) == 0x3057) {
+        a.vd = FX(opcode, 11, 7);
+        a.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s, %s", "VADD.VI", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VADD.VV
+    if ((opcode & 0xfc00707f) == 0x57) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VADD.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VADD.VX
+    if ((opcode & 0xfc00707f) == 0x4057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VADD.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VAND.VI
+    if ((opcode & 0xfc00707f) == 0x24003057) {
+        a.vd = FX(opcode, 11, 7);
+        a.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s, %s", "VAND.VI", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VAND.VV
+    if ((opcode & 0xfc00707f) == 0x24000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VAND.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VAND.VX
+    if ((opcode & 0xfc00707f) == 0x24004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VAND.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VASUB.VV
+    if ((opcode & 0xfc00707f) == 0x2c002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VASUB.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VASUB.VX
+    if ((opcode & 0xfc00707f) == 0x2c006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VASUB.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VASUBU.VV
+    if ((opcode & 0xfc00707f) == 0x28002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VASUBU.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VASUBU.VX
+    if ((opcode & 0xfc00707f) == 0x28006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VASUBU.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VCOMPRESS.VM
+    if ((opcode & 0xfe00707f) == 0x5e002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VCOMPRESS.VM", vpr[a.vd], vpr[a.vs1], vpr[a.vs2]);
+        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.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VDIV.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VDIV.VX
+    if ((opcode & 0xfc00707f) == 0x84006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VDIV.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VDIVU.VV
+    if ((opcode & 0xfc00707f) == 0x80002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VDIVU.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VDIVU.VX
+    if ((opcode & 0xfc00707f) == 0x80006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VDIVU.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFADD.VF
+    if ((opcode & 0xfc00707f) == 0x5057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFADD.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFADD.VV
+    if ((opcode & 0xfc00707f) == 0x1057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFADD.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], 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.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFDIV.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFDIV.VV
+    if ((opcode & 0xfc00707f) == 0x80001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFDIV.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], 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.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMACC.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFMACC.VV
+    if ((opcode & 0xfc00707f) == 0xb0001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMACC.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFMADD.VF
+    if ((opcode & 0xfc00707f) == 0xa0005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMADD.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFMADD.VV
+    if ((opcode & 0xfc00707f) == 0xa0001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMADD.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFMAX.VF
+    if ((opcode & 0xfc00707f) == 0x18005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMAX.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFMAX.VV
+    if ((opcode & 0xfc00707f) == 0x18001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMAX.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFMERGE.VFM
+    if ((opcode & 0xfe00707f) == 0x5c005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VFMERGE.VFM", vpr[a.vd], fpr[a.rs1], vpr[a.vs2]);
+        return buff;
+    }
+
+    //    rv_v, VFMIN.VF
+    if ((opcode & 0xfc00707f) == 0x10005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMIN.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFMIN.VV
+    if ((opcode & 0xfc00707f) == 0x10001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMIN.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFMSAC.VF
+    if ((opcode & 0xfc00707f) == 0xb8005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMSAC.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFMSAC.VV
+    if ((opcode & 0xfc00707f) == 0xb8001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMSAC.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFMSUB.VF
+    if ((opcode & 0xfc00707f) == 0xa8005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMSUB.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFMSUB.VV
+    if ((opcode & 0xfc00707f) == 0xa8001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMSUB.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFMUL.VF
+    if ((opcode & 0xfc00707f) == 0x90005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMUL.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFMUL.VV
+    if ((opcode & 0xfc00707f) == 0x90001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFMUL.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], 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.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFNMACC.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFNMACC.VV
+    if ((opcode & 0xfc00707f) == 0xb4001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFNMACC.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFNMADD.VF
+    if ((opcode & 0xfc00707f) == 0xa4005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFNMADD.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFNMADD.VV
+    if ((opcode & 0xfc00707f) == 0xa4001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFNMADD.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFNMSAC.VF
+    if ((opcode & 0xfc00707f) == 0xbc005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFNMSAC.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFNMSAC.VV
+    if ((opcode & 0xfc00707f) == 0xbc001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFNMSAC.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFNMSUB.VF
+    if ((opcode & 0xfc00707f) == 0xac005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFNMSUB.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFNMSUB.VV
+    if ((opcode & 0xfc00707f) == 0xac001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFNMSUB.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFRDIV.VF
+    if ((opcode & 0xfc00707f) == 0x84005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFRDIV.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], 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.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFREDMAX.VS", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFREDMIN.VS
+    if ((opcode & 0xfc00707f) == 0x14001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFREDMIN.VS", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFREDOSUM.VS
+    if ((opcode & 0xfc00707f) == 0xc001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFREDOSUM.VS", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFREDUSUM.VS
+    if ((opcode & 0xfc00707f) == 0x4001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFREDUSUM.VS", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], 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.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFRSUB.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFSGNJ.VF
+    if ((opcode & 0xfc00707f) == 0x20005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFSGNJ.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFSGNJ.VV
+    if ((opcode & 0xfc00707f) == 0x20001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFSGNJ.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFSGNJN.VF
+    if ((opcode & 0xfc00707f) == 0x24005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFSGNJN.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFSGNJN.VV
+    if ((opcode & 0xfc00707f) == 0x24001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFSGNJN.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFSGNJX.VF
+    if ((opcode & 0xfc00707f) == 0x28005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFSGNJX.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFSGNJX.VV
+    if ((opcode & 0xfc00707f) == 0x28001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFSGNJX.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFSLIDE1DOWN.VF
+    if ((opcode & 0xfc00707f) == 0x3c005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFSLIDE1DOWN.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFSLIDE1UP.VF
+    if ((opcode & 0xfc00707f) == 0x38005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFSLIDE1UP.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], 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.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFSUB.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFSUB.VV
+    if ((opcode & 0xfc00707f) == 0x8001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFSUB.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFWADD.VF
+    if ((opcode & 0xfc00707f) == 0xc0005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWADD.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFWADD.VV
+    if ((opcode & 0xfc00707f) == 0xc0001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWADD.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFWADD.WF
+    if ((opcode & 0xfc00707f) == 0xd0005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWADD.WF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFWADD.WV
+    if ((opcode & 0xfc00707f) == 0xd0001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWADD.WV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], 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.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWMACC.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFWMACC.VV
+    if ((opcode & 0xfc00707f) == 0xf0001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWMACC.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFWMSAC.VF
+    if ((opcode & 0xfc00707f) == 0xf8005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWMSAC.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFWMSAC.VV
+    if ((opcode & 0xfc00707f) == 0xf8001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWMSAC.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFWMUL.VF
+    if ((opcode & 0xfc00707f) == 0xe0005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWMUL.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFWMUL.VV
+    if ((opcode & 0xfc00707f) == 0xe0001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWMUL.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFWNMACC.VF
+    if ((opcode & 0xfc00707f) == 0xf4005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWNMACC.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFWNMACC.VV
+    if ((opcode & 0xfc00707f) == 0xf4001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWNMACC.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFWNMSAC.VF
+    if ((opcode & 0xfc00707f) == 0xfc005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWNMSAC.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFWNMSAC.VV
+    if ((opcode & 0xfc00707f) == 0xfc001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWNMSAC.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFWREDOSUM.VS
+    if ((opcode & 0xfc00707f) == 0xcc001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWREDOSUM.VS", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFWREDUSUM.VS
+    if ((opcode & 0xfc00707f) == 0xc4001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWREDUSUM.VS", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFWSUB.VF
+    if ((opcode & 0xfc00707f) == 0xc8005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWSUB.VF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFWSUB.VV
+    if ((opcode & 0xfc00707f) == 0xc8001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWSUB.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFWSUB.WF
+    if ((opcode & 0xfc00707f) == 0xd8005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWSUB.WF", vpr[a.vd], fpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VFWSUB.WV
+    if ((opcode & 0xfc00707f) == 0xd8001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VFWSUB.WV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], 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.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        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], gpr[a.rs1], vpr[a.vs2], vm[a.vm], nf[a.nf]);
+        return buff;
+    }
+
+    //    rv_v, VLOXEI32.V
+    if ((opcode & 0x1c00707f) == 0xc006007) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        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], gpr[a.rs1], vpr[a.vs2], vm[a.vm], nf[a.nf]);
+        return buff;
+    }
+
+    //    rv_v, VLOXEI64.V
+    if ((opcode & 0x1c00707f) == 0xc007007) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        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], gpr[a.rs1], vpr[a.vs2], vm[a.vm], nf[a.nf]);
+        return buff;
+    }
+
+    //    rv_v, VLOXEI8.V
+    if ((opcode & 0x1c00707f) == 0xc000007) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        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], gpr[a.rs1], vpr[a.vs2], vm[a.vm], nf[a.nf]);
+        return buff;
+    }
+
+    //    rv_v, VLSE16.V
+    if ((opcode & 0x1c00707f) == 0x8005007) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.rs2 = FX(opcode, 24, 20);
+        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.rs1], gpr[a.rs2], vm[a.vm], nf[a.nf]);
+        return buff;
+    }
+
+    //    rv_v, VLSE32.V
+    if ((opcode & 0x1c00707f) == 0x8006007) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.rs2 = FX(opcode, 24, 20);
+        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.rs1], gpr[a.rs2], vm[a.vm], nf[a.nf]);
+        return buff;
+    }
+
+    //    rv_v, VLSE64.V
+    if ((opcode & 0x1c00707f) == 0x8007007) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.rs2 = FX(opcode, 24, 20);
+        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.rs1], gpr[a.rs2], vm[a.vm], nf[a.nf]);
+        return buff;
+    }
+
+    //    rv_v, VLSE8.V
+    if ((opcode & 0x1c00707f) == 0x8000007) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.rs2 = FX(opcode, 24, 20);
+        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.rs1], gpr[a.rs2], vm[a.vm], nf[a.nf]);
+        return buff;
+    }
+
+    //    rv_v, VLUXEI16.V
+    if ((opcode & 0x1c00707f) == 0x4005007) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        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], gpr[a.rs1], vpr[a.vs2], vm[a.vm], nf[a.nf]);
+        return buff;
+    }
+
+    //    rv_v, VLUXEI32.V
+    if ((opcode & 0x1c00707f) == 0x4006007) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        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], gpr[a.rs1], vpr[a.vs2], vm[a.vm], nf[a.nf]);
+        return buff;
+    }
+
+    //    rv_v, VLUXEI64.V
+    if ((opcode & 0x1c00707f) == 0x4007007) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        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], gpr[a.rs1], vpr[a.vs2], vm[a.vm], nf[a.nf]);
+        return buff;
+    }
+
+    //    rv_v, VLUXEI8.V
+    if ((opcode & 0x1c00707f) == 0x4000007) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        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], gpr[a.rs1], vpr[a.vs2], vm[a.vm], nf[a.nf]);
+        return buff;
+    }
+
+    //    rv_v, VMACC.VV
+    if ((opcode & 0xfc00707f) == 0xb4002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMACC.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMACC.VX
+    if ((opcode & 0xfc00707f) == 0xb4006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMACC.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMADC.VI
+    if ((opcode & 0xfe00707f) == 0x46003057) {
+        a.vd = FX(opcode, 11, 7);
+        a.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s", "VMADC.VI", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2]);
+        return buff;
+    }
+
+    //    rv_v, VMADC.VIM
+    if ((opcode & 0xfe00707f) == 0x44003057) {
+        a.vd = FX(opcode, 11, 7);
+        a.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s", "VMADC.VIM", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2]);
+        return buff;
+    }
+
+    //    rv_v, VMADC.VV
+    if ((opcode & 0xfe00707f) == 0x46000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMADC.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2]);
+        return buff;
+    }
+
+    //    rv_v, VMADC.VVM
+    if ((opcode & 0xfe00707f) == 0x44000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMADC.VVM", vpr[a.vd], vpr[a.vs1], vpr[a.vs2]);
+        return buff;
+    }
+
+    //    rv_v, VMADC.VX
+    if ((opcode & 0xfe00707f) == 0x46004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMADC.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2]);
+        return buff;
+    }
+
+    //    rv_v, VMADC.VXM
+    if ((opcode & 0xfe00707f) == 0x44004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMADC.VXM", vpr[a.vd], gpr[a.rs1], vpr[a.vs2]);
+        return buff;
+    }
+
+    //    rv_v, VMADD.VV
+    if ((opcode & 0xfc00707f) == 0xa4002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMADD.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMADD.VX
+    if ((opcode & 0xfc00707f) == 0xa4006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMADD.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMAND.MM
+    if ((opcode & 0xfe00707f) == 0x66002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMAND.MM", vpr[a.vd], vpr[a.vs1], vpr[a.vs2]);
+        return buff;
+    }
+
+    //    rv_v, VMANDN.MM
+    if ((opcode & 0xfe00707f) == 0x62002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMANDN.MM", vpr[a.vd], vpr[a.vs1], vpr[a.vs2]);
+        return buff;
+    }
+
+    //    rv_v, VMAX.VV
+    if ((opcode & 0xfc00707f) == 0x1c000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMAX.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMAX.VX
+    if ((opcode & 0xfc00707f) == 0x1c004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMAX.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMAXU.VV
+    if ((opcode & 0xfc00707f) == 0x18000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMAXU.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMAXU.VX
+    if ((opcode & 0xfc00707f) == 0x18004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMAXU.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMERGE.VIM
+    if ((opcode & 0xfe00707f) == 0x5c003057) {
+        a.vd = FX(opcode, 11, 7);
+        a.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s", "VMERGE.VIM", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2]);
+        return buff;
+    }
+
+    //    rv_v, VMERGE.VVM
+    if ((opcode & 0xfe00707f) == 0x5c000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMERGE.VVM", vpr[a.vd], vpr[a.vs1], vpr[a.vs2]);
+        return buff;
+    }
+
+    //    rv_v, VMERGE.VXM
+    if ((opcode & 0xfe00707f) == 0x5c004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMERGE.VXM", vpr[a.vd], gpr[a.rs1], vpr[a.vs2]);
+        return buff;
+    }
+
+    //    rv_v, VMFEQ.VF
+    if ((opcode & 0xfc00707f) == 0x60005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMFEQ.VF", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMFEQ.VV
+    if ((opcode & 0xfc00707f) == 0x60001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMFEQ.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMFGE.VF
+    if ((opcode & 0xfc00707f) == 0x7c005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMFGE.VF", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMFGT.VF
+    if ((opcode & 0xfc00707f) == 0x74005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMFGT.VF", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMFLE.VF
+    if ((opcode & 0xfc00707f) == 0x64005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMFLE.VF", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMFLE.VV
+    if ((opcode & 0xfc00707f) == 0x64001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMFLE.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMFLT.VF
+    if ((opcode & 0xfc00707f) == 0x6c005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMFLT.VF", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMFLT.VV
+    if ((opcode & 0xfc00707f) == 0x6c001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMFLT.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMFNE.VF
+    if ((opcode & 0xfc00707f) == 0x70005057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMFNE.VF", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMFNE.VV
+    if ((opcode & 0xfc00707f) == 0x70001057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMFNE.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMIN.VV
+    if ((opcode & 0xfc00707f) == 0x14000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMIN.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMIN.VX
+    if ((opcode & 0xfc00707f) == 0x14004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMIN.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMINU.VV
+    if ((opcode & 0xfc00707f) == 0x10000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMINU.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMINU.VX
+    if ((opcode & 0xfc00707f) == 0x10004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMINU.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMNAND.MM
+    if ((opcode & 0xfe00707f) == 0x76002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMNAND.MM", vpr[a.vd], vpr[a.vs1], vpr[a.vs2]);
+        return buff;
+    }
+
+    //    rv_v, VMNOR.MM
+    if ((opcode & 0xfe00707f) == 0x7a002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMNOR.MM", vpr[a.vd], vpr[a.vs1], vpr[a.vs2]);
+        return buff;
+    }
+
+    //    rv_v, VMOR.MM
+    if ((opcode & 0xfe00707f) == 0x6a002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMOR.MM", vpr[a.vd], vpr[a.vs1], vpr[a.vs2]);
+        return buff;
+    }
+
+    //    rv_v, VMORN.MM
+    if ((opcode & 0xfe00707f) == 0x72002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMORN.MM", vpr[a.vd], vpr[a.vs1], vpr[a.vs2]);
+        return buff;
+    }
+
+    //    rv_v, VMSBC.VV
+    if ((opcode & 0xfe00707f) == 0x4e000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMSBC.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2]);
+        return buff;
+    }
+
+    //    rv_v, VMSBC.VVM
+    if ((opcode & 0xfe00707f) == 0x4c000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMSBC.VVM", vpr[a.vd], vpr[a.vs1], vpr[a.vs2]);
+        return buff;
+    }
+
+    //    rv_v, VMSBC.VX
+    if ((opcode & 0xfe00707f) == 0x4e004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMSBC.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2]);
+        return buff;
+    }
+
+    //    rv_v, VMSBC.VXM
+    if ((opcode & 0xfe00707f) == 0x4c004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMSBC.VXM", vpr[a.vd], gpr[a.rs1], vpr[a.vs2]);
+        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.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s, %s", "VMSEQ.VI", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMSEQ.VV
+    if ((opcode & 0xfc00707f) == 0x60000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSEQ.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMSEQ.VX
+    if ((opcode & 0xfc00707f) == 0x60004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSEQ.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMSGT.VI
+    if ((opcode & 0xfc00707f) == 0x7c003057) {
+        a.vd = FX(opcode, 11, 7);
+        a.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s, %s", "VMSGT.VI", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMSGT.VX
+    if ((opcode & 0xfc00707f) == 0x7c004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSGT.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMSGTU.VI
+    if ((opcode & 0xfc00707f) == 0x78003057) {
+        a.vd = FX(opcode, 11, 7);
+        a.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s, %s", "VMSGTU.VI", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMSGTU.VX
+    if ((opcode & 0xfc00707f) == 0x78004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSGTU.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], 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.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s, %s", "VMSLE.VI", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMSLE.VV
+    if ((opcode & 0xfc00707f) == 0x74000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSLE.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMSLE.VX
+    if ((opcode & 0xfc00707f) == 0x74004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSLE.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMSLEU.VI
+    if ((opcode & 0xfc00707f) == 0x70003057) {
+        a.vd = FX(opcode, 11, 7);
+        a.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s, %s", "VMSLEU.VI", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMSLEU.VV
+    if ((opcode & 0xfc00707f) == 0x70000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSLEU.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMSLEU.VX
+    if ((opcode & 0xfc00707f) == 0x70004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSLEU.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMSLT.VV
+    if ((opcode & 0xfc00707f) == 0x6c000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSLT.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMSLT.VX
+    if ((opcode & 0xfc00707f) == 0x6c004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSLT.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMSLTU.VV
+    if ((opcode & 0xfc00707f) == 0x68000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSLTU.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMSLTU.VX
+    if ((opcode & 0xfc00707f) == 0x68004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSLTU.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMSNE.VI
+    if ((opcode & 0xfc00707f) == 0x64003057) {
+        a.vd = FX(opcode, 11, 7);
+        a.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s, %s", "VMSNE.VI", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMSNE.VV
+    if ((opcode & 0xfc00707f) == 0x64000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSNE.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMSNE.VX
+    if ((opcode & 0xfc00707f) == 0x64004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMSNE.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], 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.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMUL.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMUL.VX
+    if ((opcode & 0xfc00707f) == 0x94006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMUL.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMULH.VV
+    if ((opcode & 0xfc00707f) == 0x9c002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMULH.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMULH.VX
+    if ((opcode & 0xfc00707f) == 0x9c006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMULH.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMULHSU.VV
+    if ((opcode & 0xfc00707f) == 0x98002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMULHSU.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMULHSU.VX
+    if ((opcode & 0xfc00707f) == 0x98006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMULHSU.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMULHU.VV
+    if ((opcode & 0xfc00707f) == 0x90002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMULHU.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VMULHU.VX
+    if ((opcode & 0xfc00707f) == 0x90006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VMULHU.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], 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.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMXNOR.MM", vpr[a.vd], vpr[a.vs1], vpr[a.vs2]);
+        return buff;
+    }
+
+    //    rv_v, VMXOR.MM
+    if ((opcode & 0xfe00707f) == 0x6e002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VMXOR.MM", vpr[a.vd], vpr[a.vs1], vpr[a.vs2]);
+        return buff;
+    }
+
+    //    rv_v, VNCLIP.WI
+    if ((opcode & 0xfc00707f) == 0xbc003057) {
+        a.vd = FX(opcode, 11, 7);
+        a.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s, %s", "VNCLIP.WI", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VNCLIP.WV
+    if ((opcode & 0xfc00707f) == 0xbc000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VNCLIP.WV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VNCLIP.WX
+    if ((opcode & 0xfc00707f) == 0xbc004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VNCLIP.WX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VNCLIPU.WI
+    if ((opcode & 0xfc00707f) == 0xb8003057) {
+        a.vd = FX(opcode, 11, 7);
+        a.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s, %s", "VNCLIPU.WI", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VNCLIPU.WV
+    if ((opcode & 0xfc00707f) == 0xb8000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VNCLIPU.WV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VNCLIPU.WX
+    if ((opcode & 0xfc00707f) == 0xb8004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VNCLIPU.WX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VNMSAC.VV
+    if ((opcode & 0xfc00707f) == 0xbc002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VNMSAC.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VNMSAC.VX
+    if ((opcode & 0xfc00707f) == 0xbc006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VNMSAC.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VNMSUB.VV
+    if ((opcode & 0xfc00707f) == 0xac002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VNMSUB.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VNMSUB.VX
+    if ((opcode & 0xfc00707f) == 0xac006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VNMSUB.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VNSRA.WI
+    if ((opcode & 0xfc00707f) == 0xb4003057) {
+        a.vd = FX(opcode, 11, 7);
+        a.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s, %s", "VNSRA.WI", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VNSRA.WV
+    if ((opcode & 0xfc00707f) == 0xb4000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VNSRA.WV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VNSRA.WX
+    if ((opcode & 0xfc00707f) == 0xb4004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VNSRA.WX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VNSRL.WI
+    if ((opcode & 0xfc00707f) == 0xb0003057) {
+        a.vd = FX(opcode, 11, 7);
+        a.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s, %s", "VNSRL.WI", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VNSRL.WV
+    if ((opcode & 0xfc00707f) == 0xb0000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VNSRL.WV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VNSRL.WX
+    if ((opcode & 0xfc00707f) == 0xb0004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VNSRL.WX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VOR.VI
+    if ((opcode & 0xfc00707f) == 0x28003057) {
+        a.vd = FX(opcode, 11, 7);
+        a.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s, %s", "VOR.VI", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VOR.VV
+    if ((opcode & 0xfc00707f) == 0x28000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VOR.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VOR.VX
+    if ((opcode & 0xfc00707f) == 0x28004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VOR.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VREDAND.VS
+    if ((opcode & 0xfc00707f) == 0x4002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VREDAND.VS", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VREDMAX.VS
+    if ((opcode & 0xfc00707f) == 0x1c002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VREDMAX.VS", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VREDMAXU.VS
+    if ((opcode & 0xfc00707f) == 0x18002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VREDMAXU.VS", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VREDMIN.VS
+    if ((opcode & 0xfc00707f) == 0x14002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VREDMIN.VS", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VREDMINU.VS
+    if ((opcode & 0xfc00707f) == 0x10002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VREDMINU.VS", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VREDOR.VS
+    if ((opcode & 0xfc00707f) == 0x8002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VREDOR.VS", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VREDSUM.VS
+    if ((opcode & 0xfc00707f) == 0x2057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VREDSUM.VS", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VREDXOR.VS
+    if ((opcode & 0xfc00707f) == 0xc002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VREDXOR.VS", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VREM.VV
+    if ((opcode & 0xfc00707f) == 0x8c002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VREM.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VREM.VX
+    if ((opcode & 0xfc00707f) == 0x8c006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VREM.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VREMU.VV
+    if ((opcode & 0xfc00707f) == 0x88002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VREMU.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VREMU.VX
+    if ((opcode & 0xfc00707f) == 0x88006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VREMU.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VRGATHER.VI
+    if ((opcode & 0xfc00707f) == 0x30003057) {
+        a.vd = FX(opcode, 11, 7);
+        a.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s, %s", "VRGATHER.VI", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VRGATHER.VV
+    if ((opcode & 0xfc00707f) == 0x30000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VRGATHER.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VRGATHER.VX
+    if ((opcode & 0xfc00707f) == 0x30004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VRGATHER.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VRGATHEREI16.VV
+    if ((opcode & 0xfc00707f) == 0x38000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VRGATHEREI16.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VRSUB.VI
+    if ((opcode & 0xfc00707f) == 0xc003057) {
+        a.vd = FX(opcode, 11, 7);
+        a.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s, %s", "VRSUB.VI", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VRSUB.VX
+    if ((opcode & 0xfc00707f) == 0xc004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VRSUB.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], 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.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s, %s", "VSADD.VI", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSADD.VV
+    if ((opcode & 0xfc00707f) == 0x84000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSADD.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSADD.VX
+    if ((opcode & 0xfc00707f) == 0x84004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSADD.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSADDU.VI
+    if ((opcode & 0xfc00707f) == 0x80003057) {
+        a.vd = FX(opcode, 11, 7);
+        a.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s, %s", "VSADDU.VI", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSADDU.VV
+    if ((opcode & 0xfc00707f) == 0x80000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSADDU.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSADDU.VX
+    if ((opcode & 0xfc00707f) == 0x80004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSADDU.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSBC.VVM
+    if ((opcode & 0xfe00707f) == 0x48000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VSBC.VVM", vpr[a.vd], vpr[a.vs1], vpr[a.vs2]);
+        return buff;
+    }
+
+    //    rv_v, VSBC.VXM
+    if ((opcode & 0xfe00707f) == 0x48004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s", "VSBC.VXM", vpr[a.vd], gpr[a.rs1], vpr[a.vs2]);
+        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.rd = FX(opcode, 11, 7);
+        a.imm = FX(opcode, 19, 15);
+        a.imm = FX(opcode, 29, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), 0x%x(%d)", "VSETIVLI", gpr[a.rd], a.imm, a.imm, a.imm, a.imm);
+        return buff;
+    }
+
+    //    rv_v, VSETVL
+    if ((opcode & 0xfe00707f) == 0x80007057) {
+        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", "VSETVL", gpr[a.rd], gpr[a.rs1], gpr[a.rs2]);
+        return buff;
+    }
+
+    //    rv_v, VSETVLI
+    if ((opcode & 0x8000707f) == 0x7057) {
+        a.rd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.imm = FX(opcode, 30, 20);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, 0x%x(%d)", "VSETVLI", gpr[a.rd], gpr[a.rs1], a.imm, a.imm);
+        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.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSLIDE1DOWN.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSLIDE1UP.VX
+    if ((opcode & 0xfc00707f) == 0x38006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSLIDE1UP.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSLIDEDOWN.VI
+    if ((opcode & 0xfc00707f) == 0x3c003057) {
+        a.vd = FX(opcode, 11, 7);
+        a.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s, %s", "VSLIDEDOWN.VI", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSLIDEDOWN.VX
+    if ((opcode & 0xfc00707f) == 0x3c004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSLIDEDOWN.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSLIDEUP.VI
+    if ((opcode & 0xfc00707f) == 0x38003057) {
+        a.vd = FX(opcode, 11, 7);
+        a.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s, %s", "VSLIDEUP.VI", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSLIDEUP.VX
+    if ((opcode & 0xfc00707f) == 0x38004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSLIDEUP.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSLL.VI
+    if ((opcode & 0xfc00707f) == 0x94003057) {
+        a.vd = FX(opcode, 11, 7);
+        a.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s, %s", "VSLL.VI", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSLL.VV
+    if ((opcode & 0xfc00707f) == 0x94000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSLL.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSLL.VX
+    if ((opcode & 0xfc00707f) == 0x94004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSLL.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], 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.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSMUL.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSMUL.VX
+    if ((opcode & 0xfc00707f) == 0x9c004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSMUL.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSOXEI16.V
+    if ((opcode & 0x1c00707f) == 0xc005027) {
+        a.vs3 = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        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], gpr[a.rs1], vpr[a.vs2], vm[a.vm], nf[a.nf]);
+        return buff;
+    }
+
+    //    rv_v, VSOXEI32.V
+    if ((opcode & 0x1c00707f) == 0xc006027) {
+        a.vs3 = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        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], gpr[a.rs1], vpr[a.vs2], vm[a.vm], nf[a.nf]);
+        return buff;
+    }
+
+    //    rv_v, VSOXEI64.V
+    if ((opcode & 0x1c00707f) == 0xc007027) {
+        a.vs3 = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        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], gpr[a.rs1], vpr[a.vs2], vm[a.vm], nf[a.nf]);
+        return buff;
+    }
+
+    //    rv_v, VSOXEI8.V
+    if ((opcode & 0x1c00707f) == 0xc000027) {
+        a.vs3 = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        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], gpr[a.rs1], vpr[a.vs2], vm[a.vm], nf[a.nf]);
+        return buff;
+    }
+
+    //    rv_v, VSRA.VI
+    if ((opcode & 0xfc00707f) == 0xa4003057) {
+        a.vd = FX(opcode, 11, 7);
+        a.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s, %s", "VSRA.VI", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSRA.VV
+    if ((opcode & 0xfc00707f) == 0xa4000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSRA.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSRA.VX
+    if ((opcode & 0xfc00707f) == 0xa4004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSRA.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSRL.VI
+    if ((opcode & 0xfc00707f) == 0xa0003057) {
+        a.vd = FX(opcode, 11, 7);
+        a.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s, %s", "VSRL.VI", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSRL.VV
+    if ((opcode & 0xfc00707f) == 0xa0000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSRL.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSRL.VX
+    if ((opcode & 0xfc00707f) == 0xa0004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSRL.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSSE16.V
+    if ((opcode & 0x1c00707f) == 0x8005027) {
+        a.vs3 = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.rs2 = FX(opcode, 24, 20);
+        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.rs1], gpr[a.rs2], vm[a.vm], nf[a.nf]);
+        return buff;
+    }
+
+    //    rv_v, VSSE32.V
+    if ((opcode & 0x1c00707f) == 0x8006027) {
+        a.vs3 = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.rs2 = FX(opcode, 24, 20);
+        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.rs1], gpr[a.rs2], vm[a.vm], nf[a.nf]);
+        return buff;
+    }
+
+    //    rv_v, VSSE64.V
+    if ((opcode & 0x1c00707f) == 0x8007027) {
+        a.vs3 = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.rs2 = FX(opcode, 24, 20);
+        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.rs1], gpr[a.rs2], vm[a.vm], nf[a.nf]);
+        return buff;
+    }
+
+    //    rv_v, VSSE8.V
+    if ((opcode & 0x1c00707f) == 0x8000027) {
+        a.vs3 = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.rs2 = FX(opcode, 24, 20);
+        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.rs1], gpr[a.rs2], vm[a.vm], nf[a.nf]);
+        return buff;
+    }
+
+    //    rv_v, VSSRA.VI
+    if ((opcode & 0xfc00707f) == 0xac003057) {
+        a.vd = FX(opcode, 11, 7);
+        a.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s, %s", "VSSRA.VI", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSSRA.VV
+    if ((opcode & 0xfc00707f) == 0xac000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSSRA.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSSRA.VX
+    if ((opcode & 0xfc00707f) == 0xac004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSSRA.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSSRL.VI
+    if ((opcode & 0xfc00707f) == 0xa8003057) {
+        a.vd = FX(opcode, 11, 7);
+        a.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s, %s", "VSSRL.VI", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSSRL.VV
+    if ((opcode & 0xfc00707f) == 0xa8000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSSRL.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSSRL.VX
+    if ((opcode & 0xfc00707f) == 0xa8004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSSRL.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSSUB.VV
+    if ((opcode & 0xfc00707f) == 0x8c000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSSUB.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSSUB.VX
+    if ((opcode & 0xfc00707f) == 0x8c004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSSUB.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSSUBU.VV
+    if ((opcode & 0xfc00707f) == 0x88000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSSUBU.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSSUBU.VX
+    if ((opcode & 0xfc00707f) == 0x88004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSSUBU.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSUB.VV
+    if ((opcode & 0xfc00707f) == 0x8000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSUB.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSUB.VX
+    if ((opcode & 0xfc00707f) == 0x8004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VSUB.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VSUXEI16.V
+    if ((opcode & 0x1c00707f) == 0x4005027) {
+        a.vs3 = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        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], gpr[a.rs1], vpr[a.vs2], vm[a.vm], nf[a.nf]);
+        return buff;
+    }
+
+    //    rv_v, VSUXEI32.V
+    if ((opcode & 0x1c00707f) == 0x4006027) {
+        a.vs3 = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        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], gpr[a.rs1], vpr[a.vs2], vm[a.vm], nf[a.nf]);
+        return buff;
+    }
+
+    //    rv_v, VSUXEI64.V
+    if ((opcode & 0x1c00707f) == 0x4007027) {
+        a.vs3 = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        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], gpr[a.rs1], vpr[a.vs2], vm[a.vm], nf[a.nf]);
+        return buff;
+    }
+
+    //    rv_v, VSUXEI8.V
+    if ((opcode & 0x1c00707f) == 0x4000027) {
+        a.vs3 = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        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], gpr[a.rs1], vpr[a.vs2], vm[a.vm], nf[a.nf]);
+        return buff;
+    }
+
+    //    rv_v, VWADD.VV
+    if ((opcode & 0xfc00707f) == 0xc4002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWADD.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWADD.VX
+    if ((opcode & 0xfc00707f) == 0xc4006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWADD.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWADD.WV
+    if ((opcode & 0xfc00707f) == 0xd4002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWADD.WV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWADD.WX
+    if ((opcode & 0xfc00707f) == 0xd4006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWADD.WX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWADDU.VV
+    if ((opcode & 0xfc00707f) == 0xc0002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWADDU.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWADDU.VX
+    if ((opcode & 0xfc00707f) == 0xc0006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWADDU.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWADDU.WV
+    if ((opcode & 0xfc00707f) == 0xd0002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWADDU.WV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWADDU.WX
+    if ((opcode & 0xfc00707f) == 0xd0006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWADDU.WX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWMACC.VV
+    if ((opcode & 0xfc00707f) == 0xf4002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWMACC.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWMACC.VX
+    if ((opcode & 0xfc00707f) == 0xf4006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWMACC.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWMACCSU.VV
+    if ((opcode & 0xfc00707f) == 0xfc002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWMACCSU.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWMACCSU.VX
+    if ((opcode & 0xfc00707f) == 0xfc006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWMACCSU.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWMACCU.VV
+    if ((opcode & 0xfc00707f) == 0xf0002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWMACCU.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWMACCU.VX
+    if ((opcode & 0xfc00707f) == 0xf0006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWMACCU.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWMACCUS.VX
+    if ((opcode & 0xfc00707f) == 0xf8006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWMACCUS.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWMUL.VV
+    if ((opcode & 0xfc00707f) == 0xec002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWMUL.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWMUL.VX
+    if ((opcode & 0xfc00707f) == 0xec006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWMUL.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWMULSU.VV
+    if ((opcode & 0xfc00707f) == 0xe8002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWMULSU.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWMULSU.VX
+    if ((opcode & 0xfc00707f) == 0xe8006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWMULSU.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWMULU.VV
+    if ((opcode & 0xfc00707f) == 0xe0002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWMULU.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWMULU.VX
+    if ((opcode & 0xfc00707f) == 0xe0006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWMULU.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWREDSUM.VS
+    if ((opcode & 0xfc00707f) == 0xc4000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWREDSUM.VS", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWREDSUMU.VS
+    if ((opcode & 0xfc00707f) == 0xc0000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWREDSUMU.VS", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWSUB.VV
+    if ((opcode & 0xfc00707f) == 0xcc002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWSUB.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWSUB.VX
+    if ((opcode & 0xfc00707f) == 0xcc006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWSUB.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWSUB.WV
+    if ((opcode & 0xfc00707f) == 0xdc002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWSUB.WV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWSUB.WX
+    if ((opcode & 0xfc00707f) == 0xdc006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWSUB.WX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWSUBU.VV
+    if ((opcode & 0xfc00707f) == 0xc8002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWSUBU.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWSUBU.VX
+    if ((opcode & 0xfc00707f) == 0xc8006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWSUBU.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWSUBU.WV
+    if ((opcode & 0xfc00707f) == 0xd8002057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWSUBU.WV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VWSUBU.WX
+    if ((opcode & 0xfc00707f) == 0xd8006057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VWSUBU.WX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VXOR.VI
+    if ((opcode & 0xfc00707f) == 0x2c003057) {
+        a.vd = FX(opcode, 11, 7);
+        a.imm = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, 0x%x(%d), %s, %s", "VXOR.VI", vpr[a.vd], SIGN_EXTEND(a.imm, 5), SIGN_EXTEND(a.imm, 5), vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VXOR.VV
+    if ((opcode & 0xfc00707f) == 0x2c000057) {
+        a.vd = FX(opcode, 11, 7);
+        a.vs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VXOR.VV", vpr[a.vd], vpr[a.vs1], vpr[a.vs2], vm[a.vm]);
+        return buff;
+    }
+
+    //    rv_v, VXOR.VX
+    if ((opcode & 0xfc00707f) == 0x2c004057) {
+        a.vd = FX(opcode, 11, 7);
+        a.rs1 = FX(opcode, 19, 15);
+        a.vs2 = FX(opcode, 24, 20);
+        a.vm = FX(opcode, 25, 25);
+        snprintf(buff, sizeof(buff), "%-15s %s, %s, %s, %s", "VXOR.VX", vpr[a.vd], gpr[a.rs1], vpr[a.vs2], 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;
 }