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