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