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