xref: /qemu/disas/riscv.c (revision 02c1b569a15b4b06a3c69b6cb1713830a29cb01f)
1ea103259SMichael Clark /*
2ea103259SMichael Clark  * QEMU RISC-V Disassembler
3ea103259SMichael Clark  *
4ea103259SMichael Clark  * Copyright (c) 2016-2017 Michael Clark <michaeljclark@mac.com>
5ea103259SMichael Clark  * Copyright (c) 2017-2018 SiFive, Inc.
6ea103259SMichael Clark  *
7ea103259SMichael Clark  * This program is free software; you can redistribute it and/or modify it
8ea103259SMichael Clark  * under the terms and conditions of the GNU General Public License,
9ea103259SMichael Clark  * version 2 or later, as published by the Free Software Foundation.
10ea103259SMichael Clark  *
11ea103259SMichael Clark  * This program is distributed in the hope it will be useful, but WITHOUT
12ea103259SMichael Clark  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13ea103259SMichael Clark  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
14ea103259SMichael Clark  * more details.
15ea103259SMichael Clark  *
16ea103259SMichael Clark  * You should have received a copy of the GNU General Public License along with
17ea103259SMichael Clark  * this program.  If not, see <http://www.gnu.org/licenses/>.
18ea103259SMichael Clark  */
19ea103259SMichael Clark 
20ea103259SMichael Clark #include "qemu/osdep.h"
213979fca4SMarkus Armbruster #include "disas/dis-asm.h"
22ea103259SMichael Clark 
23ea103259SMichael Clark 
24ea103259SMichael Clark /* types */
25ea103259SMichael Clark 
26ea103259SMichael Clark typedef uint64_t rv_inst;
27ea103259SMichael Clark typedef uint16_t rv_opcode;
28ea103259SMichael Clark 
29ea103259SMichael Clark /* enums */
30ea103259SMichael Clark 
31ea103259SMichael Clark typedef enum {
32ea103259SMichael Clark     rv32,
33ea103259SMichael Clark     rv64,
34ea103259SMichael Clark     rv128
35ea103259SMichael Clark } rv_isa;
36ea103259SMichael Clark 
37ea103259SMichael Clark typedef enum {
38ea103259SMichael Clark     rv_rm_rne = 0,
39ea103259SMichael Clark     rv_rm_rtz = 1,
40ea103259SMichael Clark     rv_rm_rdn = 2,
41ea103259SMichael Clark     rv_rm_rup = 3,
42ea103259SMichael Clark     rv_rm_rmm = 4,
43ea103259SMichael Clark     rv_rm_dyn = 7,
44ea103259SMichael Clark } rv_rm;
45ea103259SMichael Clark 
46ea103259SMichael Clark typedef enum {
47ea103259SMichael Clark     rv_fence_i = 8,
48ea103259SMichael Clark     rv_fence_o = 4,
49ea103259SMichael Clark     rv_fence_r = 2,
50ea103259SMichael Clark     rv_fence_w = 1,
51ea103259SMichael Clark } rv_fence;
52ea103259SMichael Clark 
53ea103259SMichael Clark typedef enum {
54ea103259SMichael Clark     rv_ireg_zero,
55ea103259SMichael Clark     rv_ireg_ra,
56ea103259SMichael Clark     rv_ireg_sp,
57ea103259SMichael Clark     rv_ireg_gp,
58ea103259SMichael Clark     rv_ireg_tp,
59ea103259SMichael Clark     rv_ireg_t0,
60ea103259SMichael Clark     rv_ireg_t1,
61ea103259SMichael Clark     rv_ireg_t2,
62ea103259SMichael Clark     rv_ireg_s0,
63ea103259SMichael Clark     rv_ireg_s1,
64ea103259SMichael Clark     rv_ireg_a0,
65ea103259SMichael Clark     rv_ireg_a1,
66ea103259SMichael Clark     rv_ireg_a2,
67ea103259SMichael Clark     rv_ireg_a3,
68ea103259SMichael Clark     rv_ireg_a4,
69ea103259SMichael Clark     rv_ireg_a5,
70ea103259SMichael Clark     rv_ireg_a6,
71ea103259SMichael Clark     rv_ireg_a7,
72ea103259SMichael Clark     rv_ireg_s2,
73ea103259SMichael Clark     rv_ireg_s3,
74ea103259SMichael Clark     rv_ireg_s4,
75ea103259SMichael Clark     rv_ireg_s5,
76ea103259SMichael Clark     rv_ireg_s6,
77ea103259SMichael Clark     rv_ireg_s7,
78ea103259SMichael Clark     rv_ireg_s8,
79ea103259SMichael Clark     rv_ireg_s9,
80ea103259SMichael Clark     rv_ireg_s10,
81ea103259SMichael Clark     rv_ireg_s11,
82ea103259SMichael Clark     rv_ireg_t3,
83ea103259SMichael Clark     rv_ireg_t4,
84ea103259SMichael Clark     rv_ireg_t5,
85ea103259SMichael Clark     rv_ireg_t6,
86ea103259SMichael Clark } rv_ireg;
87ea103259SMichael Clark 
88ea103259SMichael Clark typedef enum {
89ea103259SMichael Clark     rvc_end,
90ea103259SMichael Clark     rvc_rd_eq_ra,
91ea103259SMichael Clark     rvc_rd_eq_x0,
92ea103259SMichael Clark     rvc_rs1_eq_x0,
93ea103259SMichael Clark     rvc_rs2_eq_x0,
94ea103259SMichael Clark     rvc_rs2_eq_rs1,
95ea103259SMichael Clark     rvc_rs1_eq_ra,
96ea103259SMichael Clark     rvc_imm_eq_zero,
97ea103259SMichael Clark     rvc_imm_eq_n1,
98ea103259SMichael Clark     rvc_imm_eq_p1,
99ea103259SMichael Clark     rvc_csr_eq_0x001,
100ea103259SMichael Clark     rvc_csr_eq_0x002,
101ea103259SMichael Clark     rvc_csr_eq_0x003,
102ea103259SMichael Clark     rvc_csr_eq_0xc00,
103ea103259SMichael Clark     rvc_csr_eq_0xc01,
104ea103259SMichael Clark     rvc_csr_eq_0xc02,
105ea103259SMichael Clark     rvc_csr_eq_0xc80,
106ea103259SMichael Clark     rvc_csr_eq_0xc81,
107ea103259SMichael Clark     rvc_csr_eq_0xc82,
108ea103259SMichael Clark } rvc_constraint;
109ea103259SMichael Clark 
110ea103259SMichael Clark typedef enum {
111ea103259SMichael Clark     rv_codec_illegal,
112ea103259SMichael Clark     rv_codec_none,
113ea103259SMichael Clark     rv_codec_u,
114ea103259SMichael Clark     rv_codec_uj,
115ea103259SMichael Clark     rv_codec_i,
116ea103259SMichael Clark     rv_codec_i_sh5,
117ea103259SMichael Clark     rv_codec_i_sh6,
118ea103259SMichael Clark     rv_codec_i_sh7,
119ea103259SMichael Clark     rv_codec_i_csr,
120ea103259SMichael Clark     rv_codec_s,
121ea103259SMichael Clark     rv_codec_sb,
122ea103259SMichael Clark     rv_codec_r,
123ea103259SMichael Clark     rv_codec_r_m,
124ea103259SMichael Clark     rv_codec_r4_m,
125ea103259SMichael Clark     rv_codec_r_a,
126ea103259SMichael Clark     rv_codec_r_l,
127ea103259SMichael Clark     rv_codec_r_f,
128ea103259SMichael Clark     rv_codec_cb,
129ea103259SMichael Clark     rv_codec_cb_imm,
130ea103259SMichael Clark     rv_codec_cb_sh5,
131ea103259SMichael Clark     rv_codec_cb_sh6,
132ea103259SMichael Clark     rv_codec_ci,
133ea103259SMichael Clark     rv_codec_ci_sh5,
134ea103259SMichael Clark     rv_codec_ci_sh6,
135ea103259SMichael Clark     rv_codec_ci_16sp,
136ea103259SMichael Clark     rv_codec_ci_lwsp,
137ea103259SMichael Clark     rv_codec_ci_ldsp,
138ea103259SMichael Clark     rv_codec_ci_lqsp,
139ea103259SMichael Clark     rv_codec_ci_li,
140ea103259SMichael Clark     rv_codec_ci_lui,
141ea103259SMichael Clark     rv_codec_ci_none,
142ea103259SMichael Clark     rv_codec_ciw_4spn,
143ea103259SMichael Clark     rv_codec_cj,
144ea103259SMichael Clark     rv_codec_cj_jal,
145ea103259SMichael Clark     rv_codec_cl_lw,
146ea103259SMichael Clark     rv_codec_cl_ld,
147ea103259SMichael Clark     rv_codec_cl_lq,
148ea103259SMichael Clark     rv_codec_cr,
149ea103259SMichael Clark     rv_codec_cr_mv,
150ea103259SMichael Clark     rv_codec_cr_jalr,
151ea103259SMichael Clark     rv_codec_cr_jr,
152ea103259SMichael Clark     rv_codec_cs,
153ea103259SMichael Clark     rv_codec_cs_sw,
154ea103259SMichael Clark     rv_codec_cs_sd,
155ea103259SMichael Clark     rv_codec_cs_sq,
156ea103259SMichael Clark     rv_codec_css_swsp,
157ea103259SMichael Clark     rv_codec_css_sdsp,
158ea103259SMichael Clark     rv_codec_css_sqsp,
159ea103259SMichael Clark } rv_codec;
160ea103259SMichael Clark 
161ea103259SMichael Clark typedef enum {
162ea103259SMichael Clark     rv_op_illegal = 0,
163ea103259SMichael Clark     rv_op_lui = 1,
164ea103259SMichael Clark     rv_op_auipc = 2,
165ea103259SMichael Clark     rv_op_jal = 3,
166ea103259SMichael Clark     rv_op_jalr = 4,
167ea103259SMichael Clark     rv_op_beq = 5,
168ea103259SMichael Clark     rv_op_bne = 6,
169ea103259SMichael Clark     rv_op_blt = 7,
170ea103259SMichael Clark     rv_op_bge = 8,
171ea103259SMichael Clark     rv_op_bltu = 9,
172ea103259SMichael Clark     rv_op_bgeu = 10,
173ea103259SMichael Clark     rv_op_lb = 11,
174ea103259SMichael Clark     rv_op_lh = 12,
175ea103259SMichael Clark     rv_op_lw = 13,
176ea103259SMichael Clark     rv_op_lbu = 14,
177ea103259SMichael Clark     rv_op_lhu = 15,
178ea103259SMichael Clark     rv_op_sb = 16,
179ea103259SMichael Clark     rv_op_sh = 17,
180ea103259SMichael Clark     rv_op_sw = 18,
181ea103259SMichael Clark     rv_op_addi = 19,
182ea103259SMichael Clark     rv_op_slti = 20,
183ea103259SMichael Clark     rv_op_sltiu = 21,
184ea103259SMichael Clark     rv_op_xori = 22,
185ea103259SMichael Clark     rv_op_ori = 23,
186ea103259SMichael Clark     rv_op_andi = 24,
187ea103259SMichael Clark     rv_op_slli = 25,
188ea103259SMichael Clark     rv_op_srli = 26,
189ea103259SMichael Clark     rv_op_srai = 27,
190ea103259SMichael Clark     rv_op_add = 28,
191ea103259SMichael Clark     rv_op_sub = 29,
192ea103259SMichael Clark     rv_op_sll = 30,
193ea103259SMichael Clark     rv_op_slt = 31,
194ea103259SMichael Clark     rv_op_sltu = 32,
195ea103259SMichael Clark     rv_op_xor = 33,
196ea103259SMichael Clark     rv_op_srl = 34,
197ea103259SMichael Clark     rv_op_sra = 35,
198ea103259SMichael Clark     rv_op_or = 36,
199ea103259SMichael Clark     rv_op_and = 37,
200ea103259SMichael Clark     rv_op_fence = 38,
201ea103259SMichael Clark     rv_op_fence_i = 39,
202ea103259SMichael Clark     rv_op_lwu = 40,
203ea103259SMichael Clark     rv_op_ld = 41,
204ea103259SMichael Clark     rv_op_sd = 42,
205ea103259SMichael Clark     rv_op_addiw = 43,
206ea103259SMichael Clark     rv_op_slliw = 44,
207ea103259SMichael Clark     rv_op_srliw = 45,
208ea103259SMichael Clark     rv_op_sraiw = 46,
209ea103259SMichael Clark     rv_op_addw = 47,
210ea103259SMichael Clark     rv_op_subw = 48,
211ea103259SMichael Clark     rv_op_sllw = 49,
212ea103259SMichael Clark     rv_op_srlw = 50,
213ea103259SMichael Clark     rv_op_sraw = 51,
214ea103259SMichael Clark     rv_op_ldu = 52,
215ea103259SMichael Clark     rv_op_lq = 53,
216ea103259SMichael Clark     rv_op_sq = 54,
217ea103259SMichael Clark     rv_op_addid = 55,
218ea103259SMichael Clark     rv_op_sllid = 56,
219ea103259SMichael Clark     rv_op_srlid = 57,
220ea103259SMichael Clark     rv_op_sraid = 58,
221ea103259SMichael Clark     rv_op_addd = 59,
222ea103259SMichael Clark     rv_op_subd = 60,
223ea103259SMichael Clark     rv_op_slld = 61,
224ea103259SMichael Clark     rv_op_srld = 62,
225ea103259SMichael Clark     rv_op_srad = 63,
226ea103259SMichael Clark     rv_op_mul = 64,
227ea103259SMichael Clark     rv_op_mulh = 65,
228ea103259SMichael Clark     rv_op_mulhsu = 66,
229ea103259SMichael Clark     rv_op_mulhu = 67,
230ea103259SMichael Clark     rv_op_div = 68,
231ea103259SMichael Clark     rv_op_divu = 69,
232ea103259SMichael Clark     rv_op_rem = 70,
233ea103259SMichael Clark     rv_op_remu = 71,
234ea103259SMichael Clark     rv_op_mulw = 72,
235ea103259SMichael Clark     rv_op_divw = 73,
236ea103259SMichael Clark     rv_op_divuw = 74,
237ea103259SMichael Clark     rv_op_remw = 75,
238ea103259SMichael Clark     rv_op_remuw = 76,
239ea103259SMichael Clark     rv_op_muld = 77,
240ea103259SMichael Clark     rv_op_divd = 78,
241ea103259SMichael Clark     rv_op_divud = 79,
242ea103259SMichael Clark     rv_op_remd = 80,
243ea103259SMichael Clark     rv_op_remud = 81,
244ea103259SMichael Clark     rv_op_lr_w = 82,
245ea103259SMichael Clark     rv_op_sc_w = 83,
246ea103259SMichael Clark     rv_op_amoswap_w = 84,
247ea103259SMichael Clark     rv_op_amoadd_w = 85,
248ea103259SMichael Clark     rv_op_amoxor_w = 86,
249ea103259SMichael Clark     rv_op_amoor_w = 87,
250ea103259SMichael Clark     rv_op_amoand_w = 88,
251ea103259SMichael Clark     rv_op_amomin_w = 89,
252ea103259SMichael Clark     rv_op_amomax_w = 90,
253ea103259SMichael Clark     rv_op_amominu_w = 91,
254ea103259SMichael Clark     rv_op_amomaxu_w = 92,
255ea103259SMichael Clark     rv_op_lr_d = 93,
256ea103259SMichael Clark     rv_op_sc_d = 94,
257ea103259SMichael Clark     rv_op_amoswap_d = 95,
258ea103259SMichael Clark     rv_op_amoadd_d = 96,
259ea103259SMichael Clark     rv_op_amoxor_d = 97,
260ea103259SMichael Clark     rv_op_amoor_d = 98,
261ea103259SMichael Clark     rv_op_amoand_d = 99,
262ea103259SMichael Clark     rv_op_amomin_d = 100,
263ea103259SMichael Clark     rv_op_amomax_d = 101,
264ea103259SMichael Clark     rv_op_amominu_d = 102,
265ea103259SMichael Clark     rv_op_amomaxu_d = 103,
266ea103259SMichael Clark     rv_op_lr_q = 104,
267ea103259SMichael Clark     rv_op_sc_q = 105,
268ea103259SMichael Clark     rv_op_amoswap_q = 106,
269ea103259SMichael Clark     rv_op_amoadd_q = 107,
270ea103259SMichael Clark     rv_op_amoxor_q = 108,
271ea103259SMichael Clark     rv_op_amoor_q = 109,
272ea103259SMichael Clark     rv_op_amoand_q = 110,
273ea103259SMichael Clark     rv_op_amomin_q = 111,
274ea103259SMichael Clark     rv_op_amomax_q = 112,
275ea103259SMichael Clark     rv_op_amominu_q = 113,
276ea103259SMichael Clark     rv_op_amomaxu_q = 114,
277ea103259SMichael Clark     rv_op_ecall = 115,
278ea103259SMichael Clark     rv_op_ebreak = 116,
279ea103259SMichael Clark     rv_op_uret = 117,
280ea103259SMichael Clark     rv_op_sret = 118,
281ea103259SMichael Clark     rv_op_hret = 119,
282ea103259SMichael Clark     rv_op_mret = 120,
283ea103259SMichael Clark     rv_op_dret = 121,
284ea103259SMichael Clark     rv_op_sfence_vm = 122,
285ea103259SMichael Clark     rv_op_sfence_vma = 123,
286ea103259SMichael Clark     rv_op_wfi = 124,
287ea103259SMichael Clark     rv_op_csrrw = 125,
288ea103259SMichael Clark     rv_op_csrrs = 126,
289ea103259SMichael Clark     rv_op_csrrc = 127,
290ea103259SMichael Clark     rv_op_csrrwi = 128,
291ea103259SMichael Clark     rv_op_csrrsi = 129,
292ea103259SMichael Clark     rv_op_csrrci = 130,
293ea103259SMichael Clark     rv_op_flw = 131,
294ea103259SMichael Clark     rv_op_fsw = 132,
295ea103259SMichael Clark     rv_op_fmadd_s = 133,
296ea103259SMichael Clark     rv_op_fmsub_s = 134,
297ea103259SMichael Clark     rv_op_fnmsub_s = 135,
298ea103259SMichael Clark     rv_op_fnmadd_s = 136,
299ea103259SMichael Clark     rv_op_fadd_s = 137,
300ea103259SMichael Clark     rv_op_fsub_s = 138,
301ea103259SMichael Clark     rv_op_fmul_s = 139,
302ea103259SMichael Clark     rv_op_fdiv_s = 140,
303ea103259SMichael Clark     rv_op_fsgnj_s = 141,
304ea103259SMichael Clark     rv_op_fsgnjn_s = 142,
305ea103259SMichael Clark     rv_op_fsgnjx_s = 143,
306ea103259SMichael Clark     rv_op_fmin_s = 144,
307ea103259SMichael Clark     rv_op_fmax_s = 145,
308ea103259SMichael Clark     rv_op_fsqrt_s = 146,
309ea103259SMichael Clark     rv_op_fle_s = 147,
310ea103259SMichael Clark     rv_op_flt_s = 148,
311ea103259SMichael Clark     rv_op_feq_s = 149,
312ea103259SMichael Clark     rv_op_fcvt_w_s = 150,
313ea103259SMichael Clark     rv_op_fcvt_wu_s = 151,
314ea103259SMichael Clark     rv_op_fcvt_s_w = 152,
315ea103259SMichael Clark     rv_op_fcvt_s_wu = 153,
316ea103259SMichael Clark     rv_op_fmv_x_s = 154,
317ea103259SMichael Clark     rv_op_fclass_s = 155,
318ea103259SMichael Clark     rv_op_fmv_s_x = 156,
319ea103259SMichael Clark     rv_op_fcvt_l_s = 157,
320ea103259SMichael Clark     rv_op_fcvt_lu_s = 158,
321ea103259SMichael Clark     rv_op_fcvt_s_l = 159,
322ea103259SMichael Clark     rv_op_fcvt_s_lu = 160,
323ea103259SMichael Clark     rv_op_fld = 161,
324ea103259SMichael Clark     rv_op_fsd = 162,
325ea103259SMichael Clark     rv_op_fmadd_d = 163,
326ea103259SMichael Clark     rv_op_fmsub_d = 164,
327ea103259SMichael Clark     rv_op_fnmsub_d = 165,
328ea103259SMichael Clark     rv_op_fnmadd_d = 166,
329ea103259SMichael Clark     rv_op_fadd_d = 167,
330ea103259SMichael Clark     rv_op_fsub_d = 168,
331ea103259SMichael Clark     rv_op_fmul_d = 169,
332ea103259SMichael Clark     rv_op_fdiv_d = 170,
333ea103259SMichael Clark     rv_op_fsgnj_d = 171,
334ea103259SMichael Clark     rv_op_fsgnjn_d = 172,
335ea103259SMichael Clark     rv_op_fsgnjx_d = 173,
336ea103259SMichael Clark     rv_op_fmin_d = 174,
337ea103259SMichael Clark     rv_op_fmax_d = 175,
338ea103259SMichael Clark     rv_op_fcvt_s_d = 176,
339ea103259SMichael Clark     rv_op_fcvt_d_s = 177,
340ea103259SMichael Clark     rv_op_fsqrt_d = 178,
341ea103259SMichael Clark     rv_op_fle_d = 179,
342ea103259SMichael Clark     rv_op_flt_d = 180,
343ea103259SMichael Clark     rv_op_feq_d = 181,
344ea103259SMichael Clark     rv_op_fcvt_w_d = 182,
345ea103259SMichael Clark     rv_op_fcvt_wu_d = 183,
346ea103259SMichael Clark     rv_op_fcvt_d_w = 184,
347ea103259SMichael Clark     rv_op_fcvt_d_wu = 185,
348ea103259SMichael Clark     rv_op_fclass_d = 186,
349ea103259SMichael Clark     rv_op_fcvt_l_d = 187,
350ea103259SMichael Clark     rv_op_fcvt_lu_d = 188,
351ea103259SMichael Clark     rv_op_fmv_x_d = 189,
352ea103259SMichael Clark     rv_op_fcvt_d_l = 190,
353ea103259SMichael Clark     rv_op_fcvt_d_lu = 191,
354ea103259SMichael Clark     rv_op_fmv_d_x = 192,
355ea103259SMichael Clark     rv_op_flq = 193,
356ea103259SMichael Clark     rv_op_fsq = 194,
357ea103259SMichael Clark     rv_op_fmadd_q = 195,
358ea103259SMichael Clark     rv_op_fmsub_q = 196,
359ea103259SMichael Clark     rv_op_fnmsub_q = 197,
360ea103259SMichael Clark     rv_op_fnmadd_q = 198,
361ea103259SMichael Clark     rv_op_fadd_q = 199,
362ea103259SMichael Clark     rv_op_fsub_q = 200,
363ea103259SMichael Clark     rv_op_fmul_q = 201,
364ea103259SMichael Clark     rv_op_fdiv_q = 202,
365ea103259SMichael Clark     rv_op_fsgnj_q = 203,
366ea103259SMichael Clark     rv_op_fsgnjn_q = 204,
367ea103259SMichael Clark     rv_op_fsgnjx_q = 205,
368ea103259SMichael Clark     rv_op_fmin_q = 206,
369ea103259SMichael Clark     rv_op_fmax_q = 207,
370ea103259SMichael Clark     rv_op_fcvt_s_q = 208,
371ea103259SMichael Clark     rv_op_fcvt_q_s = 209,
372ea103259SMichael Clark     rv_op_fcvt_d_q = 210,
373ea103259SMichael Clark     rv_op_fcvt_q_d = 211,
374ea103259SMichael Clark     rv_op_fsqrt_q = 212,
375ea103259SMichael Clark     rv_op_fle_q = 213,
376ea103259SMichael Clark     rv_op_flt_q = 214,
377ea103259SMichael Clark     rv_op_feq_q = 215,
378ea103259SMichael Clark     rv_op_fcvt_w_q = 216,
379ea103259SMichael Clark     rv_op_fcvt_wu_q = 217,
380ea103259SMichael Clark     rv_op_fcvt_q_w = 218,
381ea103259SMichael Clark     rv_op_fcvt_q_wu = 219,
382ea103259SMichael Clark     rv_op_fclass_q = 220,
383ea103259SMichael Clark     rv_op_fcvt_l_q = 221,
384ea103259SMichael Clark     rv_op_fcvt_lu_q = 222,
385ea103259SMichael Clark     rv_op_fcvt_q_l = 223,
386ea103259SMichael Clark     rv_op_fcvt_q_lu = 224,
387ea103259SMichael Clark     rv_op_fmv_x_q = 225,
388ea103259SMichael Clark     rv_op_fmv_q_x = 226,
389ea103259SMichael Clark     rv_op_c_addi4spn = 227,
390ea103259SMichael Clark     rv_op_c_fld = 228,
391ea103259SMichael Clark     rv_op_c_lw = 229,
392ea103259SMichael Clark     rv_op_c_flw = 230,
393ea103259SMichael Clark     rv_op_c_fsd = 231,
394ea103259SMichael Clark     rv_op_c_sw = 232,
395ea103259SMichael Clark     rv_op_c_fsw = 233,
396ea103259SMichael Clark     rv_op_c_nop = 234,
397ea103259SMichael Clark     rv_op_c_addi = 235,
398ea103259SMichael Clark     rv_op_c_jal = 236,
399ea103259SMichael Clark     rv_op_c_li = 237,
400ea103259SMichael Clark     rv_op_c_addi16sp = 238,
401ea103259SMichael Clark     rv_op_c_lui = 239,
402ea103259SMichael Clark     rv_op_c_srli = 240,
403ea103259SMichael Clark     rv_op_c_srai = 241,
404ea103259SMichael Clark     rv_op_c_andi = 242,
405ea103259SMichael Clark     rv_op_c_sub = 243,
406ea103259SMichael Clark     rv_op_c_xor = 244,
407ea103259SMichael Clark     rv_op_c_or = 245,
408ea103259SMichael Clark     rv_op_c_and = 246,
409ea103259SMichael Clark     rv_op_c_subw = 247,
410ea103259SMichael Clark     rv_op_c_addw = 248,
411ea103259SMichael Clark     rv_op_c_j = 249,
412ea103259SMichael Clark     rv_op_c_beqz = 250,
413ea103259SMichael Clark     rv_op_c_bnez = 251,
414ea103259SMichael Clark     rv_op_c_slli = 252,
415ea103259SMichael Clark     rv_op_c_fldsp = 253,
416ea103259SMichael Clark     rv_op_c_lwsp = 254,
417ea103259SMichael Clark     rv_op_c_flwsp = 255,
418ea103259SMichael Clark     rv_op_c_jr = 256,
419ea103259SMichael Clark     rv_op_c_mv = 257,
420ea103259SMichael Clark     rv_op_c_ebreak = 258,
421ea103259SMichael Clark     rv_op_c_jalr = 259,
422ea103259SMichael Clark     rv_op_c_add = 260,
423ea103259SMichael Clark     rv_op_c_fsdsp = 261,
424ea103259SMichael Clark     rv_op_c_swsp = 262,
425ea103259SMichael Clark     rv_op_c_fswsp = 263,
426ea103259SMichael Clark     rv_op_c_ld = 264,
427ea103259SMichael Clark     rv_op_c_sd = 265,
428ea103259SMichael Clark     rv_op_c_addiw = 266,
429ea103259SMichael Clark     rv_op_c_ldsp = 267,
430ea103259SMichael Clark     rv_op_c_sdsp = 268,
431ea103259SMichael Clark     rv_op_c_lq = 269,
432ea103259SMichael Clark     rv_op_c_sq = 270,
433ea103259SMichael Clark     rv_op_c_lqsp = 271,
434ea103259SMichael Clark     rv_op_c_sqsp = 272,
435ea103259SMichael Clark     rv_op_nop = 273,
436ea103259SMichael Clark     rv_op_mv = 274,
437ea103259SMichael Clark     rv_op_not = 275,
438ea103259SMichael Clark     rv_op_neg = 276,
439ea103259SMichael Clark     rv_op_negw = 277,
440ea103259SMichael Clark     rv_op_sext_w = 278,
441ea103259SMichael Clark     rv_op_seqz = 279,
442ea103259SMichael Clark     rv_op_snez = 280,
443ea103259SMichael Clark     rv_op_sltz = 281,
444ea103259SMichael Clark     rv_op_sgtz = 282,
445ea103259SMichael Clark     rv_op_fmv_s = 283,
446ea103259SMichael Clark     rv_op_fabs_s = 284,
447ea103259SMichael Clark     rv_op_fneg_s = 285,
448ea103259SMichael Clark     rv_op_fmv_d = 286,
449ea103259SMichael Clark     rv_op_fabs_d = 287,
450ea103259SMichael Clark     rv_op_fneg_d = 288,
451ea103259SMichael Clark     rv_op_fmv_q = 289,
452ea103259SMichael Clark     rv_op_fabs_q = 290,
453ea103259SMichael Clark     rv_op_fneg_q = 291,
454ea103259SMichael Clark     rv_op_beqz = 292,
455ea103259SMichael Clark     rv_op_bnez = 293,
456ea103259SMichael Clark     rv_op_blez = 294,
457ea103259SMichael Clark     rv_op_bgez = 295,
458ea103259SMichael Clark     rv_op_bltz = 296,
459ea103259SMichael Clark     rv_op_bgtz = 297,
460ea103259SMichael Clark     rv_op_ble = 298,
461ea103259SMichael Clark     rv_op_bleu = 299,
462ea103259SMichael Clark     rv_op_bgt = 300,
463ea103259SMichael Clark     rv_op_bgtu = 301,
464ea103259SMichael Clark     rv_op_j = 302,
465ea103259SMichael Clark     rv_op_ret = 303,
466ea103259SMichael Clark     rv_op_jr = 304,
467ea103259SMichael Clark     rv_op_rdcycle = 305,
468ea103259SMichael Clark     rv_op_rdtime = 306,
469ea103259SMichael Clark     rv_op_rdinstret = 307,
470ea103259SMichael Clark     rv_op_rdcycleh = 308,
471ea103259SMichael Clark     rv_op_rdtimeh = 309,
472ea103259SMichael Clark     rv_op_rdinstreth = 310,
473ea103259SMichael Clark     rv_op_frcsr = 311,
474ea103259SMichael Clark     rv_op_frrm = 312,
475ea103259SMichael Clark     rv_op_frflags = 313,
476ea103259SMichael Clark     rv_op_fscsr = 314,
477ea103259SMichael Clark     rv_op_fsrm = 315,
478ea103259SMichael Clark     rv_op_fsflags = 316,
479ea103259SMichael Clark     rv_op_fsrmi = 317,
480ea103259SMichael Clark     rv_op_fsflagsi = 318,
481*02c1b569SPhilipp Tomsich     rv_op_bseti = 319,
482*02c1b569SPhilipp Tomsich     rv_op_bclri = 320,
483*02c1b569SPhilipp Tomsich     rv_op_binvi = 321,
484*02c1b569SPhilipp Tomsich     rv_op_bexti = 322,
485*02c1b569SPhilipp Tomsich     rv_op_rori = 323,
486*02c1b569SPhilipp Tomsich     rv_op_clz = 324,
487*02c1b569SPhilipp Tomsich     rv_op_ctz = 325,
488*02c1b569SPhilipp Tomsich     rv_op_cpop = 326,
489*02c1b569SPhilipp Tomsich     rv_op_sext_h = 327,
490*02c1b569SPhilipp Tomsich     rv_op_sext_b = 328,
491*02c1b569SPhilipp Tomsich     rv_op_xnor = 329,
492*02c1b569SPhilipp Tomsich     rv_op_orn = 330,
493*02c1b569SPhilipp Tomsich     rv_op_andn = 331,
494*02c1b569SPhilipp Tomsich     rv_op_rol = 332,
495*02c1b569SPhilipp Tomsich     rv_op_ror = 333,
496*02c1b569SPhilipp Tomsich     rv_op_sh1add = 334,
497*02c1b569SPhilipp Tomsich     rv_op_sh2add = 335,
498*02c1b569SPhilipp Tomsich     rv_op_sh3add = 336,
499*02c1b569SPhilipp Tomsich     rv_op_sh1add_uw = 337,
500*02c1b569SPhilipp Tomsich     rv_op_sh2add_uw = 338,
501*02c1b569SPhilipp Tomsich     rv_op_sh3add_uw = 339,
502*02c1b569SPhilipp Tomsich     rv_op_clmul = 340,
503*02c1b569SPhilipp Tomsich     rv_op_clmulr = 341,
504*02c1b569SPhilipp Tomsich     rv_op_clmulh = 342,
505*02c1b569SPhilipp Tomsich     rv_op_min = 343,
506*02c1b569SPhilipp Tomsich     rv_op_minu = 344,
507*02c1b569SPhilipp Tomsich     rv_op_max = 345,
508*02c1b569SPhilipp Tomsich     rv_op_maxu = 346,
509*02c1b569SPhilipp Tomsich     rv_op_clzw = 347,
510*02c1b569SPhilipp Tomsich     rv_op_ctzw = 348,
511*02c1b569SPhilipp Tomsich     rv_op_cpopw = 349,
512*02c1b569SPhilipp Tomsich     rv_op_slli_uw = 350,
513*02c1b569SPhilipp Tomsich     rv_op_add_uw = 351,
514*02c1b569SPhilipp Tomsich     rv_op_rolw = 352,
515*02c1b569SPhilipp Tomsich     rv_op_rorw = 353,
516*02c1b569SPhilipp Tomsich     rv_op_rev8 = 354,
517*02c1b569SPhilipp Tomsich     rv_op_zext_h = 355,
518*02c1b569SPhilipp Tomsich     rv_op_roriw = 356,
519*02c1b569SPhilipp Tomsich     rv_op_orc_b = 357,
520*02c1b569SPhilipp Tomsich     rv_op_bset = 358,
521*02c1b569SPhilipp Tomsich     rv_op_bclr = 359,
522*02c1b569SPhilipp Tomsich     rv_op_binv = 360,
523*02c1b569SPhilipp Tomsich     rv_op_bext = 361,
524ea103259SMichael Clark } rv_op;
525ea103259SMichael Clark 
526ea103259SMichael Clark /* structures */
527ea103259SMichael Clark 
528ea103259SMichael Clark typedef struct {
529ea103259SMichael Clark     uint64_t  pc;
530ea103259SMichael Clark     uint64_t  inst;
531ea103259SMichael Clark     int32_t   imm;
532ea103259SMichael Clark     uint16_t  op;
533ea103259SMichael Clark     uint8_t   codec;
534ea103259SMichael Clark     uint8_t   rd;
535ea103259SMichael Clark     uint8_t   rs1;
536ea103259SMichael Clark     uint8_t   rs2;
537ea103259SMichael Clark     uint8_t   rs3;
538ea103259SMichael Clark     uint8_t   rm;
539ea103259SMichael Clark     uint8_t   pred;
540ea103259SMichael Clark     uint8_t   succ;
541ea103259SMichael Clark     uint8_t   aq;
542ea103259SMichael Clark     uint8_t   rl;
543ea103259SMichael Clark } rv_decode;
544ea103259SMichael Clark 
545ea103259SMichael Clark typedef struct {
546ea103259SMichael Clark     const int op;
547ea103259SMichael Clark     const rvc_constraint *constraints;
548ea103259SMichael Clark } rv_comp_data;
549ea103259SMichael Clark 
550f88222daSMichael Clark enum {
551f88222daSMichael Clark     rvcd_imm_nz = 0x1
552f88222daSMichael Clark };
553f88222daSMichael Clark 
554ea103259SMichael Clark typedef struct {
555ea103259SMichael Clark     const char * const name;
556ea103259SMichael Clark     const rv_codec codec;
557ea103259SMichael Clark     const char * const format;
558ea103259SMichael Clark     const rv_comp_data *pseudo;
559f88222daSMichael Clark     const short decomp_rv32;
560f88222daSMichael Clark     const short decomp_rv64;
561f88222daSMichael Clark     const short decomp_rv128;
562f88222daSMichael Clark     const short decomp_data;
563ea103259SMichael Clark } rv_opcode_data;
564ea103259SMichael Clark 
565ea103259SMichael Clark /* register names */
566ea103259SMichael Clark 
567ea103259SMichael Clark static const char rv_ireg_name_sym[32][5] = {
568ea103259SMichael Clark     "zero", "ra",   "sp",   "gp",   "tp",   "t0",   "t1",   "t2",
569ea103259SMichael Clark     "s0",   "s1",   "a0",   "a1",   "a2",   "a3",   "a4",   "a5",
570ea103259SMichael Clark     "a6",   "a7",   "s2",   "s3",   "s4",   "s5",   "s6",   "s7",
571ea103259SMichael Clark     "s8",   "s9",   "s10",  "s11",  "t3",   "t4",   "t5",   "t6",
572ea103259SMichael Clark };
573ea103259SMichael Clark 
574ea103259SMichael Clark static const char rv_freg_name_sym[32][5] = {
575ea103259SMichael Clark     "ft0",  "ft1",  "ft2",  "ft3",  "ft4",  "ft5",  "ft6",  "ft7",
576ea103259SMichael Clark     "fs0",  "fs1",  "fa0",  "fa1",  "fa2",  "fa3",  "fa4",  "fa5",
577ea103259SMichael Clark     "fa6",  "fa7",  "fs2",  "fs3",  "fs4",  "fs5",  "fs6",  "fs7",
578ea103259SMichael Clark     "fs8",  "fs9",  "fs10", "fs11", "ft8",  "ft9",  "ft10", "ft11",
579ea103259SMichael Clark };
580ea103259SMichael Clark 
581ea103259SMichael Clark /* instruction formats */
582ea103259SMichael Clark 
583ea103259SMichael Clark #define rv_fmt_none                   "O\t"
584ea103259SMichael Clark #define rv_fmt_rs1                    "O\t1"
585ea103259SMichael Clark #define rv_fmt_offset                 "O\to"
586ea103259SMichael Clark #define rv_fmt_pred_succ              "O\tp,s"
587ea103259SMichael Clark #define rv_fmt_rs1_rs2                "O\t1,2"
588ea103259SMichael Clark #define rv_fmt_rd_imm                 "O\t0,i"
589ea103259SMichael Clark #define rv_fmt_rd_offset              "O\t0,o"
590ea103259SMichael Clark #define rv_fmt_rd_rs1_rs2             "O\t0,1,2"
591ea103259SMichael Clark #define rv_fmt_frd_rs1                "O\t3,1"
592ea103259SMichael Clark #define rv_fmt_rd_frs1                "O\t0,4"
593ea103259SMichael Clark #define rv_fmt_rd_frs1_frs2           "O\t0,4,5"
594ea103259SMichael Clark #define rv_fmt_frd_frs1_frs2          "O\t3,4,5"
595ea103259SMichael Clark #define rv_fmt_rm_frd_frs1            "O\tr,3,4"
596ea103259SMichael Clark #define rv_fmt_rm_frd_rs1             "O\tr,3,1"
597ea103259SMichael Clark #define rv_fmt_rm_rd_frs1             "O\tr,0,4"
598ea103259SMichael Clark #define rv_fmt_rm_frd_frs1_frs2       "O\tr,3,4,5"
599ea103259SMichael Clark #define rv_fmt_rm_frd_frs1_frs2_frs3  "O\tr,3,4,5,6"
600ea103259SMichael Clark #define rv_fmt_rd_rs1_imm             "O\t0,1,i"
601ea103259SMichael Clark #define rv_fmt_rd_rs1_offset          "O\t0,1,i"
602ea103259SMichael Clark #define rv_fmt_rd_offset_rs1          "O\t0,i(1)"
603ea103259SMichael Clark #define rv_fmt_frd_offset_rs1         "O\t3,i(1)"
604ea103259SMichael Clark #define rv_fmt_rd_csr_rs1             "O\t0,c,1"
605ea103259SMichael Clark #define rv_fmt_rd_csr_zimm            "O\t0,c,7"
606ea103259SMichael Clark #define rv_fmt_rs2_offset_rs1         "O\t2,i(1)"
607ea103259SMichael Clark #define rv_fmt_frs2_offset_rs1        "O\t5,i(1)"
608ea103259SMichael Clark #define rv_fmt_rs1_rs2_offset         "O\t1,2,o"
609ea103259SMichael Clark #define rv_fmt_rs2_rs1_offset         "O\t2,1,o"
610ea103259SMichael Clark #define rv_fmt_aqrl_rd_rs2_rs1        "OAR\t0,2,(1)"
611ea103259SMichael Clark #define rv_fmt_aqrl_rd_rs1            "OAR\t0,(1)"
612ea103259SMichael Clark #define rv_fmt_rd                     "O\t0"
613ea103259SMichael Clark #define rv_fmt_rd_zimm                "O\t0,7"
614ea103259SMichael Clark #define rv_fmt_rd_rs1                 "O\t0,1"
615ea103259SMichael Clark #define rv_fmt_rd_rs2                 "O\t0,2"
616ea103259SMichael Clark #define rv_fmt_rs1_offset             "O\t1,o"
617ea103259SMichael Clark #define rv_fmt_rs2_offset             "O\t2,o"
618ea103259SMichael Clark 
619ea103259SMichael Clark /* pseudo-instruction constraints */
620ea103259SMichael Clark 
621ea103259SMichael Clark static const rvc_constraint rvcc_jal[] = { rvc_rd_eq_ra, rvc_end };
622ea103259SMichael Clark static const rvc_constraint rvcc_jalr[] = { rvc_rd_eq_ra, rvc_imm_eq_zero, rvc_end };
623ea103259SMichael Clark static const rvc_constraint rvcc_nop[] = { rvc_rd_eq_x0, rvc_rs1_eq_x0, rvc_imm_eq_zero, rvc_end };
624ea103259SMichael Clark static const rvc_constraint rvcc_mv[] = { rvc_imm_eq_zero, rvc_end };
625ea103259SMichael Clark static const rvc_constraint rvcc_not[] = { rvc_imm_eq_n1, rvc_end };
626ea103259SMichael Clark static const rvc_constraint rvcc_neg[] = { rvc_rs1_eq_x0, rvc_end };
627ea103259SMichael Clark static const rvc_constraint rvcc_negw[] = { rvc_rs1_eq_x0, rvc_end };
62833b4f859SMichael Clark static const rvc_constraint rvcc_sext_w[] = { rvc_imm_eq_zero, rvc_end };
629ea103259SMichael Clark static const rvc_constraint rvcc_seqz[] = { rvc_imm_eq_p1, rvc_end };
630ea103259SMichael Clark static const rvc_constraint rvcc_snez[] = { rvc_rs1_eq_x0, rvc_end };
631ea103259SMichael Clark static const rvc_constraint rvcc_sltz[] = { rvc_rs2_eq_x0, rvc_end };
632ea103259SMichael Clark static const rvc_constraint rvcc_sgtz[] = { rvc_rs1_eq_x0, rvc_end };
633ea103259SMichael Clark static const rvc_constraint rvcc_fmv_s[] = { rvc_rs2_eq_rs1, rvc_end };
634ea103259SMichael Clark static const rvc_constraint rvcc_fabs_s[] = { rvc_rs2_eq_rs1, rvc_end };
635ea103259SMichael Clark static const rvc_constraint rvcc_fneg_s[] = { rvc_rs2_eq_rs1, rvc_end };
636ea103259SMichael Clark static const rvc_constraint rvcc_fmv_d[] = { rvc_rs2_eq_rs1, rvc_end };
637ea103259SMichael Clark static const rvc_constraint rvcc_fabs_d[] = { rvc_rs2_eq_rs1, rvc_end };
638ea103259SMichael Clark static const rvc_constraint rvcc_fneg_d[] = { rvc_rs2_eq_rs1, rvc_end };
639ea103259SMichael Clark static const rvc_constraint rvcc_fmv_q[] = { rvc_rs2_eq_rs1, rvc_end };
640ea103259SMichael Clark static const rvc_constraint rvcc_fabs_q[] = { rvc_rs2_eq_rs1, rvc_end };
641ea103259SMichael Clark static const rvc_constraint rvcc_fneg_q[] = { rvc_rs2_eq_rs1, rvc_end };
642ea103259SMichael Clark static const rvc_constraint rvcc_beqz[] = { rvc_rs2_eq_x0, rvc_end };
643ea103259SMichael Clark static const rvc_constraint rvcc_bnez[] = { rvc_rs2_eq_x0, rvc_end };
644ea103259SMichael Clark static const rvc_constraint rvcc_blez[] = { rvc_rs1_eq_x0, rvc_end };
645ea103259SMichael Clark static const rvc_constraint rvcc_bgez[] = { rvc_rs2_eq_x0, rvc_end };
646ea103259SMichael Clark static const rvc_constraint rvcc_bltz[] = { rvc_rs2_eq_x0, rvc_end };
647ea103259SMichael Clark static const rvc_constraint rvcc_bgtz[] = { rvc_rs1_eq_x0, rvc_end };
648ea103259SMichael Clark static const rvc_constraint rvcc_ble[] = { rvc_end };
649ea103259SMichael Clark static const rvc_constraint rvcc_bleu[] = { rvc_end };
650ea103259SMichael Clark static const rvc_constraint rvcc_bgt[] = { rvc_end };
651ea103259SMichael Clark static const rvc_constraint rvcc_bgtu[] = { rvc_end };
652ea103259SMichael Clark static const rvc_constraint rvcc_j[] = { rvc_rd_eq_x0, rvc_end };
653ea103259SMichael Clark static const rvc_constraint rvcc_ret[] = { rvc_rd_eq_x0, rvc_rs1_eq_ra, rvc_end };
654ea103259SMichael Clark static const rvc_constraint rvcc_jr[] = { rvc_rd_eq_x0, rvc_imm_eq_zero, rvc_end };
655ea103259SMichael Clark static const rvc_constraint rvcc_rdcycle[] = { rvc_rs1_eq_x0, rvc_csr_eq_0xc00, rvc_end };
656ea103259SMichael Clark static const rvc_constraint rvcc_rdtime[] = { rvc_rs1_eq_x0, rvc_csr_eq_0xc01, rvc_end };
657ea103259SMichael Clark static const rvc_constraint rvcc_rdinstret[] = { rvc_rs1_eq_x0, rvc_csr_eq_0xc02, rvc_end };
658ea103259SMichael Clark static const rvc_constraint rvcc_rdcycleh[] = { rvc_rs1_eq_x0, rvc_csr_eq_0xc80, rvc_end };
659ea103259SMichael Clark static const rvc_constraint rvcc_rdtimeh[] = { rvc_rs1_eq_x0, rvc_csr_eq_0xc81, rvc_end };
6602e3df911SWladimir J. van der Laan static const rvc_constraint rvcc_rdinstreth[] = { rvc_rs1_eq_x0,
6612e3df911SWladimir J. van der Laan                                                   rvc_csr_eq_0xc82, rvc_end };
662ea103259SMichael Clark static const rvc_constraint rvcc_frcsr[] = { rvc_rs1_eq_x0, rvc_csr_eq_0x003, rvc_end };
663ea103259SMichael Clark static const rvc_constraint rvcc_frrm[] = { rvc_rs1_eq_x0, rvc_csr_eq_0x002, rvc_end };
664ea103259SMichael Clark static const rvc_constraint rvcc_frflags[] = { rvc_rs1_eq_x0, rvc_csr_eq_0x001, rvc_end };
665ea103259SMichael Clark static const rvc_constraint rvcc_fscsr[] = { rvc_csr_eq_0x003, rvc_end };
666ea103259SMichael Clark static const rvc_constraint rvcc_fsrm[] = { rvc_csr_eq_0x002, rvc_end };
667ea103259SMichael Clark static const rvc_constraint rvcc_fsflags[] = { rvc_csr_eq_0x001, rvc_end };
668ea103259SMichael Clark static const rvc_constraint rvcc_fsrmi[] = { rvc_csr_eq_0x002, rvc_end };
669ea103259SMichael Clark static const rvc_constraint rvcc_fsflagsi[] = { rvc_csr_eq_0x001, rvc_end };
670ea103259SMichael Clark 
671ea103259SMichael Clark /* pseudo-instruction metadata */
672ea103259SMichael Clark 
673ea103259SMichael Clark static const rv_comp_data rvcp_jal[] = {
674ea103259SMichael Clark     { rv_op_j, rvcc_j },
675ea103259SMichael Clark     { rv_op_jal, rvcc_jal },
676ea103259SMichael Clark     { rv_op_illegal, NULL }
677ea103259SMichael Clark };
678ea103259SMichael Clark 
679ea103259SMichael Clark static const rv_comp_data rvcp_jalr[] = {
680ea103259SMichael Clark     { rv_op_ret, rvcc_ret },
681ea103259SMichael Clark     { rv_op_jr, rvcc_jr },
682ea103259SMichael Clark     { rv_op_jalr, rvcc_jalr },
683ea103259SMichael Clark     { rv_op_illegal, NULL }
684ea103259SMichael Clark };
685ea103259SMichael Clark 
686ea103259SMichael Clark static const rv_comp_data rvcp_beq[] = {
687ea103259SMichael Clark     { rv_op_beqz, rvcc_beqz },
688ea103259SMichael Clark     { rv_op_illegal, NULL }
689ea103259SMichael Clark };
690ea103259SMichael Clark 
691ea103259SMichael Clark static const rv_comp_data rvcp_bne[] = {
692ea103259SMichael Clark     { rv_op_bnez, rvcc_bnez },
693ea103259SMichael Clark     { rv_op_illegal, NULL }
694ea103259SMichael Clark };
695ea103259SMichael Clark 
696ea103259SMichael Clark static const rv_comp_data rvcp_blt[] = {
697ea103259SMichael Clark     { rv_op_bltz, rvcc_bltz },
698ea103259SMichael Clark     { rv_op_bgtz, rvcc_bgtz },
699ea103259SMichael Clark     { rv_op_bgt, rvcc_bgt },
700ea103259SMichael Clark     { rv_op_illegal, NULL }
701ea103259SMichael Clark };
702ea103259SMichael Clark 
703ea103259SMichael Clark static const rv_comp_data rvcp_bge[] = {
704ea103259SMichael Clark     { rv_op_blez, rvcc_blez },
705ea103259SMichael Clark     { rv_op_bgez, rvcc_bgez },
706ea103259SMichael Clark     { rv_op_ble, rvcc_ble },
707ea103259SMichael Clark     { rv_op_illegal, NULL }
708ea103259SMichael Clark };
709ea103259SMichael Clark 
710ea103259SMichael Clark static const rv_comp_data rvcp_bltu[] = {
711ea103259SMichael Clark     { rv_op_bgtu, rvcc_bgtu },
712ea103259SMichael Clark     { rv_op_illegal, NULL }
713ea103259SMichael Clark };
714ea103259SMichael Clark 
715ea103259SMichael Clark static const rv_comp_data rvcp_bgeu[] = {
716ea103259SMichael Clark     { rv_op_bleu, rvcc_bleu },
717ea103259SMichael Clark     { rv_op_illegal, NULL }
718ea103259SMichael Clark };
719ea103259SMichael Clark 
720ea103259SMichael Clark static const rv_comp_data rvcp_addi[] = {
721ea103259SMichael Clark     { rv_op_nop, rvcc_nop },
722ea103259SMichael Clark     { rv_op_mv, rvcc_mv },
723ea103259SMichael Clark     { rv_op_illegal, NULL }
724ea103259SMichael Clark };
725ea103259SMichael Clark 
726ea103259SMichael Clark static const rv_comp_data rvcp_sltiu[] = {
727ea103259SMichael Clark     { rv_op_seqz, rvcc_seqz },
728ea103259SMichael Clark     { rv_op_illegal, NULL }
729ea103259SMichael Clark };
730ea103259SMichael Clark 
731ea103259SMichael Clark static const rv_comp_data rvcp_xori[] = {
732ea103259SMichael Clark     { rv_op_not, rvcc_not },
733ea103259SMichael Clark     { rv_op_illegal, NULL }
734ea103259SMichael Clark };
735ea103259SMichael Clark 
736ea103259SMichael Clark static const rv_comp_data rvcp_sub[] = {
737ea103259SMichael Clark     { rv_op_neg, rvcc_neg },
738ea103259SMichael Clark     { rv_op_illegal, NULL }
739ea103259SMichael Clark };
740ea103259SMichael Clark 
741ea103259SMichael Clark static const rv_comp_data rvcp_slt[] = {
742ea103259SMichael Clark     { rv_op_sltz, rvcc_sltz },
743ea103259SMichael Clark     { rv_op_sgtz, rvcc_sgtz },
744ea103259SMichael Clark     { rv_op_illegal, NULL }
745ea103259SMichael Clark };
746ea103259SMichael Clark 
747ea103259SMichael Clark static const rv_comp_data rvcp_sltu[] = {
748ea103259SMichael Clark     { rv_op_snez, rvcc_snez },
749ea103259SMichael Clark     { rv_op_illegal, NULL }
750ea103259SMichael Clark };
751ea103259SMichael Clark 
752ea103259SMichael Clark static const rv_comp_data rvcp_addiw[] = {
753ea103259SMichael Clark     { rv_op_sext_w, rvcc_sext_w },
754ea103259SMichael Clark     { rv_op_illegal, NULL }
755ea103259SMichael Clark };
756ea103259SMichael Clark 
757ea103259SMichael Clark static const rv_comp_data rvcp_subw[] = {
758ea103259SMichael Clark     { rv_op_negw, rvcc_negw },
759ea103259SMichael Clark     { rv_op_illegal, NULL }
760ea103259SMichael Clark };
761ea103259SMichael Clark 
762ea103259SMichael Clark static const rv_comp_data rvcp_csrrw[] = {
763ea103259SMichael Clark     { rv_op_fscsr, rvcc_fscsr },
764ea103259SMichael Clark     { rv_op_fsrm, rvcc_fsrm },
765ea103259SMichael Clark     { rv_op_fsflags, rvcc_fsflags },
766ea103259SMichael Clark     { rv_op_illegal, NULL }
767ea103259SMichael Clark };
768ea103259SMichael Clark 
769ea103259SMichael Clark static const rv_comp_data rvcp_csrrs[] = {
770ea103259SMichael Clark     { rv_op_rdcycle, rvcc_rdcycle },
771ea103259SMichael Clark     { rv_op_rdtime, rvcc_rdtime },
772ea103259SMichael Clark     { rv_op_rdinstret, rvcc_rdinstret },
773ea103259SMichael Clark     { rv_op_rdcycleh, rvcc_rdcycleh },
774ea103259SMichael Clark     { rv_op_rdtimeh, rvcc_rdtimeh },
775ea103259SMichael Clark     { rv_op_rdinstreth, rvcc_rdinstreth },
776ea103259SMichael Clark     { rv_op_frcsr, rvcc_frcsr },
777ea103259SMichael Clark     { rv_op_frrm, rvcc_frrm },
778ea103259SMichael Clark     { rv_op_frflags, rvcc_frflags },
779ea103259SMichael Clark     { rv_op_illegal, NULL }
780ea103259SMichael Clark };
781ea103259SMichael Clark 
782ea103259SMichael Clark static const rv_comp_data rvcp_csrrwi[] = {
783ea103259SMichael Clark     { rv_op_fsrmi, rvcc_fsrmi },
784ea103259SMichael Clark     { rv_op_fsflagsi, rvcc_fsflagsi },
785ea103259SMichael Clark     { rv_op_illegal, NULL }
786ea103259SMichael Clark };
787ea103259SMichael Clark 
788ea103259SMichael Clark static const rv_comp_data rvcp_fsgnj_s[] = {
789ea103259SMichael Clark     { rv_op_fmv_s, rvcc_fmv_s },
790ea103259SMichael Clark     { rv_op_illegal, NULL }
791ea103259SMichael Clark };
792ea103259SMichael Clark 
793ea103259SMichael Clark static const rv_comp_data rvcp_fsgnjn_s[] = {
794ea103259SMichael Clark     { rv_op_fneg_s, rvcc_fneg_s },
795ea103259SMichael Clark     { rv_op_illegal, NULL }
796ea103259SMichael Clark };
797ea103259SMichael Clark 
798ea103259SMichael Clark static const rv_comp_data rvcp_fsgnjx_s[] = {
799ea103259SMichael Clark     { rv_op_fabs_s, rvcc_fabs_s },
800ea103259SMichael Clark     { rv_op_illegal, NULL }
801ea103259SMichael Clark };
802ea103259SMichael Clark 
803ea103259SMichael Clark static const rv_comp_data rvcp_fsgnj_d[] = {
804ea103259SMichael Clark     { rv_op_fmv_d, rvcc_fmv_d },
805ea103259SMichael Clark     { rv_op_illegal, NULL }
806ea103259SMichael Clark };
807ea103259SMichael Clark 
808ea103259SMichael Clark static const rv_comp_data rvcp_fsgnjn_d[] = {
809ea103259SMichael Clark     { rv_op_fneg_d, rvcc_fneg_d },
810ea103259SMichael Clark     { rv_op_illegal, NULL }
811ea103259SMichael Clark };
812ea103259SMichael Clark 
813ea103259SMichael Clark static const rv_comp_data rvcp_fsgnjx_d[] = {
814ea103259SMichael Clark     { rv_op_fabs_d, rvcc_fabs_d },
815ea103259SMichael Clark     { rv_op_illegal, NULL }
816ea103259SMichael Clark };
817ea103259SMichael Clark 
818ea103259SMichael Clark static const rv_comp_data rvcp_fsgnj_q[] = {
819ea103259SMichael Clark     { rv_op_fmv_q, rvcc_fmv_q },
820ea103259SMichael Clark     { rv_op_illegal, NULL }
821ea103259SMichael Clark };
822ea103259SMichael Clark 
823ea103259SMichael Clark static const rv_comp_data rvcp_fsgnjn_q[] = {
824ea103259SMichael Clark     { rv_op_fneg_q, rvcc_fneg_q },
825ea103259SMichael Clark     { rv_op_illegal, NULL }
826ea103259SMichael Clark };
827ea103259SMichael Clark 
828ea103259SMichael Clark static const rv_comp_data rvcp_fsgnjx_q[] = {
829ea103259SMichael Clark     { rv_op_fabs_q, rvcc_fabs_q },
830ea103259SMichael Clark     { rv_op_illegal, NULL }
831ea103259SMichael Clark };
832ea103259SMichael Clark 
833ea103259SMichael Clark /* instruction metadata */
834ea103259SMichael Clark 
835ea103259SMichael Clark const rv_opcode_data opcode_data[] = {
836ea103259SMichael Clark     { "illegal", rv_codec_illegal, rv_fmt_none, NULL, 0, 0, 0 },
837ea103259SMichael Clark     { "lui", rv_codec_u, rv_fmt_rd_imm, NULL, 0, 0, 0 },
838ea103259SMichael Clark     { "auipc", rv_codec_u, rv_fmt_rd_offset, NULL, 0, 0, 0 },
839ea103259SMichael Clark     { "jal", rv_codec_uj, rv_fmt_rd_offset, rvcp_jal, 0, 0, 0 },
840ea103259SMichael Clark     { "jalr", rv_codec_i, rv_fmt_rd_rs1_offset, rvcp_jalr, 0, 0, 0 },
841ea103259SMichael Clark     { "beq", rv_codec_sb, rv_fmt_rs1_rs2_offset, rvcp_beq, 0, 0, 0 },
842ea103259SMichael Clark     { "bne", rv_codec_sb, rv_fmt_rs1_rs2_offset, rvcp_bne, 0, 0, 0 },
843ea103259SMichael Clark     { "blt", rv_codec_sb, rv_fmt_rs1_rs2_offset, rvcp_blt, 0, 0, 0 },
844ea103259SMichael Clark     { "bge", rv_codec_sb, rv_fmt_rs1_rs2_offset, rvcp_bge, 0, 0, 0 },
845ea103259SMichael Clark     { "bltu", rv_codec_sb, rv_fmt_rs1_rs2_offset, rvcp_bltu, 0, 0, 0 },
846ea103259SMichael Clark     { "bgeu", rv_codec_sb, rv_fmt_rs1_rs2_offset, rvcp_bgeu, 0, 0, 0 },
847ea103259SMichael Clark     { "lb", rv_codec_i, rv_fmt_rd_offset_rs1, NULL, 0, 0, 0 },
848ea103259SMichael Clark     { "lh", rv_codec_i, rv_fmt_rd_offset_rs1, NULL, 0, 0, 0 },
849ea103259SMichael Clark     { "lw", rv_codec_i, rv_fmt_rd_offset_rs1, NULL, 0, 0, 0 },
850ea103259SMichael Clark     { "lbu", rv_codec_i, rv_fmt_rd_offset_rs1, NULL, 0, 0, 0 },
851ea103259SMichael Clark     { "lhu", rv_codec_i, rv_fmt_rd_offset_rs1, NULL, 0, 0, 0 },
852ea103259SMichael Clark     { "sb", rv_codec_s, rv_fmt_rs2_offset_rs1, NULL, 0, 0, 0 },
853ea103259SMichael Clark     { "sh", rv_codec_s, rv_fmt_rs2_offset_rs1, NULL, 0, 0, 0 },
854ea103259SMichael Clark     { "sw", rv_codec_s, rv_fmt_rs2_offset_rs1, NULL, 0, 0, 0 },
855ea103259SMichael Clark     { "addi", rv_codec_i, rv_fmt_rd_rs1_imm, rvcp_addi, 0, 0, 0 },
856ea103259SMichael Clark     { "slti", rv_codec_i, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
857ea103259SMichael Clark     { "sltiu", rv_codec_i, rv_fmt_rd_rs1_imm, rvcp_sltiu, 0, 0, 0 },
858ea103259SMichael Clark     { "xori", rv_codec_i, rv_fmt_rd_rs1_imm, rvcp_xori, 0, 0, 0 },
859ea103259SMichael Clark     { "ori", rv_codec_i, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
860ea103259SMichael Clark     { "andi", rv_codec_i, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
861ea103259SMichael Clark     { "slli", rv_codec_i_sh7, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
862ea103259SMichael Clark     { "srli", rv_codec_i_sh7, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
863ea103259SMichael Clark     { "srai", rv_codec_i_sh7, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
864ea103259SMichael Clark     { "add", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
865ea103259SMichael Clark     { "sub", rv_codec_r, rv_fmt_rd_rs1_rs2, rvcp_sub, 0, 0, 0 },
866ea103259SMichael Clark     { "sll", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
867ea103259SMichael Clark     { "slt", rv_codec_r, rv_fmt_rd_rs1_rs2, rvcp_slt, 0, 0, 0 },
868ea103259SMichael Clark     { "sltu", rv_codec_r, rv_fmt_rd_rs1_rs2, rvcp_sltu, 0, 0, 0 },
869ea103259SMichael Clark     { "xor", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
870ea103259SMichael Clark     { "srl", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
871ea103259SMichael Clark     { "sra", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
872ea103259SMichael Clark     { "or", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
873ea103259SMichael Clark     { "and", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
874ea103259SMichael Clark     { "fence", rv_codec_r_f, rv_fmt_pred_succ, NULL, 0, 0, 0 },
875ea103259SMichael Clark     { "fence.i", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
876ea103259SMichael Clark     { "lwu", rv_codec_i, rv_fmt_rd_offset_rs1, NULL, 0, 0, 0 },
877ea103259SMichael Clark     { "ld", rv_codec_i, rv_fmt_rd_offset_rs1, NULL, 0, 0, 0 },
878ea103259SMichael Clark     { "sd", rv_codec_s, rv_fmt_rs2_offset_rs1, NULL, 0, 0, 0 },
879ea103259SMichael Clark     { "addiw", rv_codec_i, rv_fmt_rd_rs1_imm, rvcp_addiw, 0, 0, 0 },
880ea103259SMichael Clark     { "slliw", rv_codec_i_sh5, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
881ea103259SMichael Clark     { "srliw", rv_codec_i_sh5, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
882ea103259SMichael Clark     { "sraiw", rv_codec_i_sh5, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
883ea103259SMichael Clark     { "addw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
884ea103259SMichael Clark     { "subw", rv_codec_r, rv_fmt_rd_rs1_rs2, rvcp_subw, 0, 0, 0 },
885ea103259SMichael Clark     { "sllw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
886ea103259SMichael Clark     { "srlw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
887ea103259SMichael Clark     { "sraw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
888ea103259SMichael Clark     { "ldu", rv_codec_i, rv_fmt_rd_offset_rs1, NULL, 0, 0, 0 },
889ea103259SMichael Clark     { "lq", rv_codec_i, rv_fmt_rd_offset_rs1, NULL, 0, 0, 0 },
890ea103259SMichael Clark     { "sq", rv_codec_s, rv_fmt_rs2_offset_rs1, NULL, 0, 0, 0 },
891ea103259SMichael Clark     { "addid", rv_codec_i, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
892ea103259SMichael Clark     { "sllid", rv_codec_i_sh6, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
893ea103259SMichael Clark     { "srlid", rv_codec_i_sh6, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
894ea103259SMichael Clark     { "sraid", rv_codec_i_sh6, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
895ea103259SMichael Clark     { "addd", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
896ea103259SMichael Clark     { "subd", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
897ea103259SMichael Clark     { "slld", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
898ea103259SMichael Clark     { "srld", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
899ea103259SMichael Clark     { "srad", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
900ea103259SMichael Clark     { "mul", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
901ea103259SMichael Clark     { "mulh", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
902ea103259SMichael Clark     { "mulhsu", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
903ea103259SMichael Clark     { "mulhu", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
904ea103259SMichael Clark     { "div", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
905ea103259SMichael Clark     { "divu", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
906ea103259SMichael Clark     { "rem", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
907ea103259SMichael Clark     { "remu", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
908ea103259SMichael Clark     { "mulw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
909ea103259SMichael Clark     { "divw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
910ea103259SMichael Clark     { "divuw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
911ea103259SMichael Clark     { "remw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
912ea103259SMichael Clark     { "remuw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
913ea103259SMichael Clark     { "muld", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
914ea103259SMichael Clark     { "divd", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
915ea103259SMichael Clark     { "divud", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
916ea103259SMichael Clark     { "remd", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
917ea103259SMichael Clark     { "remud", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
918ea103259SMichael Clark     { "lr.w", rv_codec_r_l, rv_fmt_aqrl_rd_rs1, NULL, 0, 0, 0 },
919ea103259SMichael Clark     { "sc.w", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
920ea103259SMichael Clark     { "amoswap.w", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
921ea103259SMichael Clark     { "amoadd.w", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
922ea103259SMichael Clark     { "amoxor.w", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
923ea103259SMichael Clark     { "amoor.w", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
924ea103259SMichael Clark     { "amoand.w", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
925ea103259SMichael Clark     { "amomin.w", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
926ea103259SMichael Clark     { "amomax.w", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
927ea103259SMichael Clark     { "amominu.w", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
928ea103259SMichael Clark     { "amomaxu.w", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
929ea103259SMichael Clark     { "lr.d", rv_codec_r_l, rv_fmt_aqrl_rd_rs1, NULL, 0, 0, 0 },
930ea103259SMichael Clark     { "sc.d", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
931ea103259SMichael Clark     { "amoswap.d", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
932ea103259SMichael Clark     { "amoadd.d", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
933ea103259SMichael Clark     { "amoxor.d", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
934ea103259SMichael Clark     { "amoor.d", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
935ea103259SMichael Clark     { "amoand.d", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
936ea103259SMichael Clark     { "amomin.d", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
937ea103259SMichael Clark     { "amomax.d", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
938ea103259SMichael Clark     { "amominu.d", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
939ea103259SMichael Clark     { "amomaxu.d", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
940ea103259SMichael Clark     { "lr.q", rv_codec_r_l, rv_fmt_aqrl_rd_rs1, NULL, 0, 0, 0 },
941ea103259SMichael Clark     { "sc.q", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
942ea103259SMichael Clark     { "amoswap.q", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
943ea103259SMichael Clark     { "amoadd.q", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
944ea103259SMichael Clark     { "amoxor.q", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
945ea103259SMichael Clark     { "amoor.q", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
946ea103259SMichael Clark     { "amoand.q", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
947ea103259SMichael Clark     { "amomin.q", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
948ea103259SMichael Clark     { "amomax.q", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
949ea103259SMichael Clark     { "amominu.q", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
950ea103259SMichael Clark     { "amomaxu.q", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
951ea103259SMichael Clark     { "ecall", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
952ea103259SMichael Clark     { "ebreak", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
953ea103259SMichael Clark     { "uret", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
954ea103259SMichael Clark     { "sret", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
955ea103259SMichael Clark     { "hret", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
956ea103259SMichael Clark     { "mret", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
957ea103259SMichael Clark     { "dret", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
958ea103259SMichael Clark     { "sfence.vm", rv_codec_r, rv_fmt_rs1, NULL, 0, 0, 0 },
959ea103259SMichael Clark     { "sfence.vma", rv_codec_r, rv_fmt_rs1_rs2, NULL, 0, 0, 0 },
960ea103259SMichael Clark     { "wfi", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
961ea103259SMichael Clark     { "csrrw", rv_codec_i_csr, rv_fmt_rd_csr_rs1, rvcp_csrrw, 0, 0, 0 },
962ea103259SMichael Clark     { "csrrs", rv_codec_i_csr, rv_fmt_rd_csr_rs1, rvcp_csrrs, 0, 0, 0 },
963ea103259SMichael Clark     { "csrrc", rv_codec_i_csr, rv_fmt_rd_csr_rs1, NULL, 0, 0, 0 },
964ea103259SMichael Clark     { "csrrwi", rv_codec_i_csr, rv_fmt_rd_csr_zimm, rvcp_csrrwi, 0, 0, 0 },
965ea103259SMichael Clark     { "csrrsi", rv_codec_i_csr, rv_fmt_rd_csr_zimm, NULL, 0, 0, 0 },
966ea103259SMichael Clark     { "csrrci", rv_codec_i_csr, rv_fmt_rd_csr_zimm, NULL, 0, 0, 0 },
967ea103259SMichael Clark     { "flw", rv_codec_i, rv_fmt_frd_offset_rs1, NULL, 0, 0, 0 },
968ea103259SMichael Clark     { "fsw", rv_codec_s, rv_fmt_frs2_offset_rs1, NULL, 0, 0, 0 },
969ea103259SMichael Clark     { "fmadd.s", rv_codec_r4_m, rv_fmt_rm_frd_frs1_frs2_frs3, NULL, 0, 0, 0 },
970ea103259SMichael Clark     { "fmsub.s", rv_codec_r4_m, rv_fmt_rm_frd_frs1_frs2_frs3, NULL, 0, 0, 0 },
971ea103259SMichael Clark     { "fnmsub.s", rv_codec_r4_m, rv_fmt_rm_frd_frs1_frs2_frs3, NULL, 0, 0, 0 },
972ea103259SMichael Clark     { "fnmadd.s", rv_codec_r4_m, rv_fmt_rm_frd_frs1_frs2_frs3, NULL, 0, 0, 0 },
973ea103259SMichael Clark     { "fadd.s", rv_codec_r_m, rv_fmt_rm_frd_frs1_frs2, NULL, 0, 0, 0 },
974ea103259SMichael Clark     { "fsub.s", rv_codec_r_m, rv_fmt_rm_frd_frs1_frs2, NULL, 0, 0, 0 },
975ea103259SMichael Clark     { "fmul.s", rv_codec_r_m, rv_fmt_rm_frd_frs1_frs2, NULL, 0, 0, 0 },
976ea103259SMichael Clark     { "fdiv.s", rv_codec_r_m, rv_fmt_rm_frd_frs1_frs2, NULL, 0, 0, 0 },
977ea103259SMichael Clark     { "fsgnj.s", rv_codec_r, rv_fmt_frd_frs1_frs2, rvcp_fsgnj_s, 0, 0, 0 },
978ea103259SMichael Clark     { "fsgnjn.s", rv_codec_r, rv_fmt_frd_frs1_frs2, rvcp_fsgnjn_s, 0, 0, 0 },
979ea103259SMichael Clark     { "fsgnjx.s", rv_codec_r, rv_fmt_frd_frs1_frs2, rvcp_fsgnjx_s, 0, 0, 0 },
980ea103259SMichael Clark     { "fmin.s", rv_codec_r, rv_fmt_frd_frs1_frs2, NULL, 0, 0, 0 },
981ea103259SMichael Clark     { "fmax.s", rv_codec_r, rv_fmt_frd_frs1_frs2, NULL, 0, 0, 0 },
982ea103259SMichael Clark     { "fsqrt.s", rv_codec_r_m, rv_fmt_rm_frd_frs1, NULL, 0, 0, 0 },
983ea103259SMichael Clark     { "fle.s", rv_codec_r, rv_fmt_rd_frs1_frs2, NULL, 0, 0, 0 },
984ea103259SMichael Clark     { "flt.s", rv_codec_r, rv_fmt_rd_frs1_frs2, NULL, 0, 0, 0 },
985ea103259SMichael Clark     { "feq.s", rv_codec_r, rv_fmt_rd_frs1_frs2, NULL, 0, 0, 0 },
986ea103259SMichael Clark     { "fcvt.w.s", rv_codec_r_m, rv_fmt_rm_rd_frs1, NULL, 0, 0, 0 },
987ea103259SMichael Clark     { "fcvt.wu.s", rv_codec_r_m, rv_fmt_rm_rd_frs1, NULL, 0, 0, 0 },
988ea103259SMichael Clark     { "fcvt.s.w", rv_codec_r_m, rv_fmt_rm_frd_rs1, NULL, 0, 0, 0 },
989ea103259SMichael Clark     { "fcvt.s.wu", rv_codec_r_m, rv_fmt_rm_frd_rs1, NULL, 0, 0, 0 },
990ea103259SMichael Clark     { "fmv.x.s", rv_codec_r, rv_fmt_rd_frs1, NULL, 0, 0, 0 },
991ea103259SMichael Clark     { "fclass.s", rv_codec_r, rv_fmt_rd_frs1, NULL, 0, 0, 0 },
992ea103259SMichael Clark     { "fmv.s.x", rv_codec_r, rv_fmt_frd_rs1, NULL, 0, 0, 0 },
993ea103259SMichael Clark     { "fcvt.l.s", rv_codec_r_m, rv_fmt_rm_rd_frs1, NULL, 0, 0, 0 },
994ea103259SMichael Clark     { "fcvt.lu.s", rv_codec_r_m, rv_fmt_rm_rd_frs1, NULL, 0, 0, 0 },
995ea103259SMichael Clark     { "fcvt.s.l", rv_codec_r_m, rv_fmt_rm_frd_rs1, NULL, 0, 0, 0 },
996ea103259SMichael Clark     { "fcvt.s.lu", rv_codec_r_m, rv_fmt_rm_frd_rs1, NULL, 0, 0, 0 },
997ea103259SMichael Clark     { "fld", rv_codec_i, rv_fmt_frd_offset_rs1, NULL, 0, 0, 0 },
998ea103259SMichael Clark     { "fsd", rv_codec_s, rv_fmt_frs2_offset_rs1, NULL, 0, 0, 0 },
999ea103259SMichael Clark     { "fmadd.d", rv_codec_r4_m, rv_fmt_rm_frd_frs1_frs2_frs3, NULL, 0, 0, 0 },
1000ea103259SMichael Clark     { "fmsub.d", rv_codec_r4_m, rv_fmt_rm_frd_frs1_frs2_frs3, NULL, 0, 0, 0 },
1001ea103259SMichael Clark     { "fnmsub.d", rv_codec_r4_m, rv_fmt_rm_frd_frs1_frs2_frs3, NULL, 0, 0, 0 },
1002ea103259SMichael Clark     { "fnmadd.d", rv_codec_r4_m, rv_fmt_rm_frd_frs1_frs2_frs3, NULL, 0, 0, 0 },
1003ea103259SMichael Clark     { "fadd.d", rv_codec_r_m, rv_fmt_rm_frd_frs1_frs2, NULL, 0, 0, 0 },
1004ea103259SMichael Clark     { "fsub.d", rv_codec_r_m, rv_fmt_rm_frd_frs1_frs2, NULL, 0, 0, 0 },
1005ea103259SMichael Clark     { "fmul.d", rv_codec_r_m, rv_fmt_rm_frd_frs1_frs2, NULL, 0, 0, 0 },
1006ea103259SMichael Clark     { "fdiv.d", rv_codec_r_m, rv_fmt_rm_frd_frs1_frs2, NULL, 0, 0, 0 },
1007ea103259SMichael Clark     { "fsgnj.d", rv_codec_r, rv_fmt_frd_frs1_frs2, rvcp_fsgnj_d, 0, 0, 0 },
1008ea103259SMichael Clark     { "fsgnjn.d", rv_codec_r, rv_fmt_frd_frs1_frs2, rvcp_fsgnjn_d, 0, 0, 0 },
1009ea103259SMichael Clark     { "fsgnjx.d", rv_codec_r, rv_fmt_frd_frs1_frs2, rvcp_fsgnjx_d, 0, 0, 0 },
1010ea103259SMichael Clark     { "fmin.d", rv_codec_r, rv_fmt_frd_frs1_frs2, NULL, 0, 0, 0 },
1011ea103259SMichael Clark     { "fmax.d", rv_codec_r, rv_fmt_frd_frs1_frs2, NULL, 0, 0, 0 },
1012ea103259SMichael Clark     { "fcvt.s.d", rv_codec_r_m, rv_fmt_rm_frd_frs1, NULL, 0, 0, 0 },
1013ea103259SMichael Clark     { "fcvt.d.s", rv_codec_r_m, rv_fmt_rm_frd_frs1, NULL, 0, 0, 0 },
1014ea103259SMichael Clark     { "fsqrt.d", rv_codec_r_m, rv_fmt_rm_frd_frs1, NULL, 0, 0, 0 },
1015ea103259SMichael Clark     { "fle.d", rv_codec_r, rv_fmt_rd_frs1_frs2, NULL, 0, 0, 0 },
1016ea103259SMichael Clark     { "flt.d", rv_codec_r, rv_fmt_rd_frs1_frs2, NULL, 0, 0, 0 },
1017ea103259SMichael Clark     { "feq.d", rv_codec_r, rv_fmt_rd_frs1_frs2, NULL, 0, 0, 0 },
1018ea103259SMichael Clark     { "fcvt.w.d", rv_codec_r_m, rv_fmt_rm_rd_frs1, NULL, 0, 0, 0 },
1019ea103259SMichael Clark     { "fcvt.wu.d", rv_codec_r_m, rv_fmt_rm_rd_frs1, NULL, 0, 0, 0 },
1020ea103259SMichael Clark     { "fcvt.d.w", rv_codec_r_m, rv_fmt_rm_frd_rs1, NULL, 0, 0, 0 },
1021ea103259SMichael Clark     { "fcvt.d.wu", rv_codec_r_m, rv_fmt_rm_frd_rs1, NULL, 0, 0, 0 },
1022ea103259SMichael Clark     { "fclass.d", rv_codec_r, rv_fmt_rd_frs1, NULL, 0, 0, 0 },
1023ea103259SMichael Clark     { "fcvt.l.d", rv_codec_r_m, rv_fmt_rm_rd_frs1, NULL, 0, 0, 0 },
1024ea103259SMichael Clark     { "fcvt.lu.d", rv_codec_r_m, rv_fmt_rm_rd_frs1, NULL, 0, 0, 0 },
1025ea103259SMichael Clark     { "fmv.x.d", rv_codec_r, rv_fmt_rd_frs1, NULL, 0, 0, 0 },
1026ea103259SMichael Clark     { "fcvt.d.l", rv_codec_r_m, rv_fmt_rm_frd_rs1, NULL, 0, 0, 0 },
1027ea103259SMichael Clark     { "fcvt.d.lu", rv_codec_r_m, rv_fmt_rm_frd_rs1, NULL, 0, 0, 0 },
1028ea103259SMichael Clark     { "fmv.d.x", rv_codec_r, rv_fmt_frd_rs1, NULL, 0, 0, 0 },
1029ea103259SMichael Clark     { "flq", rv_codec_i, rv_fmt_frd_offset_rs1, NULL, 0, 0, 0 },
1030ea103259SMichael Clark     { "fsq", rv_codec_s, rv_fmt_frs2_offset_rs1, NULL, 0, 0, 0 },
1031ea103259SMichael Clark     { "fmadd.q", rv_codec_r4_m, rv_fmt_rm_frd_frs1_frs2_frs3, NULL, 0, 0, 0 },
1032ea103259SMichael Clark     { "fmsub.q", rv_codec_r4_m, rv_fmt_rm_frd_frs1_frs2_frs3, NULL, 0, 0, 0 },
1033ea103259SMichael Clark     { "fnmsub.q", rv_codec_r4_m, rv_fmt_rm_frd_frs1_frs2_frs3, NULL, 0, 0, 0 },
1034ea103259SMichael Clark     { "fnmadd.q", rv_codec_r4_m, rv_fmt_rm_frd_frs1_frs2_frs3, NULL, 0, 0, 0 },
1035ea103259SMichael Clark     { "fadd.q", rv_codec_r_m, rv_fmt_rm_frd_frs1_frs2, NULL, 0, 0, 0 },
1036ea103259SMichael Clark     { "fsub.q", rv_codec_r_m, rv_fmt_rm_frd_frs1_frs2, NULL, 0, 0, 0 },
1037ea103259SMichael Clark     { "fmul.q", rv_codec_r_m, rv_fmt_rm_frd_frs1_frs2, NULL, 0, 0, 0 },
1038ea103259SMichael Clark     { "fdiv.q", rv_codec_r_m, rv_fmt_rm_frd_frs1_frs2, NULL, 0, 0, 0 },
1039ea103259SMichael Clark     { "fsgnj.q", rv_codec_r, rv_fmt_frd_frs1_frs2, rvcp_fsgnj_q, 0, 0, 0 },
1040ea103259SMichael Clark     { "fsgnjn.q", rv_codec_r, rv_fmt_frd_frs1_frs2, rvcp_fsgnjn_q, 0, 0, 0 },
1041ea103259SMichael Clark     { "fsgnjx.q", rv_codec_r, rv_fmt_frd_frs1_frs2, rvcp_fsgnjx_q, 0, 0, 0 },
1042ea103259SMichael Clark     { "fmin.q", rv_codec_r, rv_fmt_frd_frs1_frs2, NULL, 0, 0, 0 },
1043ea103259SMichael Clark     { "fmax.q", rv_codec_r, rv_fmt_frd_frs1_frs2, NULL, 0, 0, 0 },
1044ea103259SMichael Clark     { "fcvt.s.q", rv_codec_r_m, rv_fmt_rm_frd_frs1, NULL, 0, 0, 0 },
1045ea103259SMichael Clark     { "fcvt.q.s", rv_codec_r_m, rv_fmt_rm_frd_frs1, NULL, 0, 0, 0 },
1046ea103259SMichael Clark     { "fcvt.d.q", rv_codec_r_m, rv_fmt_rm_frd_frs1, NULL, 0, 0, 0 },
1047ea103259SMichael Clark     { "fcvt.q.d", rv_codec_r_m, rv_fmt_rm_frd_frs1, NULL, 0, 0, 0 },
1048ea103259SMichael Clark     { "fsqrt.q", rv_codec_r_m, rv_fmt_rm_frd_frs1, NULL, 0, 0, 0 },
1049ea103259SMichael Clark     { "fle.q", rv_codec_r, rv_fmt_rd_frs1_frs2, NULL, 0, 0, 0 },
1050ea103259SMichael Clark     { "flt.q", rv_codec_r, rv_fmt_rd_frs1_frs2, NULL, 0, 0, 0 },
1051ea103259SMichael Clark     { "feq.q", rv_codec_r, rv_fmt_rd_frs1_frs2, NULL, 0, 0, 0 },
1052ea103259SMichael Clark     { "fcvt.w.q", rv_codec_r_m, rv_fmt_rm_rd_frs1, NULL, 0, 0, 0 },
1053ea103259SMichael Clark     { "fcvt.wu.q", rv_codec_r_m, rv_fmt_rm_rd_frs1, NULL, 0, 0, 0 },
1054ea103259SMichael Clark     { "fcvt.q.w", rv_codec_r_m, rv_fmt_rm_frd_rs1, NULL, 0, 0, 0 },
1055ea103259SMichael Clark     { "fcvt.q.wu", rv_codec_r_m, rv_fmt_rm_frd_rs1, NULL, 0, 0, 0 },
1056ea103259SMichael Clark     { "fclass.q", rv_codec_r, rv_fmt_rd_frs1, NULL, 0, 0, 0 },
1057ea103259SMichael Clark     { "fcvt.l.q", rv_codec_r_m, rv_fmt_rm_rd_frs1, NULL, 0, 0, 0 },
1058ea103259SMichael Clark     { "fcvt.lu.q", rv_codec_r_m, rv_fmt_rm_rd_frs1, NULL, 0, 0, 0 },
1059ea103259SMichael Clark     { "fcvt.q.l", rv_codec_r_m, rv_fmt_rm_frd_rs1, NULL, 0, 0, 0 },
1060ea103259SMichael Clark     { "fcvt.q.lu", rv_codec_r_m, rv_fmt_rm_frd_rs1, NULL, 0, 0, 0 },
1061ea103259SMichael Clark     { "fmv.x.q", rv_codec_r, rv_fmt_rd_frs1, NULL, 0, 0, 0 },
1062ea103259SMichael Clark     { "fmv.q.x", rv_codec_r, rv_fmt_frd_rs1, NULL, 0, 0, 0 },
1063f88222daSMichael Clark     { "c.addi4spn", rv_codec_ciw_4spn, rv_fmt_rd_rs1_imm, NULL, rv_op_addi,
1064f88222daSMichael Clark       rv_op_addi, rv_op_addi, rvcd_imm_nz },
1065ea103259SMichael Clark     { "c.fld", rv_codec_cl_ld, rv_fmt_frd_offset_rs1, NULL, rv_op_fld, rv_op_fld, 0 },
1066ea103259SMichael Clark     { "c.lw", rv_codec_cl_lw, rv_fmt_rd_offset_rs1, NULL, rv_op_lw, rv_op_lw, rv_op_lw },
1067ea103259SMichael Clark     { "c.flw", rv_codec_cl_lw, rv_fmt_frd_offset_rs1, NULL, rv_op_flw, 0, 0 },
1068ea103259SMichael Clark     { "c.fsd", rv_codec_cs_sd, rv_fmt_frs2_offset_rs1, NULL, rv_op_fsd, rv_op_fsd, 0 },
1069ea103259SMichael Clark     { "c.sw", rv_codec_cs_sw, rv_fmt_rs2_offset_rs1, NULL, rv_op_sw, rv_op_sw, rv_op_sw },
1070ea103259SMichael Clark     { "c.fsw", rv_codec_cs_sw, rv_fmt_frs2_offset_rs1, NULL, rv_op_fsw, 0, 0 },
1071ea103259SMichael Clark     { "c.nop", rv_codec_ci_none, rv_fmt_none, NULL, rv_op_addi, rv_op_addi, rv_op_addi },
1072f88222daSMichael Clark     { "c.addi", rv_codec_ci, rv_fmt_rd_rs1_imm, NULL, rv_op_addi, rv_op_addi,
1073f88222daSMichael Clark       rv_op_addi, rvcd_imm_nz },
1074ea103259SMichael Clark     { "c.jal", rv_codec_cj_jal, rv_fmt_rd_offset, NULL, rv_op_jal, 0, 0 },
1075ea103259SMichael Clark     { "c.li", rv_codec_ci_li, rv_fmt_rd_rs1_imm, NULL, rv_op_addi, rv_op_addi, rv_op_addi },
1076f88222daSMichael Clark     { "c.addi16sp", rv_codec_ci_16sp, rv_fmt_rd_rs1_imm, NULL, rv_op_addi,
1077f88222daSMichael Clark       rv_op_addi, rv_op_addi, rvcd_imm_nz },
1078f88222daSMichael Clark     { "c.lui", rv_codec_ci_lui, rv_fmt_rd_imm, NULL, rv_op_lui, rv_op_lui,
1079f88222daSMichael Clark       rv_op_lui, rvcd_imm_nz },
1080f88222daSMichael Clark     { "c.srli", rv_codec_cb_sh6, rv_fmt_rd_rs1_imm, NULL, rv_op_srli,
1081f88222daSMichael Clark       rv_op_srli, rv_op_srli, rvcd_imm_nz },
1082f88222daSMichael Clark     { "c.srai", rv_codec_cb_sh6, rv_fmt_rd_rs1_imm, NULL, rv_op_srai,
1083f88222daSMichael Clark       rv_op_srai, rv_op_srai, rvcd_imm_nz },
1084f88222daSMichael Clark     { "c.andi", rv_codec_cb_imm, rv_fmt_rd_rs1_imm, NULL, rv_op_andi,
10852e3df911SWladimir J. van der Laan       rv_op_andi, rv_op_andi },
1086ea103259SMichael Clark     { "c.sub", rv_codec_cs, rv_fmt_rd_rs1_rs2, NULL, rv_op_sub, rv_op_sub, rv_op_sub },
1087ea103259SMichael Clark     { "c.xor", rv_codec_cs, rv_fmt_rd_rs1_rs2, NULL, rv_op_xor, rv_op_xor, rv_op_xor },
1088ea103259SMichael Clark     { "c.or", rv_codec_cs, rv_fmt_rd_rs1_rs2, NULL, rv_op_or, rv_op_or, rv_op_or },
1089ea103259SMichael Clark     { "c.and", rv_codec_cs, rv_fmt_rd_rs1_rs2, NULL, rv_op_and, rv_op_and, rv_op_and },
1090ea103259SMichael Clark     { "c.subw", rv_codec_cs, rv_fmt_rd_rs1_rs2, NULL, rv_op_subw, rv_op_subw, rv_op_subw },
1091ea103259SMichael Clark     { "c.addw", rv_codec_cs, rv_fmt_rd_rs1_rs2, NULL, rv_op_addw, rv_op_addw, rv_op_addw },
1092ea103259SMichael Clark     { "c.j", rv_codec_cj, rv_fmt_rd_offset, NULL, rv_op_jal, rv_op_jal, rv_op_jal },
1093ea103259SMichael Clark     { "c.beqz", rv_codec_cb, rv_fmt_rs1_rs2_offset, NULL, rv_op_beq, rv_op_beq, rv_op_beq },
1094ea103259SMichael Clark     { "c.bnez", rv_codec_cb, rv_fmt_rs1_rs2_offset, NULL, rv_op_bne, rv_op_bne, rv_op_bne },
1095f88222daSMichael Clark     { "c.slli", rv_codec_ci_sh6, rv_fmt_rd_rs1_imm, NULL, rv_op_slli,
1096f88222daSMichael Clark       rv_op_slli, rv_op_slli, rvcd_imm_nz },
1097ea103259SMichael Clark     { "c.fldsp", rv_codec_ci_ldsp, rv_fmt_frd_offset_rs1, NULL, rv_op_fld, rv_op_fld, rv_op_fld },
1098ea103259SMichael Clark     { "c.lwsp", rv_codec_ci_lwsp, rv_fmt_rd_offset_rs1, NULL, rv_op_lw, rv_op_lw, rv_op_lw },
1099ea103259SMichael Clark     { "c.flwsp", rv_codec_ci_lwsp, rv_fmt_frd_offset_rs1, NULL, rv_op_flw, 0, 0 },
1100ea103259SMichael Clark     { "c.jr", rv_codec_cr_jr, rv_fmt_rd_rs1_offset, NULL, rv_op_jalr, rv_op_jalr, rv_op_jalr },
1101ea103259SMichael Clark     { "c.mv", rv_codec_cr_mv, rv_fmt_rd_rs1_rs2, NULL, rv_op_addi, rv_op_addi, rv_op_addi },
1102ea103259SMichael Clark     { "c.ebreak", rv_codec_ci_none, rv_fmt_none, NULL, rv_op_ebreak, rv_op_ebreak, rv_op_ebreak },
1103ea103259SMichael Clark     { "c.jalr", rv_codec_cr_jalr, rv_fmt_rd_rs1_offset, NULL, rv_op_jalr, rv_op_jalr, rv_op_jalr },
1104ea103259SMichael Clark     { "c.add", rv_codec_cr, rv_fmt_rd_rs1_rs2, NULL, rv_op_add, rv_op_add, rv_op_add },
1105ea103259SMichael Clark     { "c.fsdsp", rv_codec_css_sdsp, rv_fmt_frs2_offset_rs1, NULL, rv_op_fsd, rv_op_fsd, rv_op_fsd },
1106ea103259SMichael Clark     { "c.swsp", rv_codec_css_swsp, rv_fmt_rs2_offset_rs1, NULL, rv_op_sw, rv_op_sw, rv_op_sw },
1107ea103259SMichael Clark     { "c.fswsp", rv_codec_css_swsp, rv_fmt_frs2_offset_rs1, NULL, rv_op_fsw, 0, 0 },
1108ea103259SMichael Clark     { "c.ld", rv_codec_cl_ld, rv_fmt_rd_offset_rs1, NULL, 0, rv_op_ld, rv_op_ld },
1109ea103259SMichael Clark     { "c.sd", rv_codec_cs_sd, rv_fmt_rs2_offset_rs1, NULL, 0, rv_op_sd, rv_op_sd },
1110ea103259SMichael Clark     { "c.addiw", rv_codec_ci, rv_fmt_rd_rs1_imm, NULL, 0, rv_op_addiw, rv_op_addiw },
1111ea103259SMichael Clark     { "c.ldsp", rv_codec_ci_ldsp, rv_fmt_rd_offset_rs1, NULL, 0, rv_op_ld, rv_op_ld },
1112ea103259SMichael Clark     { "c.sdsp", rv_codec_css_sdsp, rv_fmt_rs2_offset_rs1, NULL, 0, rv_op_sd, rv_op_sd },
1113ea103259SMichael Clark     { "c.lq", rv_codec_cl_lq, rv_fmt_rd_offset_rs1, NULL, 0, 0, rv_op_lq },
1114ea103259SMichael Clark     { "c.sq", rv_codec_cs_sq, rv_fmt_rs2_offset_rs1, NULL, 0, 0, rv_op_sq },
1115ea103259SMichael Clark     { "c.lqsp", rv_codec_ci_lqsp, rv_fmt_rd_offset_rs1, NULL, 0, 0, rv_op_lq },
1116ea103259SMichael Clark     { "c.sqsp", rv_codec_css_sqsp, rv_fmt_rs2_offset_rs1, NULL, 0, 0, rv_op_sq },
1117ea103259SMichael Clark     { "nop", rv_codec_i, rv_fmt_none, NULL, 0, 0, 0 },
1118ea103259SMichael Clark     { "mv", rv_codec_i, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1119ea103259SMichael Clark     { "not", rv_codec_i, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1120ea103259SMichael Clark     { "neg", rv_codec_r, rv_fmt_rd_rs2, NULL, 0, 0, 0 },
1121ea103259SMichael Clark     { "negw", rv_codec_r, rv_fmt_rd_rs2, NULL, 0, 0, 0 },
1122ea103259SMichael Clark     { "sext.w", rv_codec_i, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1123ea103259SMichael Clark     { "seqz", rv_codec_i, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1124ea103259SMichael Clark     { "snez", rv_codec_r, rv_fmt_rd_rs2, NULL, 0, 0, 0 },
1125ea103259SMichael Clark     { "sltz", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1126ea103259SMichael Clark     { "sgtz", rv_codec_r, rv_fmt_rd_rs2, NULL, 0, 0, 0 },
1127ea103259SMichael Clark     { "fmv.s", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1128ea103259SMichael Clark     { "fabs.s", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1129ea103259SMichael Clark     { "fneg.s", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1130ea103259SMichael Clark     { "fmv.d", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1131ea103259SMichael Clark     { "fabs.d", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1132ea103259SMichael Clark     { "fneg.d", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1133ea103259SMichael Clark     { "fmv.q", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1134ea103259SMichael Clark     { "fabs.q", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1135ea103259SMichael Clark     { "fneg.q", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1136ea103259SMichael Clark     { "beqz", rv_codec_sb, rv_fmt_rs1_offset, NULL, 0, 0, 0 },
1137ea103259SMichael Clark     { "bnez", rv_codec_sb, rv_fmt_rs1_offset, NULL, 0, 0, 0 },
1138ea103259SMichael Clark     { "blez", rv_codec_sb, rv_fmt_rs2_offset, NULL, 0, 0, 0 },
1139ea103259SMichael Clark     { "bgez", rv_codec_sb, rv_fmt_rs1_offset, NULL, 0, 0, 0 },
1140ea103259SMichael Clark     { "bltz", rv_codec_sb, rv_fmt_rs1_offset, NULL, 0, 0, 0 },
1141ea103259SMichael Clark     { "bgtz", rv_codec_sb, rv_fmt_rs2_offset, NULL, 0, 0, 0 },
1142ea103259SMichael Clark     { "ble", rv_codec_sb, rv_fmt_rs2_rs1_offset, NULL, 0, 0, 0 },
1143ea103259SMichael Clark     { "bleu", rv_codec_sb, rv_fmt_rs2_rs1_offset, NULL, 0, 0, 0 },
1144ea103259SMichael Clark     { "bgt", rv_codec_sb, rv_fmt_rs2_rs1_offset, NULL, 0, 0, 0 },
1145ea103259SMichael Clark     { "bgtu", rv_codec_sb, rv_fmt_rs2_rs1_offset, NULL, 0, 0, 0 },
1146ea103259SMichael Clark     { "j", rv_codec_uj, rv_fmt_offset, NULL, 0, 0, 0 },
1147ea103259SMichael Clark     { "ret", rv_codec_i, rv_fmt_none, NULL, 0, 0, 0 },
1148ea103259SMichael Clark     { "jr", rv_codec_i, rv_fmt_rs1, NULL, 0, 0, 0 },
1149ea103259SMichael Clark     { "rdcycle", rv_codec_i_csr, rv_fmt_rd, NULL, 0, 0, 0 },
1150ea103259SMichael Clark     { "rdtime", rv_codec_i_csr, rv_fmt_rd, NULL, 0, 0, 0 },
1151ea103259SMichael Clark     { "rdinstret", rv_codec_i_csr, rv_fmt_rd, NULL, 0, 0, 0 },
1152ea103259SMichael Clark     { "rdcycleh", rv_codec_i_csr, rv_fmt_rd, NULL, 0, 0, 0 },
1153ea103259SMichael Clark     { "rdtimeh", rv_codec_i_csr, rv_fmt_rd, NULL, 0, 0, 0 },
1154ea103259SMichael Clark     { "rdinstreth", rv_codec_i_csr, rv_fmt_rd, NULL, 0, 0, 0 },
1155ea103259SMichael Clark     { "frcsr", rv_codec_i_csr, rv_fmt_rd, NULL, 0, 0, 0 },
1156ea103259SMichael Clark     { "frrm", rv_codec_i_csr, rv_fmt_rd, NULL, 0, 0, 0 },
1157ea103259SMichael Clark     { "frflags", rv_codec_i_csr, rv_fmt_rd, NULL, 0, 0, 0 },
1158ea103259SMichael Clark     { "fscsr", rv_codec_i_csr, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1159ea103259SMichael Clark     { "fsrm", rv_codec_i_csr, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1160ea103259SMichael Clark     { "fsflags", rv_codec_i_csr, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1161ea103259SMichael Clark     { "fsrmi", rv_codec_i_csr, rv_fmt_rd_zimm, NULL, 0, 0, 0 },
1162ea103259SMichael Clark     { "fsflagsi", rv_codec_i_csr, rv_fmt_rd_zimm, NULL, 0, 0, 0 },
1163*02c1b569SPhilipp Tomsich     { "bseti", rv_codec_i_sh7, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1164*02c1b569SPhilipp Tomsich     { "bclri", rv_codec_i_sh7, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1165*02c1b569SPhilipp Tomsich     { "binvi", rv_codec_i_sh7, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1166*02c1b569SPhilipp Tomsich     { "bexti", rv_codec_i_sh7, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1167*02c1b569SPhilipp Tomsich     { "rori", rv_codec_i_sh7, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1168*02c1b569SPhilipp Tomsich     { "clz", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1169*02c1b569SPhilipp Tomsich     { "ctz", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1170*02c1b569SPhilipp Tomsich     { "cpop", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1171*02c1b569SPhilipp Tomsich     { "sext.h", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1172*02c1b569SPhilipp Tomsich     { "sext.b", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1173*02c1b569SPhilipp Tomsich     { "xnor", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1174*02c1b569SPhilipp Tomsich     { "orn", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1175*02c1b569SPhilipp Tomsich     { "andn", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1176*02c1b569SPhilipp Tomsich     { "rol", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1177*02c1b569SPhilipp Tomsich     { "ror", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1178*02c1b569SPhilipp Tomsich     { "sh1add", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1179*02c1b569SPhilipp Tomsich     { "sh2add", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1180*02c1b569SPhilipp Tomsich     { "sh3add", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1181*02c1b569SPhilipp Tomsich     { "sh1add.uw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1182*02c1b569SPhilipp Tomsich     { "sh2add.uw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1183*02c1b569SPhilipp Tomsich     { "sh3add.uw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1184*02c1b569SPhilipp Tomsich     { "clmul", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1185*02c1b569SPhilipp Tomsich     { "clmulr", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1186*02c1b569SPhilipp Tomsich     { "clmulh", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1187*02c1b569SPhilipp Tomsich     { "min", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1188*02c1b569SPhilipp Tomsich     { "minu", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1189*02c1b569SPhilipp Tomsich     { "max", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1190*02c1b569SPhilipp Tomsich     { "maxu", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1191*02c1b569SPhilipp Tomsich     { "clzw", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1192*02c1b569SPhilipp Tomsich     { "clzw", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1193*02c1b569SPhilipp Tomsich     { "cpopw", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1194*02c1b569SPhilipp Tomsich     { "slli.uw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1195*02c1b569SPhilipp Tomsich     { "add.uw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1196*02c1b569SPhilipp Tomsich     { "rolw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1197*02c1b569SPhilipp Tomsich     { "rorw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1198*02c1b569SPhilipp Tomsich     { "rev8", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1199*02c1b569SPhilipp Tomsich     { "zext.h", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1200*02c1b569SPhilipp Tomsich     { "roriw", rv_codec_i_sh5, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1201*02c1b569SPhilipp Tomsich     { "orc.b", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1202*02c1b569SPhilipp Tomsich     { "bset", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1203*02c1b569SPhilipp Tomsich     { "bclr", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1204*02c1b569SPhilipp Tomsich     { "binv", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1205*02c1b569SPhilipp Tomsich     { "bext", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1206ea103259SMichael Clark };
1207ea103259SMichael Clark 
1208ea103259SMichael Clark /* CSR names */
1209ea103259SMichael Clark 
1210ea103259SMichael Clark static const char *csr_name(int csrno)
1211ea103259SMichael Clark {
1212ea103259SMichael Clark     switch (csrno) {
1213ea103259SMichael Clark     case 0x0000: return "ustatus";
1214ea103259SMichael Clark     case 0x0001: return "fflags";
1215ea103259SMichael Clark     case 0x0002: return "frm";
1216ea103259SMichael Clark     case 0x0003: return "fcsr";
1217ea103259SMichael Clark     case 0x0004: return "uie";
1218ea103259SMichael Clark     case 0x0005: return "utvec";
1219ea103259SMichael Clark     case 0x0040: return "uscratch";
1220ea103259SMichael Clark     case 0x0041: return "uepc";
1221ea103259SMichael Clark     case 0x0042: return "ucause";
1222ea103259SMichael Clark     case 0x0043: return "utval";
1223ea103259SMichael Clark     case 0x0044: return "uip";
1224ea103259SMichael Clark     case 0x0100: return "sstatus";
1225ea103259SMichael Clark     case 0x0102: return "sedeleg";
1226ea103259SMichael Clark     case 0x0103: return "sideleg";
1227ea103259SMichael Clark     case 0x0104: return "sie";
1228ea103259SMichael Clark     case 0x0105: return "stvec";
1229ea103259SMichael Clark     case 0x0106: return "scounteren";
1230ea103259SMichael Clark     case 0x0140: return "sscratch";
1231ea103259SMichael Clark     case 0x0141: return "sepc";
1232ea103259SMichael Clark     case 0x0142: return "scause";
1233ea103259SMichael Clark     case 0x0143: return "stval";
1234ea103259SMichael Clark     case 0x0144: return "sip";
1235ea103259SMichael Clark     case 0x0180: return "satp";
1236ea103259SMichael Clark     case 0x0200: return "hstatus";
1237ea103259SMichael Clark     case 0x0202: return "hedeleg";
1238ea103259SMichael Clark     case 0x0203: return "hideleg";
1239ea103259SMichael Clark     case 0x0204: return "hie";
1240ea103259SMichael Clark     case 0x0205: return "htvec";
1241ea103259SMichael Clark     case 0x0240: return "hscratch";
1242ea103259SMichael Clark     case 0x0241: return "hepc";
1243ea103259SMichael Clark     case 0x0242: return "hcause";
1244ea103259SMichael Clark     case 0x0243: return "hbadaddr";
1245ea103259SMichael Clark     case 0x0244: return "hip";
1246ea103259SMichael Clark     case 0x0300: return "mstatus";
1247ea103259SMichael Clark     case 0x0301: return "misa";
1248ea103259SMichael Clark     case 0x0302: return "medeleg";
1249ea103259SMichael Clark     case 0x0303: return "mideleg";
1250ea103259SMichael Clark     case 0x0304: return "mie";
1251ea103259SMichael Clark     case 0x0305: return "mtvec";
1252ea103259SMichael Clark     case 0x0306: return "mcounteren";
1253ea103259SMichael Clark     case 0x0320: return "mucounteren";
1254ea103259SMichael Clark     case 0x0321: return "mscounteren";
1255ea103259SMichael Clark     case 0x0322: return "mhcounteren";
1256ea103259SMichael Clark     case 0x0323: return "mhpmevent3";
1257ea103259SMichael Clark     case 0x0324: return "mhpmevent4";
1258ea103259SMichael Clark     case 0x0325: return "mhpmevent5";
1259ea103259SMichael Clark     case 0x0326: return "mhpmevent6";
1260ea103259SMichael Clark     case 0x0327: return "mhpmevent7";
1261ea103259SMichael Clark     case 0x0328: return "mhpmevent8";
1262ea103259SMichael Clark     case 0x0329: return "mhpmevent9";
1263ea103259SMichael Clark     case 0x032a: return "mhpmevent10";
1264ea103259SMichael Clark     case 0x032b: return "mhpmevent11";
1265ea103259SMichael Clark     case 0x032c: return "mhpmevent12";
1266ea103259SMichael Clark     case 0x032d: return "mhpmevent13";
1267ea103259SMichael Clark     case 0x032e: return "mhpmevent14";
1268ea103259SMichael Clark     case 0x032f: return "mhpmevent15";
1269ea103259SMichael Clark     case 0x0330: return "mhpmevent16";
1270ea103259SMichael Clark     case 0x0331: return "mhpmevent17";
1271ea103259SMichael Clark     case 0x0332: return "mhpmevent18";
1272ea103259SMichael Clark     case 0x0333: return "mhpmevent19";
1273ea103259SMichael Clark     case 0x0334: return "mhpmevent20";
1274ea103259SMichael Clark     case 0x0335: return "mhpmevent21";
1275ea103259SMichael Clark     case 0x0336: return "mhpmevent22";
1276ea103259SMichael Clark     case 0x0337: return "mhpmevent23";
1277ea103259SMichael Clark     case 0x0338: return "mhpmevent24";
1278ea103259SMichael Clark     case 0x0339: return "mhpmevent25";
1279ea103259SMichael Clark     case 0x033a: return "mhpmevent26";
1280ea103259SMichael Clark     case 0x033b: return "mhpmevent27";
1281ea103259SMichael Clark     case 0x033c: return "mhpmevent28";
1282ea103259SMichael Clark     case 0x033d: return "mhpmevent29";
1283ea103259SMichael Clark     case 0x033e: return "mhpmevent30";
1284ea103259SMichael Clark     case 0x033f: return "mhpmevent31";
1285ea103259SMichael Clark     case 0x0340: return "mscratch";
1286ea103259SMichael Clark     case 0x0341: return "mepc";
1287ea103259SMichael Clark     case 0x0342: return "mcause";
1288ea103259SMichael Clark     case 0x0343: return "mtval";
1289ea103259SMichael Clark     case 0x0344: return "mip";
1290ea103259SMichael Clark     case 0x0380: return "mbase";
1291ea103259SMichael Clark     case 0x0381: return "mbound";
1292ea103259SMichael Clark     case 0x0382: return "mibase";
1293ea103259SMichael Clark     case 0x0383: return "mibound";
1294ea103259SMichael Clark     case 0x0384: return "mdbase";
1295ea103259SMichael Clark     case 0x0385: return "mdbound";
1296ea103259SMichael Clark     case 0x03a0: return "pmpcfg3";
1297ea103259SMichael Clark     case 0x03b0: return "pmpaddr0";
1298ea103259SMichael Clark     case 0x03b1: return "pmpaddr1";
1299ea103259SMichael Clark     case 0x03b2: return "pmpaddr2";
1300ea103259SMichael Clark     case 0x03b3: return "pmpaddr3";
1301ea103259SMichael Clark     case 0x03b4: return "pmpaddr4";
1302ea103259SMichael Clark     case 0x03b5: return "pmpaddr5";
1303ea103259SMichael Clark     case 0x03b6: return "pmpaddr6";
1304ea103259SMichael Clark     case 0x03b7: return "pmpaddr7";
1305ea103259SMichael Clark     case 0x03b8: return "pmpaddr8";
1306ea103259SMichael Clark     case 0x03b9: return "pmpaddr9";
1307ea103259SMichael Clark     case 0x03ba: return "pmpaddr10";
1308ea103259SMichael Clark     case 0x03bb: return "pmpaddr11";
1309ea103259SMichael Clark     case 0x03bc: return "pmpaddr12";
1310ea103259SMichael Clark     case 0x03bd: return "pmpaddr14";
1311ea103259SMichael Clark     case 0x03be: return "pmpaddr13";
1312ea103259SMichael Clark     case 0x03bf: return "pmpaddr15";
1313ea103259SMichael Clark     case 0x0780: return "mtohost";
1314ea103259SMichael Clark     case 0x0781: return "mfromhost";
1315ea103259SMichael Clark     case 0x0782: return "mreset";
1316ea103259SMichael Clark     case 0x0783: return "mipi";
1317ea103259SMichael Clark     case 0x0784: return "miobase";
1318ea103259SMichael Clark     case 0x07a0: return "tselect";
1319ea103259SMichael Clark     case 0x07a1: return "tdata1";
1320ea103259SMichael Clark     case 0x07a2: return "tdata2";
1321ea103259SMichael Clark     case 0x07a3: return "tdata3";
1322ea103259SMichael Clark     case 0x07b0: return "dcsr";
1323ea103259SMichael Clark     case 0x07b1: return "dpc";
1324ea103259SMichael Clark     case 0x07b2: return "dscratch";
1325ea103259SMichael Clark     case 0x0b00: return "mcycle";
1326ea103259SMichael Clark     case 0x0b01: return "mtime";
1327ea103259SMichael Clark     case 0x0b02: return "minstret";
1328ea103259SMichael Clark     case 0x0b03: return "mhpmcounter3";
1329ea103259SMichael Clark     case 0x0b04: return "mhpmcounter4";
1330ea103259SMichael Clark     case 0x0b05: return "mhpmcounter5";
1331ea103259SMichael Clark     case 0x0b06: return "mhpmcounter6";
1332ea103259SMichael Clark     case 0x0b07: return "mhpmcounter7";
1333ea103259SMichael Clark     case 0x0b08: return "mhpmcounter8";
1334ea103259SMichael Clark     case 0x0b09: return "mhpmcounter9";
1335ea103259SMichael Clark     case 0x0b0a: return "mhpmcounter10";
1336ea103259SMichael Clark     case 0x0b0b: return "mhpmcounter11";
1337ea103259SMichael Clark     case 0x0b0c: return "mhpmcounter12";
1338ea103259SMichael Clark     case 0x0b0d: return "mhpmcounter13";
1339ea103259SMichael Clark     case 0x0b0e: return "mhpmcounter14";
1340ea103259SMichael Clark     case 0x0b0f: return "mhpmcounter15";
1341ea103259SMichael Clark     case 0x0b10: return "mhpmcounter16";
1342ea103259SMichael Clark     case 0x0b11: return "mhpmcounter17";
1343ea103259SMichael Clark     case 0x0b12: return "mhpmcounter18";
1344ea103259SMichael Clark     case 0x0b13: return "mhpmcounter19";
1345ea103259SMichael Clark     case 0x0b14: return "mhpmcounter20";
1346ea103259SMichael Clark     case 0x0b15: return "mhpmcounter21";
1347ea103259SMichael Clark     case 0x0b16: return "mhpmcounter22";
1348ea103259SMichael Clark     case 0x0b17: return "mhpmcounter23";
1349ea103259SMichael Clark     case 0x0b18: return "mhpmcounter24";
1350ea103259SMichael Clark     case 0x0b19: return "mhpmcounter25";
1351ea103259SMichael Clark     case 0x0b1a: return "mhpmcounter26";
1352ea103259SMichael Clark     case 0x0b1b: return "mhpmcounter27";
1353ea103259SMichael Clark     case 0x0b1c: return "mhpmcounter28";
1354ea103259SMichael Clark     case 0x0b1d: return "mhpmcounter29";
1355ea103259SMichael Clark     case 0x0b1e: return "mhpmcounter30";
1356ea103259SMichael Clark     case 0x0b1f: return "mhpmcounter31";
1357ea103259SMichael Clark     case 0x0b80: return "mcycleh";
1358ea103259SMichael Clark     case 0x0b81: return "mtimeh";
1359ea103259SMichael Clark     case 0x0b82: return "minstreth";
1360ea103259SMichael Clark     case 0x0b83: return "mhpmcounter3h";
1361ea103259SMichael Clark     case 0x0b84: return "mhpmcounter4h";
1362ea103259SMichael Clark     case 0x0b85: return "mhpmcounter5h";
1363ea103259SMichael Clark     case 0x0b86: return "mhpmcounter6h";
1364ea103259SMichael Clark     case 0x0b87: return "mhpmcounter7h";
1365ea103259SMichael Clark     case 0x0b88: return "mhpmcounter8h";
1366ea103259SMichael Clark     case 0x0b89: return "mhpmcounter9h";
1367ea103259SMichael Clark     case 0x0b8a: return "mhpmcounter10h";
1368ea103259SMichael Clark     case 0x0b8b: return "mhpmcounter11h";
1369ea103259SMichael Clark     case 0x0b8c: return "mhpmcounter12h";
1370ea103259SMichael Clark     case 0x0b8d: return "mhpmcounter13h";
1371ea103259SMichael Clark     case 0x0b8e: return "mhpmcounter14h";
1372ea103259SMichael Clark     case 0x0b8f: return "mhpmcounter15h";
1373ea103259SMichael Clark     case 0x0b90: return "mhpmcounter16h";
1374ea103259SMichael Clark     case 0x0b91: return "mhpmcounter17h";
1375ea103259SMichael Clark     case 0x0b92: return "mhpmcounter18h";
1376ea103259SMichael Clark     case 0x0b93: return "mhpmcounter19h";
1377ea103259SMichael Clark     case 0x0b94: return "mhpmcounter20h";
1378ea103259SMichael Clark     case 0x0b95: return "mhpmcounter21h";
1379ea103259SMichael Clark     case 0x0b96: return "mhpmcounter22h";
1380ea103259SMichael Clark     case 0x0b97: return "mhpmcounter23h";
1381ea103259SMichael Clark     case 0x0b98: return "mhpmcounter24h";
1382ea103259SMichael Clark     case 0x0b99: return "mhpmcounter25h";
1383ea103259SMichael Clark     case 0x0b9a: return "mhpmcounter26h";
1384ea103259SMichael Clark     case 0x0b9b: return "mhpmcounter27h";
1385ea103259SMichael Clark     case 0x0b9c: return "mhpmcounter28h";
1386ea103259SMichael Clark     case 0x0b9d: return "mhpmcounter29h";
1387ea103259SMichael Clark     case 0x0b9e: return "mhpmcounter30h";
1388ea103259SMichael Clark     case 0x0b9f: return "mhpmcounter31h";
1389ea103259SMichael Clark     case 0x0c00: return "cycle";
1390ea103259SMichael Clark     case 0x0c01: return "time";
1391ea103259SMichael Clark     case 0x0c02: return "instret";
1392ea103259SMichael Clark     case 0x0c80: return "cycleh";
1393ea103259SMichael Clark     case 0x0c81: return "timeh";
1394ea103259SMichael Clark     case 0x0c82: return "instreth";
1395ea103259SMichael Clark     case 0x0d00: return "scycle";
1396ea103259SMichael Clark     case 0x0d01: return "stime";
1397ea103259SMichael Clark     case 0x0d02: return "sinstret";
1398ea103259SMichael Clark     case 0x0d80: return "scycleh";
1399ea103259SMichael Clark     case 0x0d81: return "stimeh";
1400ea103259SMichael Clark     case 0x0d82: return "sinstreth";
1401ea103259SMichael Clark     case 0x0e00: return "hcycle";
1402ea103259SMichael Clark     case 0x0e01: return "htime";
1403ea103259SMichael Clark     case 0x0e02: return "hinstret";
1404ea103259SMichael Clark     case 0x0e80: return "hcycleh";
1405ea103259SMichael Clark     case 0x0e81: return "htimeh";
1406ea103259SMichael Clark     case 0x0e82: return "hinstreth";
1407ea103259SMichael Clark     case 0x0f11: return "mvendorid";
1408ea103259SMichael Clark     case 0x0f12: return "marchid";
1409ea103259SMichael Clark     case 0x0f13: return "mimpid";
1410ea103259SMichael Clark     case 0x0f14: return "mhartid";
1411ea103259SMichael Clark     default: return NULL;
1412ea103259SMichael Clark     }
1413ea103259SMichael Clark }
1414ea103259SMichael Clark 
1415ea103259SMichael Clark /* decode opcode */
1416ea103259SMichael Clark 
1417ea103259SMichael Clark static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
1418ea103259SMichael Clark {
1419ea103259SMichael Clark     rv_inst inst = dec->inst;
1420ea103259SMichael Clark     rv_opcode op = rv_op_illegal;
1421ea103259SMichael Clark     switch (((inst >> 0) & 0b11)) {
1422ea103259SMichael Clark     case 0:
1423ea103259SMichael Clark         switch (((inst >> 13) & 0b111)) {
1424ea103259SMichael Clark         case 0: op = rv_op_c_addi4spn; break;
1425ea103259SMichael Clark         case 1:
1426ea103259SMichael Clark             if (isa == rv128) {
1427ea103259SMichael Clark                 op = rv_op_c_lq;
1428ea103259SMichael Clark             } else {
1429ea103259SMichael Clark                 op = rv_op_c_fld;
1430ea103259SMichael Clark             }
1431ea103259SMichael Clark             break;
1432ea103259SMichael Clark         case 2: op = rv_op_c_lw; break;
1433ea103259SMichael Clark         case 3:
1434ea103259SMichael Clark             if (isa == rv32) {
1435ea103259SMichael Clark                 op = rv_op_c_flw;
1436ea103259SMichael Clark             } else {
1437ea103259SMichael Clark                 op = rv_op_c_ld;
1438ea103259SMichael Clark             }
1439ea103259SMichael Clark             break;
1440ea103259SMichael Clark         case 5:
1441ea103259SMichael Clark             if (isa == rv128) {
1442ea103259SMichael Clark                 op = rv_op_c_sq;
1443ea103259SMichael Clark             } else {
1444ea103259SMichael Clark                 op = rv_op_c_fsd;
1445ea103259SMichael Clark             }
1446ea103259SMichael Clark             break;
1447ea103259SMichael Clark         case 6: op = rv_op_c_sw; break;
1448ea103259SMichael Clark         case 7:
1449ea103259SMichael Clark             if (isa == rv32) {
1450ea103259SMichael Clark                 op = rv_op_c_fsw;
1451ea103259SMichael Clark             } else {
1452ea103259SMichael Clark                 op = rv_op_c_sd;
1453ea103259SMichael Clark             }
1454ea103259SMichael Clark             break;
1455ea103259SMichael Clark         }
1456ea103259SMichael Clark         break;
1457ea103259SMichael Clark     case 1:
1458ea103259SMichael Clark         switch (((inst >> 13) & 0b111)) {
1459ea103259SMichael Clark         case 0:
1460ea103259SMichael Clark             switch (((inst >> 2) & 0b11111111111)) {
1461ea103259SMichael Clark             case 0: op = rv_op_c_nop; break;
1462ea103259SMichael Clark             default: op = rv_op_c_addi; break;
1463ea103259SMichael Clark             }
1464ea103259SMichael Clark             break;
1465ea103259SMichael Clark         case 1:
1466ea103259SMichael Clark             if (isa == rv32) {
1467ea103259SMichael Clark                 op = rv_op_c_jal;
1468ea103259SMichael Clark             } else {
1469ea103259SMichael Clark                 op = rv_op_c_addiw;
1470ea103259SMichael Clark             }
1471ea103259SMichael Clark             break;
1472ea103259SMichael Clark         case 2: op = rv_op_c_li; break;
1473ea103259SMichael Clark         case 3:
1474ea103259SMichael Clark             switch (((inst >> 7) & 0b11111)) {
1475ea103259SMichael Clark             case 2: op = rv_op_c_addi16sp; break;
1476ea103259SMichael Clark             default: op = rv_op_c_lui; break;
1477ea103259SMichael Clark             }
1478ea103259SMichael Clark             break;
1479ea103259SMichael Clark         case 4:
1480ea103259SMichael Clark             switch (((inst >> 10) & 0b11)) {
1481ea103259SMichael Clark             case 0:
1482ea103259SMichael Clark                 op = rv_op_c_srli;
1483ea103259SMichael Clark                 break;
1484ea103259SMichael Clark             case 1:
1485ea103259SMichael Clark                 op = rv_op_c_srai;
1486ea103259SMichael Clark                 break;
1487ea103259SMichael Clark             case 2: op = rv_op_c_andi; break;
1488ea103259SMichael Clark             case 3:
1489ea103259SMichael Clark                 switch (((inst >> 10) & 0b100) | ((inst >> 5) & 0b011)) {
1490ea103259SMichael Clark                 case 0: op = rv_op_c_sub; break;
1491ea103259SMichael Clark                 case 1: op = rv_op_c_xor; break;
1492ea103259SMichael Clark                 case 2: op = rv_op_c_or; break;
1493ea103259SMichael Clark                 case 3: op = rv_op_c_and; break;
1494ea103259SMichael Clark                 case 4: op = rv_op_c_subw; break;
1495ea103259SMichael Clark                 case 5: op = rv_op_c_addw; break;
1496ea103259SMichael Clark                 }
1497ea103259SMichael Clark                 break;
1498ea103259SMichael Clark             }
1499ea103259SMichael Clark             break;
1500ea103259SMichael Clark         case 5: op = rv_op_c_j; break;
1501ea103259SMichael Clark         case 6: op = rv_op_c_beqz; break;
1502ea103259SMichael Clark         case 7: op = rv_op_c_bnez; break;
1503ea103259SMichael Clark         }
1504ea103259SMichael Clark         break;
1505ea103259SMichael Clark     case 2:
1506ea103259SMichael Clark         switch (((inst >> 13) & 0b111)) {
1507ea103259SMichael Clark         case 0:
1508ea103259SMichael Clark             op = rv_op_c_slli;
1509ea103259SMichael Clark             break;
1510ea103259SMichael Clark         case 1:
1511ea103259SMichael Clark             if (isa == rv128) {
1512ea103259SMichael Clark                 op = rv_op_c_lqsp;
1513ea103259SMichael Clark             } else {
1514ea103259SMichael Clark                 op = rv_op_c_fldsp;
1515ea103259SMichael Clark             }
1516ea103259SMichael Clark             break;
1517ea103259SMichael Clark         case 2: op = rv_op_c_lwsp; break;
1518ea103259SMichael Clark         case 3:
1519ea103259SMichael Clark             if (isa == rv32) {
1520ea103259SMichael Clark                 op = rv_op_c_flwsp;
1521ea103259SMichael Clark             } else {
1522ea103259SMichael Clark                 op = rv_op_c_ldsp;
1523ea103259SMichael Clark             }
1524ea103259SMichael Clark             break;
1525ea103259SMichael Clark         case 4:
1526ea103259SMichael Clark             switch (((inst >> 12) & 0b1)) {
1527ea103259SMichael Clark             case 0:
1528ea103259SMichael Clark                 switch (((inst >> 2) & 0b11111)) {
1529ea103259SMichael Clark                 case 0: op = rv_op_c_jr; break;
1530ea103259SMichael Clark                 default: op = rv_op_c_mv; break;
1531ea103259SMichael Clark                 }
1532ea103259SMichael Clark                 break;
1533ea103259SMichael Clark             case 1:
1534ea103259SMichael Clark                 switch (((inst >> 2) & 0b11111)) {
1535ea103259SMichael Clark                 case 0:
1536ea103259SMichael Clark                     switch (((inst >> 7) & 0b11111)) {
1537ea103259SMichael Clark                     case 0: op = rv_op_c_ebreak; break;
1538ea103259SMichael Clark                     default: op = rv_op_c_jalr; break;
1539ea103259SMichael Clark                     }
1540ea103259SMichael Clark                     break;
1541ea103259SMichael Clark                 default: op = rv_op_c_add; break;
1542ea103259SMichael Clark                 }
1543ea103259SMichael Clark                 break;
1544ea103259SMichael Clark             }
1545ea103259SMichael Clark             break;
1546ea103259SMichael Clark         case 5:
1547ea103259SMichael Clark             if (isa == rv128) {
1548ea103259SMichael Clark                 op = rv_op_c_sqsp;
1549ea103259SMichael Clark             } else {
15501dc34be1SMichael Clark                 op = rv_op_c_fsdsp;
1551ea103259SMichael Clark             }
15521dc34be1SMichael Clark             break;
1553ea103259SMichael Clark         case 6: op = rv_op_c_swsp; break;
1554ea103259SMichael Clark         case 7:
1555ea103259SMichael Clark             if (isa == rv32) {
1556ea103259SMichael Clark                 op = rv_op_c_fswsp;
1557ea103259SMichael Clark             } else {
1558ea103259SMichael Clark                 op = rv_op_c_sdsp;
1559ea103259SMichael Clark             }
1560ea103259SMichael Clark             break;
1561ea103259SMichael Clark         }
1562ea103259SMichael Clark         break;
1563ea103259SMichael Clark     case 3:
1564ea103259SMichael Clark         switch (((inst >> 2) & 0b11111)) {
1565ea103259SMichael Clark         case 0:
1566ea103259SMichael Clark             switch (((inst >> 12) & 0b111)) {
1567ea103259SMichael Clark             case 0: op = rv_op_lb; break;
1568ea103259SMichael Clark             case 1: op = rv_op_lh; break;
1569ea103259SMichael Clark             case 2: op = rv_op_lw; break;
1570ea103259SMichael Clark             case 3: op = rv_op_ld; break;
1571ea103259SMichael Clark             case 4: op = rv_op_lbu; break;
1572ea103259SMichael Clark             case 5: op = rv_op_lhu; break;
1573ea103259SMichael Clark             case 6: op = rv_op_lwu; break;
1574ea103259SMichael Clark             case 7: op = rv_op_ldu; break;
1575ea103259SMichael Clark             }
1576ea103259SMichael Clark             break;
1577ea103259SMichael Clark         case 1:
1578ea103259SMichael Clark             switch (((inst >> 12) & 0b111)) {
1579ea103259SMichael Clark             case 2: op = rv_op_flw; break;
1580ea103259SMichael Clark             case 3: op = rv_op_fld; break;
1581ea103259SMichael Clark             case 4: op = rv_op_flq; break;
1582ea103259SMichael Clark             }
1583ea103259SMichael Clark             break;
1584ea103259SMichael Clark         case 3:
1585ea103259SMichael Clark             switch (((inst >> 12) & 0b111)) {
1586ea103259SMichael Clark             case 0: op = rv_op_fence; break;
1587ea103259SMichael Clark             case 1: op = rv_op_fence_i; break;
1588ea103259SMichael Clark             case 2: op = rv_op_lq; break;
1589ea103259SMichael Clark             }
1590ea103259SMichael Clark             break;
1591ea103259SMichael Clark         case 4:
1592ea103259SMichael Clark             switch (((inst >> 12) & 0b111)) {
1593ea103259SMichael Clark             case 0: op = rv_op_addi; break;
1594ea103259SMichael Clark             case 1:
1595ea103259SMichael Clark                 switch (((inst >> 27) & 0b11111)) {
1596*02c1b569SPhilipp Tomsich                 case 0b00000: op = rv_op_slli; break;
1597*02c1b569SPhilipp Tomsich                 case 0b00101: op = rv_op_bseti; break;
1598*02c1b569SPhilipp Tomsich                 case 0b01001: op = rv_op_bclri; break;
1599*02c1b569SPhilipp Tomsich                 case 0b01101: op = rv_op_binvi; break;
1600*02c1b569SPhilipp Tomsich                 case 0b01100:
1601*02c1b569SPhilipp Tomsich                     switch (((inst >> 20) & 0b1111111)) {
1602*02c1b569SPhilipp Tomsich                     case 0b0000000: op = rv_op_clz; break;
1603*02c1b569SPhilipp Tomsich                     case 0b0000001: op = rv_op_ctz; break;
1604*02c1b569SPhilipp Tomsich                     case 0b0000010: op = rv_op_cpop; break;
1605*02c1b569SPhilipp Tomsich                       /* 0b0000011 */
1606*02c1b569SPhilipp Tomsich                     case 0b0000100: op = rv_op_sext_b; break;
1607*02c1b569SPhilipp Tomsich                     case 0b0000101: op = rv_op_sext_h; break;
1608*02c1b569SPhilipp Tomsich                     }
1609*02c1b569SPhilipp Tomsich                     break;
1610ea103259SMichael Clark                 }
1611ea103259SMichael Clark                 break;
1612ea103259SMichael Clark             case 2: op = rv_op_slti; break;
1613ea103259SMichael Clark             case 3: op = rv_op_sltiu; break;
1614ea103259SMichael Clark             case 4: op = rv_op_xori; break;
1615ea103259SMichael Clark             case 5:
1616ea103259SMichael Clark                 switch (((inst >> 27) & 0b11111)) {
1617*02c1b569SPhilipp Tomsich                 case 0b00000: op = rv_op_srli; break;
1618*02c1b569SPhilipp Tomsich                 case 0b00101: op = rv_op_orc_b; break;
1619*02c1b569SPhilipp Tomsich                 case 0b01000: op = rv_op_srai; break;
1620*02c1b569SPhilipp Tomsich                 case 0b01001: op = rv_op_bexti; break;
1621*02c1b569SPhilipp Tomsich                 case 0b01100: op = rv_op_rori; break;
1622*02c1b569SPhilipp Tomsich                 case 0b01101:
1623*02c1b569SPhilipp Tomsich                     switch ((inst >> 20) & 0b1111111) {
1624*02c1b569SPhilipp Tomsich                     case 0b0111000: op = rv_op_rev8; break;
1625*02c1b569SPhilipp Tomsich                     }
1626*02c1b569SPhilipp Tomsich                     break;
1627ea103259SMichael Clark                 }
1628ea103259SMichael Clark                 break;
1629ea103259SMichael Clark             case 6: op = rv_op_ori; break;
1630ea103259SMichael Clark             case 7: op = rv_op_andi; break;
1631ea103259SMichael Clark             }
1632ea103259SMichael Clark             break;
1633ea103259SMichael Clark         case 5: op = rv_op_auipc; break;
1634ea103259SMichael Clark         case 6:
1635ea103259SMichael Clark             switch (((inst >> 12) & 0b111)) {
1636ea103259SMichael Clark             case 0: op = rv_op_addiw; break;
1637ea103259SMichael Clark             case 1:
1638ea103259SMichael Clark                 switch (((inst >> 25) & 0b1111111)) {
1639ea103259SMichael Clark                 case 0: op = rv_op_slliw; break;
1640*02c1b569SPhilipp Tomsich                 case 4: op = rv_op_slli_uw; break;
1641*02c1b569SPhilipp Tomsich                 case 48:
1642*02c1b569SPhilipp Tomsich                     switch ((inst >> 20) & 0b11111) {
1643*02c1b569SPhilipp Tomsich                     case 0b00000: op = rv_op_clzw; break;
1644*02c1b569SPhilipp Tomsich                     case 0b00001: op = rv_op_ctzw; break;
1645*02c1b569SPhilipp Tomsich                     case 0b00010: op = rv_op_cpopw; break;
1646*02c1b569SPhilipp Tomsich                     }
1647*02c1b569SPhilipp Tomsich                     break;
1648ea103259SMichael Clark                 }
1649ea103259SMichael Clark                 break;
1650ea103259SMichael Clark             case 5:
1651ea103259SMichael Clark                 switch (((inst >> 25) & 0b1111111)) {
1652ea103259SMichael Clark                 case 0: op = rv_op_srliw; break;
1653ea103259SMichael Clark                 case 32: op = rv_op_sraiw; break;
1654*02c1b569SPhilipp Tomsich                 case 48: op = rv_op_roriw; break;
1655ea103259SMichael Clark                 }
1656ea103259SMichael Clark                 break;
1657ea103259SMichael Clark             }
1658ea103259SMichael Clark             break;
1659ea103259SMichael Clark         case 8:
1660ea103259SMichael Clark             switch (((inst >> 12) & 0b111)) {
1661ea103259SMichael Clark             case 0: op = rv_op_sb; break;
1662ea103259SMichael Clark             case 1: op = rv_op_sh; break;
1663ea103259SMichael Clark             case 2: op = rv_op_sw; break;
1664ea103259SMichael Clark             case 3: op = rv_op_sd; break;
1665ea103259SMichael Clark             case 4: op = rv_op_sq; break;
1666ea103259SMichael Clark             }
1667ea103259SMichael Clark             break;
1668ea103259SMichael Clark         case 9:
1669ea103259SMichael Clark             switch (((inst >> 12) & 0b111)) {
1670ea103259SMichael Clark             case 2: op = rv_op_fsw; break;
1671ea103259SMichael Clark             case 3: op = rv_op_fsd; break;
1672ea103259SMichael Clark             case 4: op = rv_op_fsq; break;
1673ea103259SMichael Clark             }
1674ea103259SMichael Clark             break;
1675ea103259SMichael Clark         case 11:
1676ea103259SMichael Clark             switch (((inst >> 24) & 0b11111000) | ((inst >> 12) & 0b00000111)) {
1677ea103259SMichael Clark             case 2: op = rv_op_amoadd_w; break;
1678ea103259SMichael Clark             case 3: op = rv_op_amoadd_d; break;
1679ea103259SMichael Clark             case 4: op = rv_op_amoadd_q; break;
1680ea103259SMichael Clark             case 10: op = rv_op_amoswap_w; break;
1681ea103259SMichael Clark             case 11: op = rv_op_amoswap_d; break;
1682ea103259SMichael Clark             case 12: op = rv_op_amoswap_q; break;
1683ea103259SMichael Clark             case 18:
1684ea103259SMichael Clark                 switch (((inst >> 20) & 0b11111)) {
1685ea103259SMichael Clark                 case 0: op = rv_op_lr_w; break;
1686ea103259SMichael Clark                 }
1687ea103259SMichael Clark                 break;
1688ea103259SMichael Clark             case 19:
1689ea103259SMichael Clark                 switch (((inst >> 20) & 0b11111)) {
1690ea103259SMichael Clark                 case 0: op = rv_op_lr_d; break;
1691ea103259SMichael Clark                 }
1692ea103259SMichael Clark                 break;
1693ea103259SMichael Clark             case 20:
1694ea103259SMichael Clark                 switch (((inst >> 20) & 0b11111)) {
1695ea103259SMichael Clark                 case 0: op = rv_op_lr_q; break;
1696ea103259SMichael Clark                 }
1697ea103259SMichael Clark                 break;
1698ea103259SMichael Clark             case 26: op = rv_op_sc_w; break;
1699ea103259SMichael Clark             case 27: op = rv_op_sc_d; break;
1700ea103259SMichael Clark             case 28: op = rv_op_sc_q; break;
1701ea103259SMichael Clark             case 34: op = rv_op_amoxor_w; break;
1702ea103259SMichael Clark             case 35: op = rv_op_amoxor_d; break;
1703ea103259SMichael Clark             case 36: op = rv_op_amoxor_q; break;
1704ea103259SMichael Clark             case 66: op = rv_op_amoor_w; break;
1705ea103259SMichael Clark             case 67: op = rv_op_amoor_d; break;
1706ea103259SMichael Clark             case 68: op = rv_op_amoor_q; break;
1707ea103259SMichael Clark             case 98: op = rv_op_amoand_w; break;
1708ea103259SMichael Clark             case 99: op = rv_op_amoand_d; break;
1709ea103259SMichael Clark             case 100: op = rv_op_amoand_q; break;
1710ea103259SMichael Clark             case 130: op = rv_op_amomin_w; break;
1711ea103259SMichael Clark             case 131: op = rv_op_amomin_d; break;
1712ea103259SMichael Clark             case 132: op = rv_op_amomin_q; break;
1713ea103259SMichael Clark             case 162: op = rv_op_amomax_w; break;
1714ea103259SMichael Clark             case 163: op = rv_op_amomax_d; break;
1715ea103259SMichael Clark             case 164: op = rv_op_amomax_q; break;
1716ea103259SMichael Clark             case 194: op = rv_op_amominu_w; break;
1717ea103259SMichael Clark             case 195: op = rv_op_amominu_d; break;
1718ea103259SMichael Clark             case 196: op = rv_op_amominu_q; break;
1719ea103259SMichael Clark             case 226: op = rv_op_amomaxu_w; break;
1720ea103259SMichael Clark             case 227: op = rv_op_amomaxu_d; break;
1721ea103259SMichael Clark             case 228: op = rv_op_amomaxu_q; break;
1722ea103259SMichael Clark             }
1723ea103259SMichael Clark             break;
1724ea103259SMichael Clark         case 12:
1725ea103259SMichael Clark             switch (((inst >> 22) & 0b1111111000) | ((inst >> 12) & 0b0000000111)) {
1726ea103259SMichael Clark             case 0: op = rv_op_add; break;
1727ea103259SMichael Clark             case 1: op = rv_op_sll; break;
1728ea103259SMichael Clark             case 2: op = rv_op_slt; break;
1729ea103259SMichael Clark             case 3: op = rv_op_sltu; break;
1730ea103259SMichael Clark             case 4: op = rv_op_xor; break;
1731ea103259SMichael Clark             case 5: op = rv_op_srl; break;
1732ea103259SMichael Clark             case 6: op = rv_op_or; break;
1733ea103259SMichael Clark             case 7: op = rv_op_and; break;
1734ea103259SMichael Clark             case 8: op = rv_op_mul; break;
1735ea103259SMichael Clark             case 9: op = rv_op_mulh; break;
1736ea103259SMichael Clark             case 10: op = rv_op_mulhsu; break;
1737ea103259SMichael Clark             case 11: op = rv_op_mulhu; break;
1738ea103259SMichael Clark             case 12: op = rv_op_div; break;
1739ea103259SMichael Clark             case 13: op = rv_op_divu; break;
1740ea103259SMichael Clark             case 14: op = rv_op_rem; break;
1741ea103259SMichael Clark             case 15: op = rv_op_remu; break;
1742*02c1b569SPhilipp Tomsich             case 36:
1743*02c1b569SPhilipp Tomsich                 switch ((inst >> 20) & 0b11111) {
1744*02c1b569SPhilipp Tomsich                 case 0: op = rv_op_zext_h; break;
1745*02c1b569SPhilipp Tomsich                 }
1746*02c1b569SPhilipp Tomsich                 break;
1747*02c1b569SPhilipp Tomsich             case 41: op = rv_op_clmul; break;
1748*02c1b569SPhilipp Tomsich             case 42: op = rv_op_clmulr; break;
1749*02c1b569SPhilipp Tomsich             case 43: op = rv_op_clmulh; break;
1750*02c1b569SPhilipp Tomsich             case 44: op = rv_op_min; break;
1751*02c1b569SPhilipp Tomsich             case 45: op = rv_op_minu; break;
1752*02c1b569SPhilipp Tomsich             case 46: op = rv_op_max; break;
1753*02c1b569SPhilipp Tomsich             case 47: op = rv_op_maxu; break;
1754*02c1b569SPhilipp Tomsich             case 130: op = rv_op_sh1add; break;
1755*02c1b569SPhilipp Tomsich             case 132: op = rv_op_sh2add; break;
1756*02c1b569SPhilipp Tomsich             case 134: op = rv_op_sh3add; break;
1757*02c1b569SPhilipp Tomsich             case 161: op = rv_op_bset; break;
1758ea103259SMichael Clark             case 256: op = rv_op_sub; break;
1759*02c1b569SPhilipp Tomsich             case 260: op = rv_op_xnor; break;
1760ea103259SMichael Clark             case 261: op = rv_op_sra; break;
1761*02c1b569SPhilipp Tomsich             case 262: op = rv_op_orn; break;
1762*02c1b569SPhilipp Tomsich             case 263: op = rv_op_andn; break;
1763*02c1b569SPhilipp Tomsich             case 289: op = rv_op_bclr; break;
1764*02c1b569SPhilipp Tomsich             case 293: op = rv_op_bext; break;
1765*02c1b569SPhilipp Tomsich             case 385: op = rv_op_rol; break;
1766*02c1b569SPhilipp Tomsich             case 386: op = rv_op_ror; break;
1767*02c1b569SPhilipp Tomsich             case 417: op = rv_op_binv; break;
1768ea103259SMichael Clark             }
1769ea103259SMichael Clark             break;
1770ea103259SMichael Clark         case 13: op = rv_op_lui; break;
1771ea103259SMichael Clark         case 14:
1772ea103259SMichael Clark             switch (((inst >> 22) & 0b1111111000) | ((inst >> 12) & 0b0000000111)) {
1773ea103259SMichael Clark             case 0: op = rv_op_addw; break;
1774ea103259SMichael Clark             case 1: op = rv_op_sllw; break;
1775ea103259SMichael Clark             case 5: op = rv_op_srlw; break;
1776ea103259SMichael Clark             case 8: op = rv_op_mulw; break;
1777ea103259SMichael Clark             case 12: op = rv_op_divw; break;
1778ea103259SMichael Clark             case 13: op = rv_op_divuw; break;
1779ea103259SMichael Clark             case 14: op = rv_op_remw; break;
1780ea103259SMichael Clark             case 15: op = rv_op_remuw; break;
1781*02c1b569SPhilipp Tomsich             case 32: op = rv_op_add_uw; break;
1782*02c1b569SPhilipp Tomsich             case 36:
1783*02c1b569SPhilipp Tomsich                 switch ((inst >> 20) & 0b11111) {
1784*02c1b569SPhilipp Tomsich                 case 0: op = rv_op_zext_h; break;
1785*02c1b569SPhilipp Tomsich                 }
1786*02c1b569SPhilipp Tomsich                 break;
1787*02c1b569SPhilipp Tomsich             case 130: op = rv_op_sh1add_uw; break;
1788*02c1b569SPhilipp Tomsich             case 132: op = rv_op_sh2add_uw; break;
1789*02c1b569SPhilipp Tomsich             case 134: op = rv_op_sh3add_uw; break;
1790ea103259SMichael Clark             case 256: op = rv_op_subw; break;
1791ea103259SMichael Clark             case 261: op = rv_op_sraw; break;
1792*02c1b569SPhilipp Tomsich             case 385: op = rv_op_rolw; break;
1793*02c1b569SPhilipp Tomsich             case 389: op = rv_op_rorw; break;
1794ea103259SMichael Clark             }
1795ea103259SMichael Clark             break;
1796ea103259SMichael Clark         case 16:
1797ea103259SMichael Clark             switch (((inst >> 25) & 0b11)) {
1798ea103259SMichael Clark             case 0: op = rv_op_fmadd_s; break;
1799ea103259SMichael Clark             case 1: op = rv_op_fmadd_d; break;
1800ea103259SMichael Clark             case 3: op = rv_op_fmadd_q; break;
1801ea103259SMichael Clark             }
1802ea103259SMichael Clark             break;
1803ea103259SMichael Clark         case 17:
1804ea103259SMichael Clark             switch (((inst >> 25) & 0b11)) {
1805ea103259SMichael Clark             case 0: op = rv_op_fmsub_s; break;
1806ea103259SMichael Clark             case 1: op = rv_op_fmsub_d; break;
1807ea103259SMichael Clark             case 3: op = rv_op_fmsub_q; break;
1808ea103259SMichael Clark             }
1809ea103259SMichael Clark             break;
1810ea103259SMichael Clark         case 18:
1811ea103259SMichael Clark             switch (((inst >> 25) & 0b11)) {
1812ea103259SMichael Clark             case 0: op = rv_op_fnmsub_s; break;
1813ea103259SMichael Clark             case 1: op = rv_op_fnmsub_d; break;
1814ea103259SMichael Clark             case 3: op = rv_op_fnmsub_q; break;
1815ea103259SMichael Clark             }
1816ea103259SMichael Clark             break;
1817ea103259SMichael Clark         case 19:
1818ea103259SMichael Clark             switch (((inst >> 25) & 0b11)) {
1819ea103259SMichael Clark             case 0: op = rv_op_fnmadd_s; break;
1820ea103259SMichael Clark             case 1: op = rv_op_fnmadd_d; break;
1821ea103259SMichael Clark             case 3: op = rv_op_fnmadd_q; break;
1822ea103259SMichael Clark             }
1823ea103259SMichael Clark             break;
1824ea103259SMichael Clark         case 20:
1825ea103259SMichael Clark             switch (((inst >> 25) & 0b1111111)) {
1826ea103259SMichael Clark             case 0: op = rv_op_fadd_s; break;
1827ea103259SMichael Clark             case 1: op = rv_op_fadd_d; break;
1828ea103259SMichael Clark             case 3: op = rv_op_fadd_q; break;
1829ea103259SMichael Clark             case 4: op = rv_op_fsub_s; break;
1830ea103259SMichael Clark             case 5: op = rv_op_fsub_d; break;
1831ea103259SMichael Clark             case 7: op = rv_op_fsub_q; break;
1832ea103259SMichael Clark             case 8: op = rv_op_fmul_s; break;
1833ea103259SMichael Clark             case 9: op = rv_op_fmul_d; break;
1834ea103259SMichael Clark             case 11: op = rv_op_fmul_q; break;
1835ea103259SMichael Clark             case 12: op = rv_op_fdiv_s; break;
1836ea103259SMichael Clark             case 13: op = rv_op_fdiv_d; break;
1837ea103259SMichael Clark             case 15: op = rv_op_fdiv_q; break;
1838ea103259SMichael Clark             case 16:
1839ea103259SMichael Clark                 switch (((inst >> 12) & 0b111)) {
1840ea103259SMichael Clark                 case 0: op = rv_op_fsgnj_s; break;
1841ea103259SMichael Clark                 case 1: op = rv_op_fsgnjn_s; break;
1842ea103259SMichael Clark                 case 2: op = rv_op_fsgnjx_s; break;
1843ea103259SMichael Clark                 }
1844ea103259SMichael Clark                 break;
1845ea103259SMichael Clark             case 17:
1846ea103259SMichael Clark                 switch (((inst >> 12) & 0b111)) {
1847ea103259SMichael Clark                 case 0: op = rv_op_fsgnj_d; break;
1848ea103259SMichael Clark                 case 1: op = rv_op_fsgnjn_d; break;
1849ea103259SMichael Clark                 case 2: op = rv_op_fsgnjx_d; break;
1850ea103259SMichael Clark                 }
1851ea103259SMichael Clark                 break;
1852ea103259SMichael Clark             case 19:
1853ea103259SMichael Clark                 switch (((inst >> 12) & 0b111)) {
1854ea103259SMichael Clark                 case 0: op = rv_op_fsgnj_q; break;
1855ea103259SMichael Clark                 case 1: op = rv_op_fsgnjn_q; break;
1856ea103259SMichael Clark                 case 2: op = rv_op_fsgnjx_q; break;
1857ea103259SMichael Clark                 }
1858ea103259SMichael Clark                 break;
1859ea103259SMichael Clark             case 20:
1860ea103259SMichael Clark                 switch (((inst >> 12) & 0b111)) {
1861ea103259SMichael Clark                 case 0: op = rv_op_fmin_s; break;
1862ea103259SMichael Clark                 case 1: op = rv_op_fmax_s; break;
1863ea103259SMichael Clark                 }
1864ea103259SMichael Clark                 break;
1865ea103259SMichael Clark             case 21:
1866ea103259SMichael Clark                 switch (((inst >> 12) & 0b111)) {
1867ea103259SMichael Clark                 case 0: op = rv_op_fmin_d; break;
1868ea103259SMichael Clark                 case 1: op = rv_op_fmax_d; break;
1869ea103259SMichael Clark                 }
1870ea103259SMichael Clark                 break;
1871ea103259SMichael Clark             case 23:
1872ea103259SMichael Clark                 switch (((inst >> 12) & 0b111)) {
1873ea103259SMichael Clark                 case 0: op = rv_op_fmin_q; break;
1874ea103259SMichael Clark                 case 1: op = rv_op_fmax_q; break;
1875ea103259SMichael Clark                 }
1876ea103259SMichael Clark                 break;
1877ea103259SMichael Clark             case 32:
1878ea103259SMichael Clark                 switch (((inst >> 20) & 0b11111)) {
1879ea103259SMichael Clark                 case 1: op = rv_op_fcvt_s_d; break;
1880ea103259SMichael Clark                 case 3: op = rv_op_fcvt_s_q; break;
1881ea103259SMichael Clark                 }
1882ea103259SMichael Clark                 break;
1883ea103259SMichael Clark             case 33:
1884ea103259SMichael Clark                 switch (((inst >> 20) & 0b11111)) {
1885ea103259SMichael Clark                 case 0: op = rv_op_fcvt_d_s; break;
1886ea103259SMichael Clark                 case 3: op = rv_op_fcvt_d_q; break;
1887ea103259SMichael Clark                 }
1888ea103259SMichael Clark                 break;
1889ea103259SMichael Clark             case 35:
1890ea103259SMichael Clark                 switch (((inst >> 20) & 0b11111)) {
1891ea103259SMichael Clark                 case 0: op = rv_op_fcvt_q_s; break;
1892ea103259SMichael Clark                 case 1: op = rv_op_fcvt_q_d; break;
1893ea103259SMichael Clark                 }
1894ea103259SMichael Clark                 break;
1895ea103259SMichael Clark             case 44:
1896ea103259SMichael Clark                 switch (((inst >> 20) & 0b11111)) {
1897ea103259SMichael Clark                 case 0: op = rv_op_fsqrt_s; break;
1898ea103259SMichael Clark                 }
1899ea103259SMichael Clark                 break;
1900ea103259SMichael Clark             case 45:
1901ea103259SMichael Clark                 switch (((inst >> 20) & 0b11111)) {
1902ea103259SMichael Clark                 case 0: op = rv_op_fsqrt_d; break;
1903ea103259SMichael Clark                 }
1904ea103259SMichael Clark                 break;
1905ea103259SMichael Clark             case 47:
1906ea103259SMichael Clark                 switch (((inst >> 20) & 0b11111)) {
1907ea103259SMichael Clark                 case 0: op = rv_op_fsqrt_q; break;
1908ea103259SMichael Clark                 }
1909ea103259SMichael Clark                 break;
1910ea103259SMichael Clark             case 80:
1911ea103259SMichael Clark                 switch (((inst >> 12) & 0b111)) {
1912ea103259SMichael Clark                 case 0: op = rv_op_fle_s; break;
1913ea103259SMichael Clark                 case 1: op = rv_op_flt_s; break;
1914ea103259SMichael Clark                 case 2: op = rv_op_feq_s; break;
1915ea103259SMichael Clark                 }
1916ea103259SMichael Clark                 break;
1917ea103259SMichael Clark             case 81:
1918ea103259SMichael Clark                 switch (((inst >> 12) & 0b111)) {
1919ea103259SMichael Clark                 case 0: op = rv_op_fle_d; break;
1920ea103259SMichael Clark                 case 1: op = rv_op_flt_d; break;
1921ea103259SMichael Clark                 case 2: op = rv_op_feq_d; break;
1922ea103259SMichael Clark                 }
1923ea103259SMichael Clark                 break;
1924ea103259SMichael Clark             case 83:
1925ea103259SMichael Clark                 switch (((inst >> 12) & 0b111)) {
1926ea103259SMichael Clark                 case 0: op = rv_op_fle_q; break;
1927ea103259SMichael Clark                 case 1: op = rv_op_flt_q; break;
1928ea103259SMichael Clark                 case 2: op = rv_op_feq_q; break;
1929ea103259SMichael Clark                 }
1930ea103259SMichael Clark                 break;
1931ea103259SMichael Clark             case 96:
1932ea103259SMichael Clark                 switch (((inst >> 20) & 0b11111)) {
1933ea103259SMichael Clark                 case 0: op = rv_op_fcvt_w_s; break;
1934ea103259SMichael Clark                 case 1: op = rv_op_fcvt_wu_s; break;
1935ea103259SMichael Clark                 case 2: op = rv_op_fcvt_l_s; break;
1936ea103259SMichael Clark                 case 3: op = rv_op_fcvt_lu_s; break;
1937ea103259SMichael Clark                 }
1938ea103259SMichael Clark                 break;
1939ea103259SMichael Clark             case 97:
1940ea103259SMichael Clark                 switch (((inst >> 20) & 0b11111)) {
1941ea103259SMichael Clark                 case 0: op = rv_op_fcvt_w_d; break;
1942ea103259SMichael Clark                 case 1: op = rv_op_fcvt_wu_d; break;
1943ea103259SMichael Clark                 case 2: op = rv_op_fcvt_l_d; break;
1944ea103259SMichael Clark                 case 3: op = rv_op_fcvt_lu_d; break;
1945ea103259SMichael Clark                 }
1946ea103259SMichael Clark                 break;
1947ea103259SMichael Clark             case 99:
1948ea103259SMichael Clark                 switch (((inst >> 20) & 0b11111)) {
1949ea103259SMichael Clark                 case 0: op = rv_op_fcvt_w_q; break;
1950ea103259SMichael Clark                 case 1: op = rv_op_fcvt_wu_q; break;
1951ea103259SMichael Clark                 case 2: op = rv_op_fcvt_l_q; break;
1952ea103259SMichael Clark                 case 3: op = rv_op_fcvt_lu_q; break;
1953ea103259SMichael Clark                 }
1954ea103259SMichael Clark                 break;
1955ea103259SMichael Clark             case 104:
1956ea103259SMichael Clark                 switch (((inst >> 20) & 0b11111)) {
1957ea103259SMichael Clark                 case 0: op = rv_op_fcvt_s_w; break;
1958ea103259SMichael Clark                 case 1: op = rv_op_fcvt_s_wu; break;
1959ea103259SMichael Clark                 case 2: op = rv_op_fcvt_s_l; break;
1960ea103259SMichael Clark                 case 3: op = rv_op_fcvt_s_lu; break;
1961ea103259SMichael Clark                 }
1962ea103259SMichael Clark                 break;
1963ea103259SMichael Clark             case 105:
1964ea103259SMichael Clark                 switch (((inst >> 20) & 0b11111)) {
1965ea103259SMichael Clark                 case 0: op = rv_op_fcvt_d_w; break;
1966ea103259SMichael Clark                 case 1: op = rv_op_fcvt_d_wu; break;
1967ea103259SMichael Clark                 case 2: op = rv_op_fcvt_d_l; break;
1968ea103259SMichael Clark                 case 3: op = rv_op_fcvt_d_lu; break;
1969ea103259SMichael Clark                 }
1970ea103259SMichael Clark                 break;
1971ea103259SMichael Clark             case 107:
1972ea103259SMichael Clark                 switch (((inst >> 20) & 0b11111)) {
1973ea103259SMichael Clark                 case 0: op = rv_op_fcvt_q_w; break;
1974ea103259SMichael Clark                 case 1: op = rv_op_fcvt_q_wu; break;
1975ea103259SMichael Clark                 case 2: op = rv_op_fcvt_q_l; break;
1976ea103259SMichael Clark                 case 3: op = rv_op_fcvt_q_lu; break;
1977ea103259SMichael Clark                 }
1978ea103259SMichael Clark                 break;
1979ea103259SMichael Clark             case 112:
1980ea103259SMichael Clark                 switch (((inst >> 17) & 0b11111000) | ((inst >> 12) & 0b00000111)) {
1981ea103259SMichael Clark                 case 0: op = rv_op_fmv_x_s; break;
1982ea103259SMichael Clark                 case 1: op = rv_op_fclass_s; break;
1983ea103259SMichael Clark                 }
1984ea103259SMichael Clark                 break;
1985ea103259SMichael Clark             case 113:
1986ea103259SMichael Clark                 switch (((inst >> 17) & 0b11111000) | ((inst >> 12) & 0b00000111)) {
1987ea103259SMichael Clark                 case 0: op = rv_op_fmv_x_d; break;
1988ea103259SMichael Clark                 case 1: op = rv_op_fclass_d; break;
1989ea103259SMichael Clark                 }
1990ea103259SMichael Clark                 break;
1991ea103259SMichael Clark             case 115:
1992ea103259SMichael Clark                 switch (((inst >> 17) & 0b11111000) | ((inst >> 12) & 0b00000111)) {
1993ea103259SMichael Clark                 case 0: op = rv_op_fmv_x_q; break;
1994ea103259SMichael Clark                 case 1: op = rv_op_fclass_q; break;
1995ea103259SMichael Clark                 }
1996ea103259SMichael Clark                 break;
1997ea103259SMichael Clark             case 120:
1998ea103259SMichael Clark                 switch (((inst >> 17) & 0b11111000) | ((inst >> 12) & 0b00000111)) {
1999ea103259SMichael Clark                 case 0: op = rv_op_fmv_s_x; break;
2000ea103259SMichael Clark                 }
2001ea103259SMichael Clark                 break;
2002ea103259SMichael Clark             case 121:
2003ea103259SMichael Clark                 switch (((inst >> 17) & 0b11111000) | ((inst >> 12) & 0b00000111)) {
2004ea103259SMichael Clark                 case 0: op = rv_op_fmv_d_x; break;
2005ea103259SMichael Clark                 }
2006ea103259SMichael Clark                 break;
2007ea103259SMichael Clark             case 123:
2008ea103259SMichael Clark                 switch (((inst >> 17) & 0b11111000) | ((inst >> 12) & 0b00000111)) {
2009ea103259SMichael Clark                 case 0: op = rv_op_fmv_q_x; break;
2010ea103259SMichael Clark                 }
2011ea103259SMichael Clark                 break;
2012ea103259SMichael Clark             }
2013ea103259SMichael Clark             break;
2014ea103259SMichael Clark         case 22:
2015ea103259SMichael Clark             switch (((inst >> 12) & 0b111)) {
2016ea103259SMichael Clark             case 0: op = rv_op_addid; break;
2017ea103259SMichael Clark             case 1:
2018ea103259SMichael Clark                 switch (((inst >> 26) & 0b111111)) {
2019ea103259SMichael Clark                 case 0: op = rv_op_sllid; break;
2020ea103259SMichael Clark                 }
2021ea103259SMichael Clark                 break;
2022ea103259SMichael Clark             case 5:
2023ea103259SMichael Clark                 switch (((inst >> 26) & 0b111111)) {
2024ea103259SMichael Clark                 case 0: op = rv_op_srlid; break;
2025ea103259SMichael Clark                 case 16: op = rv_op_sraid; break;
2026ea103259SMichael Clark                 }
2027ea103259SMichael Clark                 break;
2028ea103259SMichael Clark             }
2029ea103259SMichael Clark             break;
2030ea103259SMichael Clark         case 24:
2031ea103259SMichael Clark             switch (((inst >> 12) & 0b111)) {
2032ea103259SMichael Clark             case 0: op = rv_op_beq; break;
2033ea103259SMichael Clark             case 1: op = rv_op_bne; break;
2034ea103259SMichael Clark             case 4: op = rv_op_blt; break;
2035ea103259SMichael Clark             case 5: op = rv_op_bge; break;
2036ea103259SMichael Clark             case 6: op = rv_op_bltu; break;
2037ea103259SMichael Clark             case 7: op = rv_op_bgeu; break;
2038ea103259SMichael Clark             }
2039ea103259SMichael Clark             break;
2040ea103259SMichael Clark         case 25:
2041ea103259SMichael Clark             switch (((inst >> 12) & 0b111)) {
2042ea103259SMichael Clark             case 0: op = rv_op_jalr; break;
2043ea103259SMichael Clark             }
2044ea103259SMichael Clark             break;
2045ea103259SMichael Clark         case 27: op = rv_op_jal; break;
2046ea103259SMichael Clark         case 28:
2047ea103259SMichael Clark             switch (((inst >> 12) & 0b111)) {
2048ea103259SMichael Clark             case 0:
2049ea103259SMichael Clark                 switch (((inst >> 20) & 0b111111100000) | ((inst >> 7) & 0b000000011111)) {
2050ea103259SMichael Clark                 case 0:
2051ea103259SMichael Clark                     switch (((inst >> 15) & 0b1111111111)) {
2052ea103259SMichael Clark                     case 0: op = rv_op_ecall; break;
2053ea103259SMichael Clark                     case 32: op = rv_op_ebreak; break;
2054ea103259SMichael Clark                     case 64: op = rv_op_uret; break;
2055ea103259SMichael Clark                     }
2056ea103259SMichael Clark                     break;
2057ea103259SMichael Clark                 case 256:
2058ea103259SMichael Clark                     switch (((inst >> 20) & 0b11111)) {
2059ea103259SMichael Clark                     case 2:
2060ea103259SMichael Clark                         switch (((inst >> 15) & 0b11111)) {
2061ea103259SMichael Clark                         case 0: op = rv_op_sret; break;
2062ea103259SMichael Clark                         }
2063ea103259SMichael Clark                         break;
2064ea103259SMichael Clark                     case 4: op = rv_op_sfence_vm; break;
2065ea103259SMichael Clark                     case 5:
2066ea103259SMichael Clark                         switch (((inst >> 15) & 0b11111)) {
2067ea103259SMichael Clark                         case 0: op = rv_op_wfi; break;
2068ea103259SMichael Clark                         }
2069ea103259SMichael Clark                         break;
2070ea103259SMichael Clark                     }
2071ea103259SMichael Clark                     break;
2072ea103259SMichael Clark                 case 288: op = rv_op_sfence_vma; break;
2073ea103259SMichael Clark                 case 512:
2074ea103259SMichael Clark                     switch (((inst >> 15) & 0b1111111111)) {
2075ea103259SMichael Clark                     case 64: op = rv_op_hret; break;
2076ea103259SMichael Clark                     }
2077ea103259SMichael Clark                     break;
2078ea103259SMichael Clark                 case 768:
2079ea103259SMichael Clark                     switch (((inst >> 15) & 0b1111111111)) {
2080ea103259SMichael Clark                     case 64: op = rv_op_mret; break;
2081ea103259SMichael Clark                     }
2082ea103259SMichael Clark                     break;
2083ea103259SMichael Clark                 case 1952:
2084ea103259SMichael Clark                     switch (((inst >> 15) & 0b1111111111)) {
2085ea103259SMichael Clark                     case 576: op = rv_op_dret; break;
2086ea103259SMichael Clark                     }
2087ea103259SMichael Clark                     break;
2088ea103259SMichael Clark                 }
2089ea103259SMichael Clark                 break;
2090ea103259SMichael Clark             case 1: op = rv_op_csrrw; break;
2091ea103259SMichael Clark             case 2: op = rv_op_csrrs; break;
2092ea103259SMichael Clark             case 3: op = rv_op_csrrc; break;
2093ea103259SMichael Clark             case 5: op = rv_op_csrrwi; break;
2094ea103259SMichael Clark             case 6: op = rv_op_csrrsi; break;
2095ea103259SMichael Clark             case 7: op = rv_op_csrrci; break;
2096ea103259SMichael Clark             }
2097ea103259SMichael Clark             break;
2098ea103259SMichael Clark         case 30:
2099ea103259SMichael Clark             switch (((inst >> 22) & 0b1111111000) | ((inst >> 12) & 0b0000000111)) {
2100ea103259SMichael Clark             case 0: op = rv_op_addd; break;
2101ea103259SMichael Clark             case 1: op = rv_op_slld; break;
2102ea103259SMichael Clark             case 5: op = rv_op_srld; break;
2103ea103259SMichael Clark             case 8: op = rv_op_muld; break;
2104ea103259SMichael Clark             case 12: op = rv_op_divd; break;
2105ea103259SMichael Clark             case 13: op = rv_op_divud; break;
2106ea103259SMichael Clark             case 14: op = rv_op_remd; break;
2107ea103259SMichael Clark             case 15: op = rv_op_remud; break;
2108ea103259SMichael Clark             case 256: op = rv_op_subd; break;
2109ea103259SMichael Clark             case 261: op = rv_op_srad; break;
2110ea103259SMichael Clark             }
2111ea103259SMichael Clark             break;
2112ea103259SMichael Clark         }
2113ea103259SMichael Clark         break;
2114ea103259SMichael Clark     }
2115ea103259SMichael Clark     dec->op = op;
2116ea103259SMichael Clark }
2117ea103259SMichael Clark 
2118ea103259SMichael Clark /* operand extractors */
2119ea103259SMichael Clark 
2120ea103259SMichael Clark static uint32_t operand_rd(rv_inst inst)
2121ea103259SMichael Clark {
2122ea103259SMichael Clark     return (inst << 52) >> 59;
2123ea103259SMichael Clark }
2124ea103259SMichael Clark 
2125ea103259SMichael Clark static uint32_t operand_rs1(rv_inst inst)
2126ea103259SMichael Clark {
2127ea103259SMichael Clark     return (inst << 44) >> 59;
2128ea103259SMichael Clark }
2129ea103259SMichael Clark 
2130ea103259SMichael Clark static uint32_t operand_rs2(rv_inst inst)
2131ea103259SMichael Clark {
2132ea103259SMichael Clark     return (inst << 39) >> 59;
2133ea103259SMichael Clark }
2134ea103259SMichael Clark 
2135ea103259SMichael Clark static uint32_t operand_rs3(rv_inst inst)
2136ea103259SMichael Clark {
2137ea103259SMichael Clark     return (inst << 32) >> 59;
2138ea103259SMichael Clark }
2139ea103259SMichael Clark 
2140ea103259SMichael Clark static uint32_t operand_aq(rv_inst inst)
2141ea103259SMichael Clark {
2142ea103259SMichael Clark     return (inst << 37) >> 63;
2143ea103259SMichael Clark }
2144ea103259SMichael Clark 
2145ea103259SMichael Clark static uint32_t operand_rl(rv_inst inst)
2146ea103259SMichael Clark {
2147ea103259SMichael Clark     return (inst << 38) >> 63;
2148ea103259SMichael Clark }
2149ea103259SMichael Clark 
2150ea103259SMichael Clark static uint32_t operand_pred(rv_inst inst)
2151ea103259SMichael Clark {
2152ea103259SMichael Clark     return (inst << 36) >> 60;
2153ea103259SMichael Clark }
2154ea103259SMichael Clark 
2155ea103259SMichael Clark static uint32_t operand_succ(rv_inst inst)
2156ea103259SMichael Clark {
2157ea103259SMichael Clark     return (inst << 40) >> 60;
2158ea103259SMichael Clark }
2159ea103259SMichael Clark 
2160ea103259SMichael Clark static uint32_t operand_rm(rv_inst inst)
2161ea103259SMichael Clark {
2162ea103259SMichael Clark     return (inst << 49) >> 61;
2163ea103259SMichael Clark }
2164ea103259SMichael Clark 
2165ea103259SMichael Clark static uint32_t operand_shamt5(rv_inst inst)
2166ea103259SMichael Clark {
2167ea103259SMichael Clark     return (inst << 39) >> 59;
2168ea103259SMichael Clark }
2169ea103259SMichael Clark 
2170ea103259SMichael Clark static uint32_t operand_shamt6(rv_inst inst)
2171ea103259SMichael Clark {
2172ea103259SMichael Clark     return (inst << 38) >> 58;
2173ea103259SMichael Clark }
2174ea103259SMichael Clark 
2175ea103259SMichael Clark static uint32_t operand_shamt7(rv_inst inst)
2176ea103259SMichael Clark {
2177ea103259SMichael Clark     return (inst << 37) >> 57;
2178ea103259SMichael Clark }
2179ea103259SMichael Clark 
2180ea103259SMichael Clark static uint32_t operand_crdq(rv_inst inst)
2181ea103259SMichael Clark {
2182ea103259SMichael Clark     return (inst << 59) >> 61;
2183ea103259SMichael Clark }
2184ea103259SMichael Clark 
2185ea103259SMichael Clark static uint32_t operand_crs1q(rv_inst inst)
2186ea103259SMichael Clark {
2187ea103259SMichael Clark     return (inst << 54) >> 61;
2188ea103259SMichael Clark }
2189ea103259SMichael Clark 
2190ea103259SMichael Clark static uint32_t operand_crs1rdq(rv_inst inst)
2191ea103259SMichael Clark {
2192ea103259SMichael Clark     return (inst << 54) >> 61;
2193ea103259SMichael Clark }
2194ea103259SMichael Clark 
2195ea103259SMichael Clark static uint32_t operand_crs2q(rv_inst inst)
2196ea103259SMichael Clark {
2197ea103259SMichael Clark     return (inst << 59) >> 61;
2198ea103259SMichael Clark }
2199ea103259SMichael Clark 
2200ea103259SMichael Clark static uint32_t operand_crd(rv_inst inst)
2201ea103259SMichael Clark {
2202ea103259SMichael Clark     return (inst << 52) >> 59;
2203ea103259SMichael Clark }
2204ea103259SMichael Clark 
2205ea103259SMichael Clark static uint32_t operand_crs1(rv_inst inst)
2206ea103259SMichael Clark {
2207ea103259SMichael Clark     return (inst << 52) >> 59;
2208ea103259SMichael Clark }
2209ea103259SMichael Clark 
2210ea103259SMichael Clark static uint32_t operand_crs1rd(rv_inst inst)
2211ea103259SMichael Clark {
2212ea103259SMichael Clark     return (inst << 52) >> 59;
2213ea103259SMichael Clark }
2214ea103259SMichael Clark 
2215ea103259SMichael Clark static uint32_t operand_crs2(rv_inst inst)
2216ea103259SMichael Clark {
2217ea103259SMichael Clark     return (inst << 57) >> 59;
2218ea103259SMichael Clark }
2219ea103259SMichael Clark 
2220ea103259SMichael Clark static uint32_t operand_cimmsh5(rv_inst inst)
2221ea103259SMichael Clark {
2222ea103259SMichael Clark     return (inst << 57) >> 59;
2223ea103259SMichael Clark }
2224ea103259SMichael Clark 
2225ea103259SMichael Clark static uint32_t operand_csr12(rv_inst inst)
2226ea103259SMichael Clark {
2227ea103259SMichael Clark     return (inst << 32) >> 52;
2228ea103259SMichael Clark }
2229ea103259SMichael Clark 
2230ea103259SMichael Clark static int32_t operand_imm12(rv_inst inst)
2231ea103259SMichael Clark {
2232ea103259SMichael Clark     return ((int64_t)inst << 32) >> 52;
2233ea103259SMichael Clark }
2234ea103259SMichael Clark 
2235ea103259SMichael Clark static int32_t operand_imm20(rv_inst inst)
2236ea103259SMichael Clark {
2237ea103259SMichael Clark     return (((int64_t)inst << 32) >> 44) << 12;
2238ea103259SMichael Clark }
2239ea103259SMichael Clark 
2240ea103259SMichael Clark static int32_t operand_jimm20(rv_inst inst)
2241ea103259SMichael Clark {
2242ea103259SMichael Clark     return (((int64_t)inst << 32) >> 63) << 20 |
2243ea103259SMichael Clark         ((inst << 33) >> 54) << 1 |
2244ea103259SMichael Clark         ((inst << 43) >> 63) << 11 |
2245ea103259SMichael Clark         ((inst << 44) >> 56) << 12;
2246ea103259SMichael Clark }
2247ea103259SMichael Clark 
2248ea103259SMichael Clark static int32_t operand_simm12(rv_inst inst)
2249ea103259SMichael Clark {
2250ea103259SMichael Clark     return (((int64_t)inst << 32) >> 57) << 5 |
2251ea103259SMichael Clark         (inst << 52) >> 59;
2252ea103259SMichael Clark }
2253ea103259SMichael Clark 
2254ea103259SMichael Clark static int32_t operand_sbimm12(rv_inst inst)
2255ea103259SMichael Clark {
2256ea103259SMichael Clark     return (((int64_t)inst << 32) >> 63) << 12 |
2257ea103259SMichael Clark         ((inst << 33) >> 58) << 5 |
2258ea103259SMichael Clark         ((inst << 52) >> 60) << 1 |
2259ea103259SMichael Clark         ((inst << 56) >> 63) << 11;
2260ea103259SMichael Clark }
2261ea103259SMichael Clark 
2262ea103259SMichael Clark static uint32_t operand_cimmsh6(rv_inst inst)
2263ea103259SMichael Clark {
2264ea103259SMichael Clark     return ((inst << 51) >> 63) << 5 |
2265ea103259SMichael Clark         (inst << 57) >> 59;
2266ea103259SMichael Clark }
2267ea103259SMichael Clark 
2268ea103259SMichael Clark static int32_t operand_cimmi(rv_inst inst)
2269ea103259SMichael Clark {
2270ea103259SMichael Clark     return (((int64_t)inst << 51) >> 63) << 5 |
2271ea103259SMichael Clark         (inst << 57) >> 59;
2272ea103259SMichael Clark }
2273ea103259SMichael Clark 
2274ea103259SMichael Clark static int32_t operand_cimmui(rv_inst inst)
2275ea103259SMichael Clark {
2276ea103259SMichael Clark     return (((int64_t)inst << 51) >> 63) << 17 |
2277ea103259SMichael Clark         ((inst << 57) >> 59) << 12;
2278ea103259SMichael Clark }
2279ea103259SMichael Clark 
2280ea103259SMichael Clark static uint32_t operand_cimmlwsp(rv_inst inst)
2281ea103259SMichael Clark {
2282ea103259SMichael Clark     return ((inst << 51) >> 63) << 5 |
2283ea103259SMichael Clark         ((inst << 57) >> 61) << 2 |
2284ea103259SMichael Clark         ((inst << 60) >> 62) << 6;
2285ea103259SMichael Clark }
2286ea103259SMichael Clark 
2287ea103259SMichael Clark static uint32_t operand_cimmldsp(rv_inst inst)
2288ea103259SMichael Clark {
2289ea103259SMichael Clark     return ((inst << 51) >> 63) << 5 |
2290ea103259SMichael Clark         ((inst << 57) >> 62) << 3 |
2291ea103259SMichael Clark         ((inst << 59) >> 61) << 6;
2292ea103259SMichael Clark }
2293ea103259SMichael Clark 
2294ea103259SMichael Clark static uint32_t operand_cimmlqsp(rv_inst inst)
2295ea103259SMichael Clark {
2296ea103259SMichael Clark     return ((inst << 51) >> 63) << 5 |
2297ea103259SMichael Clark         ((inst << 57) >> 63) << 4 |
2298ea103259SMichael Clark         ((inst << 58) >> 60) << 6;
2299ea103259SMichael Clark }
2300ea103259SMichael Clark 
2301ea103259SMichael Clark static int32_t operand_cimm16sp(rv_inst inst)
2302ea103259SMichael Clark {
2303ea103259SMichael Clark     return (((int64_t)inst << 51) >> 63) << 9 |
2304ea103259SMichael Clark         ((inst << 57) >> 63) << 4 |
2305ea103259SMichael Clark         ((inst << 58) >> 63) << 6 |
2306ea103259SMichael Clark         ((inst << 59) >> 62) << 7 |
2307ea103259SMichael Clark         ((inst << 61) >> 63) << 5;
2308ea103259SMichael Clark }
2309ea103259SMichael Clark 
2310ea103259SMichael Clark static int32_t operand_cimmj(rv_inst inst)
2311ea103259SMichael Clark {
2312ea103259SMichael Clark     return (((int64_t)inst << 51) >> 63) << 11 |
2313ea103259SMichael Clark         ((inst << 52) >> 63) << 4 |
2314ea103259SMichael Clark         ((inst << 53) >> 62) << 8 |
2315ea103259SMichael Clark         ((inst << 55) >> 63) << 10 |
2316ea103259SMichael Clark         ((inst << 56) >> 63) << 6 |
2317ea103259SMichael Clark         ((inst << 57) >> 63) << 7 |
2318ea103259SMichael Clark         ((inst << 58) >> 61) << 1 |
2319ea103259SMichael Clark         ((inst << 61) >> 63) << 5;
2320ea103259SMichael Clark }
2321ea103259SMichael Clark 
2322ea103259SMichael Clark static int32_t operand_cimmb(rv_inst inst)
2323ea103259SMichael Clark {
2324ea103259SMichael Clark     return (((int64_t)inst << 51) >> 63) << 8 |
2325ea103259SMichael Clark         ((inst << 52) >> 62) << 3 |
2326ea103259SMichael Clark         ((inst << 57) >> 62) << 6 |
2327ea103259SMichael Clark         ((inst << 59) >> 62) << 1 |
2328ea103259SMichael Clark         ((inst << 61) >> 63) << 5;
2329ea103259SMichael Clark }
2330ea103259SMichael Clark 
2331ea103259SMichael Clark static uint32_t operand_cimmswsp(rv_inst inst)
2332ea103259SMichael Clark {
2333ea103259SMichael Clark     return ((inst << 51) >> 60) << 2 |
2334ea103259SMichael Clark         ((inst << 55) >> 62) << 6;
2335ea103259SMichael Clark }
2336ea103259SMichael Clark 
2337ea103259SMichael Clark static uint32_t operand_cimmsdsp(rv_inst inst)
2338ea103259SMichael Clark {
2339ea103259SMichael Clark     return ((inst << 51) >> 61) << 3 |
2340ea103259SMichael Clark         ((inst << 54) >> 61) << 6;
2341ea103259SMichael Clark }
2342ea103259SMichael Clark 
2343ea103259SMichael Clark static uint32_t operand_cimmsqsp(rv_inst inst)
2344ea103259SMichael Clark {
2345ea103259SMichael Clark     return ((inst << 51) >> 62) << 4 |
2346ea103259SMichael Clark         ((inst << 53) >> 60) << 6;
2347ea103259SMichael Clark }
2348ea103259SMichael Clark 
2349ea103259SMichael Clark static uint32_t operand_cimm4spn(rv_inst inst)
2350ea103259SMichael Clark {
2351ea103259SMichael Clark     return ((inst << 51) >> 62) << 4 |
2352ea103259SMichael Clark         ((inst << 53) >> 60) << 6 |
2353ea103259SMichael Clark         ((inst << 57) >> 63) << 2 |
2354ea103259SMichael Clark         ((inst << 58) >> 63) << 3;
2355ea103259SMichael Clark }
2356ea103259SMichael Clark 
2357ea103259SMichael Clark static uint32_t operand_cimmw(rv_inst inst)
2358ea103259SMichael Clark {
2359ea103259SMichael Clark     return ((inst << 51) >> 61) << 3 |
2360ea103259SMichael Clark         ((inst << 57) >> 63) << 2 |
2361ea103259SMichael Clark         ((inst << 58) >> 63) << 6;
2362ea103259SMichael Clark }
2363ea103259SMichael Clark 
2364ea103259SMichael Clark static uint32_t operand_cimmd(rv_inst inst)
2365ea103259SMichael Clark {
2366ea103259SMichael Clark     return ((inst << 51) >> 61) << 3 |
2367ea103259SMichael Clark         ((inst << 57) >> 62) << 6;
2368ea103259SMichael Clark }
2369ea103259SMichael Clark 
2370ea103259SMichael Clark static uint32_t operand_cimmq(rv_inst inst)
2371ea103259SMichael Clark {
2372ea103259SMichael Clark     return ((inst << 51) >> 62) << 4 |
2373ea103259SMichael Clark         ((inst << 53) >> 63) << 8 |
2374ea103259SMichael Clark         ((inst << 57) >> 62) << 6;
2375ea103259SMichael Clark }
2376ea103259SMichael Clark 
2377ea103259SMichael Clark /* decode operands */
2378ea103259SMichael Clark 
2379ea103259SMichael Clark static void decode_inst_operands(rv_decode *dec)
2380ea103259SMichael Clark {
2381ea103259SMichael Clark     rv_inst inst = dec->inst;
2382ea103259SMichael Clark     dec->codec = opcode_data[dec->op].codec;
2383ea103259SMichael Clark     switch (dec->codec) {
2384ea103259SMichael Clark     case rv_codec_none:
2385ea103259SMichael Clark         dec->rd = dec->rs1 = dec->rs2 = rv_ireg_zero;
2386ea103259SMichael Clark         dec->imm = 0;
2387ea103259SMichael Clark         break;
2388ea103259SMichael Clark     case rv_codec_u:
2389ea103259SMichael Clark         dec->rd = operand_rd(inst);
2390ea103259SMichael Clark         dec->rs1 = dec->rs2 = rv_ireg_zero;
2391ea103259SMichael Clark         dec->imm = operand_imm20(inst);
2392ea103259SMichael Clark         break;
2393ea103259SMichael Clark     case rv_codec_uj:
2394ea103259SMichael Clark         dec->rd = operand_rd(inst);
2395ea103259SMichael Clark         dec->rs1 = dec->rs2 = rv_ireg_zero;
2396ea103259SMichael Clark         dec->imm = operand_jimm20(inst);
2397ea103259SMichael Clark         break;
2398ea103259SMichael Clark     case rv_codec_i:
2399ea103259SMichael Clark         dec->rd = operand_rd(inst);
2400ea103259SMichael Clark         dec->rs1 = operand_rs1(inst);
2401ea103259SMichael Clark         dec->rs2 = rv_ireg_zero;
2402ea103259SMichael Clark         dec->imm = operand_imm12(inst);
2403ea103259SMichael Clark         break;
2404ea103259SMichael Clark     case rv_codec_i_sh5:
2405ea103259SMichael Clark         dec->rd = operand_rd(inst);
2406ea103259SMichael Clark         dec->rs1 = operand_rs1(inst);
2407ea103259SMichael Clark         dec->rs2 = rv_ireg_zero;
2408ea103259SMichael Clark         dec->imm = operand_shamt5(inst);
2409ea103259SMichael Clark         break;
2410ea103259SMichael Clark     case rv_codec_i_sh6:
2411ea103259SMichael Clark         dec->rd = operand_rd(inst);
2412ea103259SMichael Clark         dec->rs1 = operand_rs1(inst);
2413ea103259SMichael Clark         dec->rs2 = rv_ireg_zero;
2414ea103259SMichael Clark         dec->imm = operand_shamt6(inst);
2415ea103259SMichael Clark         break;
2416ea103259SMichael Clark     case rv_codec_i_sh7:
2417ea103259SMichael Clark         dec->rd = operand_rd(inst);
2418ea103259SMichael Clark         dec->rs1 = operand_rs1(inst);
2419ea103259SMichael Clark         dec->rs2 = rv_ireg_zero;
2420ea103259SMichael Clark         dec->imm = operand_shamt7(inst);
2421ea103259SMichael Clark         break;
2422ea103259SMichael Clark     case rv_codec_i_csr:
2423ea103259SMichael Clark         dec->rd = operand_rd(inst);
2424ea103259SMichael Clark         dec->rs1 = operand_rs1(inst);
2425ea103259SMichael Clark         dec->rs2 = rv_ireg_zero;
2426ea103259SMichael Clark         dec->imm = operand_csr12(inst);
2427ea103259SMichael Clark         break;
2428ea103259SMichael Clark     case rv_codec_s:
2429ea103259SMichael Clark         dec->rd = rv_ireg_zero;
2430ea103259SMichael Clark         dec->rs1 = operand_rs1(inst);
2431ea103259SMichael Clark         dec->rs2 = operand_rs2(inst);
2432ea103259SMichael Clark         dec->imm = operand_simm12(inst);
2433ea103259SMichael Clark         break;
2434ea103259SMichael Clark     case rv_codec_sb:
2435ea103259SMichael Clark         dec->rd = rv_ireg_zero;
2436ea103259SMichael Clark         dec->rs1 = operand_rs1(inst);
2437ea103259SMichael Clark         dec->rs2 = operand_rs2(inst);
2438ea103259SMichael Clark         dec->imm = operand_sbimm12(inst);
2439ea103259SMichael Clark         break;
2440ea103259SMichael Clark     case rv_codec_r:
2441ea103259SMichael Clark         dec->rd = operand_rd(inst);
2442ea103259SMichael Clark         dec->rs1 = operand_rs1(inst);
2443ea103259SMichael Clark         dec->rs2 = operand_rs2(inst);
2444ea103259SMichael Clark         dec->imm = 0;
2445ea103259SMichael Clark         break;
2446ea103259SMichael Clark     case rv_codec_r_m:
2447ea103259SMichael Clark         dec->rd = operand_rd(inst);
2448ea103259SMichael Clark         dec->rs1 = operand_rs1(inst);
2449ea103259SMichael Clark         dec->rs2 = operand_rs2(inst);
2450ea103259SMichael Clark         dec->imm = 0;
2451ea103259SMichael Clark         dec->rm = operand_rm(inst);
2452ea103259SMichael Clark         break;
2453ea103259SMichael Clark     case rv_codec_r4_m:
2454ea103259SMichael Clark         dec->rd = operand_rd(inst);
2455ea103259SMichael Clark         dec->rs1 = operand_rs1(inst);
2456ea103259SMichael Clark         dec->rs2 = operand_rs2(inst);
2457ea103259SMichael Clark         dec->rs3 = operand_rs3(inst);
2458ea103259SMichael Clark         dec->imm = 0;
2459ea103259SMichael Clark         dec->rm = operand_rm(inst);
2460ea103259SMichael Clark         break;
2461ea103259SMichael Clark     case rv_codec_r_a:
2462ea103259SMichael Clark         dec->rd = operand_rd(inst);
2463ea103259SMichael Clark         dec->rs1 = operand_rs1(inst);
2464ea103259SMichael Clark         dec->rs2 = operand_rs2(inst);
2465ea103259SMichael Clark         dec->imm = 0;
2466ea103259SMichael Clark         dec->aq = operand_aq(inst);
2467ea103259SMichael Clark         dec->rl = operand_rl(inst);
2468ea103259SMichael Clark         break;
2469ea103259SMichael Clark     case rv_codec_r_l:
2470ea103259SMichael Clark         dec->rd = operand_rd(inst);
2471ea103259SMichael Clark         dec->rs1 = operand_rs1(inst);
2472ea103259SMichael Clark         dec->rs2 = rv_ireg_zero;
2473ea103259SMichael Clark         dec->imm = 0;
2474ea103259SMichael Clark         dec->aq = operand_aq(inst);
2475ea103259SMichael Clark         dec->rl = operand_rl(inst);
2476ea103259SMichael Clark         break;
2477ea103259SMichael Clark     case rv_codec_r_f:
2478ea103259SMichael Clark         dec->rd = dec->rs1 = dec->rs2 = rv_ireg_zero;
2479ea103259SMichael Clark         dec->pred = operand_pred(inst);
2480ea103259SMichael Clark         dec->succ = operand_succ(inst);
2481ea103259SMichael Clark         dec->imm = 0;
2482ea103259SMichael Clark         break;
2483ea103259SMichael Clark     case rv_codec_cb:
2484ea103259SMichael Clark         dec->rd = rv_ireg_zero;
2485ea103259SMichael Clark         dec->rs1 = operand_crs1q(inst) + 8;
2486ea103259SMichael Clark         dec->rs2 = rv_ireg_zero;
2487ea103259SMichael Clark         dec->imm = operand_cimmb(inst);
2488ea103259SMichael Clark         break;
2489ea103259SMichael Clark     case rv_codec_cb_imm:
2490ea103259SMichael Clark         dec->rd = dec->rs1 = operand_crs1rdq(inst) + 8;
2491ea103259SMichael Clark         dec->rs2 = rv_ireg_zero;
2492ea103259SMichael Clark         dec->imm = operand_cimmi(inst);
2493ea103259SMichael Clark         break;
2494ea103259SMichael Clark     case rv_codec_cb_sh5:
2495ea103259SMichael Clark         dec->rd = dec->rs1 = operand_crs1rdq(inst) + 8;
2496ea103259SMichael Clark         dec->rs2 = rv_ireg_zero;
2497ea103259SMichael Clark         dec->imm = operand_cimmsh5(inst);
2498ea103259SMichael Clark         break;
2499ea103259SMichael Clark     case rv_codec_cb_sh6:
2500ea103259SMichael Clark         dec->rd = dec->rs1 = operand_crs1rdq(inst) + 8;
2501ea103259SMichael Clark         dec->rs2 = rv_ireg_zero;
2502ea103259SMichael Clark         dec->imm = operand_cimmsh6(inst);
2503ea103259SMichael Clark         break;
2504ea103259SMichael Clark     case rv_codec_ci:
2505ea103259SMichael Clark         dec->rd = dec->rs1 = operand_crs1rd(inst);
2506ea103259SMichael Clark         dec->rs2 = rv_ireg_zero;
2507ea103259SMichael Clark         dec->imm = operand_cimmi(inst);
2508ea103259SMichael Clark         break;
2509ea103259SMichael Clark     case rv_codec_ci_sh5:
2510ea103259SMichael Clark         dec->rd = dec->rs1 = operand_crs1rd(inst);
2511ea103259SMichael Clark         dec->rs2 = rv_ireg_zero;
2512ea103259SMichael Clark         dec->imm = operand_cimmsh5(inst);
2513ea103259SMichael Clark         break;
2514ea103259SMichael Clark     case rv_codec_ci_sh6:
2515ea103259SMichael Clark         dec->rd = dec->rs1 = operand_crs1rd(inst);
2516ea103259SMichael Clark         dec->rs2 = rv_ireg_zero;
2517ea103259SMichael Clark         dec->imm = operand_cimmsh6(inst);
2518ea103259SMichael Clark         break;
2519ea103259SMichael Clark     case rv_codec_ci_16sp:
2520ea103259SMichael Clark         dec->rd = rv_ireg_sp;
2521ea103259SMichael Clark         dec->rs1 = rv_ireg_sp;
2522ea103259SMichael Clark         dec->rs2 = rv_ireg_zero;
2523ea103259SMichael Clark         dec->imm = operand_cimm16sp(inst);
2524ea103259SMichael Clark         break;
2525ea103259SMichael Clark     case rv_codec_ci_lwsp:
2526ea103259SMichael Clark         dec->rd = operand_crd(inst);
2527ea103259SMichael Clark         dec->rs1 = rv_ireg_sp;
2528ea103259SMichael Clark         dec->rs2 = rv_ireg_zero;
2529ea103259SMichael Clark         dec->imm = operand_cimmlwsp(inst);
2530ea103259SMichael Clark         break;
2531ea103259SMichael Clark     case rv_codec_ci_ldsp:
2532ea103259SMichael Clark         dec->rd = operand_crd(inst);
2533ea103259SMichael Clark         dec->rs1 = rv_ireg_sp;
2534ea103259SMichael Clark         dec->rs2 = rv_ireg_zero;
2535ea103259SMichael Clark         dec->imm = operand_cimmldsp(inst);
2536ea103259SMichael Clark         break;
2537ea103259SMichael Clark     case rv_codec_ci_lqsp:
2538ea103259SMichael Clark         dec->rd = operand_crd(inst);
2539ea103259SMichael Clark         dec->rs1 = rv_ireg_sp;
2540ea103259SMichael Clark         dec->rs2 = rv_ireg_zero;
2541ea103259SMichael Clark         dec->imm = operand_cimmlqsp(inst);
2542ea103259SMichael Clark         break;
2543ea103259SMichael Clark     case rv_codec_ci_li:
2544ea103259SMichael Clark         dec->rd = operand_crd(inst);
2545ea103259SMichael Clark         dec->rs1 = rv_ireg_zero;
2546ea103259SMichael Clark         dec->rs2 = rv_ireg_zero;
2547ea103259SMichael Clark         dec->imm = operand_cimmi(inst);
2548ea103259SMichael Clark         break;
2549ea103259SMichael Clark     case rv_codec_ci_lui:
2550ea103259SMichael Clark         dec->rd = operand_crd(inst);
2551ea103259SMichael Clark         dec->rs1 = rv_ireg_zero;
2552ea103259SMichael Clark         dec->rs2 = rv_ireg_zero;
2553ea103259SMichael Clark         dec->imm = operand_cimmui(inst);
2554ea103259SMichael Clark         break;
2555ea103259SMichael Clark     case rv_codec_ci_none:
2556ea103259SMichael Clark         dec->rd = dec->rs1 = dec->rs2 = rv_ireg_zero;
2557ea103259SMichael Clark         dec->imm = 0;
2558ea103259SMichael Clark         break;
2559ea103259SMichael Clark     case rv_codec_ciw_4spn:
2560ea103259SMichael Clark         dec->rd = operand_crdq(inst) + 8;
2561ea103259SMichael Clark         dec->rs1 = rv_ireg_sp;
2562ea103259SMichael Clark         dec->rs2 = rv_ireg_zero;
2563ea103259SMichael Clark         dec->imm = operand_cimm4spn(inst);
2564ea103259SMichael Clark         break;
2565ea103259SMichael Clark     case rv_codec_cj:
2566ea103259SMichael Clark         dec->rd = dec->rs1 = dec->rs2 = rv_ireg_zero;
2567ea103259SMichael Clark         dec->imm = operand_cimmj(inst);
2568ea103259SMichael Clark         break;
2569ea103259SMichael Clark     case rv_codec_cj_jal:
2570ea103259SMichael Clark         dec->rd = rv_ireg_ra;
2571ea103259SMichael Clark         dec->rs1 = dec->rs2 = rv_ireg_zero;
2572ea103259SMichael Clark         dec->imm = operand_cimmj(inst);
2573ea103259SMichael Clark         break;
2574ea103259SMichael Clark     case rv_codec_cl_lw:
2575ea103259SMichael Clark         dec->rd = operand_crdq(inst) + 8;
2576ea103259SMichael Clark         dec->rs1 = operand_crs1q(inst) + 8;
2577ea103259SMichael Clark         dec->rs2 = rv_ireg_zero;
2578ea103259SMichael Clark         dec->imm = operand_cimmw(inst);
2579ea103259SMichael Clark         break;
2580ea103259SMichael Clark     case rv_codec_cl_ld:
2581ea103259SMichael Clark         dec->rd = operand_crdq(inst) + 8;
2582ea103259SMichael Clark         dec->rs1 = operand_crs1q(inst) + 8;
2583ea103259SMichael Clark         dec->rs2 = rv_ireg_zero;
2584ea103259SMichael Clark         dec->imm = operand_cimmd(inst);
2585ea103259SMichael Clark         break;
2586ea103259SMichael Clark     case rv_codec_cl_lq:
2587ea103259SMichael Clark         dec->rd = operand_crdq(inst) + 8;
2588ea103259SMichael Clark         dec->rs1 = operand_crs1q(inst) + 8;
2589ea103259SMichael Clark         dec->rs2 = rv_ireg_zero;
2590ea103259SMichael Clark         dec->imm = operand_cimmq(inst);
2591ea103259SMichael Clark         break;
2592ea103259SMichael Clark     case rv_codec_cr:
2593ea103259SMichael Clark         dec->rd = dec->rs1 = operand_crs1rd(inst);
2594ea103259SMichael Clark         dec->rs2 = operand_crs2(inst);
2595ea103259SMichael Clark         dec->imm = 0;
2596ea103259SMichael Clark         break;
2597ea103259SMichael Clark     case rv_codec_cr_mv:
2598ea103259SMichael Clark         dec->rd = operand_crd(inst);
2599ea103259SMichael Clark         dec->rs1 = operand_crs2(inst);
2600ea103259SMichael Clark         dec->rs2 = rv_ireg_zero;
2601ea103259SMichael Clark         dec->imm = 0;
2602ea103259SMichael Clark         break;
2603ea103259SMichael Clark     case rv_codec_cr_jalr:
2604ea103259SMichael Clark         dec->rd = rv_ireg_ra;
2605ea103259SMichael Clark         dec->rs1 = operand_crs1(inst);
2606ea103259SMichael Clark         dec->rs2 = rv_ireg_zero;
2607ea103259SMichael Clark         dec->imm = 0;
2608ea103259SMichael Clark         break;
2609ea103259SMichael Clark     case rv_codec_cr_jr:
2610ea103259SMichael Clark         dec->rd = rv_ireg_zero;
2611ea103259SMichael Clark         dec->rs1 = operand_crs1(inst);
2612ea103259SMichael Clark         dec->rs2 = rv_ireg_zero;
2613ea103259SMichael Clark         dec->imm = 0;
2614ea103259SMichael Clark         break;
2615ea103259SMichael Clark     case rv_codec_cs:
2616ea103259SMichael Clark         dec->rd = dec->rs1 = operand_crs1rdq(inst) + 8;
2617ea103259SMichael Clark         dec->rs2 = operand_crs2q(inst) + 8;
2618ea103259SMichael Clark         dec->imm = 0;
2619ea103259SMichael Clark         break;
2620ea103259SMichael Clark     case rv_codec_cs_sw:
2621ea103259SMichael Clark         dec->rd = rv_ireg_zero;
2622ea103259SMichael Clark         dec->rs1 = operand_crs1q(inst) + 8;
2623ea103259SMichael Clark         dec->rs2 = operand_crs2q(inst) + 8;
2624ea103259SMichael Clark         dec->imm = operand_cimmw(inst);
2625ea103259SMichael Clark         break;
2626ea103259SMichael Clark     case rv_codec_cs_sd:
2627ea103259SMichael Clark         dec->rd = rv_ireg_zero;
2628ea103259SMichael Clark         dec->rs1 = operand_crs1q(inst) + 8;
2629ea103259SMichael Clark         dec->rs2 = operand_crs2q(inst) + 8;
2630ea103259SMichael Clark         dec->imm = operand_cimmd(inst);
2631ea103259SMichael Clark         break;
2632ea103259SMichael Clark     case rv_codec_cs_sq:
2633ea103259SMichael Clark         dec->rd = rv_ireg_zero;
2634ea103259SMichael Clark         dec->rs1 = operand_crs1q(inst) + 8;
2635ea103259SMichael Clark         dec->rs2 = operand_crs2q(inst) + 8;
2636ea103259SMichael Clark         dec->imm = operand_cimmq(inst);
2637ea103259SMichael Clark         break;
2638ea103259SMichael Clark     case rv_codec_css_swsp:
2639ea103259SMichael Clark         dec->rd = rv_ireg_zero;
2640ea103259SMichael Clark         dec->rs1 = rv_ireg_sp;
2641ea103259SMichael Clark         dec->rs2 = operand_crs2(inst);
2642ea103259SMichael Clark         dec->imm = operand_cimmswsp(inst);
2643ea103259SMichael Clark         break;
2644ea103259SMichael Clark     case rv_codec_css_sdsp:
2645ea103259SMichael Clark         dec->rd = rv_ireg_zero;
2646ea103259SMichael Clark         dec->rs1 = rv_ireg_sp;
2647ea103259SMichael Clark         dec->rs2 = operand_crs2(inst);
2648ea103259SMichael Clark         dec->imm = operand_cimmsdsp(inst);
2649ea103259SMichael Clark         break;
2650ea103259SMichael Clark     case rv_codec_css_sqsp:
2651ea103259SMichael Clark         dec->rd = rv_ireg_zero;
2652ea103259SMichael Clark         dec->rs1 = rv_ireg_sp;
2653ea103259SMichael Clark         dec->rs2 = operand_crs2(inst);
2654ea103259SMichael Clark         dec->imm = operand_cimmsqsp(inst);
2655ea103259SMichael Clark         break;
2656ea103259SMichael Clark     };
2657ea103259SMichael Clark }
2658ea103259SMichael Clark 
2659ea103259SMichael Clark /* check constraint */
2660ea103259SMichael Clark 
2661ea103259SMichael Clark static bool check_constraints(rv_decode *dec, const rvc_constraint *c)
2662ea103259SMichael Clark {
2663ea103259SMichael Clark     int32_t imm = dec->imm;
2664ea103259SMichael Clark     uint8_t rd = dec->rd, rs1 = dec->rs1, rs2 = dec->rs2;
2665ea103259SMichael Clark     while (*c != rvc_end) {
2666ea103259SMichael Clark         switch (*c) {
2667ea103259SMichael Clark         case rvc_rd_eq_ra:
2668ea103259SMichael Clark             if (!(rd == 1)) {
2669ea103259SMichael Clark                 return false;
2670ea103259SMichael Clark             }
2671ea103259SMichael Clark             break;
2672ea103259SMichael Clark         case rvc_rd_eq_x0:
2673ea103259SMichael Clark             if (!(rd == 0)) {
2674ea103259SMichael Clark                 return false;
2675ea103259SMichael Clark             }
2676ea103259SMichael Clark             break;
2677ea103259SMichael Clark         case rvc_rs1_eq_x0:
2678ea103259SMichael Clark             if (!(rs1 == 0)) {
2679ea103259SMichael Clark                 return false;
2680ea103259SMichael Clark             }
2681ea103259SMichael Clark             break;
2682ea103259SMichael Clark         case rvc_rs2_eq_x0:
2683ea103259SMichael Clark             if (!(rs2 == 0)) {
2684ea103259SMichael Clark                 return false;
2685ea103259SMichael Clark             }
2686ea103259SMichael Clark             break;
2687ea103259SMichael Clark         case rvc_rs2_eq_rs1:
2688ea103259SMichael Clark             if (!(rs2 == rs1)) {
2689ea103259SMichael Clark                 return false;
2690ea103259SMichael Clark             }
2691ea103259SMichael Clark             break;
2692ea103259SMichael Clark         case rvc_rs1_eq_ra:
2693ea103259SMichael Clark             if (!(rs1 == 1)) {
2694ea103259SMichael Clark                 return false;
2695ea103259SMichael Clark             }
2696ea103259SMichael Clark             break;
2697ea103259SMichael Clark         case rvc_imm_eq_zero:
2698ea103259SMichael Clark             if (!(imm == 0)) {
2699ea103259SMichael Clark                 return false;
2700ea103259SMichael Clark             }
2701ea103259SMichael Clark             break;
2702ea103259SMichael Clark         case rvc_imm_eq_n1:
2703ea103259SMichael Clark             if (!(imm == -1)) {
2704ea103259SMichael Clark                 return false;
2705ea103259SMichael Clark             }
2706ea103259SMichael Clark             break;
2707ea103259SMichael Clark         case rvc_imm_eq_p1:
2708ea103259SMichael Clark             if (!(imm == 1)) {
2709ea103259SMichael Clark                 return false;
2710ea103259SMichael Clark             }
2711ea103259SMichael Clark             break;
2712ea103259SMichael Clark         case rvc_csr_eq_0x001:
2713ea103259SMichael Clark             if (!(imm == 0x001)) {
2714ea103259SMichael Clark                 return false;
2715ea103259SMichael Clark             }
2716ea103259SMichael Clark             break;
2717ea103259SMichael Clark         case rvc_csr_eq_0x002:
2718ea103259SMichael Clark             if (!(imm == 0x002)) {
2719ea103259SMichael Clark                 return false;
2720ea103259SMichael Clark             }
2721ea103259SMichael Clark             break;
2722ea103259SMichael Clark         case rvc_csr_eq_0x003:
2723ea103259SMichael Clark             if (!(imm == 0x003)) {
2724ea103259SMichael Clark                 return false;
2725ea103259SMichael Clark             }
2726ea103259SMichael Clark             break;
2727ea103259SMichael Clark         case rvc_csr_eq_0xc00:
2728ea103259SMichael Clark             if (!(imm == 0xc00)) {
2729ea103259SMichael Clark                 return false;
2730ea103259SMichael Clark             }
2731ea103259SMichael Clark             break;
2732ea103259SMichael Clark         case rvc_csr_eq_0xc01:
2733ea103259SMichael Clark             if (!(imm == 0xc01)) {
2734ea103259SMichael Clark                 return false;
2735ea103259SMichael Clark             }
2736ea103259SMichael Clark             break;
2737ea103259SMichael Clark         case rvc_csr_eq_0xc02:
2738ea103259SMichael Clark             if (!(imm == 0xc02)) {
2739ea103259SMichael Clark                 return false;
2740ea103259SMichael Clark             }
2741ea103259SMichael Clark             break;
2742ea103259SMichael Clark         case rvc_csr_eq_0xc80:
2743ea103259SMichael Clark             if (!(imm == 0xc80)) {
2744ea103259SMichael Clark                 return false;
2745ea103259SMichael Clark             }
2746ea103259SMichael Clark             break;
2747ea103259SMichael Clark         case rvc_csr_eq_0xc81:
2748ea103259SMichael Clark             if (!(imm == 0xc81)) {
2749ea103259SMichael Clark                 return false;
2750ea103259SMichael Clark             }
2751ea103259SMichael Clark             break;
2752ea103259SMichael Clark         case rvc_csr_eq_0xc82:
2753ea103259SMichael Clark             if (!(imm == 0xc82)) {
2754ea103259SMichael Clark                 return false;
2755ea103259SMichael Clark             }
2756ea103259SMichael Clark             break;
2757ea103259SMichael Clark         default: break;
2758ea103259SMichael Clark         }
2759ea103259SMichael Clark         c++;
2760ea103259SMichael Clark     }
2761ea103259SMichael Clark     return true;
2762ea103259SMichael Clark }
2763ea103259SMichael Clark 
2764ea103259SMichael Clark /* instruction length */
2765ea103259SMichael Clark 
2766ea103259SMichael Clark static size_t inst_length(rv_inst inst)
2767ea103259SMichael Clark {
2768ea103259SMichael Clark     /* NOTE: supports maximum instruction size of 64-bits */
2769ea103259SMichael Clark 
2770ea103259SMichael Clark     /* instruction length coding
2771ea103259SMichael Clark      *
2772ea103259SMichael Clark      *      aa - 16 bit aa != 11
2773ea103259SMichael Clark      *   bbb11 - 32 bit bbb != 111
2774ea103259SMichael Clark      *  011111 - 48 bit
2775ea103259SMichael Clark      * 0111111 - 64 bit
2776ea103259SMichael Clark      */
2777ea103259SMichael Clark 
2778ea103259SMichael Clark     return (inst &      0b11) != 0b11      ? 2
2779ea103259SMichael Clark          : (inst &   0b11100) != 0b11100   ? 4
2780ea103259SMichael Clark          : (inst &  0b111111) == 0b011111  ? 6
2781ea103259SMichael Clark          : (inst & 0b1111111) == 0b0111111 ? 8
2782ea103259SMichael Clark          : 0;
2783ea103259SMichael Clark }
2784ea103259SMichael Clark 
2785ea103259SMichael Clark /* format instruction */
2786ea103259SMichael Clark 
2787ea103259SMichael Clark static void append(char *s1, const char *s2, size_t n)
2788ea103259SMichael Clark {
2789ea103259SMichael Clark     size_t l1 = strlen(s1);
2790ea103259SMichael Clark     if (n - l1 - 1 > 0) {
2791ea103259SMichael Clark         strncat(s1, s2, n - l1);
2792ea103259SMichael Clark     }
2793ea103259SMichael Clark }
2794ea103259SMichael Clark 
2795ea103259SMichael Clark static void format_inst(char *buf, size_t buflen, size_t tab, rv_decode *dec)
2796ea103259SMichael Clark {
2797ea103259SMichael Clark     char tmp[64];
2798ea103259SMichael Clark     const char *fmt;
2799ea103259SMichael Clark 
2800ea103259SMichael Clark     fmt = opcode_data[dec->op].format;
2801ea103259SMichael Clark     while (*fmt) {
2802ea103259SMichael Clark         switch (*fmt) {
2803ea103259SMichael Clark         case 'O':
2804ea103259SMichael Clark             append(buf, opcode_data[dec->op].name, buflen);
2805ea103259SMichael Clark             break;
2806ea103259SMichael Clark         case '(':
2807ea103259SMichael Clark             append(buf, "(", buflen);
2808ea103259SMichael Clark             break;
2809ea103259SMichael Clark         case ',':
2810ea103259SMichael Clark             append(buf, ",", buflen);
2811ea103259SMichael Clark             break;
2812ea103259SMichael Clark         case ')':
2813ea103259SMichael Clark             append(buf, ")", buflen);
2814ea103259SMichael Clark             break;
2815ea103259SMichael Clark         case '0':
2816ea103259SMichael Clark             append(buf, rv_ireg_name_sym[dec->rd], buflen);
2817ea103259SMichael Clark             break;
2818ea103259SMichael Clark         case '1':
2819ea103259SMichael Clark             append(buf, rv_ireg_name_sym[dec->rs1], buflen);
2820ea103259SMichael Clark             break;
2821ea103259SMichael Clark         case '2':
2822ea103259SMichael Clark             append(buf, rv_ireg_name_sym[dec->rs2], buflen);
2823ea103259SMichael Clark             break;
2824ea103259SMichael Clark         case '3':
2825ea103259SMichael Clark             append(buf, rv_freg_name_sym[dec->rd], buflen);
2826ea103259SMichael Clark             break;
2827ea103259SMichael Clark         case '4':
2828ea103259SMichael Clark             append(buf, rv_freg_name_sym[dec->rs1], buflen);
2829ea103259SMichael Clark             break;
2830ea103259SMichael Clark         case '5':
2831ea103259SMichael Clark             append(buf, rv_freg_name_sym[dec->rs2], buflen);
2832ea103259SMichael Clark             break;
2833ea103259SMichael Clark         case '6':
2834ea103259SMichael Clark             append(buf, rv_freg_name_sym[dec->rs3], buflen);
2835ea103259SMichael Clark             break;
2836ea103259SMichael Clark         case '7':
2837ea103259SMichael Clark             snprintf(tmp, sizeof(tmp), "%d", dec->rs1);
2838ea103259SMichael Clark             append(buf, tmp, buflen);
2839ea103259SMichael Clark             break;
2840ea103259SMichael Clark         case 'i':
2841ea103259SMichael Clark             snprintf(tmp, sizeof(tmp), "%d", dec->imm);
2842ea103259SMichael Clark             append(buf, tmp, buflen);
2843ea103259SMichael Clark             break;
2844ea103259SMichael Clark         case 'o':
2845ea103259SMichael Clark             snprintf(tmp, sizeof(tmp), "%d", dec->imm);
2846ea103259SMichael Clark             append(buf, tmp, buflen);
2847ea103259SMichael Clark             while (strlen(buf) < tab * 2) {
2848ea103259SMichael Clark                 append(buf, " ", buflen);
2849ea103259SMichael Clark             }
2850ea103259SMichael Clark             snprintf(tmp, sizeof(tmp), "# 0x%" PRIx64,
2851ea103259SMichael Clark                 dec->pc + dec->imm);
2852ea103259SMichael Clark             append(buf, tmp, buflen);
2853ea103259SMichael Clark             break;
2854ea103259SMichael Clark         case 'c': {
2855ea103259SMichael Clark             const char *name = csr_name(dec->imm & 0xfff);
2856ea103259SMichael Clark             if (name) {
2857ea103259SMichael Clark                 append(buf, name, buflen);
2858ea103259SMichael Clark             } else {
2859ea103259SMichael Clark                 snprintf(tmp, sizeof(tmp), "0x%03x", dec->imm & 0xfff);
2860ea103259SMichael Clark                 append(buf, tmp, buflen);
2861ea103259SMichael Clark             }
2862ea103259SMichael Clark             break;
2863ea103259SMichael Clark         }
2864ea103259SMichael Clark         case 'r':
2865ea103259SMichael Clark             switch (dec->rm) {
2866ea103259SMichael Clark             case rv_rm_rne:
2867ea103259SMichael Clark                 append(buf, "rne", buflen);
2868ea103259SMichael Clark                 break;
2869ea103259SMichael Clark             case rv_rm_rtz:
2870ea103259SMichael Clark                 append(buf, "rtz", buflen);
2871ea103259SMichael Clark                 break;
2872ea103259SMichael Clark             case rv_rm_rdn:
2873ea103259SMichael Clark                 append(buf, "rdn", buflen);
2874ea103259SMichael Clark                 break;
2875ea103259SMichael Clark             case rv_rm_rup:
2876ea103259SMichael Clark                 append(buf, "rup", buflen);
2877ea103259SMichael Clark                 break;
2878ea103259SMichael Clark             case rv_rm_rmm:
2879ea103259SMichael Clark                 append(buf, "rmm", buflen);
2880ea103259SMichael Clark                 break;
2881ea103259SMichael Clark             case rv_rm_dyn:
2882ea103259SMichael Clark                 append(buf, "dyn", buflen);
2883ea103259SMichael Clark                 break;
2884ea103259SMichael Clark             default:
2885ea103259SMichael Clark                 append(buf, "inv", buflen);
2886ea103259SMichael Clark                 break;
2887ea103259SMichael Clark             }
2888ea103259SMichael Clark             break;
2889ea103259SMichael Clark         case 'p':
2890ea103259SMichael Clark             if (dec->pred & rv_fence_i) {
2891ea103259SMichael Clark                 append(buf, "i", buflen);
2892ea103259SMichael Clark             }
2893ea103259SMichael Clark             if (dec->pred & rv_fence_o) {
2894ea103259SMichael Clark                 append(buf, "o", buflen);
2895ea103259SMichael Clark             }
2896ea103259SMichael Clark             if (dec->pred & rv_fence_r) {
2897ea103259SMichael Clark                 append(buf, "r", buflen);
2898ea103259SMichael Clark             }
2899ea103259SMichael Clark             if (dec->pred & rv_fence_w) {
2900ea103259SMichael Clark                 append(buf, "w", buflen);
2901ea103259SMichael Clark             }
2902ea103259SMichael Clark             break;
2903ea103259SMichael Clark         case 's':
2904ea103259SMichael Clark             if (dec->succ & rv_fence_i) {
2905ea103259SMichael Clark                 append(buf, "i", buflen);
2906ea103259SMichael Clark             }
2907ea103259SMichael Clark             if (dec->succ & rv_fence_o) {
2908ea103259SMichael Clark                 append(buf, "o", buflen);
2909ea103259SMichael Clark             }
2910ea103259SMichael Clark             if (dec->succ & rv_fence_r) {
2911ea103259SMichael Clark                 append(buf, "r", buflen);
2912ea103259SMichael Clark             }
2913ea103259SMichael Clark             if (dec->succ & rv_fence_w) {
2914ea103259SMichael Clark                 append(buf, "w", buflen);
2915ea103259SMichael Clark             }
2916ea103259SMichael Clark             break;
2917ea103259SMichael Clark         case '\t':
2918ea103259SMichael Clark             while (strlen(buf) < tab) {
2919ea103259SMichael Clark                 append(buf, " ", buflen);
2920ea103259SMichael Clark             }
2921ea103259SMichael Clark             break;
2922ea103259SMichael Clark         case 'A':
2923ea103259SMichael Clark             if (dec->aq) {
2924ea103259SMichael Clark                 append(buf, ".aq", buflen);
2925ea103259SMichael Clark             }
2926ea103259SMichael Clark             break;
2927ea103259SMichael Clark         case 'R':
2928ea103259SMichael Clark             if (dec->rl) {
2929ea103259SMichael Clark                 append(buf, ".rl", buflen);
2930ea103259SMichael Clark             }
2931ea103259SMichael Clark             break;
2932ea103259SMichael Clark         default:
2933ea103259SMichael Clark             break;
2934ea103259SMichael Clark         }
2935ea103259SMichael Clark         fmt++;
2936ea103259SMichael Clark     }
2937ea103259SMichael Clark }
2938ea103259SMichael Clark 
2939ea103259SMichael Clark /* lift instruction to pseudo-instruction */
2940ea103259SMichael Clark 
2941ea103259SMichael Clark static void decode_inst_lift_pseudo(rv_decode *dec)
2942ea103259SMichael Clark {
2943ea103259SMichael Clark     const rv_comp_data *comp_data = opcode_data[dec->op].pseudo;
2944ea103259SMichael Clark     if (!comp_data) {
2945ea103259SMichael Clark         return;
2946ea103259SMichael Clark     }
2947ea103259SMichael Clark     while (comp_data->constraints) {
2948ea103259SMichael Clark         if (check_constraints(dec, comp_data->constraints)) {
2949ea103259SMichael Clark             dec->op = comp_data->op;
2950ea103259SMichael Clark             dec->codec = opcode_data[dec->op].codec;
2951ea103259SMichael Clark             return;
2952ea103259SMichael Clark         }
2953ea103259SMichael Clark         comp_data++;
2954ea103259SMichael Clark     }
2955ea103259SMichael Clark }
2956ea103259SMichael Clark 
2957ea103259SMichael Clark /* decompress instruction */
2958ea103259SMichael Clark 
2959ea103259SMichael Clark static void decode_inst_decompress_rv32(rv_decode *dec)
2960ea103259SMichael Clark {
2961ea103259SMichael Clark     int decomp_op = opcode_data[dec->op].decomp_rv32;
2962ea103259SMichael Clark     if (decomp_op != rv_op_illegal) {
2963f88222daSMichael Clark         if ((opcode_data[dec->op].decomp_data & rvcd_imm_nz)
2964f88222daSMichael Clark             && dec->imm == 0) {
2965f88222daSMichael Clark             dec->op = rv_op_illegal;
2966f88222daSMichael Clark         } else {
2967ea103259SMichael Clark             dec->op = decomp_op;
2968ea103259SMichael Clark             dec->codec = opcode_data[decomp_op].codec;
2969ea103259SMichael Clark         }
2970ea103259SMichael Clark     }
2971f88222daSMichael Clark }
2972ea103259SMichael Clark 
2973ea103259SMichael Clark static void decode_inst_decompress_rv64(rv_decode *dec)
2974ea103259SMichael Clark {
2975ea103259SMichael Clark     int decomp_op = opcode_data[dec->op].decomp_rv64;
2976ea103259SMichael Clark     if (decomp_op != rv_op_illegal) {
2977f88222daSMichael Clark         if ((opcode_data[dec->op].decomp_data & rvcd_imm_nz)
2978f88222daSMichael Clark             && dec->imm == 0) {
2979f88222daSMichael Clark             dec->op = rv_op_illegal;
2980f88222daSMichael Clark         } else {
2981ea103259SMichael Clark             dec->op = decomp_op;
2982ea103259SMichael Clark             dec->codec = opcode_data[decomp_op].codec;
2983ea103259SMichael Clark         }
2984ea103259SMichael Clark     }
2985f88222daSMichael Clark }
2986ea103259SMichael Clark 
2987ea103259SMichael Clark static void decode_inst_decompress_rv128(rv_decode *dec)
2988ea103259SMichael Clark {
2989ea103259SMichael Clark     int decomp_op = opcode_data[dec->op].decomp_rv128;
2990ea103259SMichael Clark     if (decomp_op != rv_op_illegal) {
2991f88222daSMichael Clark         if ((opcode_data[dec->op].decomp_data & rvcd_imm_nz)
2992f88222daSMichael Clark             && dec->imm == 0) {
2993f88222daSMichael Clark             dec->op = rv_op_illegal;
2994f88222daSMichael Clark         } else {
2995ea103259SMichael Clark             dec->op = decomp_op;
2996ea103259SMichael Clark             dec->codec = opcode_data[decomp_op].codec;
2997ea103259SMichael Clark         }
2998ea103259SMichael Clark     }
2999f88222daSMichael Clark }
3000ea103259SMichael Clark 
3001ea103259SMichael Clark static void decode_inst_decompress(rv_decode *dec, rv_isa isa)
3002ea103259SMichael Clark {
3003ea103259SMichael Clark     switch (isa) {
3004ea103259SMichael Clark     case rv32:
3005ea103259SMichael Clark         decode_inst_decompress_rv32(dec);
3006ea103259SMichael Clark         break;
3007ea103259SMichael Clark     case rv64:
3008ea103259SMichael Clark         decode_inst_decompress_rv64(dec);
3009ea103259SMichael Clark         break;
3010ea103259SMichael Clark     case rv128:
3011ea103259SMichael Clark         decode_inst_decompress_rv128(dec);
3012ea103259SMichael Clark         break;
3013ea103259SMichael Clark     }
3014ea103259SMichael Clark }
3015ea103259SMichael Clark 
3016ea103259SMichael Clark /* disassemble instruction */
3017ea103259SMichael Clark 
3018ea103259SMichael Clark static void
3019ea103259SMichael Clark disasm_inst(char *buf, size_t buflen, rv_isa isa, uint64_t pc, rv_inst inst)
3020ea103259SMichael Clark {
3021ea103259SMichael Clark     rv_decode dec = { 0 };
3022ea103259SMichael Clark     dec.pc = pc;
3023ea103259SMichael Clark     dec.inst = inst;
3024ea103259SMichael Clark     decode_inst_opcode(&dec, isa);
3025ea103259SMichael Clark     decode_inst_operands(&dec);
3026ea103259SMichael Clark     decode_inst_decompress(&dec, isa);
3027ea103259SMichael Clark     decode_inst_lift_pseudo(&dec);
3028ea103259SMichael Clark     format_inst(buf, buflen, 16, &dec);
3029ea103259SMichael Clark }
3030ea103259SMichael Clark 
30316296a799SMichael Clark #define INST_FMT_2 "%04" PRIx64 "              "
30326296a799SMichael Clark #define INST_FMT_4 "%08" PRIx64 "          "
30336296a799SMichael Clark #define INST_FMT_6 "%012" PRIx64 "      "
30346296a799SMichael Clark #define INST_FMT_8 "%016" PRIx64 "  "
30356296a799SMichael Clark 
3036ea103259SMichael Clark static int
3037ea103259SMichael Clark print_insn_riscv(bfd_vma memaddr, struct disassemble_info *info, rv_isa isa)
3038ea103259SMichael Clark {
3039ea103259SMichael Clark     char buf[128] = { 0 };
3040ea103259SMichael Clark     bfd_byte packet[2];
3041ea103259SMichael Clark     rv_inst inst = 0;
3042ea103259SMichael Clark     size_t len = 2;
3043ea103259SMichael Clark     bfd_vma n;
3044ea103259SMichael Clark     int status;
3045ea103259SMichael Clark 
3046ea103259SMichael Clark     /* Instructions are made of 2-byte packets in little-endian order */
3047ea103259SMichael Clark     for (n = 0; n < len; n += 2) {
3048ea103259SMichael Clark         status = (*info->read_memory_func)(memaddr + n, packet, 2, info);
3049ea103259SMichael Clark         if (status != 0) {
3050ea103259SMichael Clark             /* Don't fail just because we fell off the end.  */
3051ea103259SMichael Clark             if (n > 0) {
3052ea103259SMichael Clark                 break;
3053ea103259SMichael Clark             }
3054ea103259SMichael Clark             (*info->memory_error_func)(status, memaddr, info);
3055ea103259SMichael Clark             return status;
3056ea103259SMichael Clark         }
3057ea103259SMichael Clark         inst |= ((rv_inst) bfd_getl16(packet)) << (8 * n);
3058ea103259SMichael Clark         if (n == 0) {
3059ea103259SMichael Clark             len = inst_length(inst);
3060ea103259SMichael Clark         }
3061ea103259SMichael Clark     }
3062ea103259SMichael Clark 
30636296a799SMichael Clark     switch (len) {
30646296a799SMichael Clark     case 2:
30656296a799SMichael Clark         (*info->fprintf_func)(info->stream, INST_FMT_2, inst);
30666296a799SMichael Clark         break;
30676296a799SMichael Clark     case 4:
30686296a799SMichael Clark         (*info->fprintf_func)(info->stream, INST_FMT_4, inst);
30696296a799SMichael Clark         break;
30706296a799SMichael Clark     case 6:
30716296a799SMichael Clark         (*info->fprintf_func)(info->stream, INST_FMT_6, inst);
30726296a799SMichael Clark         break;
30736296a799SMichael Clark     default:
30746296a799SMichael Clark         (*info->fprintf_func)(info->stream, INST_FMT_8, inst);
30756296a799SMichael Clark         break;
30766296a799SMichael Clark     }
30776296a799SMichael Clark 
3078ea103259SMichael Clark     disasm_inst(buf, sizeof(buf), isa, memaddr, inst);
3079ea103259SMichael Clark     (*info->fprintf_func)(info->stream, "%s", buf);
3080ea103259SMichael Clark 
3081ea103259SMichael Clark     return len;
3082ea103259SMichael Clark }
3083ea103259SMichael Clark 
3084ea103259SMichael Clark int print_insn_riscv32(bfd_vma memaddr, struct disassemble_info *info)
3085ea103259SMichael Clark {
3086ea103259SMichael Clark     return print_insn_riscv(memaddr, info, rv32);
3087ea103259SMichael Clark }
3088ea103259SMichael Clark 
3089ea103259SMichael Clark int print_insn_riscv64(bfd_vma memaddr, struct disassemble_info *info)
3090ea103259SMichael Clark {
3091ea103259SMichael Clark     return print_insn_riscv(memaddr, info, rv64);
3092ea103259SMichael Clark }
3093