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