xref: /qemu/disas/riscv.c (revision 75ac231c)
1 /*
2  * QEMU RISC-V Disassembler
3  *
4  * Copyright (c) 2016-2017 Michael Clark <michaeljclark@mac.com>
5  * Copyright (c) 2017-2018 SiFive, Inc.
6  *
7  * This program is free software; you can redistribute it and/or modify it
8  * under the terms and conditions of the GNU General Public License,
9  * version 2 or later, as published by the Free Software Foundation.
10  *
11  * This program is distributed in the hope it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
14  * more details.
15  *
16  * You should have received a copy of the GNU General Public License along with
17  * this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #include "qemu/osdep.h"
21 #include "disas/dis-asm.h"
22 
23 
24 /* types */
25 
26 typedef uint64_t rv_inst;
27 typedef uint16_t rv_opcode;
28 
29 /* enums */
30 
31 typedef enum {
32     rv32,
33     rv64,
34     rv128
35 } rv_isa;
36 
37 typedef enum {
38     rv_rm_rne = 0,
39     rv_rm_rtz = 1,
40     rv_rm_rdn = 2,
41     rv_rm_rup = 3,
42     rv_rm_rmm = 4,
43     rv_rm_dyn = 7,
44 } rv_rm;
45 
46 typedef enum {
47     rv_fence_i = 8,
48     rv_fence_o = 4,
49     rv_fence_r = 2,
50     rv_fence_w = 1,
51 } rv_fence;
52 
53 typedef enum {
54     rv_ireg_zero,
55     rv_ireg_ra,
56     rv_ireg_sp,
57     rv_ireg_gp,
58     rv_ireg_tp,
59     rv_ireg_t0,
60     rv_ireg_t1,
61     rv_ireg_t2,
62     rv_ireg_s0,
63     rv_ireg_s1,
64     rv_ireg_a0,
65     rv_ireg_a1,
66     rv_ireg_a2,
67     rv_ireg_a3,
68     rv_ireg_a4,
69     rv_ireg_a5,
70     rv_ireg_a6,
71     rv_ireg_a7,
72     rv_ireg_s2,
73     rv_ireg_s3,
74     rv_ireg_s4,
75     rv_ireg_s5,
76     rv_ireg_s6,
77     rv_ireg_s7,
78     rv_ireg_s8,
79     rv_ireg_s9,
80     rv_ireg_s10,
81     rv_ireg_s11,
82     rv_ireg_t3,
83     rv_ireg_t4,
84     rv_ireg_t5,
85     rv_ireg_t6,
86 } rv_ireg;
87 
88 typedef enum {
89     rvc_end,
90     rvc_rd_eq_ra,
91     rvc_rd_eq_x0,
92     rvc_rs1_eq_x0,
93     rvc_rs2_eq_x0,
94     rvc_rs2_eq_rs1,
95     rvc_rs1_eq_ra,
96     rvc_imm_eq_zero,
97     rvc_imm_eq_n1,
98     rvc_imm_eq_p1,
99     rvc_csr_eq_0x001,
100     rvc_csr_eq_0x002,
101     rvc_csr_eq_0x003,
102     rvc_csr_eq_0xc00,
103     rvc_csr_eq_0xc01,
104     rvc_csr_eq_0xc02,
105     rvc_csr_eq_0xc80,
106     rvc_csr_eq_0xc81,
107     rvc_csr_eq_0xc82,
108 } rvc_constraint;
109 
110 typedef enum {
111     rv_codec_illegal,
112     rv_codec_none,
113     rv_codec_u,
114     rv_codec_uj,
115     rv_codec_i,
116     rv_codec_i_sh5,
117     rv_codec_i_sh6,
118     rv_codec_i_sh7,
119     rv_codec_i_csr,
120     rv_codec_s,
121     rv_codec_sb,
122     rv_codec_r,
123     rv_codec_r_m,
124     rv_codec_r4_m,
125     rv_codec_r_a,
126     rv_codec_r_l,
127     rv_codec_r_f,
128     rv_codec_cb,
129     rv_codec_cb_imm,
130     rv_codec_cb_sh5,
131     rv_codec_cb_sh6,
132     rv_codec_ci,
133     rv_codec_ci_sh5,
134     rv_codec_ci_sh6,
135     rv_codec_ci_16sp,
136     rv_codec_ci_lwsp,
137     rv_codec_ci_ldsp,
138     rv_codec_ci_lqsp,
139     rv_codec_ci_li,
140     rv_codec_ci_lui,
141     rv_codec_ci_none,
142     rv_codec_ciw_4spn,
143     rv_codec_cj,
144     rv_codec_cj_jal,
145     rv_codec_cl_lw,
146     rv_codec_cl_ld,
147     rv_codec_cl_lq,
148     rv_codec_cr,
149     rv_codec_cr_mv,
150     rv_codec_cr_jalr,
151     rv_codec_cr_jr,
152     rv_codec_cs,
153     rv_codec_cs_sw,
154     rv_codec_cs_sd,
155     rv_codec_cs_sq,
156     rv_codec_css_swsp,
157     rv_codec_css_sdsp,
158     rv_codec_css_sqsp,
159     rv_codec_k_bs,
160     rv_codec_k_rnum,
161     rv_codec_v_r,
162     rv_codec_v_ldst,
163     rv_codec_v_i,
164     rv_codec_vsetvli,
165     rv_codec_vsetivli,
166 } rv_codec;
167 
168 typedef enum {
169     rv_op_illegal = 0,
170     rv_op_lui = 1,
171     rv_op_auipc = 2,
172     rv_op_jal = 3,
173     rv_op_jalr = 4,
174     rv_op_beq = 5,
175     rv_op_bne = 6,
176     rv_op_blt = 7,
177     rv_op_bge = 8,
178     rv_op_bltu = 9,
179     rv_op_bgeu = 10,
180     rv_op_lb = 11,
181     rv_op_lh = 12,
182     rv_op_lw = 13,
183     rv_op_lbu = 14,
184     rv_op_lhu = 15,
185     rv_op_sb = 16,
186     rv_op_sh = 17,
187     rv_op_sw = 18,
188     rv_op_addi = 19,
189     rv_op_slti = 20,
190     rv_op_sltiu = 21,
191     rv_op_xori = 22,
192     rv_op_ori = 23,
193     rv_op_andi = 24,
194     rv_op_slli = 25,
195     rv_op_srli = 26,
196     rv_op_srai = 27,
197     rv_op_add = 28,
198     rv_op_sub = 29,
199     rv_op_sll = 30,
200     rv_op_slt = 31,
201     rv_op_sltu = 32,
202     rv_op_xor = 33,
203     rv_op_srl = 34,
204     rv_op_sra = 35,
205     rv_op_or = 36,
206     rv_op_and = 37,
207     rv_op_fence = 38,
208     rv_op_fence_i = 39,
209     rv_op_lwu = 40,
210     rv_op_ld = 41,
211     rv_op_sd = 42,
212     rv_op_addiw = 43,
213     rv_op_slliw = 44,
214     rv_op_srliw = 45,
215     rv_op_sraiw = 46,
216     rv_op_addw = 47,
217     rv_op_subw = 48,
218     rv_op_sllw = 49,
219     rv_op_srlw = 50,
220     rv_op_sraw = 51,
221     rv_op_ldu = 52,
222     rv_op_lq = 53,
223     rv_op_sq = 54,
224     rv_op_addid = 55,
225     rv_op_sllid = 56,
226     rv_op_srlid = 57,
227     rv_op_sraid = 58,
228     rv_op_addd = 59,
229     rv_op_subd = 60,
230     rv_op_slld = 61,
231     rv_op_srld = 62,
232     rv_op_srad = 63,
233     rv_op_mul = 64,
234     rv_op_mulh = 65,
235     rv_op_mulhsu = 66,
236     rv_op_mulhu = 67,
237     rv_op_div = 68,
238     rv_op_divu = 69,
239     rv_op_rem = 70,
240     rv_op_remu = 71,
241     rv_op_mulw = 72,
242     rv_op_divw = 73,
243     rv_op_divuw = 74,
244     rv_op_remw = 75,
245     rv_op_remuw = 76,
246     rv_op_muld = 77,
247     rv_op_divd = 78,
248     rv_op_divud = 79,
249     rv_op_remd = 80,
250     rv_op_remud = 81,
251     rv_op_lr_w = 82,
252     rv_op_sc_w = 83,
253     rv_op_amoswap_w = 84,
254     rv_op_amoadd_w = 85,
255     rv_op_amoxor_w = 86,
256     rv_op_amoor_w = 87,
257     rv_op_amoand_w = 88,
258     rv_op_amomin_w = 89,
259     rv_op_amomax_w = 90,
260     rv_op_amominu_w = 91,
261     rv_op_amomaxu_w = 92,
262     rv_op_lr_d = 93,
263     rv_op_sc_d = 94,
264     rv_op_amoswap_d = 95,
265     rv_op_amoadd_d = 96,
266     rv_op_amoxor_d = 97,
267     rv_op_amoor_d = 98,
268     rv_op_amoand_d = 99,
269     rv_op_amomin_d = 100,
270     rv_op_amomax_d = 101,
271     rv_op_amominu_d = 102,
272     rv_op_amomaxu_d = 103,
273     rv_op_lr_q = 104,
274     rv_op_sc_q = 105,
275     rv_op_amoswap_q = 106,
276     rv_op_amoadd_q = 107,
277     rv_op_amoxor_q = 108,
278     rv_op_amoor_q = 109,
279     rv_op_amoand_q = 110,
280     rv_op_amomin_q = 111,
281     rv_op_amomax_q = 112,
282     rv_op_amominu_q = 113,
283     rv_op_amomaxu_q = 114,
284     rv_op_ecall = 115,
285     rv_op_ebreak = 116,
286     rv_op_uret = 117,
287     rv_op_sret = 118,
288     rv_op_hret = 119,
289     rv_op_mret = 120,
290     rv_op_dret = 121,
291     rv_op_sfence_vm = 122,
292     rv_op_sfence_vma = 123,
293     rv_op_wfi = 124,
294     rv_op_csrrw = 125,
295     rv_op_csrrs = 126,
296     rv_op_csrrc = 127,
297     rv_op_csrrwi = 128,
298     rv_op_csrrsi = 129,
299     rv_op_csrrci = 130,
300     rv_op_flw = 131,
301     rv_op_fsw = 132,
302     rv_op_fmadd_s = 133,
303     rv_op_fmsub_s = 134,
304     rv_op_fnmsub_s = 135,
305     rv_op_fnmadd_s = 136,
306     rv_op_fadd_s = 137,
307     rv_op_fsub_s = 138,
308     rv_op_fmul_s = 139,
309     rv_op_fdiv_s = 140,
310     rv_op_fsgnj_s = 141,
311     rv_op_fsgnjn_s = 142,
312     rv_op_fsgnjx_s = 143,
313     rv_op_fmin_s = 144,
314     rv_op_fmax_s = 145,
315     rv_op_fsqrt_s = 146,
316     rv_op_fle_s = 147,
317     rv_op_flt_s = 148,
318     rv_op_feq_s = 149,
319     rv_op_fcvt_w_s = 150,
320     rv_op_fcvt_wu_s = 151,
321     rv_op_fcvt_s_w = 152,
322     rv_op_fcvt_s_wu = 153,
323     rv_op_fmv_x_s = 154,
324     rv_op_fclass_s = 155,
325     rv_op_fmv_s_x = 156,
326     rv_op_fcvt_l_s = 157,
327     rv_op_fcvt_lu_s = 158,
328     rv_op_fcvt_s_l = 159,
329     rv_op_fcvt_s_lu = 160,
330     rv_op_fld = 161,
331     rv_op_fsd = 162,
332     rv_op_fmadd_d = 163,
333     rv_op_fmsub_d = 164,
334     rv_op_fnmsub_d = 165,
335     rv_op_fnmadd_d = 166,
336     rv_op_fadd_d = 167,
337     rv_op_fsub_d = 168,
338     rv_op_fmul_d = 169,
339     rv_op_fdiv_d = 170,
340     rv_op_fsgnj_d = 171,
341     rv_op_fsgnjn_d = 172,
342     rv_op_fsgnjx_d = 173,
343     rv_op_fmin_d = 174,
344     rv_op_fmax_d = 175,
345     rv_op_fcvt_s_d = 176,
346     rv_op_fcvt_d_s = 177,
347     rv_op_fsqrt_d = 178,
348     rv_op_fle_d = 179,
349     rv_op_flt_d = 180,
350     rv_op_feq_d = 181,
351     rv_op_fcvt_w_d = 182,
352     rv_op_fcvt_wu_d = 183,
353     rv_op_fcvt_d_w = 184,
354     rv_op_fcvt_d_wu = 185,
355     rv_op_fclass_d = 186,
356     rv_op_fcvt_l_d = 187,
357     rv_op_fcvt_lu_d = 188,
358     rv_op_fmv_x_d = 189,
359     rv_op_fcvt_d_l = 190,
360     rv_op_fcvt_d_lu = 191,
361     rv_op_fmv_d_x = 192,
362     rv_op_flq = 193,
363     rv_op_fsq = 194,
364     rv_op_fmadd_q = 195,
365     rv_op_fmsub_q = 196,
366     rv_op_fnmsub_q = 197,
367     rv_op_fnmadd_q = 198,
368     rv_op_fadd_q = 199,
369     rv_op_fsub_q = 200,
370     rv_op_fmul_q = 201,
371     rv_op_fdiv_q = 202,
372     rv_op_fsgnj_q = 203,
373     rv_op_fsgnjn_q = 204,
374     rv_op_fsgnjx_q = 205,
375     rv_op_fmin_q = 206,
376     rv_op_fmax_q = 207,
377     rv_op_fcvt_s_q = 208,
378     rv_op_fcvt_q_s = 209,
379     rv_op_fcvt_d_q = 210,
380     rv_op_fcvt_q_d = 211,
381     rv_op_fsqrt_q = 212,
382     rv_op_fle_q = 213,
383     rv_op_flt_q = 214,
384     rv_op_feq_q = 215,
385     rv_op_fcvt_w_q = 216,
386     rv_op_fcvt_wu_q = 217,
387     rv_op_fcvt_q_w = 218,
388     rv_op_fcvt_q_wu = 219,
389     rv_op_fclass_q = 220,
390     rv_op_fcvt_l_q = 221,
391     rv_op_fcvt_lu_q = 222,
392     rv_op_fcvt_q_l = 223,
393     rv_op_fcvt_q_lu = 224,
394     rv_op_fmv_x_q = 225,
395     rv_op_fmv_q_x = 226,
396     rv_op_c_addi4spn = 227,
397     rv_op_c_fld = 228,
398     rv_op_c_lw = 229,
399     rv_op_c_flw = 230,
400     rv_op_c_fsd = 231,
401     rv_op_c_sw = 232,
402     rv_op_c_fsw = 233,
403     rv_op_c_nop = 234,
404     rv_op_c_addi = 235,
405     rv_op_c_jal = 236,
406     rv_op_c_li = 237,
407     rv_op_c_addi16sp = 238,
408     rv_op_c_lui = 239,
409     rv_op_c_srli = 240,
410     rv_op_c_srai = 241,
411     rv_op_c_andi = 242,
412     rv_op_c_sub = 243,
413     rv_op_c_xor = 244,
414     rv_op_c_or = 245,
415     rv_op_c_and = 246,
416     rv_op_c_subw = 247,
417     rv_op_c_addw = 248,
418     rv_op_c_j = 249,
419     rv_op_c_beqz = 250,
420     rv_op_c_bnez = 251,
421     rv_op_c_slli = 252,
422     rv_op_c_fldsp = 253,
423     rv_op_c_lwsp = 254,
424     rv_op_c_flwsp = 255,
425     rv_op_c_jr = 256,
426     rv_op_c_mv = 257,
427     rv_op_c_ebreak = 258,
428     rv_op_c_jalr = 259,
429     rv_op_c_add = 260,
430     rv_op_c_fsdsp = 261,
431     rv_op_c_swsp = 262,
432     rv_op_c_fswsp = 263,
433     rv_op_c_ld = 264,
434     rv_op_c_sd = 265,
435     rv_op_c_addiw = 266,
436     rv_op_c_ldsp = 267,
437     rv_op_c_sdsp = 268,
438     rv_op_c_lq = 269,
439     rv_op_c_sq = 270,
440     rv_op_c_lqsp = 271,
441     rv_op_c_sqsp = 272,
442     rv_op_nop = 273,
443     rv_op_mv = 274,
444     rv_op_not = 275,
445     rv_op_neg = 276,
446     rv_op_negw = 277,
447     rv_op_sext_w = 278,
448     rv_op_seqz = 279,
449     rv_op_snez = 280,
450     rv_op_sltz = 281,
451     rv_op_sgtz = 282,
452     rv_op_fmv_s = 283,
453     rv_op_fabs_s = 284,
454     rv_op_fneg_s = 285,
455     rv_op_fmv_d = 286,
456     rv_op_fabs_d = 287,
457     rv_op_fneg_d = 288,
458     rv_op_fmv_q = 289,
459     rv_op_fabs_q = 290,
460     rv_op_fneg_q = 291,
461     rv_op_beqz = 292,
462     rv_op_bnez = 293,
463     rv_op_blez = 294,
464     rv_op_bgez = 295,
465     rv_op_bltz = 296,
466     rv_op_bgtz = 297,
467     rv_op_ble = 298,
468     rv_op_bleu = 299,
469     rv_op_bgt = 300,
470     rv_op_bgtu = 301,
471     rv_op_j = 302,
472     rv_op_ret = 303,
473     rv_op_jr = 304,
474     rv_op_rdcycle = 305,
475     rv_op_rdtime = 306,
476     rv_op_rdinstret = 307,
477     rv_op_rdcycleh = 308,
478     rv_op_rdtimeh = 309,
479     rv_op_rdinstreth = 310,
480     rv_op_frcsr = 311,
481     rv_op_frrm = 312,
482     rv_op_frflags = 313,
483     rv_op_fscsr = 314,
484     rv_op_fsrm = 315,
485     rv_op_fsflags = 316,
486     rv_op_fsrmi = 317,
487     rv_op_fsflagsi = 318,
488     rv_op_bseti = 319,
489     rv_op_bclri = 320,
490     rv_op_binvi = 321,
491     rv_op_bexti = 322,
492     rv_op_rori = 323,
493     rv_op_clz = 324,
494     rv_op_ctz = 325,
495     rv_op_cpop = 326,
496     rv_op_sext_h = 327,
497     rv_op_sext_b = 328,
498     rv_op_xnor = 329,
499     rv_op_orn = 330,
500     rv_op_andn = 331,
501     rv_op_rol = 332,
502     rv_op_ror = 333,
503     rv_op_sh1add = 334,
504     rv_op_sh2add = 335,
505     rv_op_sh3add = 336,
506     rv_op_sh1add_uw = 337,
507     rv_op_sh2add_uw = 338,
508     rv_op_sh3add_uw = 339,
509     rv_op_clmul = 340,
510     rv_op_clmulr = 341,
511     rv_op_clmulh = 342,
512     rv_op_min = 343,
513     rv_op_minu = 344,
514     rv_op_max = 345,
515     rv_op_maxu = 346,
516     rv_op_clzw = 347,
517     rv_op_ctzw = 348,
518     rv_op_cpopw = 349,
519     rv_op_slli_uw = 350,
520     rv_op_add_uw = 351,
521     rv_op_rolw = 352,
522     rv_op_rorw = 353,
523     rv_op_rev8 = 354,
524     rv_op_zext_h = 355,
525     rv_op_roriw = 356,
526     rv_op_orc_b = 357,
527     rv_op_bset = 358,
528     rv_op_bclr = 359,
529     rv_op_binv = 360,
530     rv_op_bext = 361,
531     rv_op_aes32esmi = 362,
532     rv_op_aes32esi = 363,
533     rv_op_aes32dsmi = 364,
534     rv_op_aes32dsi = 365,
535     rv_op_aes64ks1i = 366,
536     rv_op_aes64ks2 = 367,
537     rv_op_aes64im = 368,
538     rv_op_aes64esm = 369,
539     rv_op_aes64es = 370,
540     rv_op_aes64dsm = 371,
541     rv_op_aes64ds = 372,
542     rv_op_sha256sig0 = 373,
543     rv_op_sha256sig1 = 374,
544     rv_op_sha256sum0 = 375,
545     rv_op_sha256sum1 = 376,
546     rv_op_sha512sig0 = 377,
547     rv_op_sha512sig1 = 378,
548     rv_op_sha512sum0 = 379,
549     rv_op_sha512sum1 = 380,
550     rv_op_sha512sum0r = 381,
551     rv_op_sha512sum1r = 382,
552     rv_op_sha512sig0l = 383,
553     rv_op_sha512sig0h = 384,
554     rv_op_sha512sig1l = 385,
555     rv_op_sha512sig1h = 386,
556     rv_op_sm3p0 = 387,
557     rv_op_sm3p1 = 388,
558     rv_op_sm4ed = 389,
559     rv_op_sm4ks = 390,
560     rv_op_brev8 = 391,
561     rv_op_pack = 392,
562     rv_op_packh = 393,
563     rv_op_packw = 394,
564     rv_op_unzip = 395,
565     rv_op_zip = 396,
566     rv_op_xperm4 = 397,
567     rv_op_xperm8 = 398,
568     rv_op_vle8_v = 399,
569     rv_op_vle16_v = 400,
570     rv_op_vle32_v = 401,
571     rv_op_vle64_v = 402,
572     rv_op_vse8_v = 403,
573     rv_op_vse16_v = 404,
574     rv_op_vse32_v = 405,
575     rv_op_vse64_v = 406,
576     rv_op_vlm_v = 407,
577     rv_op_vsm_v = 408,
578     rv_op_vlse8_v = 409,
579     rv_op_vlse16_v = 410,
580     rv_op_vlse32_v = 411,
581     rv_op_vlse64_v = 412,
582     rv_op_vsse8_v = 413,
583     rv_op_vsse16_v = 414,
584     rv_op_vsse32_v = 415,
585     rv_op_vsse64_v = 416,
586     rv_op_vluxei8_v = 417,
587     rv_op_vluxei16_v = 418,
588     rv_op_vluxei32_v = 419,
589     rv_op_vluxei64_v = 420,
590     rv_op_vloxei8_v = 421,
591     rv_op_vloxei16_v = 422,
592     rv_op_vloxei32_v = 423,
593     rv_op_vloxei64_v = 424,
594     rv_op_vsuxei8_v = 425,
595     rv_op_vsuxei16_v = 426,
596     rv_op_vsuxei32_v = 427,
597     rv_op_vsuxei64_v = 428,
598     rv_op_vsoxei8_v = 429,
599     rv_op_vsoxei16_v = 430,
600     rv_op_vsoxei32_v = 431,
601     rv_op_vsoxei64_v = 432,
602     rv_op_vle8ff_v = 433,
603     rv_op_vle16ff_v = 434,
604     rv_op_vle32ff_v = 435,
605     rv_op_vle64ff_v = 436,
606     rv_op_vl1re8_v = 437,
607     rv_op_vl1re16_v = 438,
608     rv_op_vl1re32_v = 439,
609     rv_op_vl1re64_v = 440,
610     rv_op_vl2re8_v = 441,
611     rv_op_vl2re16_v = 442,
612     rv_op_vl2re32_v = 443,
613     rv_op_vl2re64_v = 444,
614     rv_op_vl4re8_v = 445,
615     rv_op_vl4re16_v = 446,
616     rv_op_vl4re32_v = 447,
617     rv_op_vl4re64_v = 448,
618     rv_op_vl8re8_v = 449,
619     rv_op_vl8re16_v = 450,
620     rv_op_vl8re32_v = 451,
621     rv_op_vl8re64_v = 452,
622     rv_op_vs1r_v = 453,
623     rv_op_vs2r_v = 454,
624     rv_op_vs4r_v = 455,
625     rv_op_vs8r_v = 456,
626     rv_op_vadd_vv = 457,
627     rv_op_vadd_vx = 458,
628     rv_op_vadd_vi = 459,
629     rv_op_vsub_vv = 460,
630     rv_op_vsub_vx = 461,
631     rv_op_vrsub_vx = 462,
632     rv_op_vrsub_vi = 463,
633     rv_op_vwaddu_vv = 464,
634     rv_op_vwaddu_vx = 465,
635     rv_op_vwadd_vv = 466,
636     rv_op_vwadd_vx = 467,
637     rv_op_vwsubu_vv = 468,
638     rv_op_vwsubu_vx = 469,
639     rv_op_vwsub_vv = 470,
640     rv_op_vwsub_vx = 471,
641     rv_op_vwaddu_wv = 472,
642     rv_op_vwaddu_wx = 473,
643     rv_op_vwadd_wv = 474,
644     rv_op_vwadd_wx = 475,
645     rv_op_vwsubu_wv = 476,
646     rv_op_vwsubu_wx = 477,
647     rv_op_vwsub_wv = 478,
648     rv_op_vwsub_wx = 479,
649     rv_op_vadc_vvm = 480,
650     rv_op_vadc_vxm = 481,
651     rv_op_vadc_vim = 482,
652     rv_op_vmadc_vvm = 483,
653     rv_op_vmadc_vxm = 484,
654     rv_op_vmadc_vim = 485,
655     rv_op_vsbc_vvm = 486,
656     rv_op_vsbc_vxm = 487,
657     rv_op_vmsbc_vvm = 488,
658     rv_op_vmsbc_vxm = 489,
659     rv_op_vand_vv = 490,
660     rv_op_vand_vx = 491,
661     rv_op_vand_vi = 492,
662     rv_op_vor_vv = 493,
663     rv_op_vor_vx = 494,
664     rv_op_vor_vi = 495,
665     rv_op_vxor_vv = 496,
666     rv_op_vxor_vx = 497,
667     rv_op_vxor_vi = 498,
668     rv_op_vsll_vv = 499,
669     rv_op_vsll_vx = 500,
670     rv_op_vsll_vi = 501,
671     rv_op_vsrl_vv = 502,
672     rv_op_vsrl_vx = 503,
673     rv_op_vsrl_vi = 504,
674     rv_op_vsra_vv = 505,
675     rv_op_vsra_vx = 506,
676     rv_op_vsra_vi = 507,
677     rv_op_vnsrl_wv = 508,
678     rv_op_vnsrl_wx = 509,
679     rv_op_vnsrl_wi = 510,
680     rv_op_vnsra_wv = 511,
681     rv_op_vnsra_wx = 512,
682     rv_op_vnsra_wi = 513,
683     rv_op_vmseq_vv = 514,
684     rv_op_vmseq_vx = 515,
685     rv_op_vmseq_vi = 516,
686     rv_op_vmsne_vv = 517,
687     rv_op_vmsne_vx = 518,
688     rv_op_vmsne_vi = 519,
689     rv_op_vmsltu_vv = 520,
690     rv_op_vmsltu_vx = 521,
691     rv_op_vmslt_vv = 522,
692     rv_op_vmslt_vx = 523,
693     rv_op_vmsleu_vv = 524,
694     rv_op_vmsleu_vx = 525,
695     rv_op_vmsleu_vi = 526,
696     rv_op_vmsle_vv = 527,
697     rv_op_vmsle_vx = 528,
698     rv_op_vmsle_vi = 529,
699     rv_op_vmsgtu_vx = 530,
700     rv_op_vmsgtu_vi = 531,
701     rv_op_vmsgt_vx = 532,
702     rv_op_vmsgt_vi = 533,
703     rv_op_vminu_vv = 534,
704     rv_op_vminu_vx = 535,
705     rv_op_vmin_vv = 536,
706     rv_op_vmin_vx = 537,
707     rv_op_vmaxu_vv = 538,
708     rv_op_vmaxu_vx = 539,
709     rv_op_vmax_vv = 540,
710     rv_op_vmax_vx = 541,
711     rv_op_vmul_vv = 542,
712     rv_op_vmul_vx = 543,
713     rv_op_vmulh_vv = 544,
714     rv_op_vmulh_vx = 545,
715     rv_op_vmulhu_vv = 546,
716     rv_op_vmulhu_vx = 547,
717     rv_op_vmulhsu_vv = 548,
718     rv_op_vmulhsu_vx = 549,
719     rv_op_vdivu_vv = 550,
720     rv_op_vdivu_vx = 551,
721     rv_op_vdiv_vv = 552,
722     rv_op_vdiv_vx = 553,
723     rv_op_vremu_vv = 554,
724     rv_op_vremu_vx = 555,
725     rv_op_vrem_vv = 556,
726     rv_op_vrem_vx = 557,
727     rv_op_vwmulu_vv = 558,
728     rv_op_vwmulu_vx = 559,
729     rv_op_vwmulsu_vv = 560,
730     rv_op_vwmulsu_vx = 561,
731     rv_op_vwmul_vv = 562,
732     rv_op_vwmul_vx = 563,
733     rv_op_vmacc_vv = 564,
734     rv_op_vmacc_vx = 565,
735     rv_op_vnmsac_vv = 566,
736     rv_op_vnmsac_vx = 567,
737     rv_op_vmadd_vv = 568,
738     rv_op_vmadd_vx = 569,
739     rv_op_vnmsub_vv = 570,
740     rv_op_vnmsub_vx = 571,
741     rv_op_vwmaccu_vv = 572,
742     rv_op_vwmaccu_vx = 573,
743     rv_op_vwmacc_vv = 574,
744     rv_op_vwmacc_vx = 575,
745     rv_op_vwmaccsu_vv = 576,
746     rv_op_vwmaccsu_vx = 577,
747     rv_op_vwmaccus_vx = 578,
748     rv_op_vmv_v_v = 579,
749     rv_op_vmv_v_x = 580,
750     rv_op_vmv_v_i = 581,
751     rv_op_vmerge_vvm = 582,
752     rv_op_vmerge_vxm = 583,
753     rv_op_vmerge_vim = 584,
754     rv_op_vsaddu_vv = 585,
755     rv_op_vsaddu_vx = 586,
756     rv_op_vsaddu_vi = 587,
757     rv_op_vsadd_vv = 588,
758     rv_op_vsadd_vx = 589,
759     rv_op_vsadd_vi = 590,
760     rv_op_vssubu_vv = 591,
761     rv_op_vssubu_vx = 592,
762     rv_op_vssub_vv = 593,
763     rv_op_vssub_vx = 594,
764     rv_op_vaadd_vv = 595,
765     rv_op_vaadd_vx = 596,
766     rv_op_vaaddu_vv = 597,
767     rv_op_vaaddu_vx = 598,
768     rv_op_vasub_vv = 599,
769     rv_op_vasub_vx = 600,
770     rv_op_vasubu_vv = 601,
771     rv_op_vasubu_vx = 602,
772     rv_op_vsmul_vv = 603,
773     rv_op_vsmul_vx = 604,
774     rv_op_vssrl_vv = 605,
775     rv_op_vssrl_vx = 606,
776     rv_op_vssrl_vi = 607,
777     rv_op_vssra_vv = 608,
778     rv_op_vssra_vx = 609,
779     rv_op_vssra_vi = 610,
780     rv_op_vnclipu_wv = 611,
781     rv_op_vnclipu_wx = 612,
782     rv_op_vnclipu_wi = 613,
783     rv_op_vnclip_wv = 614,
784     rv_op_vnclip_wx = 615,
785     rv_op_vnclip_wi = 616,
786     rv_op_vfadd_vv = 617,
787     rv_op_vfadd_vf = 618,
788     rv_op_vfsub_vv = 619,
789     rv_op_vfsub_vf = 620,
790     rv_op_vfrsub_vf = 621,
791     rv_op_vfwadd_vv = 622,
792     rv_op_vfwadd_vf = 623,
793     rv_op_vfwadd_wv = 624,
794     rv_op_vfwadd_wf = 625,
795     rv_op_vfwsub_vv = 626,
796     rv_op_vfwsub_vf = 627,
797     rv_op_vfwsub_wv = 628,
798     rv_op_vfwsub_wf = 629,
799     rv_op_vfmul_vv = 630,
800     rv_op_vfmul_vf = 631,
801     rv_op_vfdiv_vv = 632,
802     rv_op_vfdiv_vf = 633,
803     rv_op_vfrdiv_vf = 634,
804     rv_op_vfwmul_vv = 635,
805     rv_op_vfwmul_vf = 636,
806     rv_op_vfmacc_vv = 637,
807     rv_op_vfmacc_vf = 638,
808     rv_op_vfnmacc_vv = 639,
809     rv_op_vfnmacc_vf = 640,
810     rv_op_vfmsac_vv = 641,
811     rv_op_vfmsac_vf = 642,
812     rv_op_vfnmsac_vv = 643,
813     rv_op_vfnmsac_vf = 644,
814     rv_op_vfmadd_vv = 645,
815     rv_op_vfmadd_vf = 646,
816     rv_op_vfnmadd_vv = 647,
817     rv_op_vfnmadd_vf = 648,
818     rv_op_vfmsub_vv = 649,
819     rv_op_vfmsub_vf = 650,
820     rv_op_vfnmsub_vv = 651,
821     rv_op_vfnmsub_vf = 652,
822     rv_op_vfwmacc_vv = 653,
823     rv_op_vfwmacc_vf = 654,
824     rv_op_vfwnmacc_vv = 655,
825     rv_op_vfwnmacc_vf = 656,
826     rv_op_vfwmsac_vv = 657,
827     rv_op_vfwmsac_vf = 658,
828     rv_op_vfwnmsac_vv = 659,
829     rv_op_vfwnmsac_vf = 660,
830     rv_op_vfsqrt_v = 661,
831     rv_op_vfrsqrt7_v = 662,
832     rv_op_vfrec7_v = 663,
833     rv_op_vfmin_vv = 664,
834     rv_op_vfmin_vf = 665,
835     rv_op_vfmax_vv = 666,
836     rv_op_vfmax_vf = 667,
837     rv_op_vfsgnj_vv = 668,
838     rv_op_vfsgnj_vf = 669,
839     rv_op_vfsgnjn_vv = 670,
840     rv_op_vfsgnjn_vf = 671,
841     rv_op_vfsgnjx_vv = 672,
842     rv_op_vfsgnjx_vf = 673,
843     rv_op_vfslide1up_vf = 674,
844     rv_op_vfslide1down_vf = 675,
845     rv_op_vmfeq_vv = 676,
846     rv_op_vmfeq_vf = 677,
847     rv_op_vmfne_vv = 678,
848     rv_op_vmfne_vf = 679,
849     rv_op_vmflt_vv = 680,
850     rv_op_vmflt_vf = 681,
851     rv_op_vmfle_vv = 682,
852     rv_op_vmfle_vf = 683,
853     rv_op_vmfgt_vf = 684,
854     rv_op_vmfge_vf = 685,
855     rv_op_vfclass_v = 686,
856     rv_op_vfmerge_vfm = 687,
857     rv_op_vfmv_v_f = 688,
858     rv_op_vfcvt_xu_f_v = 689,
859     rv_op_vfcvt_x_f_v = 690,
860     rv_op_vfcvt_f_xu_v = 691,
861     rv_op_vfcvt_f_x_v = 692,
862     rv_op_vfcvt_rtz_xu_f_v = 693,
863     rv_op_vfcvt_rtz_x_f_v = 694,
864     rv_op_vfwcvt_xu_f_v = 695,
865     rv_op_vfwcvt_x_f_v = 696,
866     rv_op_vfwcvt_f_xu_v = 697,
867     rv_op_vfwcvt_f_x_v = 698,
868     rv_op_vfwcvt_f_f_v = 699,
869     rv_op_vfwcvt_rtz_xu_f_v = 700,
870     rv_op_vfwcvt_rtz_x_f_v = 701,
871     rv_op_vfncvt_xu_f_w = 702,
872     rv_op_vfncvt_x_f_w = 703,
873     rv_op_vfncvt_f_xu_w = 704,
874     rv_op_vfncvt_f_x_w = 705,
875     rv_op_vfncvt_f_f_w = 706,
876     rv_op_vfncvt_rod_f_f_w = 707,
877     rv_op_vfncvt_rtz_xu_f_w = 708,
878     rv_op_vfncvt_rtz_x_f_w = 709,
879     rv_op_vredsum_vs = 710,
880     rv_op_vredand_vs = 711,
881     rv_op_vredor_vs = 712,
882     rv_op_vredxor_vs = 713,
883     rv_op_vredminu_vs = 714,
884     rv_op_vredmin_vs = 715,
885     rv_op_vredmaxu_vs = 716,
886     rv_op_vredmax_vs = 717,
887     rv_op_vwredsumu_vs = 718,
888     rv_op_vwredsum_vs = 719,
889     rv_op_vfredusum_vs = 720,
890     rv_op_vfredosum_vs = 721,
891     rv_op_vfredmin_vs = 722,
892     rv_op_vfredmax_vs = 723,
893     rv_op_vfwredusum_vs = 724,
894     rv_op_vfwredosum_vs = 725,
895     rv_op_vmand_mm = 726,
896     rv_op_vmnand_mm = 727,
897     rv_op_vmandn_mm = 728,
898     rv_op_vmxor_mm = 729,
899     rv_op_vmor_mm = 730,
900     rv_op_vmnor_mm = 731,
901     rv_op_vmorn_mm = 732,
902     rv_op_vmxnor_mm = 733,
903     rv_op_vcpop_m = 734,
904     rv_op_vfirst_m = 735,
905     rv_op_vmsbf_m = 736,
906     rv_op_vmsif_m = 737,
907     rv_op_vmsof_m = 738,
908     rv_op_viota_m = 739,
909     rv_op_vid_v = 740,
910     rv_op_vmv_x_s = 741,
911     rv_op_vmv_s_x = 742,
912     rv_op_vfmv_f_s = 743,
913     rv_op_vfmv_s_f = 744,
914     rv_op_vslideup_vx = 745,
915     rv_op_vslideup_vi = 746,
916     rv_op_vslide1up_vx = 747,
917     rv_op_vslidedown_vx = 748,
918     rv_op_vslidedown_vi = 749,
919     rv_op_vslide1down_vx = 750,
920     rv_op_vrgather_vv = 751,
921     rv_op_vrgatherei16_vv = 752,
922     rv_op_vrgather_vx = 753,
923     rv_op_vrgather_vi = 754,
924     rv_op_vcompress_vm = 755,
925     rv_op_vmv1r_v = 756,
926     rv_op_vmv2r_v = 757,
927     rv_op_vmv4r_v = 758,
928     rv_op_vmv8r_v = 759,
929     rv_op_vzext_vf2 = 760,
930     rv_op_vzext_vf4 = 761,
931     rv_op_vzext_vf8 = 762,
932     rv_op_vsext_vf2 = 763,
933     rv_op_vsext_vf4 = 764,
934     rv_op_vsext_vf8 = 765,
935     rv_op_vsetvli = 766,
936     rv_op_vsetivli = 767,
937     rv_op_vsetvl = 768,
938 } rv_op;
939 
940 /* structures */
941 
942 typedef struct {
943     uint64_t  pc;
944     uint64_t  inst;
945     int32_t   imm;
946     uint16_t  op;
947     uint8_t   codec;
948     uint8_t   rd;
949     uint8_t   rs1;
950     uint8_t   rs2;
951     uint8_t   rs3;
952     uint8_t   rm;
953     uint8_t   pred;
954     uint8_t   succ;
955     uint8_t   aq;
956     uint8_t   rl;
957     uint8_t   bs;
958     uint8_t   rnum;
959     uint8_t   vm;
960     uint32_t  vzimm;
961 } rv_decode;
962 
963 typedef struct {
964     const int op;
965     const rvc_constraint *constraints;
966 } rv_comp_data;
967 
968 enum {
969     rvcd_imm_nz = 0x1
970 };
971 
972 typedef struct {
973     const char * const name;
974     const rv_codec codec;
975     const char * const format;
976     const rv_comp_data *pseudo;
977     const short decomp_rv32;
978     const short decomp_rv64;
979     const short decomp_rv128;
980     const short decomp_data;
981 } rv_opcode_data;
982 
983 /* register names */
984 
985 static const char rv_ireg_name_sym[32][5] = {
986     "zero", "ra",   "sp",   "gp",   "tp",   "t0",   "t1",   "t2",
987     "s0",   "s1",   "a0",   "a1",   "a2",   "a3",   "a4",   "a5",
988     "a6",   "a7",   "s2",   "s3",   "s4",   "s5",   "s6",   "s7",
989     "s8",   "s9",   "s10",  "s11",  "t3",   "t4",   "t5",   "t6",
990 };
991 
992 static const char rv_freg_name_sym[32][5] = {
993     "ft0",  "ft1",  "ft2",  "ft3",  "ft4",  "ft5",  "ft6",  "ft7",
994     "fs0",  "fs1",  "fa0",  "fa1",  "fa2",  "fa3",  "fa4",  "fa5",
995     "fa6",  "fa7",  "fs2",  "fs3",  "fs4",  "fs5",  "fs6",  "fs7",
996     "fs8",  "fs9",  "fs10", "fs11", "ft8",  "ft9",  "ft10", "ft11",
997 };
998 
999 static const char rv_vreg_name_sym[32][4] = {
1000     "v0",  "v1",  "v2",  "v3",  "v4",  "v5",  "v6",  "v7",
1001     "v8",  "v9",  "v10", "v11", "v12", "v13", "v14", "v15",
1002     "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1003     "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
1004 };
1005 
1006 /* instruction formats */
1007 
1008 #define rv_fmt_none                   "O\t"
1009 #define rv_fmt_rs1                    "O\t1"
1010 #define rv_fmt_offset                 "O\to"
1011 #define rv_fmt_pred_succ              "O\tp,s"
1012 #define rv_fmt_rs1_rs2                "O\t1,2"
1013 #define rv_fmt_rd_imm                 "O\t0,i"
1014 #define rv_fmt_rd_offset              "O\t0,o"
1015 #define rv_fmt_rd_rs1_rs2             "O\t0,1,2"
1016 #define rv_fmt_frd_rs1                "O\t3,1"
1017 #define rv_fmt_rd_frs1                "O\t0,4"
1018 #define rv_fmt_rd_frs1_frs2           "O\t0,4,5"
1019 #define rv_fmt_frd_frs1_frs2          "O\t3,4,5"
1020 #define rv_fmt_rm_frd_frs1            "O\tr,3,4"
1021 #define rv_fmt_rm_frd_rs1             "O\tr,3,1"
1022 #define rv_fmt_rm_rd_frs1             "O\tr,0,4"
1023 #define rv_fmt_rm_frd_frs1_frs2       "O\tr,3,4,5"
1024 #define rv_fmt_rm_frd_frs1_frs2_frs3  "O\tr,3,4,5,6"
1025 #define rv_fmt_rd_rs1_imm             "O\t0,1,i"
1026 #define rv_fmt_rd_rs1_offset          "O\t0,1,i"
1027 #define rv_fmt_rd_offset_rs1          "O\t0,i(1)"
1028 #define rv_fmt_frd_offset_rs1         "O\t3,i(1)"
1029 #define rv_fmt_rd_csr_rs1             "O\t0,c,1"
1030 #define rv_fmt_rd_csr_zimm            "O\t0,c,7"
1031 #define rv_fmt_rs2_offset_rs1         "O\t2,i(1)"
1032 #define rv_fmt_frs2_offset_rs1        "O\t5,i(1)"
1033 #define rv_fmt_rs1_rs2_offset         "O\t1,2,o"
1034 #define rv_fmt_rs2_rs1_offset         "O\t2,1,o"
1035 #define rv_fmt_aqrl_rd_rs2_rs1        "OAR\t0,2,(1)"
1036 #define rv_fmt_aqrl_rd_rs1            "OAR\t0,(1)"
1037 #define rv_fmt_rd                     "O\t0"
1038 #define rv_fmt_rd_zimm                "O\t0,7"
1039 #define rv_fmt_rd_rs1                 "O\t0,1"
1040 #define rv_fmt_rd_rs2                 "O\t0,2"
1041 #define rv_fmt_rs1_offset             "O\t1,o"
1042 #define rv_fmt_rs2_offset             "O\t2,o"
1043 #define rv_fmt_rs1_rs2_bs             "O\t1,2,b"
1044 #define rv_fmt_rd_rs1_rnum            "O\t0,1,n"
1045 #define rv_fmt_ldst_vd_rs1_vm         "O\tD,(1)m"
1046 #define rv_fmt_ldst_vd_rs1_rs2_vm     "O\tD,(1),2m"
1047 #define rv_fmt_ldst_vd_rs1_vs2_vm     "O\tD,(1),Fm"
1048 #define rv_fmt_vd_vs2_vs1             "O\tD,F,E"
1049 #define rv_fmt_vd_vs2_vs1_vl          "O\tD,F,El"
1050 #define rv_fmt_vd_vs2_vs1_vm          "O\tD,F,Em"
1051 #define rv_fmt_vd_vs2_rs1_vl          "O\tD,F,1l"
1052 #define rv_fmt_vd_vs2_fs1_vl          "O\tD,F,4l"
1053 #define rv_fmt_vd_vs2_rs1_vm          "O\tD,F,1m"
1054 #define rv_fmt_vd_vs2_fs1_vm          "O\tD,F,4m"
1055 #define rv_fmt_vd_vs2_imm_vl          "O\tD,F,il"
1056 #define rv_fmt_vd_vs2_imm_vm          "O\tD,F,im"
1057 #define rv_fmt_vd_vs2_uimm_vm         "O\tD,F,um"
1058 #define rv_fmt_vd_vs1_vs2_vm          "O\tD,E,Fm"
1059 #define rv_fmt_vd_rs1_vs2_vm          "O\tD,1,Fm"
1060 #define rv_fmt_vd_fs1_vs2_vm          "O\tD,4,Fm"
1061 #define rv_fmt_vd_vs1                 "O\tD,E"
1062 #define rv_fmt_vd_rs1                 "O\tD,1"
1063 #define rv_fmt_vd_fs1                 "O\tD,4"
1064 #define rv_fmt_vd_imm                 "O\tD,i"
1065 #define rv_fmt_vd_vs2                 "O\tD,F"
1066 #define rv_fmt_vd_vs2_vm              "O\tD,Fm"
1067 #define rv_fmt_rd_vs2_vm              "O\t0,Fm"
1068 #define rv_fmt_rd_vs2                 "O\t0,F"
1069 #define rv_fmt_fd_vs2                 "O\t3,F"
1070 #define rv_fmt_vd_vm                  "O\tDm"
1071 #define rv_fmt_vsetvli                "O\t0,1,v"
1072 #define rv_fmt_vsetivli               "O\t0,u,v"
1073 
1074 /* pseudo-instruction constraints */
1075 
1076 static const rvc_constraint rvcc_jal[] = { rvc_rd_eq_ra, rvc_end };
1077 static const rvc_constraint rvcc_jalr[] = { rvc_rd_eq_ra, rvc_imm_eq_zero, rvc_end };
1078 static const rvc_constraint rvcc_nop[] = { rvc_rd_eq_x0, rvc_rs1_eq_x0, rvc_imm_eq_zero, rvc_end };
1079 static const rvc_constraint rvcc_mv[] = { rvc_imm_eq_zero, rvc_end };
1080 static const rvc_constraint rvcc_not[] = { rvc_imm_eq_n1, rvc_end };
1081 static const rvc_constraint rvcc_neg[] = { rvc_rs1_eq_x0, rvc_end };
1082 static const rvc_constraint rvcc_negw[] = { rvc_rs1_eq_x0, rvc_end };
1083 static const rvc_constraint rvcc_sext_w[] = { rvc_imm_eq_zero, rvc_end };
1084 static const rvc_constraint rvcc_seqz[] = { rvc_imm_eq_p1, rvc_end };
1085 static const rvc_constraint rvcc_snez[] = { rvc_rs1_eq_x0, rvc_end };
1086 static const rvc_constraint rvcc_sltz[] = { rvc_rs2_eq_x0, rvc_end };
1087 static const rvc_constraint rvcc_sgtz[] = { rvc_rs1_eq_x0, rvc_end };
1088 static const rvc_constraint rvcc_fmv_s[] = { rvc_rs2_eq_rs1, rvc_end };
1089 static const rvc_constraint rvcc_fabs_s[] = { rvc_rs2_eq_rs1, rvc_end };
1090 static const rvc_constraint rvcc_fneg_s[] = { rvc_rs2_eq_rs1, rvc_end };
1091 static const rvc_constraint rvcc_fmv_d[] = { rvc_rs2_eq_rs1, rvc_end };
1092 static const rvc_constraint rvcc_fabs_d[] = { rvc_rs2_eq_rs1, rvc_end };
1093 static const rvc_constraint rvcc_fneg_d[] = { rvc_rs2_eq_rs1, rvc_end };
1094 static const rvc_constraint rvcc_fmv_q[] = { rvc_rs2_eq_rs1, rvc_end };
1095 static const rvc_constraint rvcc_fabs_q[] = { rvc_rs2_eq_rs1, rvc_end };
1096 static const rvc_constraint rvcc_fneg_q[] = { rvc_rs2_eq_rs1, rvc_end };
1097 static const rvc_constraint rvcc_beqz[] = { rvc_rs2_eq_x0, rvc_end };
1098 static const rvc_constraint rvcc_bnez[] = { rvc_rs2_eq_x0, rvc_end };
1099 static const rvc_constraint rvcc_blez[] = { rvc_rs1_eq_x0, rvc_end };
1100 static const rvc_constraint rvcc_bgez[] = { rvc_rs2_eq_x0, rvc_end };
1101 static const rvc_constraint rvcc_bltz[] = { rvc_rs2_eq_x0, rvc_end };
1102 static const rvc_constraint rvcc_bgtz[] = { rvc_rs1_eq_x0, rvc_end };
1103 static const rvc_constraint rvcc_ble[] = { rvc_end };
1104 static const rvc_constraint rvcc_bleu[] = { rvc_end };
1105 static const rvc_constraint rvcc_bgt[] = { rvc_end };
1106 static const rvc_constraint rvcc_bgtu[] = { rvc_end };
1107 static const rvc_constraint rvcc_j[] = { rvc_rd_eq_x0, rvc_end };
1108 static const rvc_constraint rvcc_ret[] = { rvc_rd_eq_x0, rvc_rs1_eq_ra, rvc_end };
1109 static const rvc_constraint rvcc_jr[] = { rvc_rd_eq_x0, rvc_imm_eq_zero, rvc_end };
1110 static const rvc_constraint rvcc_rdcycle[] = { rvc_rs1_eq_x0, rvc_csr_eq_0xc00, rvc_end };
1111 static const rvc_constraint rvcc_rdtime[] = { rvc_rs1_eq_x0, rvc_csr_eq_0xc01, rvc_end };
1112 static const rvc_constraint rvcc_rdinstret[] = { rvc_rs1_eq_x0, rvc_csr_eq_0xc02, rvc_end };
1113 static const rvc_constraint rvcc_rdcycleh[] = { rvc_rs1_eq_x0, rvc_csr_eq_0xc80, rvc_end };
1114 static const rvc_constraint rvcc_rdtimeh[] = { rvc_rs1_eq_x0, rvc_csr_eq_0xc81, rvc_end };
1115 static const rvc_constraint rvcc_rdinstreth[] = { rvc_rs1_eq_x0,
1116                                                   rvc_csr_eq_0xc82, rvc_end };
1117 static const rvc_constraint rvcc_frcsr[] = { rvc_rs1_eq_x0, rvc_csr_eq_0x003, rvc_end };
1118 static const rvc_constraint rvcc_frrm[] = { rvc_rs1_eq_x0, rvc_csr_eq_0x002, rvc_end };
1119 static const rvc_constraint rvcc_frflags[] = { rvc_rs1_eq_x0, rvc_csr_eq_0x001, rvc_end };
1120 static const rvc_constraint rvcc_fscsr[] = { rvc_csr_eq_0x003, rvc_end };
1121 static const rvc_constraint rvcc_fsrm[] = { rvc_csr_eq_0x002, rvc_end };
1122 static const rvc_constraint rvcc_fsflags[] = { rvc_csr_eq_0x001, rvc_end };
1123 static const rvc_constraint rvcc_fsrmi[] = { rvc_csr_eq_0x002, rvc_end };
1124 static const rvc_constraint rvcc_fsflagsi[] = { rvc_csr_eq_0x001, rvc_end };
1125 
1126 /* pseudo-instruction metadata */
1127 
1128 static const rv_comp_data rvcp_jal[] = {
1129     { rv_op_j, rvcc_j },
1130     { rv_op_jal, rvcc_jal },
1131     { rv_op_illegal, NULL }
1132 };
1133 
1134 static const rv_comp_data rvcp_jalr[] = {
1135     { rv_op_ret, rvcc_ret },
1136     { rv_op_jr, rvcc_jr },
1137     { rv_op_jalr, rvcc_jalr },
1138     { rv_op_illegal, NULL }
1139 };
1140 
1141 static const rv_comp_data rvcp_beq[] = {
1142     { rv_op_beqz, rvcc_beqz },
1143     { rv_op_illegal, NULL }
1144 };
1145 
1146 static const rv_comp_data rvcp_bne[] = {
1147     { rv_op_bnez, rvcc_bnez },
1148     { rv_op_illegal, NULL }
1149 };
1150 
1151 static const rv_comp_data rvcp_blt[] = {
1152     { rv_op_bltz, rvcc_bltz },
1153     { rv_op_bgtz, rvcc_bgtz },
1154     { rv_op_bgt, rvcc_bgt },
1155     { rv_op_illegal, NULL }
1156 };
1157 
1158 static const rv_comp_data rvcp_bge[] = {
1159     { rv_op_blez, rvcc_blez },
1160     { rv_op_bgez, rvcc_bgez },
1161     { rv_op_ble, rvcc_ble },
1162     { rv_op_illegal, NULL }
1163 };
1164 
1165 static const rv_comp_data rvcp_bltu[] = {
1166     { rv_op_bgtu, rvcc_bgtu },
1167     { rv_op_illegal, NULL }
1168 };
1169 
1170 static const rv_comp_data rvcp_bgeu[] = {
1171     { rv_op_bleu, rvcc_bleu },
1172     { rv_op_illegal, NULL }
1173 };
1174 
1175 static const rv_comp_data rvcp_addi[] = {
1176     { rv_op_nop, rvcc_nop },
1177     { rv_op_mv, rvcc_mv },
1178     { rv_op_illegal, NULL }
1179 };
1180 
1181 static const rv_comp_data rvcp_sltiu[] = {
1182     { rv_op_seqz, rvcc_seqz },
1183     { rv_op_illegal, NULL }
1184 };
1185 
1186 static const rv_comp_data rvcp_xori[] = {
1187     { rv_op_not, rvcc_not },
1188     { rv_op_illegal, NULL }
1189 };
1190 
1191 static const rv_comp_data rvcp_sub[] = {
1192     { rv_op_neg, rvcc_neg },
1193     { rv_op_illegal, NULL }
1194 };
1195 
1196 static const rv_comp_data rvcp_slt[] = {
1197     { rv_op_sltz, rvcc_sltz },
1198     { rv_op_sgtz, rvcc_sgtz },
1199     { rv_op_illegal, NULL }
1200 };
1201 
1202 static const rv_comp_data rvcp_sltu[] = {
1203     { rv_op_snez, rvcc_snez },
1204     { rv_op_illegal, NULL }
1205 };
1206 
1207 static const rv_comp_data rvcp_addiw[] = {
1208     { rv_op_sext_w, rvcc_sext_w },
1209     { rv_op_illegal, NULL }
1210 };
1211 
1212 static const rv_comp_data rvcp_subw[] = {
1213     { rv_op_negw, rvcc_negw },
1214     { rv_op_illegal, NULL }
1215 };
1216 
1217 static const rv_comp_data rvcp_csrrw[] = {
1218     { rv_op_fscsr, rvcc_fscsr },
1219     { rv_op_fsrm, rvcc_fsrm },
1220     { rv_op_fsflags, rvcc_fsflags },
1221     { rv_op_illegal, NULL }
1222 };
1223 
1224 
1225 static const rv_comp_data rvcp_csrrs[] = {
1226     { rv_op_rdcycle, rvcc_rdcycle },
1227     { rv_op_rdtime, rvcc_rdtime },
1228     { rv_op_rdinstret, rvcc_rdinstret },
1229     { rv_op_rdcycleh, rvcc_rdcycleh },
1230     { rv_op_rdtimeh, rvcc_rdtimeh },
1231     { rv_op_rdinstreth, rvcc_rdinstreth },
1232     { rv_op_frcsr, rvcc_frcsr },
1233     { rv_op_frrm, rvcc_frrm },
1234     { rv_op_frflags, rvcc_frflags },
1235     { rv_op_illegal, NULL }
1236 };
1237 
1238 static const rv_comp_data rvcp_csrrwi[] = {
1239     { rv_op_fsrmi, rvcc_fsrmi },
1240     { rv_op_fsflagsi, rvcc_fsflagsi },
1241     { rv_op_illegal, NULL }
1242 };
1243 
1244 static const rv_comp_data rvcp_fsgnj_s[] = {
1245     { rv_op_fmv_s, rvcc_fmv_s },
1246     { rv_op_illegal, NULL }
1247 };
1248 
1249 static const rv_comp_data rvcp_fsgnjn_s[] = {
1250     { rv_op_fneg_s, rvcc_fneg_s },
1251     { rv_op_illegal, NULL }
1252 };
1253 
1254 static const rv_comp_data rvcp_fsgnjx_s[] = {
1255     { rv_op_fabs_s, rvcc_fabs_s },
1256     { rv_op_illegal, NULL }
1257 };
1258 
1259 static const rv_comp_data rvcp_fsgnj_d[] = {
1260     { rv_op_fmv_d, rvcc_fmv_d },
1261     { rv_op_illegal, NULL }
1262 };
1263 
1264 static const rv_comp_data rvcp_fsgnjn_d[] = {
1265     { rv_op_fneg_d, rvcc_fneg_d },
1266     { rv_op_illegal, NULL }
1267 };
1268 
1269 static const rv_comp_data rvcp_fsgnjx_d[] = {
1270     { rv_op_fabs_d, rvcc_fabs_d },
1271     { rv_op_illegal, NULL }
1272 };
1273 
1274 static const rv_comp_data rvcp_fsgnj_q[] = {
1275     { rv_op_fmv_q, rvcc_fmv_q },
1276     { rv_op_illegal, NULL }
1277 };
1278 
1279 static const rv_comp_data rvcp_fsgnjn_q[] = {
1280     { rv_op_fneg_q, rvcc_fneg_q },
1281     { rv_op_illegal, NULL }
1282 };
1283 
1284 static const rv_comp_data rvcp_fsgnjx_q[] = {
1285     { rv_op_fabs_q, rvcc_fabs_q },
1286     { rv_op_illegal, NULL }
1287 };
1288 
1289 /* instruction metadata */
1290 
1291 const rv_opcode_data opcode_data[] = {
1292     { "illegal", rv_codec_illegal, rv_fmt_none, NULL, 0, 0, 0 },
1293     { "lui", rv_codec_u, rv_fmt_rd_imm, NULL, 0, 0, 0 },
1294     { "auipc", rv_codec_u, rv_fmt_rd_offset, NULL, 0, 0, 0 },
1295     { "jal", rv_codec_uj, rv_fmt_rd_offset, rvcp_jal, 0, 0, 0 },
1296     { "jalr", rv_codec_i, rv_fmt_rd_rs1_offset, rvcp_jalr, 0, 0, 0 },
1297     { "beq", rv_codec_sb, rv_fmt_rs1_rs2_offset, rvcp_beq, 0, 0, 0 },
1298     { "bne", rv_codec_sb, rv_fmt_rs1_rs2_offset, rvcp_bne, 0, 0, 0 },
1299     { "blt", rv_codec_sb, rv_fmt_rs1_rs2_offset, rvcp_blt, 0, 0, 0 },
1300     { "bge", rv_codec_sb, rv_fmt_rs1_rs2_offset, rvcp_bge, 0, 0, 0 },
1301     { "bltu", rv_codec_sb, rv_fmt_rs1_rs2_offset, rvcp_bltu, 0, 0, 0 },
1302     { "bgeu", rv_codec_sb, rv_fmt_rs1_rs2_offset, rvcp_bgeu, 0, 0, 0 },
1303     { "lb", rv_codec_i, rv_fmt_rd_offset_rs1, NULL, 0, 0, 0 },
1304     { "lh", rv_codec_i, rv_fmt_rd_offset_rs1, NULL, 0, 0, 0 },
1305     { "lw", rv_codec_i, rv_fmt_rd_offset_rs1, NULL, 0, 0, 0 },
1306     { "lbu", rv_codec_i, rv_fmt_rd_offset_rs1, NULL, 0, 0, 0 },
1307     { "lhu", rv_codec_i, rv_fmt_rd_offset_rs1, NULL, 0, 0, 0 },
1308     { "sb", rv_codec_s, rv_fmt_rs2_offset_rs1, NULL, 0, 0, 0 },
1309     { "sh", rv_codec_s, rv_fmt_rs2_offset_rs1, NULL, 0, 0, 0 },
1310     { "sw", rv_codec_s, rv_fmt_rs2_offset_rs1, NULL, 0, 0, 0 },
1311     { "addi", rv_codec_i, rv_fmt_rd_rs1_imm, rvcp_addi, 0, 0, 0 },
1312     { "slti", rv_codec_i, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1313     { "sltiu", rv_codec_i, rv_fmt_rd_rs1_imm, rvcp_sltiu, 0, 0, 0 },
1314     { "xori", rv_codec_i, rv_fmt_rd_rs1_imm, rvcp_xori, 0, 0, 0 },
1315     { "ori", rv_codec_i, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1316     { "andi", rv_codec_i, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1317     { "slli", rv_codec_i_sh7, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1318     { "srli", rv_codec_i_sh7, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1319     { "srai", rv_codec_i_sh7, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1320     { "add", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1321     { "sub", rv_codec_r, rv_fmt_rd_rs1_rs2, rvcp_sub, 0, 0, 0 },
1322     { "sll", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1323     { "slt", rv_codec_r, rv_fmt_rd_rs1_rs2, rvcp_slt, 0, 0, 0 },
1324     { "sltu", rv_codec_r, rv_fmt_rd_rs1_rs2, rvcp_sltu, 0, 0, 0 },
1325     { "xor", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1326     { "srl", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1327     { "sra", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1328     { "or", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1329     { "and", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1330     { "fence", rv_codec_r_f, rv_fmt_pred_succ, NULL, 0, 0, 0 },
1331     { "fence.i", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
1332     { "lwu", rv_codec_i, rv_fmt_rd_offset_rs1, NULL, 0, 0, 0 },
1333     { "ld", rv_codec_i, rv_fmt_rd_offset_rs1, NULL, 0, 0, 0 },
1334     { "sd", rv_codec_s, rv_fmt_rs2_offset_rs1, NULL, 0, 0, 0 },
1335     { "addiw", rv_codec_i, rv_fmt_rd_rs1_imm, rvcp_addiw, 0, 0, 0 },
1336     { "slliw", rv_codec_i_sh5, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1337     { "srliw", rv_codec_i_sh5, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1338     { "sraiw", rv_codec_i_sh5, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1339     { "addw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1340     { "subw", rv_codec_r, rv_fmt_rd_rs1_rs2, rvcp_subw, 0, 0, 0 },
1341     { "sllw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1342     { "srlw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1343     { "sraw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1344     { "ldu", rv_codec_i, rv_fmt_rd_offset_rs1, NULL, 0, 0, 0 },
1345     { "lq", rv_codec_i, rv_fmt_rd_offset_rs1, NULL, 0, 0, 0 },
1346     { "sq", rv_codec_s, rv_fmt_rs2_offset_rs1, NULL, 0, 0, 0 },
1347     { "addid", rv_codec_i, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1348     { "sllid", rv_codec_i_sh6, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1349     { "srlid", rv_codec_i_sh6, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1350     { "sraid", rv_codec_i_sh6, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1351     { "addd", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1352     { "subd", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1353     { "slld", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1354     { "srld", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1355     { "srad", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1356     { "mul", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1357     { "mulh", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1358     { "mulhsu", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1359     { "mulhu", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1360     { "div", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1361     { "divu", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1362     { "rem", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1363     { "remu", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1364     { "mulw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1365     { "divw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1366     { "divuw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1367     { "remw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1368     { "remuw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1369     { "muld", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1370     { "divd", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1371     { "divud", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1372     { "remd", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1373     { "remud", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1374     { "lr.w", rv_codec_r_l, rv_fmt_aqrl_rd_rs1, NULL, 0, 0, 0 },
1375     { "sc.w", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1376     { "amoswap.w", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1377     { "amoadd.w", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1378     { "amoxor.w", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1379     { "amoor.w", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1380     { "amoand.w", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1381     { "amomin.w", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1382     { "amomax.w", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1383     { "amominu.w", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1384     { "amomaxu.w", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1385     { "lr.d", rv_codec_r_l, rv_fmt_aqrl_rd_rs1, NULL, 0, 0, 0 },
1386     { "sc.d", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1387     { "amoswap.d", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1388     { "amoadd.d", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1389     { "amoxor.d", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1390     { "amoor.d", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1391     { "amoand.d", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1392     { "amomin.d", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1393     { "amomax.d", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1394     { "amominu.d", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1395     { "amomaxu.d", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1396     { "lr.q", rv_codec_r_l, rv_fmt_aqrl_rd_rs1, NULL, 0, 0, 0 },
1397     { "sc.q", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1398     { "amoswap.q", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1399     { "amoadd.q", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1400     { "amoxor.q", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1401     { "amoor.q", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1402     { "amoand.q", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1403     { "amomin.q", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1404     { "amomax.q", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1405     { "amominu.q", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1406     { "amomaxu.q", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
1407     { "ecall", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
1408     { "ebreak", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
1409     { "uret", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
1410     { "sret", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
1411     { "hret", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
1412     { "mret", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
1413     { "dret", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
1414     { "sfence.vm", rv_codec_r, rv_fmt_rs1, NULL, 0, 0, 0 },
1415     { "sfence.vma", rv_codec_r, rv_fmt_rs1_rs2, NULL, 0, 0, 0 },
1416     { "wfi", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
1417     { "csrrw", rv_codec_i_csr, rv_fmt_rd_csr_rs1, rvcp_csrrw, 0, 0, 0 },
1418     { "csrrs", rv_codec_i_csr, rv_fmt_rd_csr_rs1, rvcp_csrrs, 0, 0, 0 },
1419     { "csrrc", rv_codec_i_csr, rv_fmt_rd_csr_rs1, NULL, 0, 0, 0 },
1420     { "csrrwi", rv_codec_i_csr, rv_fmt_rd_csr_zimm, rvcp_csrrwi, 0, 0, 0 },
1421     { "csrrsi", rv_codec_i_csr, rv_fmt_rd_csr_zimm, NULL, 0, 0, 0 },
1422     { "csrrci", rv_codec_i_csr, rv_fmt_rd_csr_zimm, NULL, 0, 0, 0 },
1423     { "flw", rv_codec_i, rv_fmt_frd_offset_rs1, NULL, 0, 0, 0 },
1424     { "fsw", rv_codec_s, rv_fmt_frs2_offset_rs1, NULL, 0, 0, 0 },
1425     { "fmadd.s", rv_codec_r4_m, rv_fmt_rm_frd_frs1_frs2_frs3, NULL, 0, 0, 0 },
1426     { "fmsub.s", rv_codec_r4_m, rv_fmt_rm_frd_frs1_frs2_frs3, NULL, 0, 0, 0 },
1427     { "fnmsub.s", rv_codec_r4_m, rv_fmt_rm_frd_frs1_frs2_frs3, NULL, 0, 0, 0 },
1428     { "fnmadd.s", rv_codec_r4_m, rv_fmt_rm_frd_frs1_frs2_frs3, NULL, 0, 0, 0 },
1429     { "fadd.s", rv_codec_r_m, rv_fmt_rm_frd_frs1_frs2, NULL, 0, 0, 0 },
1430     { "fsub.s", rv_codec_r_m, rv_fmt_rm_frd_frs1_frs2, NULL, 0, 0, 0 },
1431     { "fmul.s", rv_codec_r_m, rv_fmt_rm_frd_frs1_frs2, NULL, 0, 0, 0 },
1432     { "fdiv.s", rv_codec_r_m, rv_fmt_rm_frd_frs1_frs2, NULL, 0, 0, 0 },
1433     { "fsgnj.s", rv_codec_r, rv_fmt_frd_frs1_frs2, rvcp_fsgnj_s, 0, 0, 0 },
1434     { "fsgnjn.s", rv_codec_r, rv_fmt_frd_frs1_frs2, rvcp_fsgnjn_s, 0, 0, 0 },
1435     { "fsgnjx.s", rv_codec_r, rv_fmt_frd_frs1_frs2, rvcp_fsgnjx_s, 0, 0, 0 },
1436     { "fmin.s", rv_codec_r, rv_fmt_frd_frs1_frs2, NULL, 0, 0, 0 },
1437     { "fmax.s", rv_codec_r, rv_fmt_frd_frs1_frs2, NULL, 0, 0, 0 },
1438     { "fsqrt.s", rv_codec_r_m, rv_fmt_rm_frd_frs1, NULL, 0, 0, 0 },
1439     { "fle.s", rv_codec_r, rv_fmt_rd_frs1_frs2, NULL, 0, 0, 0 },
1440     { "flt.s", rv_codec_r, rv_fmt_rd_frs1_frs2, NULL, 0, 0, 0 },
1441     { "feq.s", rv_codec_r, rv_fmt_rd_frs1_frs2, NULL, 0, 0, 0 },
1442     { "fcvt.w.s", rv_codec_r_m, rv_fmt_rm_rd_frs1, NULL, 0, 0, 0 },
1443     { "fcvt.wu.s", rv_codec_r_m, rv_fmt_rm_rd_frs1, NULL, 0, 0, 0 },
1444     { "fcvt.s.w", rv_codec_r_m, rv_fmt_rm_frd_rs1, NULL, 0, 0, 0 },
1445     { "fcvt.s.wu", rv_codec_r_m, rv_fmt_rm_frd_rs1, NULL, 0, 0, 0 },
1446     { "fmv.x.s", rv_codec_r, rv_fmt_rd_frs1, NULL, 0, 0, 0 },
1447     { "fclass.s", rv_codec_r, rv_fmt_rd_frs1, NULL, 0, 0, 0 },
1448     { "fmv.s.x", rv_codec_r, rv_fmt_frd_rs1, NULL, 0, 0, 0 },
1449     { "fcvt.l.s", rv_codec_r_m, rv_fmt_rm_rd_frs1, NULL, 0, 0, 0 },
1450     { "fcvt.lu.s", rv_codec_r_m, rv_fmt_rm_rd_frs1, NULL, 0, 0, 0 },
1451     { "fcvt.s.l", rv_codec_r_m, rv_fmt_rm_frd_rs1, NULL, 0, 0, 0 },
1452     { "fcvt.s.lu", rv_codec_r_m, rv_fmt_rm_frd_rs1, NULL, 0, 0, 0 },
1453     { "fld", rv_codec_i, rv_fmt_frd_offset_rs1, NULL, 0, 0, 0 },
1454     { "fsd", rv_codec_s, rv_fmt_frs2_offset_rs1, NULL, 0, 0, 0 },
1455     { "fmadd.d", rv_codec_r4_m, rv_fmt_rm_frd_frs1_frs2_frs3, NULL, 0, 0, 0 },
1456     { "fmsub.d", rv_codec_r4_m, rv_fmt_rm_frd_frs1_frs2_frs3, NULL, 0, 0, 0 },
1457     { "fnmsub.d", rv_codec_r4_m, rv_fmt_rm_frd_frs1_frs2_frs3, NULL, 0, 0, 0 },
1458     { "fnmadd.d", rv_codec_r4_m, rv_fmt_rm_frd_frs1_frs2_frs3, NULL, 0, 0, 0 },
1459     { "fadd.d", rv_codec_r_m, rv_fmt_rm_frd_frs1_frs2, NULL, 0, 0, 0 },
1460     { "fsub.d", rv_codec_r_m, rv_fmt_rm_frd_frs1_frs2, NULL, 0, 0, 0 },
1461     { "fmul.d", rv_codec_r_m, rv_fmt_rm_frd_frs1_frs2, NULL, 0, 0, 0 },
1462     { "fdiv.d", rv_codec_r_m, rv_fmt_rm_frd_frs1_frs2, NULL, 0, 0, 0 },
1463     { "fsgnj.d", rv_codec_r, rv_fmt_frd_frs1_frs2, rvcp_fsgnj_d, 0, 0, 0 },
1464     { "fsgnjn.d", rv_codec_r, rv_fmt_frd_frs1_frs2, rvcp_fsgnjn_d, 0, 0, 0 },
1465     { "fsgnjx.d", rv_codec_r, rv_fmt_frd_frs1_frs2, rvcp_fsgnjx_d, 0, 0, 0 },
1466     { "fmin.d", rv_codec_r, rv_fmt_frd_frs1_frs2, NULL, 0, 0, 0 },
1467     { "fmax.d", rv_codec_r, rv_fmt_frd_frs1_frs2, NULL, 0, 0, 0 },
1468     { "fcvt.s.d", rv_codec_r_m, rv_fmt_rm_frd_frs1, NULL, 0, 0, 0 },
1469     { "fcvt.d.s", rv_codec_r_m, rv_fmt_rm_frd_frs1, NULL, 0, 0, 0 },
1470     { "fsqrt.d", rv_codec_r_m, rv_fmt_rm_frd_frs1, NULL, 0, 0, 0 },
1471     { "fle.d", rv_codec_r, rv_fmt_rd_frs1_frs2, NULL, 0, 0, 0 },
1472     { "flt.d", rv_codec_r, rv_fmt_rd_frs1_frs2, NULL, 0, 0, 0 },
1473     { "feq.d", rv_codec_r, rv_fmt_rd_frs1_frs2, NULL, 0, 0, 0 },
1474     { "fcvt.w.d", rv_codec_r_m, rv_fmt_rm_rd_frs1, NULL, 0, 0, 0 },
1475     { "fcvt.wu.d", rv_codec_r_m, rv_fmt_rm_rd_frs1, NULL, 0, 0, 0 },
1476     { "fcvt.d.w", rv_codec_r_m, rv_fmt_rm_frd_rs1, NULL, 0, 0, 0 },
1477     { "fcvt.d.wu", rv_codec_r_m, rv_fmt_rm_frd_rs1, NULL, 0, 0, 0 },
1478     { "fclass.d", rv_codec_r, rv_fmt_rd_frs1, NULL, 0, 0, 0 },
1479     { "fcvt.l.d", rv_codec_r_m, rv_fmt_rm_rd_frs1, NULL, 0, 0, 0 },
1480     { "fcvt.lu.d", rv_codec_r_m, rv_fmt_rm_rd_frs1, NULL, 0, 0, 0 },
1481     { "fmv.x.d", rv_codec_r, rv_fmt_rd_frs1, NULL, 0, 0, 0 },
1482     { "fcvt.d.l", rv_codec_r_m, rv_fmt_rm_frd_rs1, NULL, 0, 0, 0 },
1483     { "fcvt.d.lu", rv_codec_r_m, rv_fmt_rm_frd_rs1, NULL, 0, 0, 0 },
1484     { "fmv.d.x", rv_codec_r, rv_fmt_frd_rs1, NULL, 0, 0, 0 },
1485     { "flq", rv_codec_i, rv_fmt_frd_offset_rs1, NULL, 0, 0, 0 },
1486     { "fsq", rv_codec_s, rv_fmt_frs2_offset_rs1, NULL, 0, 0, 0 },
1487     { "fmadd.q", rv_codec_r4_m, rv_fmt_rm_frd_frs1_frs2_frs3, NULL, 0, 0, 0 },
1488     { "fmsub.q", rv_codec_r4_m, rv_fmt_rm_frd_frs1_frs2_frs3, NULL, 0, 0, 0 },
1489     { "fnmsub.q", rv_codec_r4_m, rv_fmt_rm_frd_frs1_frs2_frs3, NULL, 0, 0, 0 },
1490     { "fnmadd.q", rv_codec_r4_m, rv_fmt_rm_frd_frs1_frs2_frs3, NULL, 0, 0, 0 },
1491     { "fadd.q", rv_codec_r_m, rv_fmt_rm_frd_frs1_frs2, NULL, 0, 0, 0 },
1492     { "fsub.q", rv_codec_r_m, rv_fmt_rm_frd_frs1_frs2, NULL, 0, 0, 0 },
1493     { "fmul.q", rv_codec_r_m, rv_fmt_rm_frd_frs1_frs2, NULL, 0, 0, 0 },
1494     { "fdiv.q", rv_codec_r_m, rv_fmt_rm_frd_frs1_frs2, NULL, 0, 0, 0 },
1495     { "fsgnj.q", rv_codec_r, rv_fmt_frd_frs1_frs2, rvcp_fsgnj_q, 0, 0, 0 },
1496     { "fsgnjn.q", rv_codec_r, rv_fmt_frd_frs1_frs2, rvcp_fsgnjn_q, 0, 0, 0 },
1497     { "fsgnjx.q", rv_codec_r, rv_fmt_frd_frs1_frs2, rvcp_fsgnjx_q, 0, 0, 0 },
1498     { "fmin.q", rv_codec_r, rv_fmt_frd_frs1_frs2, NULL, 0, 0, 0 },
1499     { "fmax.q", rv_codec_r, rv_fmt_frd_frs1_frs2, NULL, 0, 0, 0 },
1500     { "fcvt.s.q", rv_codec_r_m, rv_fmt_rm_frd_frs1, NULL, 0, 0, 0 },
1501     { "fcvt.q.s", rv_codec_r_m, rv_fmt_rm_frd_frs1, NULL, 0, 0, 0 },
1502     { "fcvt.d.q", rv_codec_r_m, rv_fmt_rm_frd_frs1, NULL, 0, 0, 0 },
1503     { "fcvt.q.d", rv_codec_r_m, rv_fmt_rm_frd_frs1, NULL, 0, 0, 0 },
1504     { "fsqrt.q", rv_codec_r_m, rv_fmt_rm_frd_frs1, NULL, 0, 0, 0 },
1505     { "fle.q", rv_codec_r, rv_fmt_rd_frs1_frs2, NULL, 0, 0, 0 },
1506     { "flt.q", rv_codec_r, rv_fmt_rd_frs1_frs2, NULL, 0, 0, 0 },
1507     { "feq.q", rv_codec_r, rv_fmt_rd_frs1_frs2, NULL, 0, 0, 0 },
1508     { "fcvt.w.q", rv_codec_r_m, rv_fmt_rm_rd_frs1, NULL, 0, 0, 0 },
1509     { "fcvt.wu.q", rv_codec_r_m, rv_fmt_rm_rd_frs1, NULL, 0, 0, 0 },
1510     { "fcvt.q.w", rv_codec_r_m, rv_fmt_rm_frd_rs1, NULL, 0, 0, 0 },
1511     { "fcvt.q.wu", rv_codec_r_m, rv_fmt_rm_frd_rs1, NULL, 0, 0, 0 },
1512     { "fclass.q", rv_codec_r, rv_fmt_rd_frs1, NULL, 0, 0, 0 },
1513     { "fcvt.l.q", rv_codec_r_m, rv_fmt_rm_rd_frs1, NULL, 0, 0, 0 },
1514     { "fcvt.lu.q", rv_codec_r_m, rv_fmt_rm_rd_frs1, NULL, 0, 0, 0 },
1515     { "fcvt.q.l", rv_codec_r_m, rv_fmt_rm_frd_rs1, NULL, 0, 0, 0 },
1516     { "fcvt.q.lu", rv_codec_r_m, rv_fmt_rm_frd_rs1, NULL, 0, 0, 0 },
1517     { "fmv.x.q", rv_codec_r, rv_fmt_rd_frs1, NULL, 0, 0, 0 },
1518     { "fmv.q.x", rv_codec_r, rv_fmt_frd_rs1, NULL, 0, 0, 0 },
1519     { "c.addi4spn", rv_codec_ciw_4spn, rv_fmt_rd_rs1_imm, NULL, rv_op_addi,
1520       rv_op_addi, rv_op_addi, rvcd_imm_nz },
1521     { "c.fld", rv_codec_cl_ld, rv_fmt_frd_offset_rs1, NULL, rv_op_fld, rv_op_fld, 0 },
1522     { "c.lw", rv_codec_cl_lw, rv_fmt_rd_offset_rs1, NULL, rv_op_lw, rv_op_lw, rv_op_lw },
1523     { "c.flw", rv_codec_cl_lw, rv_fmt_frd_offset_rs1, NULL, rv_op_flw, 0, 0 },
1524     { "c.fsd", rv_codec_cs_sd, rv_fmt_frs2_offset_rs1, NULL, rv_op_fsd, rv_op_fsd, 0 },
1525     { "c.sw", rv_codec_cs_sw, rv_fmt_rs2_offset_rs1, NULL, rv_op_sw, rv_op_sw, rv_op_sw },
1526     { "c.fsw", rv_codec_cs_sw, rv_fmt_frs2_offset_rs1, NULL, rv_op_fsw, 0, 0 },
1527     { "c.nop", rv_codec_ci_none, rv_fmt_none, NULL, rv_op_addi, rv_op_addi, rv_op_addi },
1528     { "c.addi", rv_codec_ci, rv_fmt_rd_rs1_imm, NULL, rv_op_addi, rv_op_addi,
1529       rv_op_addi, rvcd_imm_nz },
1530     { "c.jal", rv_codec_cj_jal, rv_fmt_rd_offset, NULL, rv_op_jal, 0, 0 },
1531     { "c.li", rv_codec_ci_li, rv_fmt_rd_rs1_imm, NULL, rv_op_addi, rv_op_addi, rv_op_addi },
1532     { "c.addi16sp", rv_codec_ci_16sp, rv_fmt_rd_rs1_imm, NULL, rv_op_addi,
1533       rv_op_addi, rv_op_addi, rvcd_imm_nz },
1534     { "c.lui", rv_codec_ci_lui, rv_fmt_rd_imm, NULL, rv_op_lui, rv_op_lui,
1535       rv_op_lui, rvcd_imm_nz },
1536     { "c.srli", rv_codec_cb_sh6, rv_fmt_rd_rs1_imm, NULL, rv_op_srli,
1537       rv_op_srli, rv_op_srli, rvcd_imm_nz },
1538     { "c.srai", rv_codec_cb_sh6, rv_fmt_rd_rs1_imm, NULL, rv_op_srai,
1539       rv_op_srai, rv_op_srai, rvcd_imm_nz },
1540     { "c.andi", rv_codec_cb_imm, rv_fmt_rd_rs1_imm, NULL, rv_op_andi,
1541       rv_op_andi, rv_op_andi },
1542     { "c.sub", rv_codec_cs, rv_fmt_rd_rs1_rs2, NULL, rv_op_sub, rv_op_sub, rv_op_sub },
1543     { "c.xor", rv_codec_cs, rv_fmt_rd_rs1_rs2, NULL, rv_op_xor, rv_op_xor, rv_op_xor },
1544     { "c.or", rv_codec_cs, rv_fmt_rd_rs1_rs2, NULL, rv_op_or, rv_op_or, rv_op_or },
1545     { "c.and", rv_codec_cs, rv_fmt_rd_rs1_rs2, NULL, rv_op_and, rv_op_and, rv_op_and },
1546     { "c.subw", rv_codec_cs, rv_fmt_rd_rs1_rs2, NULL, rv_op_subw, rv_op_subw, rv_op_subw },
1547     { "c.addw", rv_codec_cs, rv_fmt_rd_rs1_rs2, NULL, rv_op_addw, rv_op_addw, rv_op_addw },
1548     { "c.j", rv_codec_cj, rv_fmt_rd_offset, NULL, rv_op_jal, rv_op_jal, rv_op_jal },
1549     { "c.beqz", rv_codec_cb, rv_fmt_rs1_rs2_offset, NULL, rv_op_beq, rv_op_beq, rv_op_beq },
1550     { "c.bnez", rv_codec_cb, rv_fmt_rs1_rs2_offset, NULL, rv_op_bne, rv_op_bne, rv_op_bne },
1551     { "c.slli", rv_codec_ci_sh6, rv_fmt_rd_rs1_imm, NULL, rv_op_slli,
1552       rv_op_slli, rv_op_slli, rvcd_imm_nz },
1553     { "c.fldsp", rv_codec_ci_ldsp, rv_fmt_frd_offset_rs1, NULL, rv_op_fld, rv_op_fld, rv_op_fld },
1554     { "c.lwsp", rv_codec_ci_lwsp, rv_fmt_rd_offset_rs1, NULL, rv_op_lw, rv_op_lw, rv_op_lw },
1555     { "c.flwsp", rv_codec_ci_lwsp, rv_fmt_frd_offset_rs1, NULL, rv_op_flw, 0, 0 },
1556     { "c.jr", rv_codec_cr_jr, rv_fmt_rd_rs1_offset, NULL, rv_op_jalr, rv_op_jalr, rv_op_jalr },
1557     { "c.mv", rv_codec_cr_mv, rv_fmt_rd_rs1_rs2, NULL, rv_op_addi, rv_op_addi, rv_op_addi },
1558     { "c.ebreak", rv_codec_ci_none, rv_fmt_none, NULL, rv_op_ebreak, rv_op_ebreak, rv_op_ebreak },
1559     { "c.jalr", rv_codec_cr_jalr, rv_fmt_rd_rs1_offset, NULL, rv_op_jalr, rv_op_jalr, rv_op_jalr },
1560     { "c.add", rv_codec_cr, rv_fmt_rd_rs1_rs2, NULL, rv_op_add, rv_op_add, rv_op_add },
1561     { "c.fsdsp", rv_codec_css_sdsp, rv_fmt_frs2_offset_rs1, NULL, rv_op_fsd, rv_op_fsd, rv_op_fsd },
1562     { "c.swsp", rv_codec_css_swsp, rv_fmt_rs2_offset_rs1, NULL, rv_op_sw, rv_op_sw, rv_op_sw },
1563     { "c.fswsp", rv_codec_css_swsp, rv_fmt_frs2_offset_rs1, NULL, rv_op_fsw, 0, 0 },
1564     { "c.ld", rv_codec_cl_ld, rv_fmt_rd_offset_rs1, NULL, 0, rv_op_ld, rv_op_ld },
1565     { "c.sd", rv_codec_cs_sd, rv_fmt_rs2_offset_rs1, NULL, 0, rv_op_sd, rv_op_sd },
1566     { "c.addiw", rv_codec_ci, rv_fmt_rd_rs1_imm, NULL, 0, rv_op_addiw, rv_op_addiw },
1567     { "c.ldsp", rv_codec_ci_ldsp, rv_fmt_rd_offset_rs1, NULL, 0, rv_op_ld, rv_op_ld },
1568     { "c.sdsp", rv_codec_css_sdsp, rv_fmt_rs2_offset_rs1, NULL, 0, rv_op_sd, rv_op_sd },
1569     { "c.lq", rv_codec_cl_lq, rv_fmt_rd_offset_rs1, NULL, 0, 0, rv_op_lq },
1570     { "c.sq", rv_codec_cs_sq, rv_fmt_rs2_offset_rs1, NULL, 0, 0, rv_op_sq },
1571     { "c.lqsp", rv_codec_ci_lqsp, rv_fmt_rd_offset_rs1, NULL, 0, 0, rv_op_lq },
1572     { "c.sqsp", rv_codec_css_sqsp, rv_fmt_rs2_offset_rs1, NULL, 0, 0, rv_op_sq },
1573     { "nop", rv_codec_i, rv_fmt_none, NULL, 0, 0, 0 },
1574     { "mv", rv_codec_i, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1575     { "not", rv_codec_i, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1576     { "neg", rv_codec_r, rv_fmt_rd_rs2, NULL, 0, 0, 0 },
1577     { "negw", rv_codec_r, rv_fmt_rd_rs2, NULL, 0, 0, 0 },
1578     { "sext.w", rv_codec_i, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1579     { "seqz", rv_codec_i, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1580     { "snez", rv_codec_r, rv_fmt_rd_rs2, NULL, 0, 0, 0 },
1581     { "sltz", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1582     { "sgtz", rv_codec_r, rv_fmt_rd_rs2, NULL, 0, 0, 0 },
1583     { "fmv.s", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1584     { "fabs.s", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1585     { "fneg.s", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1586     { "fmv.d", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1587     { "fabs.d", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1588     { "fneg.d", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1589     { "fmv.q", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1590     { "fabs.q", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1591     { "fneg.q", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1592     { "beqz", rv_codec_sb, rv_fmt_rs1_offset, NULL, 0, 0, 0 },
1593     { "bnez", rv_codec_sb, rv_fmt_rs1_offset, NULL, 0, 0, 0 },
1594     { "blez", rv_codec_sb, rv_fmt_rs2_offset, NULL, 0, 0, 0 },
1595     { "bgez", rv_codec_sb, rv_fmt_rs1_offset, NULL, 0, 0, 0 },
1596     { "bltz", rv_codec_sb, rv_fmt_rs1_offset, NULL, 0, 0, 0 },
1597     { "bgtz", rv_codec_sb, rv_fmt_rs2_offset, NULL, 0, 0, 0 },
1598     { "ble", rv_codec_sb, rv_fmt_rs2_rs1_offset, NULL, 0, 0, 0 },
1599     { "bleu", rv_codec_sb, rv_fmt_rs2_rs1_offset, NULL, 0, 0, 0 },
1600     { "bgt", rv_codec_sb, rv_fmt_rs2_rs1_offset, NULL, 0, 0, 0 },
1601     { "bgtu", rv_codec_sb, rv_fmt_rs2_rs1_offset, NULL, 0, 0, 0 },
1602     { "j", rv_codec_uj, rv_fmt_offset, NULL, 0, 0, 0 },
1603     { "ret", rv_codec_i, rv_fmt_none, NULL, 0, 0, 0 },
1604     { "jr", rv_codec_i, rv_fmt_rs1, NULL, 0, 0, 0 },
1605     { "rdcycle", rv_codec_i_csr, rv_fmt_rd, NULL, 0, 0, 0 },
1606     { "rdtime", rv_codec_i_csr, rv_fmt_rd, NULL, 0, 0, 0 },
1607     { "rdinstret", rv_codec_i_csr, rv_fmt_rd, NULL, 0, 0, 0 },
1608     { "rdcycleh", rv_codec_i_csr, rv_fmt_rd, NULL, 0, 0, 0 },
1609     { "rdtimeh", rv_codec_i_csr, rv_fmt_rd, NULL, 0, 0, 0 },
1610     { "rdinstreth", rv_codec_i_csr, rv_fmt_rd, NULL, 0, 0, 0 },
1611     { "frcsr", rv_codec_i_csr, rv_fmt_rd, NULL, 0, 0, 0 },
1612     { "frrm", rv_codec_i_csr, rv_fmt_rd, NULL, 0, 0, 0 },
1613     { "frflags", rv_codec_i_csr, rv_fmt_rd, NULL, 0, 0, 0 },
1614     { "fscsr", rv_codec_i_csr, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1615     { "fsrm", rv_codec_i_csr, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1616     { "fsflags", rv_codec_i_csr, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1617     { "fsrmi", rv_codec_i_csr, rv_fmt_rd_zimm, NULL, 0, 0, 0 },
1618     { "fsflagsi", rv_codec_i_csr, rv_fmt_rd_zimm, NULL, 0, 0, 0 },
1619     { "bseti", rv_codec_i_sh7, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1620     { "bclri", rv_codec_i_sh7, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1621     { "binvi", rv_codec_i_sh7, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1622     { "bexti", rv_codec_i_sh7, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1623     { "rori", rv_codec_i_sh7, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1624     { "clz", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1625     { "ctz", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1626     { "cpop", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1627     { "sext.h", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1628     { "sext.b", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1629     { "xnor", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1630     { "orn", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1631     { "andn", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1632     { "rol", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1633     { "ror", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1634     { "sh1add", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1635     { "sh2add", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1636     { "sh3add", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1637     { "sh1add.uw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1638     { "sh2add.uw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1639     { "sh3add.uw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1640     { "clmul", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1641     { "clmulr", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1642     { "clmulh", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1643     { "min", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1644     { "minu", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1645     { "max", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1646     { "maxu", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1647     { "clzw", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1648     { "clzw", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1649     { "cpopw", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1650     { "slli.uw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1651     { "add.uw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1652     { "rolw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1653     { "rorw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1654     { "rev8", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1655     { "zext.h", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1656     { "roriw", rv_codec_i_sh5, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1657     { "orc.b", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1658     { "bset", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1659     { "bclr", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1660     { "binv", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1661     { "bext", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1662     { "aes32esmi", rv_codec_k_bs, rv_fmt_rs1_rs2_bs, NULL, 0, 0, 0 },
1663     { "aes32esi", rv_codec_k_bs, rv_fmt_rs1_rs2_bs, NULL, 0, 0, 0 },
1664     { "aes32dsmi", rv_codec_k_bs, rv_fmt_rs1_rs2_bs, NULL, 0, 0, 0 },
1665     { "aes32dsi", rv_codec_k_bs, rv_fmt_rs1_rs2_bs, NULL, 0, 0, 0 },
1666     { "aes64ks1i", rv_codec_k_rnum,  rv_fmt_rd_rs1_rnum, NULL, 0, 0, 0 },
1667     { "aes64ks2", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1668     { "aes64im", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0 },
1669     { "aes64esm", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1670     { "aes64es", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1671     { "aes64dsm", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1672     { "aes64ds", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1673     { "sha256sig0", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0 },
1674     { "sha256sig1", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0 },
1675     { "sha256sum0", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0 },
1676     { "sha256sum1", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0 },
1677     { "sha512sig0", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1678     { "sha512sig1", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1679     { "sha512sum0", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1680     { "sha512sum1", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1681     { "sha512sum0r", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1682     { "sha512sum1r", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1683     { "sha512sig0l", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1684     { "sha512sig0h", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1685     { "sha512sig1l", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1686     { "sha512sig1h", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1687     { "sm3p0", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0 },
1688     { "sm3p1", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0 },
1689     { "sm4ed", rv_codec_k_bs, rv_fmt_rs1_rs2_bs, NULL, 0, 0, 0 },
1690     { "sm4ks", rv_codec_k_bs, rv_fmt_rs1_rs2_bs, NULL, 0, 0, 0 },
1691     { "brev8", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1692     { "pack", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1693     { "packh", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1694     { "packw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1695     { "unzip", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1696     { "zip", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1697     { "xperm4", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1698     { "xperm8", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1699     { "vle8.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vle8_v, rv_op_vle8_v, 0 },
1700     { "vle16.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vle16_v, rv_op_vle16_v, 0 },
1701     { "vle32.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vle32_v, rv_op_vle32_v, 0 },
1702     { "vle64.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vle64_v, rv_op_vle64_v, 0 },
1703     { "vse8.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vse8_v, rv_op_vse8_v, 0 },
1704     { "vse16.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vse16_v, rv_op_vse16_v, 0 },
1705     { "vse32.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vse32_v, rv_op_vse32_v, 0 },
1706     { "vse64.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vse64_v, rv_op_vse64_v, 0 },
1707     { "vlm.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vlm_v, rv_op_vlm_v, 0 },
1708     { "vsm.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vsm_v, rv_op_vsm_v, 0 },
1709     { "vlse8.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, rv_op_vlse8_v, rv_op_vlse8_v, 0 },
1710     { "vlse16.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, rv_op_vlse16_v, rv_op_vlse16_v, 0 },
1711     { "vlse32.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, rv_op_vlse32_v, rv_op_vlse32_v, 0 },
1712     { "vlse64.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, rv_op_vlse64_v, rv_op_vlse64_v, 0 },
1713     { "vsse8.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, rv_op_vsse8_v, rv_op_vsse8_v, 0 },
1714     { "vsse16.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, rv_op_vsse16_v, rv_op_vsse16_v, 0 },
1715     { "vsse32.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, rv_op_vsse32_v, rv_op_vsse32_v, 0 },
1716     { "vsse64.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_rs2_vm, NULL, rv_op_vsse64_v, rv_op_vsse64_v, 0 },
1717     { "vluxei8.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vluxei8_v, rv_op_vluxei8_v, 0 },
1718     { "vluxei16.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vluxei16_v, rv_op_vluxei16_v, 0 },
1719     { "vluxei32.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vluxei32_v, rv_op_vluxei32_v, 0 },
1720     { "vluxei64.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vluxei64_v, rv_op_vluxei64_v, 0 },
1721     { "vloxei8.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vloxei8_v, rv_op_vloxei8_v, 0 },
1722     { "vloxei16.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vloxei16_v, rv_op_vloxei16_v, 0 },
1723     { "vloxei32.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vloxei32_v, rv_op_vloxei32_v, 0 },
1724     { "vloxei64.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vloxei64_v, rv_op_vloxei64_v, 0 },
1725     { "vsuxei8.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vsuxei8_v, rv_op_vsuxei8_v, 0 },
1726     { "vsuxei16.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vsuxei16_v, rv_op_vsuxei16_v, 0 },
1727     { "vsuxei32.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vsuxei32_v, rv_op_vsuxei32_v, 0 },
1728     { "vsuxei64.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vsuxei64_v, rv_op_vsuxei64_v, 0 },
1729     { "vsoxei8.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vsoxei8_v, rv_op_vsoxei8_v, 0 },
1730     { "vsoxei16.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vsoxei16_v, rv_op_vsoxei16_v, 0 },
1731     { "vsoxei32.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vsoxei32_v, rv_op_vsoxei32_v, 0 },
1732     { "vsoxei64.v", rv_codec_v_r, rv_fmt_ldst_vd_rs1_vs2_vm, NULL, rv_op_vsoxei64_v, rv_op_vsoxei64_v, 0 },
1733     { "vle8ff.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vle8ff_v, rv_op_vle8ff_v, 0 },
1734     { "vle16ff.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vle16ff_v, rv_op_vle16ff_v, 0 },
1735     { "vle32ff.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vle32ff_v, rv_op_vle32ff_v, 0 },
1736     { "vle64ff.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vle64ff_v, rv_op_vle64ff_v, 0 },
1737     { "vl1re8.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl1re8_v, rv_op_vl1re8_v, 0 },
1738     { "vl1re16.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl1re16_v, rv_op_vl1re16_v, 0 },
1739     { "vl1re32.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl1re32_v, rv_op_vl1re32_v, 0 },
1740     { "vl1re64.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl1re64_v, rv_op_vl1re64_v, 0 },
1741     { "vl2re8.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl2re8_v, rv_op_vl2re8_v, 0 },
1742     { "vl2re16.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl2re16_v, rv_op_vl2re16_v, 0 },
1743     { "vl2re32.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl2re32_v, rv_op_vl2re32_v, 0 },
1744     { "vl2re64.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl2re64_v, rv_op_vl2re64_v, 0 },
1745     { "vl4re8.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl4re8_v, rv_op_vl4re8_v, 0 },
1746     { "vl4re16.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl4re16_v, rv_op_vl4re16_v, 0 },
1747     { "vl4re32.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl4re32_v, rv_op_vl4re32_v, 0 },
1748     { "vl4re64.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl4re64_v, rv_op_vl4re64_v, 0 },
1749     { "vl8re8.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl8re8_v, rv_op_vl8re8_v, 0 },
1750     { "vl8re16.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl8re16_v, rv_op_vl8re16_v, 0 },
1751     { "vl8re32.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl8re32_v, rv_op_vl8re32_v, 0 },
1752     { "vl8re64.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vl8re64_v, rv_op_vl8re64_v, 0 },
1753     { "vs1r.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vs1r_v, rv_op_vs1r_v, 0 },
1754     { "vs2r.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vs2r_v, rv_op_vs2r_v, 0 },
1755     { "vs4r.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vs4r_v, rv_op_vs4r_v, 0 },
1756     { "vs8r.v", rv_codec_v_ldst, rv_fmt_ldst_vd_rs1_vm, NULL, rv_op_vs8r_v, rv_op_vs8r_v, 0 },
1757     { "vadd.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vadd_vv, rv_op_vadd_vv, 0 },
1758     { "vadd.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vadd_vx, rv_op_vadd_vx, 0 },
1759     { "vadd.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vadd_vi, rv_op_vadd_vi, 0 },
1760     { "vsub.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vsub_vv, rv_op_vsub_vv, 0 },
1761     { "vsub.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vsub_vx, rv_op_vsub_vx, 0 },
1762     { "vrsub.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vrsub_vx, rv_op_vrsub_vx, 0 },
1763     { "vrsub.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vrsub_vi, rv_op_vrsub_vi, 0 },
1764     { "vwaddu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwaddu_vv, rv_op_vwaddu_vv, 0 },
1765     { "vwaddu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwaddu_vx, rv_op_vwaddu_vx, 0 },
1766     { "vwadd.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwadd_vv, rv_op_vwadd_vv, 0 },
1767     { "vwadd.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwadd_vx, rv_op_vwadd_vx, 0 },
1768     { "vwsubu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwsubu_vv, rv_op_vwsubu_vv, 0 },
1769     { "vwsubu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwsubu_vx, rv_op_vwsubu_vx, 0 },
1770     { "vwsub.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwsub_vv, rv_op_vwsub_vv, 0 },
1771     { "vwsub.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwsub_vx, rv_op_vwsub_vx, 0 },
1772     { "vwaddu.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwaddu_wv, rv_op_vwaddu_wv, 0 },
1773     { "vwaddu.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwaddu_wx, rv_op_vwaddu_wx, 0 },
1774     { "vwadd.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwadd_wv, rv_op_vwadd_wv, 0 },
1775     { "vwadd.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwadd_wx, rv_op_vwadd_wx, 0 },
1776     { "vwsubu.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwsubu_wv, rv_op_vwsubu_wv, 0 },
1777     { "vwsubu.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwsubu_wx, rv_op_vwsubu_wx, 0 },
1778     { "vwsub.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwsub_wv, rv_op_vwsub_wv, 0 },
1779     { "vwsub.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwsub_wx, rv_op_vwsub_wx, 0 },
1780     { "vadc.vvm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vl, NULL, rv_op_vadc_vvm, rv_op_vadc_vvm, 0 },
1781     { "vadc.vxm", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vl, NULL, rv_op_vadc_vxm, rv_op_vadc_vxm, 0 },
1782     { "vadc.vim", rv_codec_v_i, rv_fmt_vd_vs2_imm_vl, NULL, rv_op_vadc_vim, rv_op_vadc_vim, 0 },
1783     { "vmadc.vvm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vl, NULL, rv_op_vmadc_vvm, rv_op_vmadc_vvm, 0 },
1784     { "vmadc.vxm", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vl, NULL, rv_op_vmadc_vxm, rv_op_vmadc_vxm, 0 },
1785     { "vmadc.vim", rv_codec_v_i, rv_fmt_vd_vs2_imm_vl, NULL, rv_op_vmadc_vim, rv_op_vmadc_vim, 0 },
1786     { "vsbc.vvm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vl, NULL, rv_op_vsbc_vvm, rv_op_vsbc_vvm, 0 },
1787     { "vsbc.vxm", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vl, NULL, rv_op_vsbc_vxm, rv_op_vsbc_vxm, 0 },
1788     { "vmsbc.vvm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vl, NULL, rv_op_vmsbc_vvm, rv_op_vmsbc_vvm, 0 },
1789     { "vmsbc.vxm", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vl, NULL, rv_op_vmsbc_vxm, rv_op_vmsbc_vxm, 0 },
1790     { "vand.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vand_vv, rv_op_vand_vv, 0 },
1791     { "vand.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vand_vx, rv_op_vand_vx, 0 },
1792     { "vand.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vand_vi, rv_op_vand_vi, 0 },
1793     { "vor.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vor_vv, rv_op_vor_vv, 0 },
1794     { "vor.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vor_vx, rv_op_vor_vx, 0 },
1795     { "vor.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vor_vi, rv_op_vor_vi, 0 },
1796     { "vxor.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vxor_vv, rv_op_vxor_vv, 0 },
1797     { "vxor.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vxor_vx, rv_op_vxor_vx, 0 },
1798     { "vxor.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vxor_vi, rv_op_vxor_vi, 0 },
1799     { "vsll.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vsll_vv, rv_op_vsll_vv, 0 },
1800     { "vsll.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vsll_vx, rv_op_vsll_vx, 0 },
1801     { "vsll.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vsll_vi, rv_op_vsll_vi, 0 },
1802     { "vsrl.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vsrl_vv, rv_op_vsrl_vv, 0 },
1803     { "vsrl.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vsrl_vx, rv_op_vsrl_vx, 0 },
1804     { "vsrl.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vsrl_vi, rv_op_vsrl_vi, 0 },
1805     { "vsra.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vsra_vv, rv_op_vsra_vv, 0 },
1806     { "vsra.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vsra_vx, rv_op_vsra_vx, 0 },
1807     { "vsra.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vsra_vi, rv_op_vsra_vi, 0 },
1808     { "vnsrl.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vnsrl_wv, rv_op_vnsrl_wv, 0 },
1809     { "vnsrl.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vnsrl_wx, rv_op_vnsrl_wx, 0 },
1810     { "vnsrl.wi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vnsrl_wi, rv_op_vnsrl_wi, 0 },
1811     { "vnsra.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vnsra_wv, rv_op_vnsra_wv, 0 },
1812     { "vnsra.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vnsra_wx, rv_op_vnsra_wx, 0 },
1813     { "vnsra.wi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vnsra_wi, rv_op_vnsra_wi, 0 },
1814     { "vmseq.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmseq_vv, rv_op_vmseq_vv, 0 },
1815     { "vmseq.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmseq_vx, rv_op_vmseq_vx, 0 },
1816     { "vmseq.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vmseq_vi, rv_op_vmseq_vi, 0 },
1817     { "vmsne.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmsne_vv, rv_op_vmsne_vv, 0 },
1818     { "vmsne.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmsne_vx, rv_op_vmsne_vx, 0 },
1819     { "vmsne.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vmsne_vi, rv_op_vmsne_vi, 0 },
1820     { "vmsltu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmsltu_vv, rv_op_vmsltu_vv, 0 },
1821     { "vmsltu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmsltu_vx, rv_op_vmsltu_vx, 0 },
1822     { "vmslt.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmslt_vv, rv_op_vmslt_vv, 0 },
1823     { "vmslt.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmslt_vx, rv_op_vmslt_vx, 0 },
1824     { "vmsleu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmsleu_vv, rv_op_vmsleu_vv, 0 },
1825     { "vmsleu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmsleu_vx, rv_op_vmsleu_vx, 0 },
1826     { "vmsleu.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vmsleu_vi, rv_op_vmsleu_vi, 0 },
1827     { "vmsle.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmsle_vv, rv_op_vmsle_vv, 0 },
1828     { "vmsle.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmsle_vx, rv_op_vmsle_vx, 0 },
1829     { "vmsle.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vmsle_vi, rv_op_vmsle_vi, 0 },
1830     { "vmsgtu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmsgtu_vx, rv_op_vmsgtu_vx, 0 },
1831     { "vmsgtu.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vmsgtu_vi, rv_op_vmsgtu_vi, 0 },
1832     { "vmsgt.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmsgt_vx, rv_op_vmsgt_vx, 0 },
1833     { "vmsgt.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vmsgt_vi, rv_op_vmsgt_vi, 0 },
1834     { "vminu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vminu_vv, rv_op_vminu_vv, 0 },
1835     { "vminu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vminu_vx, rv_op_vminu_vx, 0 },
1836     { "vmin.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmin_vv, rv_op_vmin_vv, 0 },
1837     { "vmin.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmin_vx, rv_op_vmin_vx, 0 },
1838     { "vmaxu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmaxu_vv, rv_op_vmaxu_vv, 0 },
1839     { "vmaxu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmaxu_vx, rv_op_vmaxu_vx, 0 },
1840     { "vmax.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmax_vv, rv_op_vmax_vv, 0 },
1841     { "vmax.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmax_vx, rv_op_vmax_vx, 0 },
1842     { "vmul.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmul_vv, rv_op_vmul_vv, 0 },
1843     { "vmul.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmul_vx, rv_op_vmul_vx, 0 },
1844     { "vmulh.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmulh_vv, rv_op_vmulh_vv, 0 },
1845     { "vmulh.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmulh_vx, rv_op_vmulh_vx, 0 },
1846     { "vmulhu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmulhu_vv, rv_op_vmulhu_vv, 0 },
1847     { "vmulhu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmulhu_vx, rv_op_vmulhu_vx, 0 },
1848     { "vmulhsu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmulhsu_vv, rv_op_vmulhsu_vv, 0 },
1849     { "vmulhsu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vmulhsu_vx, rv_op_vmulhsu_vx, 0 },
1850     { "vdivu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vdivu_vv, rv_op_vdivu_vv, 0 },
1851     { "vdivu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vdivu_vx, rv_op_vdivu_vx, 0 },
1852     { "vdiv.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vdiv_vv, rv_op_vdiv_vv, 0 },
1853     { "vdiv.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vdiv_vx, rv_op_vdiv_vx, 0 },
1854     { "vremu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vremu_vv, rv_op_vremu_vv, 0 },
1855     { "vremu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vremu_vx, rv_op_vremu_vx, 0 },
1856     { "vrem.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vrem_vv, rv_op_vrem_vv, 0 },
1857     { "vrem.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vrem_vx, rv_op_vrem_vx, 0 },
1858     { "vwmulu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwmulu_vv, rv_op_vwmulu_vv, 0 },
1859     { "vwmulu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwmulu_vx, rv_op_vwmulu_vx, 0 },
1860     { "vwmulsu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwmulsu_vv, rv_op_vwmulsu_vv, 0 },
1861     { "vwmulsu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwmulsu_vx, rv_op_vwmulsu_vx, 0 },
1862     { "vwmul.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwmul_vv, rv_op_vwmul_vv, 0 },
1863     { "vwmul.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vwmul_vx, rv_op_vwmul_vx, 0 },
1864     { "vmacc.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vmacc_vv, rv_op_vmacc_vv, 0 },
1865     { "vmacc.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, rv_op_vmacc_vx, rv_op_vmacc_vx, 0 },
1866     { "vnmsac.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vnmsac_vv, rv_op_vnmsac_vv, 0 },
1867     { "vnmsac.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, rv_op_vnmsac_vx, rv_op_vnmsac_vx, 0 },
1868     { "vmadd.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vmadd_vv, rv_op_vmadd_vv, 0 },
1869     { "vmadd.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, rv_op_vmadd_vx, rv_op_vmadd_vx, 0 },
1870     { "vnmsub.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vnmsub_vv, rv_op_vnmsub_vv, 0 },
1871     { "vnmsub.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, rv_op_vnmsub_vx, rv_op_vnmsub_vx, 0 },
1872     { "vwmaccu.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vwmaccu_vv, rv_op_vwmaccu_vv, 0 },
1873     { "vwmaccu.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, rv_op_vwmaccu_vx, rv_op_vwmaccu_vx, 0 },
1874     { "vwmacc.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vwmacc_vv, rv_op_vwmacc_vv, 0 },
1875     { "vwmacc.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, rv_op_vwmacc_vx, rv_op_vwmacc_vx, 0 },
1876     { "vwmaccsu.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vwmaccsu_vv, rv_op_vwmaccsu_vv, 0 },
1877     { "vwmaccsu.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, rv_op_vwmaccsu_vx, rv_op_vwmaccsu_vx, 0 },
1878     { "vwmaccus.vx", rv_codec_v_r, rv_fmt_vd_rs1_vs2_vm, NULL, rv_op_vwmaccus_vx, rv_op_vwmaccus_vx, 0 },
1879     { "vmv.v.v", rv_codec_v_r, rv_fmt_vd_vs1, NULL, rv_op_vmv_v_v, rv_op_vmv_v_v, 0 },
1880     { "vmv.v.x", rv_codec_v_r, rv_fmt_vd_rs1, NULL, rv_op_vmv_v_x, rv_op_vmv_v_x, 0 },
1881     { "vmv.v.i", rv_codec_v_i, rv_fmt_vd_imm, NULL, rv_op_vmv_v_i, rv_op_vmv_v_i, 0 },
1882     { "vmerge.vvm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vl, NULL, rv_op_vmerge_vvm, rv_op_vmerge_vvm, 0 },
1883     { "vmerge.vxm", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vl, NULL, rv_op_vmerge_vxm, rv_op_vmerge_vxm, 0 },
1884     { "vmerge.vim", rv_codec_v_i, rv_fmt_vd_vs2_imm_vl, NULL, rv_op_vmerge_vim, rv_op_vmerge_vim, 0 },
1885     { "vsaddu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vsaddu_vv, rv_op_vsaddu_vv, 0 },
1886     { "vsaddu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vsaddu_vx, rv_op_vsaddu_vx, 0 },
1887     { "vsaddu.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vsaddu_vi, rv_op_vsaddu_vi, 0 },
1888     { "vsadd.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vsadd_vv, rv_op_vsadd_vv, 0 },
1889     { "vsadd.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vsadd_vx, rv_op_vsadd_vx, 0 },
1890     { "vsadd.vi", rv_codec_v_i, rv_fmt_vd_vs2_imm_vm, NULL, rv_op_vsadd_vi, rv_op_vsadd_vi, 0 },
1891     { "vssubu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vssubu_vv, rv_op_vssubu_vv, 0 },
1892     { "vssubu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vssubu_vx, rv_op_vssubu_vx, 0 },
1893     { "vssub.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vssub_vv, rv_op_vssub_vv, 0 },
1894     { "vssub.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vssub_vx, rv_op_vssub_vx, 0 },
1895     { "vaadd.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vaadd_vv, rv_op_vaadd_vv, 0 },
1896     { "vaadd.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vaadd_vx, rv_op_vaadd_vx, 0 },
1897     { "vaaddu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vaaddu_vv, rv_op_vaaddu_vv, 0 },
1898     { "vaaddu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vaaddu_vx, rv_op_vaaddu_vx, 0 },
1899     { "vasub.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vasub_vv, rv_op_vasub_vv, 0 },
1900     { "vasub.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vasub_vx, rv_op_vasub_vx, 0 },
1901     { "vasubu.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vasubu_vv, rv_op_vasubu_vv, 0 },
1902     { "vasubu.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vasubu_vx, rv_op_vasubu_vx, 0 },
1903     { "vsmul.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vsmul_vv, rv_op_vsmul_vv, 0 },
1904     { "vsmul.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vsmul_vx, rv_op_vsmul_vx, 0 },
1905     { "vssrl.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vssrl_vv, rv_op_vssrl_vv, 0 },
1906     { "vssrl.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vssrl_vx, rv_op_vssrl_vx, 0 },
1907     { "vssrl.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vssrl_vi, rv_op_vssrl_vi, 0 },
1908     { "vssra.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vssra_vv, rv_op_vssra_vv, 0 },
1909     { "vssra.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vssra_vx, rv_op_vssra_vx, 0 },
1910     { "vssra.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vssra_vi, rv_op_vssra_vi, 0 },
1911     { "vnclipu.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vnclipu_wv, rv_op_vnclipu_wv, 0 },
1912     { "vnclipu.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vnclipu_wx, rv_op_vnclipu_wx, 0 },
1913     { "vnclipu.wi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vnclipu_wi, rv_op_vnclipu_wi, 0 },
1914     { "vnclip.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vnclip_wv, rv_op_vnclip_wv, 0 },
1915     { "vnclip.wx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vnclip_wx, rv_op_vnclip_wx, 0 },
1916     { "vnclip.wi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vnclip_wi, rv_op_vnclip_wi, 0 },
1917     { "vfadd.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfadd_vv, rv_op_vfadd_vv, 0 },
1918     { "vfadd.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfadd_vf, rv_op_vfadd_vf, 0 },
1919     { "vfsub.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfsub_vv, rv_op_vfsub_vv, 0 },
1920     { "vfsub.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfsub_vf, rv_op_vfsub_vf, 0 },
1921     { "vfrsub.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfrsub_vf, rv_op_vfrsub_vf, 0 },
1922     { "vfwadd.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfwadd_vv, rv_op_vfwadd_vv, 0 },
1923     { "vfwadd.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfwadd_vf, rv_op_vfwadd_vf, 0 },
1924     { "vfwadd.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfwadd_wv, rv_op_vfwadd_wv, 0 },
1925     { "vfwadd.wf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfwadd_wf, rv_op_vfwadd_wf, 0 },
1926     { "vfwsub.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfwsub_vv, rv_op_vfwsub_vv, 0 },
1927     { "vfwsub.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfwsub_vf, rv_op_vfwsub_vf, 0 },
1928     { "vfwsub.wv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfwsub_wv, rv_op_vfwsub_wv, 0 },
1929     { "vfwsub.wf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfwsub_wf, rv_op_vfwsub_wf, 0 },
1930     { "vfmul.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfmul_vv, rv_op_vfmul_vv, 0 },
1931     { "vfmul.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfmul_vf, rv_op_vfmul_vf, 0 },
1932     { "vfdiv.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfdiv_vv, rv_op_vfdiv_vv, 0 },
1933     { "vfdiv.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfdiv_vf, rv_op_vfdiv_vf, 0 },
1934     { "vfrdiv.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfrdiv_vf, rv_op_vfrdiv_vf, 0 },
1935     { "vfwmul.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfwmul_vv, rv_op_vfwmul_vv, 0 },
1936     { "vfwmul.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfwmul_vf, rv_op_vfwmul_vf, 0 },
1937     { "vfmacc.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfmacc_vv, rv_op_vfmacc_vv, 0 },
1938     { "vfmacc.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfmacc_vf, rv_op_vfmacc_vf, 0 },
1939     { "vfnmacc.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfnmacc_vv, rv_op_vfnmacc_vv, 0 },
1940     { "vfnmacc.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfnmacc_vf, rv_op_vfnmacc_vf, 0 },
1941     { "vfmsac.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfmsac_vv, rv_op_vfmsac_vv, 0 },
1942     { "vfmsac.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfmsac_vf, rv_op_vfmsac_vf, 0 },
1943     { "vfnmsac.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfnmsac_vv, rv_op_vfnmsac_vv, 0 },
1944     { "vfnmsac.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfnmsac_vf, rv_op_vfnmsac_vf, 0 },
1945     { "vfmadd.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfmadd_vv, rv_op_vfmadd_vv, 0 },
1946     { "vfmadd.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfmadd_vf, rv_op_vfmadd_vf, 0 },
1947     { "vfnmadd.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfnmadd_vv, rv_op_vfnmadd_vv, 0 },
1948     { "vfnmadd.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfnmadd_vf, rv_op_vfnmadd_vf, 0 },
1949     { "vfmsub.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfmsub_vv, rv_op_vfmsub_vv, 0 },
1950     { "vfmsub.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfmsub_vf, rv_op_vfmsub_vf, 0 },
1951     { "vfnmsub.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfnmsub_vv, rv_op_vfnmsub_vv, 0 },
1952     { "vfnmsub.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfnmsub_vf, rv_op_vfnmsub_vf, 0 },
1953     { "vfwmacc.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfwmacc_vv, rv_op_vfwmacc_vv, 0 },
1954     { "vfwmacc.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfwmacc_vf, rv_op_vfwmacc_vf, 0 },
1955     { "vfwnmacc.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfwnmacc_vv, rv_op_vfwnmacc_vv, 0 },
1956     { "vfwnmacc.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfwnmacc_vf, rv_op_vfwnmacc_vf, 0 },
1957     { "vfwmsac.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfwmsac_vv, rv_op_vfwmsac_vv, 0 },
1958     { "vfwmsac.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfwmsac_vf, rv_op_vfwmsac_vf, 0 },
1959     { "vfwnmsac.vv", rv_codec_v_r, rv_fmt_vd_vs1_vs2_vm, NULL, rv_op_vfwnmsac_vv, rv_op_vfwnmsac_vv, 0 },
1960     { "vfwnmsac.vf", rv_codec_v_r, rv_fmt_vd_fs1_vs2_vm, NULL, rv_op_vfwnmsac_vf, rv_op_vfwnmsac_vf, 0 },
1961     { "vfsqrt.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, rv_op_vfsqrt_v, rv_op_vfsqrt_v, 0 },
1962     { "vfrsqrt7.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, rv_op_vfrsqrt7_v, rv_op_vfrsqrt7_v, 0 },
1963     { "vfrec7.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, rv_op_vfrec7_v, rv_op_vfrec7_v, 0 },
1964     { "vfmin.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfmin_vv, rv_op_vfmin_vv, 0 },
1965     { "vfmin.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfmin_vf, rv_op_vfmin_vf, 0 },
1966     { "vfmax.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfmax_vv, rv_op_vfmax_vv, 0 },
1967     { "vfmax.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfmax_vf, rv_op_vfmax_vf, 0 },
1968     { "vfsgnj.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfsgnj_vv, rv_op_vfsgnj_vv, 0 },
1969     { "vfsgnj.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfsgnj_vf, rv_op_vfsgnj_vf, 0 },
1970     { "vfsgnjn.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfsgnjn_vv, rv_op_vfsgnjn_vv, 0 },
1971     { "vfsgnjn.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfsgnjn_vf, rv_op_vfsgnjn_vf, 0 },
1972     { "vfsgnjx.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfsgnjx_vv, rv_op_vfsgnjx_vv, 0 },
1973     { "vfsgnjx.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfsgnjx_vf, rv_op_vfsgnjx_vf, 0 },
1974     { "vfslide1up.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfslide1up_vf, rv_op_vfslide1up_vf, 0 },
1975     { "vfslide1down.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vfslide1down_vf, rv_op_vfslide1down_vf, 0 },
1976     { "vmfeq.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmfeq_vv, rv_op_vmfeq_vv, 0 },
1977     { "vmfeq.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vmfeq_vf, rv_op_vmfeq_vf, 0 },
1978     { "vmfne.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmfne_vv, rv_op_vmfne_vv, 0 },
1979     { "vmfne.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vmfne_vf, rv_op_vmfne_vf, 0 },
1980     { "vmflt.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmflt_vv, rv_op_vmflt_vv, 0 },
1981     { "vmflt.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vmflt_vf, rv_op_vmflt_vf, 0 },
1982     { "vmfle.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmfle_vv, rv_op_vmfle_vv, 0 },
1983     { "vmfle.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vmfle_vf, rv_op_vmfle_vf, 0 },
1984     { "vmfgt.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vmfgt_vf, rv_op_vmfgt_vf, 0 },
1985     { "vmfge.vf", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vm, NULL, rv_op_vmfge_vf, rv_op_vmfge_vf, 0 },
1986     { "vfclass.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfclass_v, rv_op_vfclass_v, 0 },
1987     { "vfmerge.vfm", rv_codec_v_r, rv_fmt_vd_vs2_fs1_vl, NULL, rv_op_vfmerge_vfm, rv_op_vfmerge_vfm, 0 },
1988     { "vfmv.v.f", rv_codec_v_r, rv_fmt_vd_fs1, NULL, rv_op_vfmv_v_f, rv_op_vfmv_v_f, 0 },
1989     { "vfcvt.xu.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfcvt_xu_f_v, rv_op_vfcvt_xu_f_v, 0 },
1990     { "vfcvt.x.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfcvt_x_f_v, rv_op_vfcvt_x_f_v, 0 },
1991     { "vfcvt.f.xu.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfcvt_f_xu_v, rv_op_vfcvt_f_xu_v, 0 },
1992     { "vfcvt.f.x.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfcvt_f_x_v, rv_op_vfcvt_f_x_v, 0 },
1993     { "vfcvt.rtz.xu.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfcvt_rtz_xu_f_v, rv_op_vfcvt_rtz_xu_f_v, 0 },
1994     { "vfcvt.rtz.x.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfcvt_rtz_x_f_v, rv_op_vfcvt_rtz_x_f_v, 0 },
1995     { "vfwcvt.xu.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfwcvt_xu_f_v, rv_op_vfwcvt_xu_f_v, 0 },
1996     { "vfwcvt.x.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfwcvt_x_f_v, rv_op_vfwcvt_x_f_v, 0 },
1997     { "vfwcvt.f.xu.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfwcvt_f_xu_v, rv_op_vfwcvt_f_xu_v, 0 },
1998     { "vfwcvt.f.x.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfwcvt_f_x_v, rv_op_vfwcvt_f_x_v, 0 },
1999     { "vfwcvt.f.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfwcvt_f_f_v, rv_op_vfwcvt_f_f_v, 0 },
2000     { "vfwcvt.rtz.xu.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfwcvt_rtz_xu_f_v, rv_op_vfwcvt_rtz_xu_f_v, 0 },
2001     { "vfwcvt.rtz.x.f.v", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfwcvt_rtz_x_f_v, rv_op_vfwcvt_rtz_x_f_v, 0 },
2002     { "vfncvt.xu.f.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfncvt_xu_f_w, rv_op_vfncvt_xu_f_w, 0 },
2003     { "vfncvt.x.f.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfncvt_x_f_w, rv_op_vfncvt_x_f_w, 0 },
2004     { "vfncvt.f.xu.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfncvt_f_xu_w, rv_op_vfncvt_f_xu_w, 0 },
2005     { "vfncvt.f.x.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfncvt_f_x_w, rv_op_vfncvt_f_x_w, 0 },
2006     { "vfncvt.f.f.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfncvt_f_f_w, rv_op_vfncvt_f_f_w, 0 },
2007     { "vfncvt.rod.f.f.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfncvt_rod_f_f_w, rv_op_vfncvt_rod_f_f_w, 0 },
2008     { "vfncvt.rtz.xu.f.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfncvt_rtz_xu_f_w, rv_op_vfncvt_rtz_xu_f_w, 0 },
2009     { "vfncvt.rtz.x.f.w", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vfncvt_rtz_x_f_w, rv_op_vfncvt_rtz_x_f_w, 0 },
2010     { "vredsum.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vredsum_vs, rv_op_vredsum_vs, 0 },
2011     { "vredand.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vredand_vs, rv_op_vredand_vs, 0 },
2012     { "vredor.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vredor_vs, rv_op_vredor_vs, 0 },
2013     { "vredxor.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vredxor_vs, rv_op_vredxor_vs, 0 },
2014     { "vredminu.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vredminu_vs, rv_op_vredminu_vs, 0 },
2015     { "vredmin.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vredmin_vs, rv_op_vredmin_vs, 0 },
2016     { "vredmaxu.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vredmaxu_vs, rv_op_vredmaxu_vs, 0 },
2017     { "vredmax.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vredmax_vs, rv_op_vredmax_vs, 0 },
2018     { "vwredsumu.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwredsumu_vs, rv_op_vwredsumu_vs, 0 },
2019     { "vwredsum.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vwredsum_vs, rv_op_vwredsum_vs, 0 },
2020     { "vfredusum.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfredusum_vs, rv_op_vfredusum_vs, 0 },
2021     { "vfredosum.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfredosum_vs, rv_op_vfredosum_vs, 0 },
2022     { "vfredmin.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfredmin_vs, rv_op_vfredmin_vs, 0 },
2023     { "vfredmax.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfredmax_vs, rv_op_vfredmax_vs, 0 },
2024     { "vfwredusum.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfwredusum_vs, rv_op_vfwredusum_vs, 0 },
2025     { "vfwredosum.vs", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vfwredosum_vs, rv_op_vfwredosum_vs, 0 },
2026     { "vmand.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmand_mm, rv_op_vmand_mm, 0 },
2027     { "vmnand.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmnand_mm, rv_op_vmnand_mm, 0 },
2028     { "vmandn.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmandn_mm, rv_op_vmandn_mm, 0 },
2029     { "vmxor.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmxor_mm, rv_op_vmxor_mm, 0 },
2030     { "vmor.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmor_mm, rv_op_vmor_mm, 0 },
2031     { "vmnor.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmnor_mm, rv_op_vmnor_mm, 0 },
2032     { "vmorn.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmorn_mm, rv_op_vmorn_mm, 0 },
2033     { "vmxnor.mm", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vmxnor_mm, rv_op_vmxnor_mm, 0 },
2034     { "vcpop.m", rv_codec_v_r, rv_fmt_rd_vs2_vm, NULL, rv_op_vcpop_m, rv_op_vcpop_m, 0 },
2035     { "vfirst.m", rv_codec_v_r, rv_fmt_rd_vs2_vm, NULL, rv_op_vfirst_m, rv_op_vfirst_m, 0 },
2036     { "vmsbf.m", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vmsbf_m, rv_op_vmsbf_m, 0 },
2037     { "vmsif.m", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vmsif_m, rv_op_vmsif_m, 0 },
2038     { "vmsof.m", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vmsof_m, rv_op_vmsof_m, 0 },
2039     { "viota.m", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_viota_m, rv_op_viota_m, 0 },
2040     { "vid.v", rv_codec_v_r, rv_fmt_vd_vm, NULL, rv_op_vid_v, rv_op_vid_v, 0 },
2041     { "vmv.x.s", rv_codec_v_r, rv_fmt_rd_vs2, NULL, rv_op_vmv_x_s, rv_op_vmv_x_s, 0 },
2042     { "vmv.s.x", rv_codec_v_r, rv_fmt_vd_rs1, NULL, rv_op_vmv_s_x, rv_op_vmv_s_x, 0 },
2043     { "vfmv.f.s", rv_codec_v_r, rv_fmt_fd_vs2, NULL, rv_op_vfmv_f_s, rv_op_vfmv_f_s, 0 },
2044     { "vfmv.s.f", rv_codec_v_r, rv_fmt_vd_fs1, NULL, rv_op_vfmv_s_f, rv_op_vfmv_s_f, 0 },
2045     { "vslideup.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vslideup_vx, rv_op_vslideup_vx, 0 },
2046     { "vslideup.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vslideup_vi, rv_op_vslideup_vi, 0 },
2047     { "vslide1up.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vslide1up_vx, rv_op_vslide1up_vx, 0 },
2048     { "vslidedown.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vslidedown_vx, rv_op_vslidedown_vx, 0 },
2049     { "vslidedown.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vslidedown_vi, rv_op_vslidedown_vi, 0 },
2050     { "vslide1down.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vslide1down_vx, rv_op_vslide1down_vx, 0 },
2051     { "vrgather.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vrgather_vv, rv_op_vrgather_vv, 0 },
2052     { "vrgatherei16.vv", rv_codec_v_r, rv_fmt_vd_vs2_vs1_vm, NULL, rv_op_vrgatherei16_vv, rv_op_vrgatherei16_vv, 0 },
2053     { "vrgather.vx", rv_codec_v_r, rv_fmt_vd_vs2_rs1_vm, NULL, rv_op_vrgather_vx, rv_op_vrgather_vx, 0 },
2054     { "vrgather.vi", rv_codec_v_i, rv_fmt_vd_vs2_uimm_vm, NULL, rv_op_vrgather_vi, rv_op_vrgather_vi, 0 },
2055     { "vcompress.vm", rv_codec_v_r, rv_fmt_vd_vs2_vs1, NULL, rv_op_vcompress_vm, rv_op_vcompress_vm, 0 },
2056     { "vmv1r.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, rv_op_vmv1r_v, rv_op_vmv1r_v, 0 },
2057     { "vmv2r.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, rv_op_vmv2r_v, rv_op_vmv2r_v, 0 },
2058     { "vmv4r.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, rv_op_vmv4r_v, rv_op_vmv4r_v, 0 },
2059     { "vmv8r.v", rv_codec_v_r, rv_fmt_vd_vs2, NULL, rv_op_vmv8r_v, rv_op_vmv8r_v, 0 },
2060     { "vzext.vf2", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vzext_vf2, rv_op_vzext_vf2, 0 },
2061     { "vzext.vf4", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vzext_vf4, rv_op_vzext_vf4, 0 },
2062     { "vzext.vf8", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vzext_vf8, rv_op_vzext_vf8, 0 },
2063     { "vsext.vf2", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vsext_vf2, rv_op_vsext_vf2, 0 },
2064     { "vsext.vf4", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vsext_vf4, rv_op_vsext_vf4, 0 },
2065     { "vsext.vf8", rv_codec_v_r, rv_fmt_vd_vs2_vm, NULL, rv_op_vsext_vf8, rv_op_vsext_vf8, 0 },
2066     { "vsetvli", rv_codec_vsetvli, rv_fmt_vsetvli, NULL, rv_op_vsetvli, rv_op_vsetvli, 0 },
2067     { "vsetivli", rv_codec_vsetivli, rv_fmt_vsetivli, NULL, rv_op_vsetivli, rv_op_vsetivli, 0 },
2068     { "vsetvl", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, rv_op_vsetvl, rv_op_vsetvl, 0 }
2069 };
2070 
2071 /* CSR names */
2072 
2073 static const char *csr_name(int csrno)
2074 {
2075     switch (csrno) {
2076     case 0x0000: return "ustatus";
2077     case 0x0001: return "fflags";
2078     case 0x0002: return "frm";
2079     case 0x0003: return "fcsr";
2080     case 0x0004: return "uie";
2081     case 0x0005: return "utvec";
2082     case 0x0008: return "vstart";
2083     case 0x0009: return "vxsat";
2084     case 0x000a: return "vxrm";
2085     case 0x000f: return "vcsr";
2086     case 0x0015: return "seed";
2087     case 0x0040: return "uscratch";
2088     case 0x0041: return "uepc";
2089     case 0x0042: return "ucause";
2090     case 0x0043: return "utval";
2091     case 0x0044: return "uip";
2092     case 0x0100: return "sstatus";
2093     case 0x0104: return "sie";
2094     case 0x0105: return "stvec";
2095     case 0x0106: return "scounteren";
2096     case 0x0140: return "sscratch";
2097     case 0x0141: return "sepc";
2098     case 0x0142: return "scause";
2099     case 0x0143: return "stval";
2100     case 0x0144: return "sip";
2101     case 0x0180: return "satp";
2102     case 0x0200: return "hstatus";
2103     case 0x0202: return "hedeleg";
2104     case 0x0203: return "hideleg";
2105     case 0x0204: return "hie";
2106     case 0x0205: return "htvec";
2107     case 0x0240: return "hscratch";
2108     case 0x0241: return "hepc";
2109     case 0x0242: return "hcause";
2110     case 0x0243: return "hbadaddr";
2111     case 0x0244: return "hip";
2112     case 0x0300: return "mstatus";
2113     case 0x0301: return "misa";
2114     case 0x0302: return "medeleg";
2115     case 0x0303: return "mideleg";
2116     case 0x0304: return "mie";
2117     case 0x0305: return "mtvec";
2118     case 0x0306: return "mcounteren";
2119     case 0x0320: return "mucounteren";
2120     case 0x0321: return "mscounteren";
2121     case 0x0322: return "mhcounteren";
2122     case 0x0323: return "mhpmevent3";
2123     case 0x0324: return "mhpmevent4";
2124     case 0x0325: return "mhpmevent5";
2125     case 0x0326: return "mhpmevent6";
2126     case 0x0327: return "mhpmevent7";
2127     case 0x0328: return "mhpmevent8";
2128     case 0x0329: return "mhpmevent9";
2129     case 0x032a: return "mhpmevent10";
2130     case 0x032b: return "mhpmevent11";
2131     case 0x032c: return "mhpmevent12";
2132     case 0x032d: return "mhpmevent13";
2133     case 0x032e: return "mhpmevent14";
2134     case 0x032f: return "mhpmevent15";
2135     case 0x0330: return "mhpmevent16";
2136     case 0x0331: return "mhpmevent17";
2137     case 0x0332: return "mhpmevent18";
2138     case 0x0333: return "mhpmevent19";
2139     case 0x0334: return "mhpmevent20";
2140     case 0x0335: return "mhpmevent21";
2141     case 0x0336: return "mhpmevent22";
2142     case 0x0337: return "mhpmevent23";
2143     case 0x0338: return "mhpmevent24";
2144     case 0x0339: return "mhpmevent25";
2145     case 0x033a: return "mhpmevent26";
2146     case 0x033b: return "mhpmevent27";
2147     case 0x033c: return "mhpmevent28";
2148     case 0x033d: return "mhpmevent29";
2149     case 0x033e: return "mhpmevent30";
2150     case 0x033f: return "mhpmevent31";
2151     case 0x0340: return "mscratch";
2152     case 0x0341: return "mepc";
2153     case 0x0342: return "mcause";
2154     case 0x0343: return "mtval";
2155     case 0x0344: return "mip";
2156     case 0x0380: return "mbase";
2157     case 0x0381: return "mbound";
2158     case 0x0382: return "mibase";
2159     case 0x0383: return "mibound";
2160     case 0x0384: return "mdbase";
2161     case 0x0385: return "mdbound";
2162     case 0x03a0: return "pmpcfg3";
2163     case 0x03b0: return "pmpaddr0";
2164     case 0x03b1: return "pmpaddr1";
2165     case 0x03b2: return "pmpaddr2";
2166     case 0x03b3: return "pmpaddr3";
2167     case 0x03b4: return "pmpaddr4";
2168     case 0x03b5: return "pmpaddr5";
2169     case 0x03b6: return "pmpaddr6";
2170     case 0x03b7: return "pmpaddr7";
2171     case 0x03b8: return "pmpaddr8";
2172     case 0x03b9: return "pmpaddr9";
2173     case 0x03ba: return "pmpaddr10";
2174     case 0x03bb: return "pmpaddr11";
2175     case 0x03bc: return "pmpaddr12";
2176     case 0x03bd: return "pmpaddr14";
2177     case 0x03be: return "pmpaddr13";
2178     case 0x03bf: return "pmpaddr15";
2179     case 0x0780: return "mtohost";
2180     case 0x0781: return "mfromhost";
2181     case 0x0782: return "mreset";
2182     case 0x0783: return "mipi";
2183     case 0x0784: return "miobase";
2184     case 0x07a0: return "tselect";
2185     case 0x07a1: return "tdata1";
2186     case 0x07a2: return "tdata2";
2187     case 0x07a3: return "tdata3";
2188     case 0x07b0: return "dcsr";
2189     case 0x07b1: return "dpc";
2190     case 0x07b2: return "dscratch";
2191     case 0x0b00: return "mcycle";
2192     case 0x0b01: return "mtime";
2193     case 0x0b02: return "minstret";
2194     case 0x0b03: return "mhpmcounter3";
2195     case 0x0b04: return "mhpmcounter4";
2196     case 0x0b05: return "mhpmcounter5";
2197     case 0x0b06: return "mhpmcounter6";
2198     case 0x0b07: return "mhpmcounter7";
2199     case 0x0b08: return "mhpmcounter8";
2200     case 0x0b09: return "mhpmcounter9";
2201     case 0x0b0a: return "mhpmcounter10";
2202     case 0x0b0b: return "mhpmcounter11";
2203     case 0x0b0c: return "mhpmcounter12";
2204     case 0x0b0d: return "mhpmcounter13";
2205     case 0x0b0e: return "mhpmcounter14";
2206     case 0x0b0f: return "mhpmcounter15";
2207     case 0x0b10: return "mhpmcounter16";
2208     case 0x0b11: return "mhpmcounter17";
2209     case 0x0b12: return "mhpmcounter18";
2210     case 0x0b13: return "mhpmcounter19";
2211     case 0x0b14: return "mhpmcounter20";
2212     case 0x0b15: return "mhpmcounter21";
2213     case 0x0b16: return "mhpmcounter22";
2214     case 0x0b17: return "mhpmcounter23";
2215     case 0x0b18: return "mhpmcounter24";
2216     case 0x0b19: return "mhpmcounter25";
2217     case 0x0b1a: return "mhpmcounter26";
2218     case 0x0b1b: return "mhpmcounter27";
2219     case 0x0b1c: return "mhpmcounter28";
2220     case 0x0b1d: return "mhpmcounter29";
2221     case 0x0b1e: return "mhpmcounter30";
2222     case 0x0b1f: return "mhpmcounter31";
2223     case 0x0b80: return "mcycleh";
2224     case 0x0b81: return "mtimeh";
2225     case 0x0b82: return "minstreth";
2226     case 0x0b83: return "mhpmcounter3h";
2227     case 0x0b84: return "mhpmcounter4h";
2228     case 0x0b85: return "mhpmcounter5h";
2229     case 0x0b86: return "mhpmcounter6h";
2230     case 0x0b87: return "mhpmcounter7h";
2231     case 0x0b88: return "mhpmcounter8h";
2232     case 0x0b89: return "mhpmcounter9h";
2233     case 0x0b8a: return "mhpmcounter10h";
2234     case 0x0b8b: return "mhpmcounter11h";
2235     case 0x0b8c: return "mhpmcounter12h";
2236     case 0x0b8d: return "mhpmcounter13h";
2237     case 0x0b8e: return "mhpmcounter14h";
2238     case 0x0b8f: return "mhpmcounter15h";
2239     case 0x0b90: return "mhpmcounter16h";
2240     case 0x0b91: return "mhpmcounter17h";
2241     case 0x0b92: return "mhpmcounter18h";
2242     case 0x0b93: return "mhpmcounter19h";
2243     case 0x0b94: return "mhpmcounter20h";
2244     case 0x0b95: return "mhpmcounter21h";
2245     case 0x0b96: return "mhpmcounter22h";
2246     case 0x0b97: return "mhpmcounter23h";
2247     case 0x0b98: return "mhpmcounter24h";
2248     case 0x0b99: return "mhpmcounter25h";
2249     case 0x0b9a: return "mhpmcounter26h";
2250     case 0x0b9b: return "mhpmcounter27h";
2251     case 0x0b9c: return "mhpmcounter28h";
2252     case 0x0b9d: return "mhpmcounter29h";
2253     case 0x0b9e: return "mhpmcounter30h";
2254     case 0x0b9f: return "mhpmcounter31h";
2255     case 0x0c00: return "cycle";
2256     case 0x0c01: return "time";
2257     case 0x0c02: return "instret";
2258     case 0x0c20: return "vl";
2259     case 0x0c21: return "vtype";
2260     case 0x0c22: return "vlenb";
2261     case 0x0c80: return "cycleh";
2262     case 0x0c81: return "timeh";
2263     case 0x0c82: return "instreth";
2264     case 0x0d00: return "scycle";
2265     case 0x0d01: return "stime";
2266     case 0x0d02: return "sinstret";
2267     case 0x0d80: return "scycleh";
2268     case 0x0d81: return "stimeh";
2269     case 0x0d82: return "sinstreth";
2270     case 0x0e00: return "hcycle";
2271     case 0x0e01: return "htime";
2272     case 0x0e02: return "hinstret";
2273     case 0x0e80: return "hcycleh";
2274     case 0x0e81: return "htimeh";
2275     case 0x0e82: return "hinstreth";
2276     case 0x0f11: return "mvendorid";
2277     case 0x0f12: return "marchid";
2278     case 0x0f13: return "mimpid";
2279     case 0x0f14: return "mhartid";
2280     default: return NULL;
2281     }
2282 }
2283 
2284 /* decode opcode */
2285 
2286 static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
2287 {
2288     rv_inst inst = dec->inst;
2289     rv_opcode op = rv_op_illegal;
2290     switch (((inst >> 0) & 0b11)) {
2291     case 0:
2292         switch (((inst >> 13) & 0b111)) {
2293         case 0: op = rv_op_c_addi4spn; break;
2294         case 1:
2295             if (isa == rv128) {
2296                 op = rv_op_c_lq;
2297             } else {
2298                 op = rv_op_c_fld;
2299             }
2300             break;
2301         case 2: op = rv_op_c_lw; break;
2302         case 3:
2303             if (isa == rv32) {
2304                 op = rv_op_c_flw;
2305             } else {
2306                 op = rv_op_c_ld;
2307             }
2308             break;
2309         case 5:
2310             if (isa == rv128) {
2311                 op = rv_op_c_sq;
2312             } else {
2313                 op = rv_op_c_fsd;
2314             }
2315             break;
2316         case 6: op = rv_op_c_sw; break;
2317         case 7:
2318             if (isa == rv32) {
2319                 op = rv_op_c_fsw;
2320             } else {
2321                 op = rv_op_c_sd;
2322             }
2323             break;
2324         }
2325         break;
2326     case 1:
2327         switch (((inst >> 13) & 0b111)) {
2328         case 0:
2329             switch (((inst >> 2) & 0b11111111111)) {
2330             case 0: op = rv_op_c_nop; break;
2331             default: op = rv_op_c_addi; break;
2332             }
2333             break;
2334         case 1:
2335             if (isa == rv32) {
2336                 op = rv_op_c_jal;
2337             } else {
2338                 op = rv_op_c_addiw;
2339             }
2340             break;
2341         case 2: op = rv_op_c_li; break;
2342         case 3:
2343             switch (((inst >> 7) & 0b11111)) {
2344             case 2: op = rv_op_c_addi16sp; break;
2345             default: op = rv_op_c_lui; break;
2346             }
2347             break;
2348         case 4:
2349             switch (((inst >> 10) & 0b11)) {
2350             case 0:
2351                 op = rv_op_c_srli;
2352                 break;
2353             case 1:
2354                 op = rv_op_c_srai;
2355                 break;
2356             case 2: op = rv_op_c_andi; break;
2357             case 3:
2358                 switch (((inst >> 10) & 0b100) | ((inst >> 5) & 0b011)) {
2359                 case 0: op = rv_op_c_sub; break;
2360                 case 1: op = rv_op_c_xor; break;
2361                 case 2: op = rv_op_c_or; break;
2362                 case 3: op = rv_op_c_and; break;
2363                 case 4: op = rv_op_c_subw; break;
2364                 case 5: op = rv_op_c_addw; break;
2365                 }
2366                 break;
2367             }
2368             break;
2369         case 5: op = rv_op_c_j; break;
2370         case 6: op = rv_op_c_beqz; break;
2371         case 7: op = rv_op_c_bnez; break;
2372         }
2373         break;
2374     case 2:
2375         switch (((inst >> 13) & 0b111)) {
2376         case 0:
2377             op = rv_op_c_slli;
2378             break;
2379         case 1:
2380             if (isa == rv128) {
2381                 op = rv_op_c_lqsp;
2382             } else {
2383                 op = rv_op_c_fldsp;
2384             }
2385             break;
2386         case 2: op = rv_op_c_lwsp; break;
2387         case 3:
2388             if (isa == rv32) {
2389                 op = rv_op_c_flwsp;
2390             } else {
2391                 op = rv_op_c_ldsp;
2392             }
2393             break;
2394         case 4:
2395             switch (((inst >> 12) & 0b1)) {
2396             case 0:
2397                 switch (((inst >> 2) & 0b11111)) {
2398                 case 0: op = rv_op_c_jr; break;
2399                 default: op = rv_op_c_mv; break;
2400                 }
2401                 break;
2402             case 1:
2403                 switch (((inst >> 2) & 0b11111)) {
2404                 case 0:
2405                     switch (((inst >> 7) & 0b11111)) {
2406                     case 0: op = rv_op_c_ebreak; break;
2407                     default: op = rv_op_c_jalr; break;
2408                     }
2409                     break;
2410                 default: op = rv_op_c_add; break;
2411                 }
2412                 break;
2413             }
2414             break;
2415         case 5:
2416             if (isa == rv128) {
2417                 op = rv_op_c_sqsp;
2418             } else {
2419                 op = rv_op_c_fsdsp;
2420             }
2421             break;
2422         case 6: op = rv_op_c_swsp; break;
2423         case 7:
2424             if (isa == rv32) {
2425                 op = rv_op_c_fswsp;
2426             } else {
2427                 op = rv_op_c_sdsp;
2428             }
2429             break;
2430         }
2431         break;
2432     case 3:
2433         switch (((inst >> 2) & 0b11111)) {
2434         case 0:
2435             switch (((inst >> 12) & 0b111)) {
2436             case 0: op = rv_op_lb; break;
2437             case 1: op = rv_op_lh; break;
2438             case 2: op = rv_op_lw; break;
2439             case 3: op = rv_op_ld; break;
2440             case 4: op = rv_op_lbu; break;
2441             case 5: op = rv_op_lhu; break;
2442             case 6: op = rv_op_lwu; break;
2443             case 7: op = rv_op_ldu; break;
2444             }
2445             break;
2446         case 1:
2447             switch (((inst >> 12) & 0b111)) {
2448             case 0:
2449                 switch (((inst >> 20) & 0b111111111111)) {
2450                 case 40: op = rv_op_vl1re8_v; break;
2451                 case 552: op = rv_op_vl2re8_v; break;
2452                 case 1576: op = rv_op_vl4re8_v; break;
2453                 case 3624: op = rv_op_vl8re8_v; break;
2454                 }
2455                 switch (((inst >> 26) & 0b111)) {
2456                 case 0:
2457                     switch (((inst >> 20) & 0b11111)) {
2458                     case 0: op = rv_op_vle8_v; break;
2459                     case 11: op = rv_op_vlm_v; break;
2460                     case 16: op = rv_op_vle8ff_v; break;
2461                     }
2462                     break;
2463                 case 1: op = rv_op_vluxei8_v; break;
2464                 case 2: op = rv_op_vlse8_v; break;
2465                 case 3: op = rv_op_vloxei8_v; break;
2466                 }
2467                 break;
2468             case 2: op = rv_op_flw; break;
2469             case 3: op = rv_op_fld; break;
2470             case 4: op = rv_op_flq; break;
2471             case 5:
2472                 switch (((inst >> 20) & 0b111111111111)) {
2473                 case 40: op = rv_op_vl1re16_v; break;
2474                 case 552: op = rv_op_vl2re16_v; break;
2475                 case 1576: op = rv_op_vl4re16_v; break;
2476                 case 3624: op = rv_op_vl8re16_v; break;
2477                 }
2478                 switch (((inst >> 26) & 0b111)) {
2479                 case 0:
2480                     switch (((inst >> 20) & 0b11111)) {
2481                     case 0: op = rv_op_vle16_v; break;
2482                     case 16: op = rv_op_vle16ff_v; break;
2483                     }
2484                     break;
2485                 case 1: op = rv_op_vluxei16_v; break;
2486                 case 2: op = rv_op_vlse16_v; break;
2487                 case 3: op = rv_op_vloxei16_v; break;
2488                 }
2489                 break;
2490             case 6:
2491                 switch (((inst >> 20) & 0b111111111111)) {
2492                 case 40: op = rv_op_vl1re32_v; break;
2493                 case 552: op = rv_op_vl2re32_v; break;
2494                 case 1576: op = rv_op_vl4re32_v; break;
2495                 case 3624: op = rv_op_vl8re32_v; break;
2496                 }
2497                 switch (((inst >> 26) & 0b111)) {
2498                 case 0:
2499                     switch (((inst >> 20) & 0b11111)) {
2500                     case 0: op = rv_op_vle32_v; break;
2501                     case 16: op = rv_op_vle32ff_v; break;
2502                     }
2503                     break;
2504                 case 1: op = rv_op_vluxei32_v; break;
2505                 case 2: op = rv_op_vlse32_v; break;
2506                 case 3: op = rv_op_vloxei32_v; break;
2507                 }
2508                 break;
2509             case 7:
2510                 switch (((inst >> 20) & 0b111111111111)) {
2511                 case 40: op = rv_op_vl1re64_v; break;
2512                 case 552: op = rv_op_vl2re64_v; break;
2513                 case 1576: op = rv_op_vl4re64_v; break;
2514                 case 3624: op = rv_op_vl8re64_v; break;
2515                 }
2516                 switch (((inst >> 26) & 0b111)) {
2517                 case 0:
2518                     switch (((inst >> 20) & 0b11111)) {
2519                     case 0: op = rv_op_vle64_v; break;
2520                     case 16: op = rv_op_vle64ff_v; break;
2521                     }
2522                     break;
2523                 case 1: op = rv_op_vluxei64_v; break;
2524                 case 2: op = rv_op_vlse64_v; break;
2525                 case 3: op = rv_op_vloxei64_v; break;
2526                 }
2527                 break;
2528             }
2529             break;
2530         case 3:
2531             switch (((inst >> 12) & 0b111)) {
2532             case 0: op = rv_op_fence; break;
2533             case 1: op = rv_op_fence_i; break;
2534             case 2: op = rv_op_lq; break;
2535             }
2536             break;
2537         case 4:
2538             switch (((inst >> 12) & 0b111)) {
2539             case 0: op = rv_op_addi; break;
2540             case 1:
2541                 switch (((inst >> 27) & 0b11111)) {
2542                 case 0b00000: op = rv_op_slli; break;
2543                 case 0b00001:
2544                     switch (((inst >> 20) & 0b1111111)) {
2545                     case 0b0001111: op = rv_op_zip; break;
2546                     }
2547                     break;
2548                 case 0b00010:
2549                     switch (((inst >> 20) & 0b1111111)) {
2550                     case 0b0000000: op = rv_op_sha256sum0; break;
2551                     case 0b0000001: op = rv_op_sha256sum1; break;
2552                     case 0b0000010: op = rv_op_sha256sig0; break;
2553                     case 0b0000011: op = rv_op_sha256sig1; break;
2554                     case 0b0000100: op = rv_op_sha512sum0; break;
2555                     case 0b0000101: op = rv_op_sha512sum1; break;
2556                     case 0b0000110: op = rv_op_sha512sig0; break;
2557                     case 0b0000111: op = rv_op_sha512sig1; break;
2558                     case 0b0001000: op = rv_op_sm3p0; break;
2559                     case 0b0001001: op = rv_op_sm3p1; break;
2560                     }
2561                     break;
2562                 case 0b00101: op = rv_op_bseti; break;
2563                 case 0b00110:
2564                     switch (((inst >> 20) & 0b1111111)) {
2565                     case 0b0000000: op = rv_op_aes64im; break;
2566                     default:
2567                         if (((inst >> 24) & 0b0111) == 0b001) {
2568                             op = rv_op_aes64ks1i;
2569                         }
2570                         break;
2571                      }
2572                      break;
2573                 case 0b01001: op = rv_op_bclri; break;
2574                 case 0b01101: op = rv_op_binvi; break;
2575                 case 0b01100:
2576                     switch (((inst >> 20) & 0b1111111)) {
2577                     case 0b0000000: op = rv_op_clz; break;
2578                     case 0b0000001: op = rv_op_ctz; break;
2579                     case 0b0000010: op = rv_op_cpop; break;
2580                       /* 0b0000011 */
2581                     case 0b0000100: op = rv_op_sext_b; break;
2582                     case 0b0000101: op = rv_op_sext_h; break;
2583                     }
2584                     break;
2585                 }
2586                 break;
2587             case 2: op = rv_op_slti; break;
2588             case 3: op = rv_op_sltiu; break;
2589             case 4: op = rv_op_xori; break;
2590             case 5:
2591                 switch (((inst >> 27) & 0b11111)) {
2592                 case 0b00000: op = rv_op_srli; break;
2593                 case 0b00001:
2594                     switch (((inst >> 20) & 0b1111111)) {
2595                     case 0b0001111: op = rv_op_unzip; break;
2596                     }
2597                     break;
2598                 case 0b00101: op = rv_op_orc_b; break;
2599                 case 0b01000: op = rv_op_srai; break;
2600                 case 0b01001: op = rv_op_bexti; break;
2601                 case 0b01100: op = rv_op_rori; break;
2602                 case 0b01101:
2603                     switch ((inst >> 20) & 0b1111111) {
2604                     case 0b0011000: op = rv_op_rev8; break;
2605                     case 0b0111000: op = rv_op_rev8; break;
2606                     case 0b0000111: op = rv_op_brev8; break;
2607                     }
2608                     break;
2609                 }
2610                 break;
2611             case 6: op = rv_op_ori; break;
2612             case 7: op = rv_op_andi; break;
2613             }
2614             break;
2615         case 5: op = rv_op_auipc; break;
2616         case 6:
2617             switch (((inst >> 12) & 0b111)) {
2618             case 0: op = rv_op_addiw; break;
2619             case 1:
2620                 switch (((inst >> 25) & 0b1111111)) {
2621                 case 0: op = rv_op_slliw; break;
2622                 case 4: op = rv_op_slli_uw; break;
2623                 case 48:
2624                     switch ((inst >> 20) & 0b11111) {
2625                     case 0b00000: op = rv_op_clzw; break;
2626                     case 0b00001: op = rv_op_ctzw; break;
2627                     case 0b00010: op = rv_op_cpopw; break;
2628                     }
2629                     break;
2630                 }
2631                 break;
2632             case 5:
2633                 switch (((inst >> 25) & 0b1111111)) {
2634                 case 0: op = rv_op_srliw; break;
2635                 case 32: op = rv_op_sraiw; break;
2636                 case 48: op = rv_op_roriw; break;
2637                 }
2638                 break;
2639             }
2640             break;
2641         case 8:
2642             switch (((inst >> 12) & 0b111)) {
2643             case 0: op = rv_op_sb; break;
2644             case 1: op = rv_op_sh; break;
2645             case 2: op = rv_op_sw; break;
2646             case 3: op = rv_op_sd; break;
2647             case 4: op = rv_op_sq; break;
2648             }
2649             break;
2650         case 9:
2651             switch (((inst >> 12) & 0b111)) {
2652             case 0:
2653                 switch (((inst >> 20) & 0b111111111111)) {
2654                 case 40: op = rv_op_vs1r_v; break;
2655                 case 552: op = rv_op_vs2r_v; break;
2656                 case 1576: op = rv_op_vs4r_v; break;
2657                 case 3624: op = rv_op_vs8r_v; break;
2658                 }
2659                 switch (((inst >> 26) & 0b111)) {
2660                 case 0:
2661                     switch (((inst >> 20) & 0b11111)) {
2662                     case 0: op = rv_op_vse8_v; break;
2663                     case 11: op = rv_op_vsm_v; break;
2664                     }
2665                     break;
2666                 case 1: op = rv_op_vsuxei8_v; break;
2667                 case 2: op = rv_op_vsse8_v; break;
2668                 case 3: op = rv_op_vsoxei8_v; break;
2669                 }
2670                 break;
2671             case 2: op = rv_op_fsw; break;
2672             case 3: op = rv_op_fsd; break;
2673             case 4: op = rv_op_fsq; break;
2674             case 5:
2675                 switch (((inst >> 26) & 0b111)) {
2676                 case 0:
2677                     switch (((inst >> 20) & 0b11111)) {
2678                     case 0: op = rv_op_vse16_v; break;
2679                     }
2680                     break;
2681                 case 1: op = rv_op_vsuxei16_v; break;
2682                 case 2: op = rv_op_vsse16_v; break;
2683                 case 3: op = rv_op_vsoxei16_v; break;
2684                 }
2685                 break;
2686             case 6:
2687                 switch (((inst >> 26) & 0b111)) {
2688                 case 0:
2689                     switch (((inst >> 20) & 0b11111)) {
2690                     case 0: op = rv_op_vse32_v; break;
2691                     }
2692                     break;
2693                 case 1: op = rv_op_vsuxei32_v; break;
2694                 case 2: op = rv_op_vsse32_v; break;
2695                 case 3: op = rv_op_vsoxei32_v; break;
2696                 }
2697                 break;
2698             case 7:
2699                 switch (((inst >> 26) & 0b111)) {
2700                 case 0:
2701                     switch (((inst >> 20) & 0b11111)) {
2702                     case 0: op = rv_op_vse64_v; break;
2703                     }
2704                     break;
2705                 case 1: op = rv_op_vsuxei64_v; break;
2706                 case 2: op = rv_op_vsse64_v; break;
2707                 case 3: op = rv_op_vsoxei64_v; break;
2708                 }
2709                 break;
2710             }
2711             break;
2712         case 11:
2713             switch (((inst >> 24) & 0b11111000) | ((inst >> 12) & 0b00000111)) {
2714             case 2: op = rv_op_amoadd_w; break;
2715             case 3: op = rv_op_amoadd_d; break;
2716             case 4: op = rv_op_amoadd_q; break;
2717             case 10: op = rv_op_amoswap_w; break;
2718             case 11: op = rv_op_amoswap_d; break;
2719             case 12: op = rv_op_amoswap_q; break;
2720             case 18:
2721                 switch (((inst >> 20) & 0b11111)) {
2722                 case 0: op = rv_op_lr_w; break;
2723                 }
2724                 break;
2725             case 19:
2726                 switch (((inst >> 20) & 0b11111)) {
2727                 case 0: op = rv_op_lr_d; break;
2728                 }
2729                 break;
2730             case 20:
2731                 switch (((inst >> 20) & 0b11111)) {
2732                 case 0: op = rv_op_lr_q; break;
2733                 }
2734                 break;
2735             case 26: op = rv_op_sc_w; break;
2736             case 27: op = rv_op_sc_d; break;
2737             case 28: op = rv_op_sc_q; break;
2738             case 34: op = rv_op_amoxor_w; break;
2739             case 35: op = rv_op_amoxor_d; break;
2740             case 36: op = rv_op_amoxor_q; break;
2741             case 66: op = rv_op_amoor_w; break;
2742             case 67: op = rv_op_amoor_d; break;
2743             case 68: op = rv_op_amoor_q; break;
2744             case 98: op = rv_op_amoand_w; break;
2745             case 99: op = rv_op_amoand_d; break;
2746             case 100: op = rv_op_amoand_q; break;
2747             case 130: op = rv_op_amomin_w; break;
2748             case 131: op = rv_op_amomin_d; break;
2749             case 132: op = rv_op_amomin_q; break;
2750             case 162: op = rv_op_amomax_w; break;
2751             case 163: op = rv_op_amomax_d; break;
2752             case 164: op = rv_op_amomax_q; break;
2753             case 194: op = rv_op_amominu_w; break;
2754             case 195: op = rv_op_amominu_d; break;
2755             case 196: op = rv_op_amominu_q; break;
2756             case 226: op = rv_op_amomaxu_w; break;
2757             case 227: op = rv_op_amomaxu_d; break;
2758             case 228: op = rv_op_amomaxu_q; break;
2759             }
2760             break;
2761         case 12:
2762             switch (((inst >> 22) & 0b1111111000) | ((inst >> 12) & 0b0000000111)) {
2763             case 0: op = rv_op_add; break;
2764             case 1: op = rv_op_sll; break;
2765             case 2: op = rv_op_slt; break;
2766             case 3: op = rv_op_sltu; break;
2767             case 4: op = rv_op_xor; break;
2768             case 5: op = rv_op_srl; break;
2769             case 6: op = rv_op_or; break;
2770             case 7: op = rv_op_and; break;
2771             case 8: op = rv_op_mul; break;
2772             case 9: op = rv_op_mulh; break;
2773             case 10: op = rv_op_mulhsu; break;
2774             case 11: op = rv_op_mulhu; break;
2775             case 12: op = rv_op_div; break;
2776             case 13: op = rv_op_divu; break;
2777             case 14: op = rv_op_rem; break;
2778             case 15: op = rv_op_remu; break;
2779             case 36:
2780                 switch ((inst >> 20) & 0b11111) {
2781                 case 0: op = rv_op_zext_h; break;
2782                 default: op = rv_op_pack; break;
2783                 }
2784                 break;
2785             case 39: op = rv_op_packh; break;
2786 
2787             case 41: op = rv_op_clmul; break;
2788             case 42: op = rv_op_clmulr; break;
2789             case 43: op = rv_op_clmulh; break;
2790             case 44: op = rv_op_min; break;
2791             case 45: op = rv_op_minu; break;
2792             case 46: op = rv_op_max; break;
2793             case 47: op = rv_op_maxu; break;
2794             case 130: op = rv_op_sh1add; break;
2795             case 132: op = rv_op_sh2add; break;
2796             case 134: op = rv_op_sh3add; break;
2797             case 161: op = rv_op_bset; break;
2798             case 162: op = rv_op_xperm4; break;
2799             case 164: op = rv_op_xperm8; break;
2800             case 200: op = rv_op_aes64es; break;
2801             case 216: op = rv_op_aes64esm; break;
2802             case 232: op = rv_op_aes64ds; break;
2803             case 248: op = rv_op_aes64dsm; break;
2804             case 256: op = rv_op_sub; break;
2805             case 260: op = rv_op_xnor; break;
2806             case 261: op = rv_op_sra; break;
2807             case 262: op = rv_op_orn; break;
2808             case 263: op = rv_op_andn; break;
2809             case 289: op = rv_op_bclr; break;
2810             case 293: op = rv_op_bext; break;
2811             case 320: op = rv_op_sha512sum0r; break;
2812             case 328: op = rv_op_sha512sum1r; break;
2813             case 336: op = rv_op_sha512sig0l; break;
2814             case 344: op = rv_op_sha512sig1l; break;
2815             case 368: op = rv_op_sha512sig0h; break;
2816             case 376: op = rv_op_sha512sig1h; break;
2817             case 385: op = rv_op_rol; break;
2818             case 389: op = rv_op_ror; break;
2819             case 417: op = rv_op_binv; break;
2820             case 504: op = rv_op_aes64ks2; break;
2821             }
2822             switch ((inst >> 25) & 0b0011111) {
2823             case 17: op = rv_op_aes32esi; break;
2824             case 19: op = rv_op_aes32esmi; break;
2825             case 21: op = rv_op_aes32dsi; break;
2826             case 23: op = rv_op_aes32dsmi; break;
2827             case 24: op = rv_op_sm4ed; break;
2828             case 26: op = rv_op_sm4ks; break;
2829             }
2830             break;
2831         case 13: op = rv_op_lui; break;
2832         case 14:
2833             switch (((inst >> 22) & 0b1111111000) | ((inst >> 12) & 0b0000000111)) {
2834             case 0: op = rv_op_addw; break;
2835             case 1: op = rv_op_sllw; break;
2836             case 5: op = rv_op_srlw; break;
2837             case 8: op = rv_op_mulw; break;
2838             case 12: op = rv_op_divw; break;
2839             case 13: op = rv_op_divuw; break;
2840             case 14: op = rv_op_remw; break;
2841             case 15: op = rv_op_remuw; break;
2842             case 32: op = rv_op_add_uw; break;
2843             case 36:
2844                 switch ((inst >> 20) & 0b11111) {
2845                 case 0: op = rv_op_zext_h; break;
2846                 default: op = rv_op_packw; break;
2847                 }
2848                 break;
2849             case 130: op = rv_op_sh1add_uw; break;
2850             case 132: op = rv_op_sh2add_uw; break;
2851             case 134: op = rv_op_sh3add_uw; break;
2852             case 256: op = rv_op_subw; break;
2853             case 261: op = rv_op_sraw; break;
2854             case 385: op = rv_op_rolw; break;
2855             case 389: op = rv_op_rorw; break;
2856             }
2857             break;
2858         case 16:
2859             switch (((inst >> 25) & 0b11)) {
2860             case 0: op = rv_op_fmadd_s; break;
2861             case 1: op = rv_op_fmadd_d; break;
2862             case 3: op = rv_op_fmadd_q; break;
2863             }
2864             break;
2865         case 17:
2866             switch (((inst >> 25) & 0b11)) {
2867             case 0: op = rv_op_fmsub_s; break;
2868             case 1: op = rv_op_fmsub_d; break;
2869             case 3: op = rv_op_fmsub_q; break;
2870             }
2871             break;
2872         case 18:
2873             switch (((inst >> 25) & 0b11)) {
2874             case 0: op = rv_op_fnmsub_s; break;
2875             case 1: op = rv_op_fnmsub_d; break;
2876             case 3: op = rv_op_fnmsub_q; break;
2877             }
2878             break;
2879         case 19:
2880             switch (((inst >> 25) & 0b11)) {
2881             case 0: op = rv_op_fnmadd_s; break;
2882             case 1: op = rv_op_fnmadd_d; break;
2883             case 3: op = rv_op_fnmadd_q; break;
2884             }
2885             break;
2886         case 20:
2887             switch (((inst >> 25) & 0b1111111)) {
2888             case 0: op = rv_op_fadd_s; break;
2889             case 1: op = rv_op_fadd_d; break;
2890             case 3: op = rv_op_fadd_q; break;
2891             case 4: op = rv_op_fsub_s; break;
2892             case 5: op = rv_op_fsub_d; break;
2893             case 7: op = rv_op_fsub_q; break;
2894             case 8: op = rv_op_fmul_s; break;
2895             case 9: op = rv_op_fmul_d; break;
2896             case 11: op = rv_op_fmul_q; break;
2897             case 12: op = rv_op_fdiv_s; break;
2898             case 13: op = rv_op_fdiv_d; break;
2899             case 15: op = rv_op_fdiv_q; break;
2900             case 16:
2901                 switch (((inst >> 12) & 0b111)) {
2902                 case 0: op = rv_op_fsgnj_s; break;
2903                 case 1: op = rv_op_fsgnjn_s; break;
2904                 case 2: op = rv_op_fsgnjx_s; break;
2905                 }
2906                 break;
2907             case 17:
2908                 switch (((inst >> 12) & 0b111)) {
2909                 case 0: op = rv_op_fsgnj_d; break;
2910                 case 1: op = rv_op_fsgnjn_d; break;
2911                 case 2: op = rv_op_fsgnjx_d; break;
2912                 }
2913                 break;
2914             case 19:
2915                 switch (((inst >> 12) & 0b111)) {
2916                 case 0: op = rv_op_fsgnj_q; break;
2917                 case 1: op = rv_op_fsgnjn_q; break;
2918                 case 2: op = rv_op_fsgnjx_q; break;
2919                 }
2920                 break;
2921             case 20:
2922                 switch (((inst >> 12) & 0b111)) {
2923                 case 0: op = rv_op_fmin_s; break;
2924                 case 1: op = rv_op_fmax_s; break;
2925                 }
2926                 break;
2927             case 21:
2928                 switch (((inst >> 12) & 0b111)) {
2929                 case 0: op = rv_op_fmin_d; break;
2930                 case 1: op = rv_op_fmax_d; break;
2931                 }
2932                 break;
2933             case 23:
2934                 switch (((inst >> 12) & 0b111)) {
2935                 case 0: op = rv_op_fmin_q; break;
2936                 case 1: op = rv_op_fmax_q; break;
2937                 }
2938                 break;
2939             case 32:
2940                 switch (((inst >> 20) & 0b11111)) {
2941                 case 1: op = rv_op_fcvt_s_d; break;
2942                 case 3: op = rv_op_fcvt_s_q; break;
2943                 }
2944                 break;
2945             case 33:
2946                 switch (((inst >> 20) & 0b11111)) {
2947                 case 0: op = rv_op_fcvt_d_s; break;
2948                 case 3: op = rv_op_fcvt_d_q; break;
2949                 }
2950                 break;
2951             case 35:
2952                 switch (((inst >> 20) & 0b11111)) {
2953                 case 0: op = rv_op_fcvt_q_s; break;
2954                 case 1: op = rv_op_fcvt_q_d; break;
2955                 }
2956                 break;
2957             case 44:
2958                 switch (((inst >> 20) & 0b11111)) {
2959                 case 0: op = rv_op_fsqrt_s; break;
2960                 }
2961                 break;
2962             case 45:
2963                 switch (((inst >> 20) & 0b11111)) {
2964                 case 0: op = rv_op_fsqrt_d; break;
2965                 }
2966                 break;
2967             case 47:
2968                 switch (((inst >> 20) & 0b11111)) {
2969                 case 0: op = rv_op_fsqrt_q; break;
2970                 }
2971                 break;
2972             case 80:
2973                 switch (((inst >> 12) & 0b111)) {
2974                 case 0: op = rv_op_fle_s; break;
2975                 case 1: op = rv_op_flt_s; break;
2976                 case 2: op = rv_op_feq_s; break;
2977                 }
2978                 break;
2979             case 81:
2980                 switch (((inst >> 12) & 0b111)) {
2981                 case 0: op = rv_op_fle_d; break;
2982                 case 1: op = rv_op_flt_d; break;
2983                 case 2: op = rv_op_feq_d; break;
2984                 }
2985                 break;
2986             case 83:
2987                 switch (((inst >> 12) & 0b111)) {
2988                 case 0: op = rv_op_fle_q; break;
2989                 case 1: op = rv_op_flt_q; break;
2990                 case 2: op = rv_op_feq_q; break;
2991                 }
2992                 break;
2993             case 96:
2994                 switch (((inst >> 20) & 0b11111)) {
2995                 case 0: op = rv_op_fcvt_w_s; break;
2996                 case 1: op = rv_op_fcvt_wu_s; break;
2997                 case 2: op = rv_op_fcvt_l_s; break;
2998                 case 3: op = rv_op_fcvt_lu_s; break;
2999                 }
3000                 break;
3001             case 97:
3002                 switch (((inst >> 20) & 0b11111)) {
3003                 case 0: op = rv_op_fcvt_w_d; break;
3004                 case 1: op = rv_op_fcvt_wu_d; break;
3005                 case 2: op = rv_op_fcvt_l_d; break;
3006                 case 3: op = rv_op_fcvt_lu_d; break;
3007                 }
3008                 break;
3009             case 99:
3010                 switch (((inst >> 20) & 0b11111)) {
3011                 case 0: op = rv_op_fcvt_w_q; break;
3012                 case 1: op = rv_op_fcvt_wu_q; break;
3013                 case 2: op = rv_op_fcvt_l_q; break;
3014                 case 3: op = rv_op_fcvt_lu_q; break;
3015                 }
3016                 break;
3017             case 104:
3018                 switch (((inst >> 20) & 0b11111)) {
3019                 case 0: op = rv_op_fcvt_s_w; break;
3020                 case 1: op = rv_op_fcvt_s_wu; break;
3021                 case 2: op = rv_op_fcvt_s_l; break;
3022                 case 3: op = rv_op_fcvt_s_lu; break;
3023                 }
3024                 break;
3025             case 105:
3026                 switch (((inst >> 20) & 0b11111)) {
3027                 case 0: op = rv_op_fcvt_d_w; break;
3028                 case 1: op = rv_op_fcvt_d_wu; break;
3029                 case 2: op = rv_op_fcvt_d_l; break;
3030                 case 3: op = rv_op_fcvt_d_lu; break;
3031                 }
3032                 break;
3033             case 107:
3034                 switch (((inst >> 20) & 0b11111)) {
3035                 case 0: op = rv_op_fcvt_q_w; break;
3036                 case 1: op = rv_op_fcvt_q_wu; break;
3037                 case 2: op = rv_op_fcvt_q_l; break;
3038                 case 3: op = rv_op_fcvt_q_lu; break;
3039                 }
3040                 break;
3041             case 112:
3042                 switch (((inst >> 17) & 0b11111000) | ((inst >> 12) & 0b00000111)) {
3043                 case 0: op = rv_op_fmv_x_s; break;
3044                 case 1: op = rv_op_fclass_s; break;
3045                 }
3046                 break;
3047             case 113:
3048                 switch (((inst >> 17) & 0b11111000) | ((inst >> 12) & 0b00000111)) {
3049                 case 0: op = rv_op_fmv_x_d; break;
3050                 case 1: op = rv_op_fclass_d; break;
3051                 }
3052                 break;
3053             case 115:
3054                 switch (((inst >> 17) & 0b11111000) | ((inst >> 12) & 0b00000111)) {
3055                 case 0: op = rv_op_fmv_x_q; break;
3056                 case 1: op = rv_op_fclass_q; break;
3057                 }
3058                 break;
3059             case 120:
3060                 switch (((inst >> 17) & 0b11111000) | ((inst >> 12) & 0b00000111)) {
3061                 case 0: op = rv_op_fmv_s_x; break;
3062                 }
3063                 break;
3064             case 121:
3065                 switch (((inst >> 17) & 0b11111000) | ((inst >> 12) & 0b00000111)) {
3066                 case 0: op = rv_op_fmv_d_x; break;
3067                 }
3068                 break;
3069             case 123:
3070                 switch (((inst >> 17) & 0b11111000) | ((inst >> 12) & 0b00000111)) {
3071                 case 0: op = rv_op_fmv_q_x; break;
3072                 }
3073                 break;
3074             }
3075             break;
3076         case 21:
3077             switch (((inst >> 12) & 0b111)) {
3078             case 0:
3079                 switch (((inst >> 26) & 0b111111)) {
3080                 case 0: op = rv_op_vadd_vv; break;
3081                 case 2: op = rv_op_vsub_vv; break;
3082                 case 4: op = rv_op_vminu_vv; break;
3083                 case 5: op = rv_op_vmin_vv; break;
3084                 case 6: op = rv_op_vmaxu_vv; break;
3085                 case 7: op = rv_op_vmax_vv; break;
3086                 case 9: op = rv_op_vand_vv; break;
3087                 case 10: op = rv_op_vor_vv; break;
3088                 case 11: op = rv_op_vxor_vv; break;
3089                 case 12: op = rv_op_vrgather_vv; break;
3090                 case 14: op = rv_op_vrgatherei16_vv; break;
3091                 case 16: if (((inst >> 25) & 1) == 0) op = rv_op_vadc_vvm; break;
3092                 case 17: op = rv_op_vmadc_vvm; break;
3093                 case 18: if (((inst >> 25) & 1) == 0) op = rv_op_vsbc_vvm; break;
3094                 case 19: op = rv_op_vmsbc_vvm; break;
3095                 case 23:
3096                     if (((inst >> 20) & 0b111111) == 32)
3097                         op = rv_op_vmv_v_v;
3098                     else if (((inst >> 25) & 1) == 0)
3099                         op = rv_op_vmerge_vvm;
3100                     break;
3101                 case 24: op = rv_op_vmseq_vv; break;
3102                 case 25: op = rv_op_vmsne_vv; break;
3103                 case 26: op = rv_op_vmsltu_vv; break;
3104                 case 27: op = rv_op_vmslt_vv; break;
3105                 case 28: op = rv_op_vmsleu_vv; break;
3106                 case 29: op = rv_op_vmsle_vv; break;
3107                 case 32: op = rv_op_vsaddu_vv; break;
3108                 case 33: op = rv_op_vsadd_vv; break;
3109                 case 34: op = rv_op_vssubu_vv; break;
3110                 case 35: op = rv_op_vssub_vv; break;
3111                 case 37: op = rv_op_vsll_vv; break;
3112                 case 39: op = rv_op_vsmul_vv; break;
3113                 case 40: op = rv_op_vsrl_vv; break;
3114                 case 41: op = rv_op_vsra_vv; break;
3115                 case 42: op = rv_op_vssrl_vv; break;
3116                 case 43: op = rv_op_vssra_vv; break;
3117                 case 44: op = rv_op_vnsrl_wv; break;
3118                 case 45: op = rv_op_vnsra_wv; break;
3119                 case 46: op = rv_op_vnclipu_wv; break;
3120                 case 47: op = rv_op_vnclip_wv; break;
3121                 case 48: op = rv_op_vwredsumu_vs; break;
3122                 case 49: op = rv_op_vwredsum_vs; break;
3123                 }
3124                 break;
3125             case 1:
3126                 switch (((inst >> 26) & 0b111111)) {
3127                 case 0: op = rv_op_vfadd_vv; break;
3128                 case 1: op = rv_op_vfredusum_vs; break;
3129                 case 2: op = rv_op_vfsub_vv; break;
3130                 case 3: op = rv_op_vfredosum_vs; break;
3131                 case 4: op = rv_op_vfmin_vv; break;
3132                 case 5: op = rv_op_vfredmin_vs; break;
3133                 case 6: op = rv_op_vfmax_vv; break;
3134                 case 7: op = rv_op_vfredmax_vs; break;
3135                 case 8: op = rv_op_vfsgnj_vv; break;
3136                 case 9: op = rv_op_vfsgnjn_vv; break;
3137                 case 10: op = rv_op_vfsgnjx_vv; break;
3138                 case 16:
3139                     switch (((inst >> 15) & 0b11111)) {
3140                     case 0: if ((inst >> 25) & 1) op = rv_op_vfmv_f_s; break;
3141                     }
3142                     break;
3143                 case 18:
3144                     switch (((inst >> 15) & 0b11111)) {
3145                     case 0: op = rv_op_vfcvt_xu_f_v; break;
3146                     case 1: op = rv_op_vfcvt_x_f_v; break;
3147                     case 2: op = rv_op_vfcvt_f_xu_v; break;
3148                     case 3: op = rv_op_vfcvt_f_x_v; break;
3149                     case 6: op = rv_op_vfcvt_rtz_xu_f_v; break;
3150                     case 7: op = rv_op_vfcvt_rtz_x_f_v; break;
3151                     case 8: op = rv_op_vfwcvt_xu_f_v; break;
3152                     case 9: op = rv_op_vfwcvt_x_f_v; break;
3153                     case 10: op = rv_op_vfwcvt_f_xu_v; break;
3154                     case 11: op = rv_op_vfwcvt_f_x_v; break;
3155                     case 12: op = rv_op_vfwcvt_f_f_v; break;
3156                     case 14: op = rv_op_vfwcvt_rtz_xu_f_v; break;
3157                     case 15: op = rv_op_vfwcvt_rtz_x_f_v; break;
3158                     case 16: op = rv_op_vfncvt_xu_f_w; break;
3159                     case 17: op = rv_op_vfncvt_x_f_w; break;
3160                     case 18: op = rv_op_vfncvt_f_xu_w; break;
3161                     case 19: op = rv_op_vfncvt_f_x_w; break;
3162                     case 20: op = rv_op_vfncvt_f_f_w; break;
3163                     case 21: op = rv_op_vfncvt_rod_f_f_w; break;
3164                     case 22: op = rv_op_vfncvt_rtz_xu_f_w; break;
3165                     case 23: op = rv_op_vfncvt_rtz_x_f_w; break;
3166                     }
3167                     break;
3168                 case 19:
3169                     switch (((inst >> 15) & 0b11111)) {
3170                     case 0: op = rv_op_vfsqrt_v; break;
3171                     case 4: op = rv_op_vfrsqrt7_v; break;
3172                     case 5: op = rv_op_vfrec7_v; break;
3173                     case 16: op = rv_op_vfclass_v; break;
3174                     }
3175                     break;
3176                 case 24: op = rv_op_vmfeq_vv; break;
3177                 case 25: op = rv_op_vmfle_vv; break;
3178                 case 27: op = rv_op_vmflt_vv; break;
3179                 case 28: op = rv_op_vmfne_vv; break;
3180                 case 32: op = rv_op_vfdiv_vv; break;
3181                 case 36: op = rv_op_vfmul_vv; break;
3182                 case 40: op = rv_op_vfmadd_vv; break;
3183                 case 41: op = rv_op_vfnmadd_vv; break;
3184                 case 42: op = rv_op_vfmsub_vv; break;
3185                 case 43: op = rv_op_vfnmsub_vv; break;
3186                 case 44: op = rv_op_vfmacc_vv; break;
3187                 case 45: op = rv_op_vfnmacc_vv; break;
3188                 case 46: op = rv_op_vfmsac_vv; break;
3189                 case 47: op = rv_op_vfnmsac_vv; break;
3190                 case 48: op = rv_op_vfwadd_vv; break;
3191                 case 49: op = rv_op_vfwredusum_vs; break;
3192                 case 50: op = rv_op_vfwsub_vv; break;
3193                 case 51: op = rv_op_vfwredosum_vs; break;
3194                 case 52: op = rv_op_vfwadd_wv; break;
3195                 case 54: op = rv_op_vfwsub_wv; break;
3196                 case 56: op = rv_op_vfwmul_vv; break;
3197                 case 60: op = rv_op_vfwmacc_vv; break;
3198                 case 61: op = rv_op_vfwnmacc_vv; break;
3199                 case 62: op = rv_op_vfwmsac_vv; break;
3200                 case 63: op = rv_op_vfwnmsac_vv; break;
3201                 }
3202                 break;
3203             case 2:
3204                 switch (((inst >> 26) & 0b111111)) {
3205                 case 0: op = rv_op_vredsum_vs; break;
3206                 case 1: op = rv_op_vredand_vs; break;
3207                 case 2: op = rv_op_vredor_vs; break;
3208                 case 3: op = rv_op_vredxor_vs; break;
3209                 case 4: op = rv_op_vredminu_vs; break;
3210                 case 5: op = rv_op_vredmin_vs; break;
3211                 case 6: op = rv_op_vredmaxu_vs; break;
3212                 case 7: op = rv_op_vredmax_vs; break;
3213                 case 8: op = rv_op_vaaddu_vv; break;
3214                 case 9: op = rv_op_vaadd_vv; break;
3215                 case 10: op = rv_op_vasubu_vv; break;
3216                 case 11: op = rv_op_vasub_vv; break;
3217                 case 16:
3218                     switch (((inst >> 15) & 0b11111)) {
3219                     case 0: if ((inst >> 25) & 1) op = rv_op_vmv_x_s; break;
3220                     case 16: op = rv_op_vcpop_m; break;
3221                     case 17: op = rv_op_vfirst_m; break;
3222                     }
3223                     break;
3224                 case 18:
3225                     switch (((inst >> 15) & 0b11111)) {
3226                     case 2: op = rv_op_vzext_vf8; break;
3227                     case 3: op = rv_op_vsext_vf8; break;
3228                     case 4: op = rv_op_vzext_vf4; break;
3229                     case 5: op = rv_op_vsext_vf4; break;
3230                     case 6: op = rv_op_vzext_vf2; break;
3231                     case 7: op = rv_op_vsext_vf2; break;
3232                     }
3233                     break;
3234                 case 20:
3235                     switch (((inst >> 15) & 0b11111)) {
3236                     case 1: op = rv_op_vmsbf_m;  break;
3237                     case 2: op = rv_op_vmsof_m; break;
3238                     case 3: op = rv_op_vmsif_m; break;
3239                     case 16: op = rv_op_viota_m; break;
3240                     case 17: if (((inst >> 20) & 0b11111) == 0) op = rv_op_vid_v; break;
3241                     }
3242                     break;
3243                 case 23: if ((inst >> 25) & 1) op = rv_op_vcompress_vm; break;
3244                 case 24: if ((inst >> 25) & 1) op = rv_op_vmandn_mm; break;
3245                 case 25: if ((inst >> 25) & 1) op = rv_op_vmand_mm; break;
3246                 case 26: if ((inst >> 25) & 1) op = rv_op_vmor_mm; break;
3247                 case 27: if ((inst >> 25) & 1) op = rv_op_vmxor_mm; break;
3248                 case 28: if ((inst >> 25) & 1) op = rv_op_vmorn_mm; break;
3249                 case 29: if ((inst >> 25) & 1) op = rv_op_vmnand_mm; break;
3250                 case 30: if ((inst >> 25) & 1) op = rv_op_vmnor_mm; break;
3251                 case 31: if ((inst >> 25) & 1) op = rv_op_vmxnor_mm; break;
3252                 case 32: op = rv_op_vdivu_vv; break;
3253                 case 33: op = rv_op_vdiv_vv; break;
3254                 case 34: op = rv_op_vremu_vv; break;
3255                 case 35: op = rv_op_vrem_vv; break;
3256                 case 36: op = rv_op_vmulhu_vv; break;
3257                 case 37: op = rv_op_vmul_vv; break;
3258                 case 38: op = rv_op_vmulhsu_vv; break;
3259                 case 39: op = rv_op_vmulh_vv; break;
3260                 case 41: op = rv_op_vmadd_vv; break;
3261                 case 43: op = rv_op_vnmsub_vv; break;
3262                 case 45: op = rv_op_vmacc_vv; break;
3263                 case 47: op = rv_op_vnmsac_vv; break;
3264                 case 48: op = rv_op_vwaddu_vv; break;
3265                 case 49: op = rv_op_vwadd_vv; break;
3266                 case 50: op = rv_op_vwsubu_vv; break;
3267                 case 51: op = rv_op_vwsub_vv; break;
3268                 case 52: op = rv_op_vwaddu_wv; break;
3269                 case 53: op = rv_op_vwadd_wv; break;
3270                 case 54: op = rv_op_vwsubu_wv; break;
3271                 case 55: op = rv_op_vwsub_wv; break;
3272                 case 56: op = rv_op_vwmulu_vv; break;
3273                 case 58: op = rv_op_vwmulsu_vv; break;
3274                 case 59: op = rv_op_vwmul_vv; break;
3275                 case 60: op = rv_op_vwmaccu_vv; break;
3276                 case 61: op = rv_op_vwmacc_vv; break;
3277                 case 63: op = rv_op_vwmaccsu_vv; break;
3278                 }
3279                 break;
3280             case 3:
3281                 switch (((inst >> 26) & 0b111111)) {
3282                 case 0: op = rv_op_vadd_vi; break;
3283                 case 3: op = rv_op_vrsub_vi; break;
3284                 case 9: op = rv_op_vand_vi; break;
3285                 case 10: op = rv_op_vor_vi; break;
3286                 case 11: op = rv_op_vxor_vi; break;
3287                 case 12: op = rv_op_vrgather_vi; break;
3288                 case 14: op = rv_op_vslideup_vi; break;
3289                 case 15: op = rv_op_vslidedown_vi; break;
3290                 case 16: if (((inst >> 25) & 1) == 0) op = rv_op_vadc_vim; break;
3291                 case 17: op = rv_op_vmadc_vim; break;
3292                 case 23:
3293                     if (((inst >> 20) & 0b111111) == 32)
3294                         op = rv_op_vmv_v_i;
3295                     else if (((inst >> 25) & 1) == 0)
3296                         op = rv_op_vmerge_vim;
3297                     break;
3298                 case 24: op = rv_op_vmseq_vi; break;
3299                 case 25: op = rv_op_vmsne_vi; break;
3300                 case 28: op = rv_op_vmsleu_vi; break;
3301                 case 29: op = rv_op_vmsle_vi; break;
3302                 case 30: op = rv_op_vmsgtu_vi; break;
3303                 case 31: op = rv_op_vmsgt_vi; break;
3304                 case 32: op = rv_op_vsaddu_vi; break;
3305                 case 33: op = rv_op_vsadd_vi; break;
3306                 case 37: op = rv_op_vsll_vi; break;
3307                 case 39:
3308                     switch (((inst >> 15) & 0b11111)) {
3309                     case 0: op = rv_op_vmv1r_v; break;
3310                     case 1: op = rv_op_vmv2r_v; break;
3311                     case 3: op = rv_op_vmv4r_v; break;
3312                     case 7: op = rv_op_vmv8r_v; break;
3313                     }
3314                     break;
3315                 case 40: op = rv_op_vsrl_vi; break;
3316                 case 41: op = rv_op_vsra_vi; break;
3317                 case 42: op = rv_op_vssrl_vi; break;
3318                 case 43: op = rv_op_vssra_vi; break;
3319                 case 44: op = rv_op_vnsrl_wi; break;
3320                 case 45: op = rv_op_vnsra_wi; break;
3321                 case 46: op = rv_op_vnclipu_wi; break;
3322                 case 47: op = rv_op_vnclip_wi; break;
3323                 }
3324                 break;
3325             case 4:
3326                 switch (((inst >> 26) & 0b111111)) {
3327                 case 0: op = rv_op_vadd_vx; break;
3328                 case 2: op = rv_op_vsub_vx; break;
3329                 case 3: op = rv_op_vrsub_vx; break;
3330                 case 4: op = rv_op_vminu_vx; break;
3331                 case 5: op = rv_op_vmin_vx; break;
3332                 case 6: op = rv_op_vmaxu_vx; break;
3333                 case 7: op = rv_op_vmax_vx; break;
3334                 case 9: op = rv_op_vand_vx; break;
3335                 case 10: op = rv_op_vor_vx; break;
3336                 case 11: op = rv_op_vxor_vx; break;
3337                 case 12: op = rv_op_vrgather_vx; break;
3338                 case 14: op = rv_op_vslideup_vx; break;
3339                 case 15: op = rv_op_vslidedown_vx; break;
3340                 case 16: if (((inst >> 25) & 1) == 0) op = rv_op_vadc_vxm; break;
3341                 case 17: op = rv_op_vmadc_vxm; break;
3342                 case 18: if (((inst >> 25) & 1) == 0) op = rv_op_vsbc_vxm; break;
3343                 case 19: op = rv_op_vmsbc_vxm; break;
3344                 case 23:
3345                     if (((inst >> 20) & 0b111111) == 32)
3346                         op = rv_op_vmv_v_x;
3347                     else if (((inst >> 25) & 1) == 0)
3348                         op = rv_op_vmerge_vxm;
3349                     break;
3350                 case 24: op = rv_op_vmseq_vx; break;
3351                 case 25: op = rv_op_vmsne_vx; break;
3352                 case 26: op = rv_op_vmsltu_vx; break;
3353                 case 27: op = rv_op_vmslt_vx; break;
3354                 case 28: op = rv_op_vmsleu_vx; break;
3355                 case 29: op = rv_op_vmsle_vx; break;
3356                 case 30: op = rv_op_vmsgtu_vx; break;
3357                 case 31: op = rv_op_vmsgt_vx; break;
3358                 case 32: op = rv_op_vsaddu_vx; break;
3359                 case 33: op = rv_op_vsadd_vx; break;
3360                 case 34: op = rv_op_vssubu_vx; break;
3361                 case 35: op = rv_op_vssub_vx; break;
3362                 case 37: op = rv_op_vsll_vx; break;
3363                 case 39: op = rv_op_vsmul_vx; break;
3364                 case 40: op = rv_op_vsrl_vx; break;
3365                 case 41: op = rv_op_vsra_vx; break;
3366                 case 42: op = rv_op_vssrl_vx; break;
3367                 case 43: op = rv_op_vssra_vx; break;
3368                 case 44: op = rv_op_vnsrl_wx; break;
3369                 case 45: op = rv_op_vnsra_wx; break;
3370                 case 46: op = rv_op_vnclipu_wx; break;
3371                 case 47: op = rv_op_vnclip_wx; break;
3372                 }
3373                 break;
3374             case 5:
3375                 switch (((inst >> 26) & 0b111111)) {
3376                 case 0: op = rv_op_vfadd_vf; break;
3377                 case 2: op = rv_op_vfsub_vf; break;
3378                 case 4: op = rv_op_vfmin_vf; break;
3379                 case 6: op = rv_op_vfmax_vf; break;
3380                 case 8: op = rv_op_vfsgnj_vf; break;
3381                 case 9: op = rv_op_vfsgnjn_vf; break;
3382                 case 10: op = rv_op_vfsgnjx_vf; break;
3383                 case 14: op = rv_op_vfslide1up_vf; break;
3384                 case 15: op = rv_op_vfslide1down_vf; break;
3385                 case 16:
3386                     switch (((inst >> 20) & 0b11111)) {
3387                     case 0: if ((inst >> 25) & 1) op = rv_op_vfmv_s_f; break;
3388                     }
3389                     break;
3390                 case 23:
3391                     if (((inst >> 25) & 1) == 0)
3392                         op = rv_op_vfmerge_vfm;
3393                     else if (((inst >> 20) & 0b111111) == 32)
3394                         op = rv_op_vfmv_v_f;
3395                     break;
3396                 case 24: op = rv_op_vmfeq_vf; break;
3397                 case 25: op = rv_op_vmfle_vf; break;
3398                 case 27: op = rv_op_vmflt_vf; break;
3399                 case 28: op = rv_op_vmfne_vf; break;
3400                 case 29: op = rv_op_vmfgt_vf; break;
3401                 case 31: op = rv_op_vmfge_vf; break;
3402                 case 32: op = rv_op_vfdiv_vf; break;
3403                 case 33: op = rv_op_vfrdiv_vf; break;
3404                 case 36: op = rv_op_vfmul_vf; break;
3405                 case 39: op = rv_op_vfrsub_vf; break;
3406                 case 40: op = rv_op_vfmadd_vf; break;
3407                 case 41: op = rv_op_vfnmadd_vf; break;
3408                 case 42: op = rv_op_vfmsub_vf; break;
3409                 case 43: op = rv_op_vfnmsub_vf; break;
3410                 case 44: op = rv_op_vfmacc_vf; break;
3411                 case 45: op = rv_op_vfnmacc_vf; break;
3412                 case 46: op = rv_op_vfmsac_vf; break;
3413                 case 47: op = rv_op_vfnmsac_vf; break;
3414                 case 48: op = rv_op_vfwadd_vf; break;
3415                 case 50: op = rv_op_vfwsub_vf; break;
3416                 case 52: op = rv_op_vfwadd_wf; break;
3417                 case 54: op = rv_op_vfwsub_wf; break;
3418                 case 56: op = rv_op_vfwmul_vf; break;
3419                 case 60: op = rv_op_vfwmacc_vf; break;
3420                 case 61: op = rv_op_vfwnmacc_vf; break;
3421                 case 62: op = rv_op_vfwmsac_vf; break;
3422                 case 63: op = rv_op_vfwnmsac_vf; break;
3423                 }
3424                 break;
3425             case 6:
3426                 switch (((inst >> 26) & 0b111111)) {
3427                 case 8: op = rv_op_vaaddu_vx; break;
3428                 case 9: op = rv_op_vaadd_vx; break;
3429                 case 10: op = rv_op_vasubu_vx; break;
3430                 case 11: op = rv_op_vasub_vx; break;
3431                 case 14: op = rv_op_vslide1up_vx; break;
3432                 case 15: op = rv_op_vslide1down_vx; break;
3433                 case 16:
3434                     switch (((inst >> 20) & 0b11111)) {
3435                     case 0: if ((inst >> 25) & 1) op = rv_op_vmv_s_x; break;
3436                     }
3437                     break;
3438                 case 32: op = rv_op_vdivu_vx; break;
3439                 case 33: op = rv_op_vdiv_vx; break;
3440                 case 34: op = rv_op_vremu_vx; break;
3441                 case 35: op = rv_op_vrem_vx; break;
3442                 case 36: op = rv_op_vmulhu_vx; break;
3443                 case 37: op = rv_op_vmul_vx; break;
3444                 case 38: op = rv_op_vmulhsu_vx; break;
3445                 case 39: op = rv_op_vmulh_vx; break;
3446                 case 41: op = rv_op_vmadd_vx; break;
3447                 case 43: op = rv_op_vnmsub_vx; break;
3448                 case 45: op = rv_op_vmacc_vx; break;
3449                 case 47: op = rv_op_vnmsac_vx; break;
3450                 case 48: op = rv_op_vwaddu_vx; break;
3451                 case 49: op = rv_op_vwadd_vx; break;
3452                 case 50: op = rv_op_vwsubu_vx; break;
3453                 case 51: op = rv_op_vwsub_vx; break;
3454                 case 52: op = rv_op_vwaddu_wx; break;
3455                 case 53: op = rv_op_vwadd_wx; break;
3456                 case 54: op = rv_op_vwsubu_wx; break;
3457                 case 55: op = rv_op_vwsub_wx; break;
3458                 case 56: op = rv_op_vwmulu_vx; break;
3459                 case 58: op = rv_op_vwmulsu_vx; break;
3460                 case 59: op = rv_op_vwmul_vx; break;
3461                 case 60: op = rv_op_vwmaccu_vx; break;
3462                 case 61: op = rv_op_vwmacc_vx; break;
3463                 case 62: op = rv_op_vwmaccus_vx; break;
3464                 case 63: op = rv_op_vwmaccsu_vx; break;
3465                 }
3466                 break;
3467             case 7:
3468                 if (((inst >> 31) & 1) == 0) {
3469                     op = rv_op_vsetvli;
3470                 } else if ((inst >> 30) & 1) {
3471                     op = rv_op_vsetivli;
3472                 } else if (((inst >> 25) & 0b11111) == 0) {
3473                     op = rv_op_vsetvl;
3474                 }
3475                 break;
3476             }
3477             break;
3478         case 22:
3479             switch (((inst >> 12) & 0b111)) {
3480             case 0: op = rv_op_addid; break;
3481             case 1:
3482                 switch (((inst >> 26) & 0b111111)) {
3483                 case 0: op = rv_op_sllid; break;
3484                 }
3485                 break;
3486             case 5:
3487                 switch (((inst >> 26) & 0b111111)) {
3488                 case 0: op = rv_op_srlid; break;
3489                 case 16: op = rv_op_sraid; break;
3490                 }
3491                 break;
3492             }
3493             break;
3494         case 24:
3495             switch (((inst >> 12) & 0b111)) {
3496             case 0: op = rv_op_beq; break;
3497             case 1: op = rv_op_bne; break;
3498             case 4: op = rv_op_blt; break;
3499             case 5: op = rv_op_bge; break;
3500             case 6: op = rv_op_bltu; break;
3501             case 7: op = rv_op_bgeu; break;
3502             }
3503             break;
3504         case 25:
3505             switch (((inst >> 12) & 0b111)) {
3506             case 0: op = rv_op_jalr; break;
3507             }
3508             break;
3509         case 27: op = rv_op_jal; break;
3510         case 28:
3511             switch (((inst >> 12) & 0b111)) {
3512             case 0:
3513                 switch (((inst >> 20) & 0b111111100000) | ((inst >> 7) & 0b000000011111)) {
3514                 case 0:
3515                     switch (((inst >> 15) & 0b1111111111)) {
3516                     case 0: op = rv_op_ecall; break;
3517                     case 32: op = rv_op_ebreak; break;
3518                     case 64: op = rv_op_uret; break;
3519                     }
3520                     break;
3521                 case 256:
3522                     switch (((inst >> 20) & 0b11111)) {
3523                     case 2:
3524                         switch (((inst >> 15) & 0b11111)) {
3525                         case 0: op = rv_op_sret; break;
3526                         }
3527                         break;
3528                     case 4: op = rv_op_sfence_vm; break;
3529                     case 5:
3530                         switch (((inst >> 15) & 0b11111)) {
3531                         case 0: op = rv_op_wfi; break;
3532                         }
3533                         break;
3534                     }
3535                     break;
3536                 case 288: op = rv_op_sfence_vma; break;
3537                 case 512:
3538                     switch (((inst >> 15) & 0b1111111111)) {
3539                     case 64: op = rv_op_hret; break;
3540                     }
3541                     break;
3542                 case 768:
3543                     switch (((inst >> 15) & 0b1111111111)) {
3544                     case 64: op = rv_op_mret; break;
3545                     }
3546                     break;
3547                 case 1952:
3548                     switch (((inst >> 15) & 0b1111111111)) {
3549                     case 576: op = rv_op_dret; break;
3550                     }
3551                     break;
3552                 }
3553                 break;
3554             case 1: op = rv_op_csrrw; break;
3555             case 2: op = rv_op_csrrs; break;
3556             case 3: op = rv_op_csrrc; break;
3557             case 5: op = rv_op_csrrwi; break;
3558             case 6: op = rv_op_csrrsi; break;
3559             case 7: op = rv_op_csrrci; break;
3560             }
3561             break;
3562         case 30:
3563             switch (((inst >> 22) & 0b1111111000) | ((inst >> 12) & 0b0000000111)) {
3564             case 0: op = rv_op_addd; break;
3565             case 1: op = rv_op_slld; break;
3566             case 5: op = rv_op_srld; break;
3567             case 8: op = rv_op_muld; break;
3568             case 12: op = rv_op_divd; break;
3569             case 13: op = rv_op_divud; break;
3570             case 14: op = rv_op_remd; break;
3571             case 15: op = rv_op_remud; break;
3572             case 256: op = rv_op_subd; break;
3573             case 261: op = rv_op_srad; break;
3574             }
3575             break;
3576         }
3577         break;
3578     }
3579     dec->op = op;
3580 }
3581 
3582 /* operand extractors */
3583 
3584 static uint32_t operand_rd(rv_inst inst)
3585 {
3586     return (inst << 52) >> 59;
3587 }
3588 
3589 static uint32_t operand_rs1(rv_inst inst)
3590 {
3591     return (inst << 44) >> 59;
3592 }
3593 
3594 static uint32_t operand_rs2(rv_inst inst)
3595 {
3596     return (inst << 39) >> 59;
3597 }
3598 
3599 static uint32_t operand_rs3(rv_inst inst)
3600 {
3601     return (inst << 32) >> 59;
3602 }
3603 
3604 static uint32_t operand_aq(rv_inst inst)
3605 {
3606     return (inst << 37) >> 63;
3607 }
3608 
3609 static uint32_t operand_rl(rv_inst inst)
3610 {
3611     return (inst << 38) >> 63;
3612 }
3613 
3614 static uint32_t operand_pred(rv_inst inst)
3615 {
3616     return (inst << 36) >> 60;
3617 }
3618 
3619 static uint32_t operand_succ(rv_inst inst)
3620 {
3621     return (inst << 40) >> 60;
3622 }
3623 
3624 static uint32_t operand_rm(rv_inst inst)
3625 {
3626     return (inst << 49) >> 61;
3627 }
3628 
3629 static uint32_t operand_shamt5(rv_inst inst)
3630 {
3631     return (inst << 39) >> 59;
3632 }
3633 
3634 static uint32_t operand_shamt6(rv_inst inst)
3635 {
3636     return (inst << 38) >> 58;
3637 }
3638 
3639 static uint32_t operand_shamt7(rv_inst inst)
3640 {
3641     return (inst << 37) >> 57;
3642 }
3643 
3644 static uint32_t operand_crdq(rv_inst inst)
3645 {
3646     return (inst << 59) >> 61;
3647 }
3648 
3649 static uint32_t operand_crs1q(rv_inst inst)
3650 {
3651     return (inst << 54) >> 61;
3652 }
3653 
3654 static uint32_t operand_crs1rdq(rv_inst inst)
3655 {
3656     return (inst << 54) >> 61;
3657 }
3658 
3659 static uint32_t operand_crs2q(rv_inst inst)
3660 {
3661     return (inst << 59) >> 61;
3662 }
3663 
3664 static uint32_t operand_crd(rv_inst inst)
3665 {
3666     return (inst << 52) >> 59;
3667 }
3668 
3669 static uint32_t operand_crs1(rv_inst inst)
3670 {
3671     return (inst << 52) >> 59;
3672 }
3673 
3674 static uint32_t operand_crs1rd(rv_inst inst)
3675 {
3676     return (inst << 52) >> 59;
3677 }
3678 
3679 static uint32_t operand_crs2(rv_inst inst)
3680 {
3681     return (inst << 57) >> 59;
3682 }
3683 
3684 static uint32_t operand_cimmsh5(rv_inst inst)
3685 {
3686     return (inst << 57) >> 59;
3687 }
3688 
3689 static uint32_t operand_csr12(rv_inst inst)
3690 {
3691     return (inst << 32) >> 52;
3692 }
3693 
3694 static int32_t operand_imm12(rv_inst inst)
3695 {
3696     return ((int64_t)inst << 32) >> 52;
3697 }
3698 
3699 static int32_t operand_imm20(rv_inst inst)
3700 {
3701     return (((int64_t)inst << 32) >> 44) << 12;
3702 }
3703 
3704 static int32_t operand_jimm20(rv_inst inst)
3705 {
3706     return (((int64_t)inst << 32) >> 63) << 20 |
3707         ((inst << 33) >> 54) << 1 |
3708         ((inst << 43) >> 63) << 11 |
3709         ((inst << 44) >> 56) << 12;
3710 }
3711 
3712 static int32_t operand_simm12(rv_inst inst)
3713 {
3714     return (((int64_t)inst << 32) >> 57) << 5 |
3715         (inst << 52) >> 59;
3716 }
3717 
3718 static int32_t operand_sbimm12(rv_inst inst)
3719 {
3720     return (((int64_t)inst << 32) >> 63) << 12 |
3721         ((inst << 33) >> 58) << 5 |
3722         ((inst << 52) >> 60) << 1 |
3723         ((inst << 56) >> 63) << 11;
3724 }
3725 
3726 static uint32_t operand_cimmshl6(rv_inst inst, rv_isa isa)
3727 {
3728     int imm = ((inst << 51) >> 63) << 5 |
3729         (inst << 57) >> 59;
3730     if (isa == rv128) {
3731         imm = imm ? imm : 64;
3732     }
3733     return imm;
3734 }
3735 
3736 static uint32_t operand_cimmshr6(rv_inst inst, rv_isa isa)
3737 {
3738     int imm = ((inst << 51) >> 63) << 5 |
3739         (inst << 57) >> 59;
3740     if (isa == rv128) {
3741         imm = imm | (imm & 32) << 1;
3742         imm = imm ? imm : 64;
3743     }
3744     return imm;
3745 }
3746 
3747 static int32_t operand_cimmi(rv_inst inst)
3748 {
3749     return (((int64_t)inst << 51) >> 63) << 5 |
3750         (inst << 57) >> 59;
3751 }
3752 
3753 static int32_t operand_cimmui(rv_inst inst)
3754 {
3755     return (((int64_t)inst << 51) >> 63) << 17 |
3756         ((inst << 57) >> 59) << 12;
3757 }
3758 
3759 static uint32_t operand_cimmlwsp(rv_inst inst)
3760 {
3761     return ((inst << 51) >> 63) << 5 |
3762         ((inst << 57) >> 61) << 2 |
3763         ((inst << 60) >> 62) << 6;
3764 }
3765 
3766 static uint32_t operand_cimmldsp(rv_inst inst)
3767 {
3768     return ((inst << 51) >> 63) << 5 |
3769         ((inst << 57) >> 62) << 3 |
3770         ((inst << 59) >> 61) << 6;
3771 }
3772 
3773 static uint32_t operand_cimmlqsp(rv_inst inst)
3774 {
3775     return ((inst << 51) >> 63) << 5 |
3776         ((inst << 57) >> 63) << 4 |
3777         ((inst << 58) >> 60) << 6;
3778 }
3779 
3780 static int32_t operand_cimm16sp(rv_inst inst)
3781 {
3782     return (((int64_t)inst << 51) >> 63) << 9 |
3783         ((inst << 57) >> 63) << 4 |
3784         ((inst << 58) >> 63) << 6 |
3785         ((inst << 59) >> 62) << 7 |
3786         ((inst << 61) >> 63) << 5;
3787 }
3788 
3789 static int32_t operand_cimmj(rv_inst inst)
3790 {
3791     return (((int64_t)inst << 51) >> 63) << 11 |
3792         ((inst << 52) >> 63) << 4 |
3793         ((inst << 53) >> 62) << 8 |
3794         ((inst << 55) >> 63) << 10 |
3795         ((inst << 56) >> 63) << 6 |
3796         ((inst << 57) >> 63) << 7 |
3797         ((inst << 58) >> 61) << 1 |
3798         ((inst << 61) >> 63) << 5;
3799 }
3800 
3801 static int32_t operand_cimmb(rv_inst inst)
3802 {
3803     return (((int64_t)inst << 51) >> 63) << 8 |
3804         ((inst << 52) >> 62) << 3 |
3805         ((inst << 57) >> 62) << 6 |
3806         ((inst << 59) >> 62) << 1 |
3807         ((inst << 61) >> 63) << 5;
3808 }
3809 
3810 static uint32_t operand_cimmswsp(rv_inst inst)
3811 {
3812     return ((inst << 51) >> 60) << 2 |
3813         ((inst << 55) >> 62) << 6;
3814 }
3815 
3816 static uint32_t operand_cimmsdsp(rv_inst inst)
3817 {
3818     return ((inst << 51) >> 61) << 3 |
3819         ((inst << 54) >> 61) << 6;
3820 }
3821 
3822 static uint32_t operand_cimmsqsp(rv_inst inst)
3823 {
3824     return ((inst << 51) >> 62) << 4 |
3825         ((inst << 53) >> 60) << 6;
3826 }
3827 
3828 static uint32_t operand_cimm4spn(rv_inst inst)
3829 {
3830     return ((inst << 51) >> 62) << 4 |
3831         ((inst << 53) >> 60) << 6 |
3832         ((inst << 57) >> 63) << 2 |
3833         ((inst << 58) >> 63) << 3;
3834 }
3835 
3836 static uint32_t operand_cimmw(rv_inst inst)
3837 {
3838     return ((inst << 51) >> 61) << 3 |
3839         ((inst << 57) >> 63) << 2 |
3840         ((inst << 58) >> 63) << 6;
3841 }
3842 
3843 static uint32_t operand_cimmd(rv_inst inst)
3844 {
3845     return ((inst << 51) >> 61) << 3 |
3846         ((inst << 57) >> 62) << 6;
3847 }
3848 
3849 static uint32_t operand_cimmq(rv_inst inst)
3850 {
3851     return ((inst << 51) >> 62) << 4 |
3852         ((inst << 53) >> 63) << 8 |
3853         ((inst << 57) >> 62) << 6;
3854 }
3855 
3856 static uint32_t operand_vimm(rv_inst inst)
3857 {
3858     return (int64_t)(inst << 44) >> 59;
3859 }
3860 
3861 static uint32_t operand_vzimm11(rv_inst inst)
3862 {
3863     return (inst << 33) >> 53;
3864 }
3865 
3866 static uint32_t operand_vzimm10(rv_inst inst)
3867 {
3868     return (inst << 34) >> 54;
3869 }
3870 
3871 static uint32_t operand_bs(rv_inst inst)
3872 {
3873     return (inst << 32) >> 62;
3874 }
3875 
3876 static uint32_t operand_rnum(rv_inst inst)
3877 {
3878     return (inst << 40) >> 60;
3879 }
3880 
3881 static uint32_t operand_vm(rv_inst inst)
3882 {
3883     return (inst << 38) >> 63;
3884 }
3885 
3886 /* decode operands */
3887 
3888 static void decode_inst_operands(rv_decode *dec, rv_isa isa)
3889 {
3890     rv_inst inst = dec->inst;
3891     dec->codec = opcode_data[dec->op].codec;
3892     switch (dec->codec) {
3893     case rv_codec_none:
3894         dec->rd = dec->rs1 = dec->rs2 = rv_ireg_zero;
3895         dec->imm = 0;
3896         break;
3897     case rv_codec_u:
3898         dec->rd = operand_rd(inst);
3899         dec->rs1 = dec->rs2 = rv_ireg_zero;
3900         dec->imm = operand_imm20(inst);
3901         break;
3902     case rv_codec_uj:
3903         dec->rd = operand_rd(inst);
3904         dec->rs1 = dec->rs2 = rv_ireg_zero;
3905         dec->imm = operand_jimm20(inst);
3906         break;
3907     case rv_codec_i:
3908         dec->rd = operand_rd(inst);
3909         dec->rs1 = operand_rs1(inst);
3910         dec->rs2 = rv_ireg_zero;
3911         dec->imm = operand_imm12(inst);
3912         break;
3913     case rv_codec_i_sh5:
3914         dec->rd = operand_rd(inst);
3915         dec->rs1 = operand_rs1(inst);
3916         dec->rs2 = rv_ireg_zero;
3917         dec->imm = operand_shamt5(inst);
3918         break;
3919     case rv_codec_i_sh6:
3920         dec->rd = operand_rd(inst);
3921         dec->rs1 = operand_rs1(inst);
3922         dec->rs2 = rv_ireg_zero;
3923         dec->imm = operand_shamt6(inst);
3924         break;
3925     case rv_codec_i_sh7:
3926         dec->rd = operand_rd(inst);
3927         dec->rs1 = operand_rs1(inst);
3928         dec->rs2 = rv_ireg_zero;
3929         dec->imm = operand_shamt7(inst);
3930         break;
3931     case rv_codec_i_csr:
3932         dec->rd = operand_rd(inst);
3933         dec->rs1 = operand_rs1(inst);
3934         dec->rs2 = rv_ireg_zero;
3935         dec->imm = operand_csr12(inst);
3936         break;
3937     case rv_codec_s:
3938         dec->rd = rv_ireg_zero;
3939         dec->rs1 = operand_rs1(inst);
3940         dec->rs2 = operand_rs2(inst);
3941         dec->imm = operand_simm12(inst);
3942         break;
3943     case rv_codec_sb:
3944         dec->rd = rv_ireg_zero;
3945         dec->rs1 = operand_rs1(inst);
3946         dec->rs2 = operand_rs2(inst);
3947         dec->imm = operand_sbimm12(inst);
3948         break;
3949     case rv_codec_r:
3950         dec->rd = operand_rd(inst);
3951         dec->rs1 = operand_rs1(inst);
3952         dec->rs2 = operand_rs2(inst);
3953         dec->imm = 0;
3954         break;
3955     case rv_codec_r_m:
3956         dec->rd = operand_rd(inst);
3957         dec->rs1 = operand_rs1(inst);
3958         dec->rs2 = operand_rs2(inst);
3959         dec->imm = 0;
3960         dec->rm = operand_rm(inst);
3961         break;
3962     case rv_codec_r4_m:
3963         dec->rd = operand_rd(inst);
3964         dec->rs1 = operand_rs1(inst);
3965         dec->rs2 = operand_rs2(inst);
3966         dec->rs3 = operand_rs3(inst);
3967         dec->imm = 0;
3968         dec->rm = operand_rm(inst);
3969         break;
3970     case rv_codec_r_a:
3971         dec->rd = operand_rd(inst);
3972         dec->rs1 = operand_rs1(inst);
3973         dec->rs2 = operand_rs2(inst);
3974         dec->imm = 0;
3975         dec->aq = operand_aq(inst);
3976         dec->rl = operand_rl(inst);
3977         break;
3978     case rv_codec_r_l:
3979         dec->rd = operand_rd(inst);
3980         dec->rs1 = operand_rs1(inst);
3981         dec->rs2 = rv_ireg_zero;
3982         dec->imm = 0;
3983         dec->aq = operand_aq(inst);
3984         dec->rl = operand_rl(inst);
3985         break;
3986     case rv_codec_r_f:
3987         dec->rd = dec->rs1 = dec->rs2 = rv_ireg_zero;
3988         dec->pred = operand_pred(inst);
3989         dec->succ = operand_succ(inst);
3990         dec->imm = 0;
3991         break;
3992     case rv_codec_cb:
3993         dec->rd = rv_ireg_zero;
3994         dec->rs1 = operand_crs1q(inst) + 8;
3995         dec->rs2 = rv_ireg_zero;
3996         dec->imm = operand_cimmb(inst);
3997         break;
3998     case rv_codec_cb_imm:
3999         dec->rd = dec->rs1 = operand_crs1rdq(inst) + 8;
4000         dec->rs2 = rv_ireg_zero;
4001         dec->imm = operand_cimmi(inst);
4002         break;
4003     case rv_codec_cb_sh5:
4004         dec->rd = dec->rs1 = operand_crs1rdq(inst) + 8;
4005         dec->rs2 = rv_ireg_zero;
4006         dec->imm = operand_cimmsh5(inst);
4007         break;
4008     case rv_codec_cb_sh6:
4009         dec->rd = dec->rs1 = operand_crs1rdq(inst) + 8;
4010         dec->rs2 = rv_ireg_zero;
4011         dec->imm = operand_cimmshr6(inst, isa);
4012         break;
4013     case rv_codec_ci:
4014         dec->rd = dec->rs1 = operand_crs1rd(inst);
4015         dec->rs2 = rv_ireg_zero;
4016         dec->imm = operand_cimmi(inst);
4017         break;
4018     case rv_codec_ci_sh5:
4019         dec->rd = dec->rs1 = operand_crs1rd(inst);
4020         dec->rs2 = rv_ireg_zero;
4021         dec->imm = operand_cimmsh5(inst);
4022         break;
4023     case rv_codec_ci_sh6:
4024         dec->rd = dec->rs1 = operand_crs1rd(inst);
4025         dec->rs2 = rv_ireg_zero;
4026         dec->imm = operand_cimmshl6(inst, isa);
4027         break;
4028     case rv_codec_ci_16sp:
4029         dec->rd = rv_ireg_sp;
4030         dec->rs1 = rv_ireg_sp;
4031         dec->rs2 = rv_ireg_zero;
4032         dec->imm = operand_cimm16sp(inst);
4033         break;
4034     case rv_codec_ci_lwsp:
4035         dec->rd = operand_crd(inst);
4036         dec->rs1 = rv_ireg_sp;
4037         dec->rs2 = rv_ireg_zero;
4038         dec->imm = operand_cimmlwsp(inst);
4039         break;
4040     case rv_codec_ci_ldsp:
4041         dec->rd = operand_crd(inst);
4042         dec->rs1 = rv_ireg_sp;
4043         dec->rs2 = rv_ireg_zero;
4044         dec->imm = operand_cimmldsp(inst);
4045         break;
4046     case rv_codec_ci_lqsp:
4047         dec->rd = operand_crd(inst);
4048         dec->rs1 = rv_ireg_sp;
4049         dec->rs2 = rv_ireg_zero;
4050         dec->imm = operand_cimmlqsp(inst);
4051         break;
4052     case rv_codec_ci_li:
4053         dec->rd = operand_crd(inst);
4054         dec->rs1 = rv_ireg_zero;
4055         dec->rs2 = rv_ireg_zero;
4056         dec->imm = operand_cimmi(inst);
4057         break;
4058     case rv_codec_ci_lui:
4059         dec->rd = operand_crd(inst);
4060         dec->rs1 = rv_ireg_zero;
4061         dec->rs2 = rv_ireg_zero;
4062         dec->imm = operand_cimmui(inst);
4063         break;
4064     case rv_codec_ci_none:
4065         dec->rd = dec->rs1 = dec->rs2 = rv_ireg_zero;
4066         dec->imm = 0;
4067         break;
4068     case rv_codec_ciw_4spn:
4069         dec->rd = operand_crdq(inst) + 8;
4070         dec->rs1 = rv_ireg_sp;
4071         dec->rs2 = rv_ireg_zero;
4072         dec->imm = operand_cimm4spn(inst);
4073         break;
4074     case rv_codec_cj:
4075         dec->rd = dec->rs1 = dec->rs2 = rv_ireg_zero;
4076         dec->imm = operand_cimmj(inst);
4077         break;
4078     case rv_codec_cj_jal:
4079         dec->rd = rv_ireg_ra;
4080         dec->rs1 = dec->rs2 = rv_ireg_zero;
4081         dec->imm = operand_cimmj(inst);
4082         break;
4083     case rv_codec_cl_lw:
4084         dec->rd = operand_crdq(inst) + 8;
4085         dec->rs1 = operand_crs1q(inst) + 8;
4086         dec->rs2 = rv_ireg_zero;
4087         dec->imm = operand_cimmw(inst);
4088         break;
4089     case rv_codec_cl_ld:
4090         dec->rd = operand_crdq(inst) + 8;
4091         dec->rs1 = operand_crs1q(inst) + 8;
4092         dec->rs2 = rv_ireg_zero;
4093         dec->imm = operand_cimmd(inst);
4094         break;
4095     case rv_codec_cl_lq:
4096         dec->rd = operand_crdq(inst) + 8;
4097         dec->rs1 = operand_crs1q(inst) + 8;
4098         dec->rs2 = rv_ireg_zero;
4099         dec->imm = operand_cimmq(inst);
4100         break;
4101     case rv_codec_cr:
4102         dec->rd = dec->rs1 = operand_crs1rd(inst);
4103         dec->rs2 = operand_crs2(inst);
4104         dec->imm = 0;
4105         break;
4106     case rv_codec_cr_mv:
4107         dec->rd = operand_crd(inst);
4108         dec->rs1 = operand_crs2(inst);
4109         dec->rs2 = rv_ireg_zero;
4110         dec->imm = 0;
4111         break;
4112     case rv_codec_cr_jalr:
4113         dec->rd = rv_ireg_ra;
4114         dec->rs1 = operand_crs1(inst);
4115         dec->rs2 = rv_ireg_zero;
4116         dec->imm = 0;
4117         break;
4118     case rv_codec_cr_jr:
4119         dec->rd = rv_ireg_zero;
4120         dec->rs1 = operand_crs1(inst);
4121         dec->rs2 = rv_ireg_zero;
4122         dec->imm = 0;
4123         break;
4124     case rv_codec_cs:
4125         dec->rd = dec->rs1 = operand_crs1rdq(inst) + 8;
4126         dec->rs2 = operand_crs2q(inst) + 8;
4127         dec->imm = 0;
4128         break;
4129     case rv_codec_cs_sw:
4130         dec->rd = rv_ireg_zero;
4131         dec->rs1 = operand_crs1q(inst) + 8;
4132         dec->rs2 = operand_crs2q(inst) + 8;
4133         dec->imm = operand_cimmw(inst);
4134         break;
4135     case rv_codec_cs_sd:
4136         dec->rd = rv_ireg_zero;
4137         dec->rs1 = operand_crs1q(inst) + 8;
4138         dec->rs2 = operand_crs2q(inst) + 8;
4139         dec->imm = operand_cimmd(inst);
4140         break;
4141     case rv_codec_cs_sq:
4142         dec->rd = rv_ireg_zero;
4143         dec->rs1 = operand_crs1q(inst) + 8;
4144         dec->rs2 = operand_crs2q(inst) + 8;
4145         dec->imm = operand_cimmq(inst);
4146         break;
4147     case rv_codec_css_swsp:
4148         dec->rd = rv_ireg_zero;
4149         dec->rs1 = rv_ireg_sp;
4150         dec->rs2 = operand_crs2(inst);
4151         dec->imm = operand_cimmswsp(inst);
4152         break;
4153     case rv_codec_css_sdsp:
4154         dec->rd = rv_ireg_zero;
4155         dec->rs1 = rv_ireg_sp;
4156         dec->rs2 = operand_crs2(inst);
4157         dec->imm = operand_cimmsdsp(inst);
4158         break;
4159     case rv_codec_css_sqsp:
4160         dec->rd = rv_ireg_zero;
4161         dec->rs1 = rv_ireg_sp;
4162         dec->rs2 = operand_crs2(inst);
4163         dec->imm = operand_cimmsqsp(inst);
4164         break;
4165     case rv_codec_k_bs:
4166         dec->rs1 = operand_rs1(inst);
4167         dec->rs2 = operand_rs2(inst);
4168         dec->bs = operand_bs(inst);
4169         break;
4170     case rv_codec_k_rnum:
4171         dec->rd = operand_rd(inst);
4172         dec->rs1 = operand_rs1(inst);
4173         dec->rnum = operand_rnum(inst);
4174         break;
4175     case rv_codec_v_r:
4176         dec->rd = operand_rd(inst);
4177         dec->rs1 = operand_rs1(inst);
4178         dec->rs2 = operand_rs2(inst);
4179         dec->vm = operand_vm(inst);
4180         break;
4181     case rv_codec_v_ldst:
4182         dec->rd = operand_rd(inst);
4183         dec->rs1 = operand_rs1(inst);
4184         dec->vm = operand_vm(inst);
4185         break;
4186     case rv_codec_v_i:
4187         dec->rd = operand_rd(inst);
4188         dec->rs2 = operand_rs2(inst);
4189         dec->imm = operand_vimm(inst);
4190         dec->vm = operand_vm(inst);
4191         break;
4192     case rv_codec_vsetvli:
4193         dec->rd = operand_rd(inst);
4194         dec->rs1 = operand_rs1(inst);
4195         dec->vzimm = operand_vzimm11(inst);
4196         break;
4197     case rv_codec_vsetivli:
4198         dec->rd = operand_rd(inst);
4199         dec->imm = operand_vimm(inst);
4200         dec->vzimm = operand_vzimm10(inst);
4201         break;
4202     };
4203 }
4204 
4205 /* check constraint */
4206 
4207 static bool check_constraints(rv_decode *dec, const rvc_constraint *c)
4208 {
4209     int32_t imm = dec->imm;
4210     uint8_t rd = dec->rd, rs1 = dec->rs1, rs2 = dec->rs2;
4211     while (*c != rvc_end) {
4212         switch (*c) {
4213         case rvc_rd_eq_ra:
4214             if (!(rd == 1)) {
4215                 return false;
4216             }
4217             break;
4218         case rvc_rd_eq_x0:
4219             if (!(rd == 0)) {
4220                 return false;
4221             }
4222             break;
4223         case rvc_rs1_eq_x0:
4224             if (!(rs1 == 0)) {
4225                 return false;
4226             }
4227             break;
4228         case rvc_rs2_eq_x0:
4229             if (!(rs2 == 0)) {
4230                 return false;
4231             }
4232             break;
4233         case rvc_rs2_eq_rs1:
4234             if (!(rs2 == rs1)) {
4235                 return false;
4236             }
4237             break;
4238         case rvc_rs1_eq_ra:
4239             if (!(rs1 == 1)) {
4240                 return false;
4241             }
4242             break;
4243         case rvc_imm_eq_zero:
4244             if (!(imm == 0)) {
4245                 return false;
4246             }
4247             break;
4248         case rvc_imm_eq_n1:
4249             if (!(imm == -1)) {
4250                 return false;
4251             }
4252             break;
4253         case rvc_imm_eq_p1:
4254             if (!(imm == 1)) {
4255                 return false;
4256             }
4257             break;
4258         case rvc_csr_eq_0x001:
4259             if (!(imm == 0x001)) {
4260                 return false;
4261             }
4262             break;
4263         case rvc_csr_eq_0x002:
4264             if (!(imm == 0x002)) {
4265                 return false;
4266             }
4267             break;
4268         case rvc_csr_eq_0x003:
4269             if (!(imm == 0x003)) {
4270                 return false;
4271             }
4272             break;
4273         case rvc_csr_eq_0xc00:
4274             if (!(imm == 0xc00)) {
4275                 return false;
4276             }
4277             break;
4278         case rvc_csr_eq_0xc01:
4279             if (!(imm == 0xc01)) {
4280                 return false;
4281             }
4282             break;
4283         case rvc_csr_eq_0xc02:
4284             if (!(imm == 0xc02)) {
4285                 return false;
4286             }
4287             break;
4288         case rvc_csr_eq_0xc80:
4289             if (!(imm == 0xc80)) {
4290                 return false;
4291             }
4292             break;
4293         case rvc_csr_eq_0xc81:
4294             if (!(imm == 0xc81)) {
4295                 return false;
4296             }
4297             break;
4298         case rvc_csr_eq_0xc82:
4299             if (!(imm == 0xc82)) {
4300                 return false;
4301             }
4302             break;
4303         default: break;
4304         }
4305         c++;
4306     }
4307     return true;
4308 }
4309 
4310 /* instruction length */
4311 
4312 static size_t inst_length(rv_inst inst)
4313 {
4314     /* NOTE: supports maximum instruction size of 64-bits */
4315 
4316     /* instruction length coding
4317      *
4318      *      aa - 16 bit aa != 11
4319      *   bbb11 - 32 bit bbb != 111
4320      *  011111 - 48 bit
4321      * 0111111 - 64 bit
4322      */
4323 
4324     return (inst &      0b11) != 0b11      ? 2
4325          : (inst &   0b11100) != 0b11100   ? 4
4326          : (inst &  0b111111) == 0b011111  ? 6
4327          : (inst & 0b1111111) == 0b0111111 ? 8
4328          : 0;
4329 }
4330 
4331 /* format instruction */
4332 
4333 static void append(char *s1, const char *s2, size_t n)
4334 {
4335     size_t l1 = strlen(s1);
4336     if (n - l1 - 1 > 0) {
4337         strncat(s1, s2, n - l1);
4338     }
4339 }
4340 
4341 static void format_inst(char *buf, size_t buflen, size_t tab, rv_decode *dec)
4342 {
4343     char tmp[64];
4344     const char *fmt;
4345 
4346     fmt = opcode_data[dec->op].format;
4347     while (*fmt) {
4348         switch (*fmt) {
4349         case 'O':
4350             append(buf, opcode_data[dec->op].name, buflen);
4351             break;
4352         case '(':
4353             append(buf, "(", buflen);
4354             break;
4355         case ',':
4356             append(buf, ",", buflen);
4357             break;
4358         case ')':
4359             append(buf, ")", buflen);
4360             break;
4361         case 'b':
4362             snprintf(tmp, sizeof(tmp), "%d", dec->bs);
4363             append(buf, tmp, buflen);
4364             break;
4365         case 'n':
4366             snprintf(tmp, sizeof(tmp), "%d", dec->rnum);
4367             append(buf, tmp, buflen);
4368             break;
4369         case '0':
4370             append(buf, rv_ireg_name_sym[dec->rd], buflen);
4371             break;
4372         case '1':
4373             append(buf, rv_ireg_name_sym[dec->rs1], buflen);
4374             break;
4375         case '2':
4376             append(buf, rv_ireg_name_sym[dec->rs2], buflen);
4377             break;
4378         case '3':
4379             append(buf, rv_freg_name_sym[dec->rd], buflen);
4380             break;
4381         case '4':
4382             append(buf, rv_freg_name_sym[dec->rs1], buflen);
4383             break;
4384         case '5':
4385             append(buf, rv_freg_name_sym[dec->rs2], buflen);
4386             break;
4387         case '6':
4388             append(buf, rv_freg_name_sym[dec->rs3], buflen);
4389             break;
4390         case '7':
4391             snprintf(tmp, sizeof(tmp), "%d", dec->rs1);
4392             append(buf, tmp, buflen);
4393             break;
4394         case 'i':
4395             snprintf(tmp, sizeof(tmp), "%d", dec->imm);
4396             append(buf, tmp, buflen);
4397             break;
4398         case 'u':
4399             snprintf(tmp, sizeof(tmp), "%u", ((uint32_t)dec->imm & 0b11111));
4400             append(buf, tmp, buflen);
4401             break;
4402         case 'o':
4403             snprintf(tmp, sizeof(tmp), "%d", dec->imm);
4404             append(buf, tmp, buflen);
4405             while (strlen(buf) < tab * 2) {
4406                 append(buf, " ", buflen);
4407             }
4408             snprintf(tmp, sizeof(tmp), "# 0x%" PRIx64,
4409                 dec->pc + dec->imm);
4410             append(buf, tmp, buflen);
4411             break;
4412         case 'c': {
4413             const char *name = csr_name(dec->imm & 0xfff);
4414             if (name) {
4415                 append(buf, name, buflen);
4416             } else {
4417                 snprintf(tmp, sizeof(tmp), "0x%03x", dec->imm & 0xfff);
4418                 append(buf, tmp, buflen);
4419             }
4420             break;
4421         }
4422         case 'r':
4423             switch (dec->rm) {
4424             case rv_rm_rne:
4425                 append(buf, "rne", buflen);
4426                 break;
4427             case rv_rm_rtz:
4428                 append(buf, "rtz", buflen);
4429                 break;
4430             case rv_rm_rdn:
4431                 append(buf, "rdn", buflen);
4432                 break;
4433             case rv_rm_rup:
4434                 append(buf, "rup", buflen);
4435                 break;
4436             case rv_rm_rmm:
4437                 append(buf, "rmm", buflen);
4438                 break;
4439             case rv_rm_dyn:
4440                 append(buf, "dyn", buflen);
4441                 break;
4442             default:
4443                 append(buf, "inv", buflen);
4444                 break;
4445             }
4446             break;
4447         case 'p':
4448             if (dec->pred & rv_fence_i) {
4449                 append(buf, "i", buflen);
4450             }
4451             if (dec->pred & rv_fence_o) {
4452                 append(buf, "o", buflen);
4453             }
4454             if (dec->pred & rv_fence_r) {
4455                 append(buf, "r", buflen);
4456             }
4457             if (dec->pred & rv_fence_w) {
4458                 append(buf, "w", buflen);
4459             }
4460             break;
4461         case 's':
4462             if (dec->succ & rv_fence_i) {
4463                 append(buf, "i", buflen);
4464             }
4465             if (dec->succ & rv_fence_o) {
4466                 append(buf, "o", buflen);
4467             }
4468             if (dec->succ & rv_fence_r) {
4469                 append(buf, "r", buflen);
4470             }
4471             if (dec->succ & rv_fence_w) {
4472                 append(buf, "w", buflen);
4473             }
4474             break;
4475         case '\t':
4476             while (strlen(buf) < tab) {
4477                 append(buf, " ", buflen);
4478             }
4479             break;
4480         case 'A':
4481             if (dec->aq) {
4482                 append(buf, ".aq", buflen);
4483             }
4484             break;
4485         case 'R':
4486             if (dec->rl) {
4487                 append(buf, ".rl", buflen);
4488             }
4489             break;
4490         case 'l':
4491             append(buf, ",v0", buflen);
4492             break;
4493         case 'm':
4494             if (dec->vm == 0) {
4495                 append(buf, ",v0.t", buflen);
4496             }
4497             break;
4498         case 'D':
4499             append(buf, rv_vreg_name_sym[dec->rd], buflen);
4500             break;
4501         case 'E':
4502             append(buf, rv_vreg_name_sym[dec->rs1], buflen);
4503             break;
4504         case 'F':
4505             append(buf, rv_vreg_name_sym[dec->rs2], buflen);
4506             break;
4507         case 'G':
4508             append(buf, rv_vreg_name_sym[dec->rs3], buflen);
4509             break;
4510         case 'v': {
4511             char nbuf[32] = {0};
4512             const int sew = 1 << (((dec->vzimm >> 3) & 0b111) + 3);
4513             sprintf(nbuf, "%d", sew);
4514             const int lmul = dec->vzimm & 0b11;
4515             const int flmul = (dec->vzimm >> 2) & 1;
4516             const char *vta = (dec->vzimm >> 6) & 1 ? "ta" : "tu";
4517             const char *vma = (dec->vzimm >> 7) & 1 ? "ma" : "mu";
4518             append(buf, "e", buflen);
4519             append(buf, nbuf, buflen);
4520             append(buf, ",m", buflen);
4521             if (flmul) {
4522                 switch (lmul) {
4523                 case 3:
4524                     sprintf(nbuf, "f2");
4525                     break;
4526                 case 2:
4527                     sprintf(nbuf, "f4");
4528                     break;
4529                 case 1:
4530                     sprintf(nbuf, "f8");
4531                 break;
4532                 }
4533                 append(buf, nbuf, buflen);
4534             } else {
4535                 sprintf(nbuf, "%d", 1 << lmul);
4536                 append(buf, nbuf, buflen);
4537             }
4538             append(buf, ",", buflen);
4539             append(buf, vta, buflen);
4540             append(buf, ",", buflen);
4541             append(buf, vma, buflen);
4542             break;
4543         }
4544         default:
4545             break;
4546         }
4547         fmt++;
4548     }
4549 }
4550 
4551 /* lift instruction to pseudo-instruction */
4552 
4553 static void decode_inst_lift_pseudo(rv_decode *dec)
4554 {
4555     const rv_comp_data *comp_data = opcode_data[dec->op].pseudo;
4556     if (!comp_data) {
4557         return;
4558     }
4559     while (comp_data->constraints) {
4560         if (check_constraints(dec, comp_data->constraints)) {
4561             dec->op = comp_data->op;
4562             dec->codec = opcode_data[dec->op].codec;
4563             return;
4564         }
4565         comp_data++;
4566     }
4567 }
4568 
4569 /* decompress instruction */
4570 
4571 static void decode_inst_decompress_rv32(rv_decode *dec)
4572 {
4573     int decomp_op = opcode_data[dec->op].decomp_rv32;
4574     if (decomp_op != rv_op_illegal) {
4575         if ((opcode_data[dec->op].decomp_data & rvcd_imm_nz)
4576             && dec->imm == 0) {
4577             dec->op = rv_op_illegal;
4578         } else {
4579             dec->op = decomp_op;
4580             dec->codec = opcode_data[decomp_op].codec;
4581         }
4582     }
4583 }
4584 
4585 static void decode_inst_decompress_rv64(rv_decode *dec)
4586 {
4587     int decomp_op = opcode_data[dec->op].decomp_rv64;
4588     if (decomp_op != rv_op_illegal) {
4589         if ((opcode_data[dec->op].decomp_data & rvcd_imm_nz)
4590             && dec->imm == 0) {
4591             dec->op = rv_op_illegal;
4592         } else {
4593             dec->op = decomp_op;
4594             dec->codec = opcode_data[decomp_op].codec;
4595         }
4596     }
4597 }
4598 
4599 static void decode_inst_decompress_rv128(rv_decode *dec)
4600 {
4601     int decomp_op = opcode_data[dec->op].decomp_rv128;
4602     if (decomp_op != rv_op_illegal) {
4603         if ((opcode_data[dec->op].decomp_data & rvcd_imm_nz)
4604             && dec->imm == 0) {
4605             dec->op = rv_op_illegal;
4606         } else {
4607             dec->op = decomp_op;
4608             dec->codec = opcode_data[decomp_op].codec;
4609         }
4610     }
4611 }
4612 
4613 static void decode_inst_decompress(rv_decode *dec, rv_isa isa)
4614 {
4615     switch (isa) {
4616     case rv32:
4617         decode_inst_decompress_rv32(dec);
4618         break;
4619     case rv64:
4620         decode_inst_decompress_rv64(dec);
4621         break;
4622     case rv128:
4623         decode_inst_decompress_rv128(dec);
4624         break;
4625     }
4626 }
4627 
4628 /* disassemble instruction */
4629 
4630 static void
4631 disasm_inst(char *buf, size_t buflen, rv_isa isa, uint64_t pc, rv_inst inst)
4632 {
4633     rv_decode dec = { 0 };
4634     dec.pc = pc;
4635     dec.inst = inst;
4636     decode_inst_opcode(&dec, isa);
4637     decode_inst_operands(&dec, isa);
4638     decode_inst_decompress(&dec, isa);
4639     decode_inst_lift_pseudo(&dec);
4640     format_inst(buf, buflen, 24, &dec);
4641 }
4642 
4643 #define INST_FMT_2 "%04" PRIx64 "              "
4644 #define INST_FMT_4 "%08" PRIx64 "          "
4645 #define INST_FMT_6 "%012" PRIx64 "      "
4646 #define INST_FMT_8 "%016" PRIx64 "  "
4647 
4648 static int
4649 print_insn_riscv(bfd_vma memaddr, struct disassemble_info *info, rv_isa isa)
4650 {
4651     char buf[128] = { 0 };
4652     bfd_byte packet[2];
4653     rv_inst inst = 0;
4654     size_t len = 2;
4655     bfd_vma n;
4656     int status;
4657 
4658     /* Instructions are made of 2-byte packets in little-endian order */
4659     for (n = 0; n < len; n += 2) {
4660         status = (*info->read_memory_func)(memaddr + n, packet, 2, info);
4661         if (status != 0) {
4662             /* Don't fail just because we fell off the end.  */
4663             if (n > 0) {
4664                 break;
4665             }
4666             (*info->memory_error_func)(status, memaddr, info);
4667             return status;
4668         }
4669         inst |= ((rv_inst) bfd_getl16(packet)) << (8 * n);
4670         if (n == 0) {
4671             len = inst_length(inst);
4672         }
4673     }
4674 
4675     switch (len) {
4676     case 2:
4677         (*info->fprintf_func)(info->stream, INST_FMT_2, inst);
4678         break;
4679     case 4:
4680         (*info->fprintf_func)(info->stream, INST_FMT_4, inst);
4681         break;
4682     case 6:
4683         (*info->fprintf_func)(info->stream, INST_FMT_6, inst);
4684         break;
4685     default:
4686         (*info->fprintf_func)(info->stream, INST_FMT_8, inst);
4687         break;
4688     }
4689 
4690     disasm_inst(buf, sizeof(buf), isa, memaddr, inst);
4691     (*info->fprintf_func)(info->stream, "%s", buf);
4692 
4693     return len;
4694 }
4695 
4696 int print_insn_riscv32(bfd_vma memaddr, struct disassemble_info *info)
4697 {
4698     return print_insn_riscv(memaddr, info, rv32);
4699 }
4700 
4701 int print_insn_riscv64(bfd_vma memaddr, struct disassemble_info *info)
4702 {
4703     return print_insn_riscv(memaddr, info, rv64);
4704 }
4705 
4706 int print_insn_riscv128(bfd_vma memaddr, struct disassemble_info *info)
4707 {
4708     return print_insn_riscv(memaddr, info, rv128);
4709 }
4710