xref: /qemu/disas/riscv-xthead.c (revision 3910de6f)
1318df723SChristoph Müllner /*
2318df723SChristoph Müllner  * QEMU RISC-V Disassembler for xthead.
3318df723SChristoph Müllner  *
4318df723SChristoph Müllner  * SPDX-License-Identifier: GPL-2.0-or-later
5318df723SChristoph Müllner  */
6318df723SChristoph Müllner 
73910de6fSPeter Maydell #include "qemu/osdep.h"
8318df723SChristoph Müllner #include "disas/riscv.h"
9318df723SChristoph Müllner #include "disas/riscv-xthead.h"
10318df723SChristoph Müllner 
11318df723SChristoph Müllner typedef enum {
12318df723SChristoph Müllner     /* 0 is reserved for rv_op_illegal. */
13318df723SChristoph Müllner     /* XTheadBa */
14318df723SChristoph Müllner     rv_op_th_addsl = 1,
15318df723SChristoph Müllner     /* XTheadBb */
16318df723SChristoph Müllner     rv_op_th_srri,
17318df723SChristoph Müllner     rv_op_th_srriw,
18318df723SChristoph Müllner     rv_op_th_ext,
19318df723SChristoph Müllner     rv_op_th_extu,
20318df723SChristoph Müllner     rv_op_th_ff0,
21318df723SChristoph Müllner     rv_op_th_ff1,
22318df723SChristoph Müllner     rv_op_th_rev,
23318df723SChristoph Müllner     rv_op_th_revw,
24318df723SChristoph Müllner     rv_op_th_tstnbz,
25318df723SChristoph Müllner     /* XTheadBs */
26318df723SChristoph Müllner     rv_op_th_tst,
27318df723SChristoph Müllner     /* XTheadCmo */
28318df723SChristoph Müllner     rv_op_th_dcache_call,
29318df723SChristoph Müllner     rv_op_th_dcache_ciall,
30318df723SChristoph Müllner     rv_op_th_dcache_iall,
31318df723SChristoph Müllner     rv_op_th_dcache_cpa,
32318df723SChristoph Müllner     rv_op_th_dcache_cipa,
33318df723SChristoph Müllner     rv_op_th_dcache_ipa,
34318df723SChristoph Müllner     rv_op_th_dcache_cva,
35318df723SChristoph Müllner     rv_op_th_dcache_civa,
36318df723SChristoph Müllner     rv_op_th_dcache_iva,
37318df723SChristoph Müllner     rv_op_th_dcache_csw,
38318df723SChristoph Müllner     rv_op_th_dcache_cisw,
39318df723SChristoph Müllner     rv_op_th_dcache_isw,
40318df723SChristoph Müllner     rv_op_th_dcache_cpal1,
41318df723SChristoph Müllner     rv_op_th_dcache_cval1,
42318df723SChristoph Müllner     rv_op_th_icache_iall,
43318df723SChristoph Müllner     rv_op_th_icache_ialls,
44318df723SChristoph Müllner     rv_op_th_icache_ipa,
45318df723SChristoph Müllner     rv_op_th_icache_iva,
46318df723SChristoph Müllner     rv_op_th_l2cache_call,
47318df723SChristoph Müllner     rv_op_th_l2cache_ciall,
48318df723SChristoph Müllner     rv_op_th_l2cache_iall,
49318df723SChristoph Müllner     /* XTheadCondMov */
50318df723SChristoph Müllner     rv_op_th_mveqz,
51318df723SChristoph Müllner     rv_op_th_mvnez,
52318df723SChristoph Müllner     /* XTheadFMemIdx */
53318df723SChristoph Müllner     rv_op_th_flrd,
54318df723SChristoph Müllner     rv_op_th_flrw,
55318df723SChristoph Müllner     rv_op_th_flurd,
56318df723SChristoph Müllner     rv_op_th_flurw,
57318df723SChristoph Müllner     rv_op_th_fsrd,
58318df723SChristoph Müllner     rv_op_th_fsrw,
59318df723SChristoph Müllner     rv_op_th_fsurd,
60318df723SChristoph Müllner     rv_op_th_fsurw,
61318df723SChristoph Müllner     /* XTheadFmv */
62318df723SChristoph Müllner     rv_op_th_fmv_hw_x,
63318df723SChristoph Müllner     rv_op_th_fmv_x_hw,
64318df723SChristoph Müllner     /* XTheadMac */
65318df723SChristoph Müllner     rv_op_th_mula,
66318df723SChristoph Müllner     rv_op_th_mulah,
67318df723SChristoph Müllner     rv_op_th_mulaw,
68318df723SChristoph Müllner     rv_op_th_muls,
69318df723SChristoph Müllner     rv_op_th_mulsw,
70318df723SChristoph Müllner     rv_op_th_mulsh,
71318df723SChristoph Müllner     /* XTheadMemIdx */
72318df723SChristoph Müllner     rv_op_th_lbia,
73318df723SChristoph Müllner     rv_op_th_lbib,
74318df723SChristoph Müllner     rv_op_th_lbuia,
75318df723SChristoph Müllner     rv_op_th_lbuib,
76318df723SChristoph Müllner     rv_op_th_lhia,
77318df723SChristoph Müllner     rv_op_th_lhib,
78318df723SChristoph Müllner     rv_op_th_lhuia,
79318df723SChristoph Müllner     rv_op_th_lhuib,
80318df723SChristoph Müllner     rv_op_th_lwia,
81318df723SChristoph Müllner     rv_op_th_lwib,
82318df723SChristoph Müllner     rv_op_th_lwuia,
83318df723SChristoph Müllner     rv_op_th_lwuib,
84318df723SChristoph Müllner     rv_op_th_ldia,
85318df723SChristoph Müllner     rv_op_th_ldib,
86318df723SChristoph Müllner     rv_op_th_sbia,
87318df723SChristoph Müllner     rv_op_th_sbib,
88318df723SChristoph Müllner     rv_op_th_shia,
89318df723SChristoph Müllner     rv_op_th_shib,
90318df723SChristoph Müllner     rv_op_th_swia,
91318df723SChristoph Müllner     rv_op_th_swib,
92318df723SChristoph Müllner     rv_op_th_sdia,
93318df723SChristoph Müllner     rv_op_th_sdib,
94318df723SChristoph Müllner     rv_op_th_lrb,
95318df723SChristoph Müllner     rv_op_th_lrbu,
96318df723SChristoph Müllner     rv_op_th_lrh,
97318df723SChristoph Müllner     rv_op_th_lrhu,
98318df723SChristoph Müllner     rv_op_th_lrw,
99318df723SChristoph Müllner     rv_op_th_lrwu,
100318df723SChristoph Müllner     rv_op_th_lrd,
101318df723SChristoph Müllner     rv_op_th_srb,
102318df723SChristoph Müllner     rv_op_th_srh,
103318df723SChristoph Müllner     rv_op_th_srw,
104318df723SChristoph Müllner     rv_op_th_srd,
105318df723SChristoph Müllner     rv_op_th_lurb,
106318df723SChristoph Müllner     rv_op_th_lurbu,
107318df723SChristoph Müllner     rv_op_th_lurh,
108318df723SChristoph Müllner     rv_op_th_lurhu,
109318df723SChristoph Müllner     rv_op_th_lurw,
110318df723SChristoph Müllner     rv_op_th_lurwu,
111318df723SChristoph Müllner     rv_op_th_lurd,
112318df723SChristoph Müllner     rv_op_th_surb,
113318df723SChristoph Müllner     rv_op_th_surh,
114318df723SChristoph Müllner     rv_op_th_surw,
115318df723SChristoph Müllner     rv_op_th_surd,
116318df723SChristoph Müllner     /* XTheadMemPair */
117318df723SChristoph Müllner     rv_op_th_ldd,
118318df723SChristoph Müllner     rv_op_th_lwd,
119318df723SChristoph Müllner     rv_op_th_lwud,
120318df723SChristoph Müllner     rv_op_th_sdd,
121318df723SChristoph Müllner     rv_op_th_swd,
122318df723SChristoph Müllner     /* XTheadSync */
123318df723SChristoph Müllner     rv_op_th_sfence_vmas,
124318df723SChristoph Müllner     rv_op_th_sync,
125318df723SChristoph Müllner     rv_op_th_sync_i,
126318df723SChristoph Müllner     rv_op_th_sync_is,
127318df723SChristoph Müllner     rv_op_th_sync_s,
128318df723SChristoph Müllner } rv_xthead_op;
129318df723SChristoph Müllner 
130318df723SChristoph Müllner const rv_opcode_data xthead_opcode_data[] = {
131318df723SChristoph Müllner     { "th.illegal", rv_codec_illegal, rv_fmt_none, NULL, 0, 0, 0 },
132318df723SChristoph Müllner     /* XTheadBa */
133318df723SChristoph Müllner     { "th.addsl", rv_codec_r_imm2, rv_fmt_rd_rs1_rs2_imm, NULL, 0, 0, 0 },
134318df723SChristoph Müllner     /* XTheadBb */
135318df723SChristoph Müllner     { "th.srri", rv_codec_r2_imm6, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
136318df723SChristoph Müllner     { "th.srriw", rv_codec_r2_imm5, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
137318df723SChristoph Müllner     { "th.ext", rv_codec_r2_immhl, rv_fmt_rd_rs1_immh_imml, NULL, 0, 0, 0 },
138318df723SChristoph Müllner     { "th.extu", rv_codec_r2_immhl, rv_fmt_rd_rs1_immh_imml, NULL, 0, 0, 0 },
139318df723SChristoph Müllner     { "th.ff0", rv_codec_r2, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
140318df723SChristoph Müllner     { "th.ff1", rv_codec_r2, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
141318df723SChristoph Müllner     { "th.rev", rv_codec_r2, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
142318df723SChristoph Müllner     { "th.revw", rv_codec_r2, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
143318df723SChristoph Müllner     { "th.tstnbz", rv_codec_r2, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
144318df723SChristoph Müllner     /* XTheadBs */
145318df723SChristoph Müllner     { "th.tst", rv_codec_r2_imm6, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
146318df723SChristoph Müllner     /* XTheadCmo */
147318df723SChristoph Müllner     { "th.dcache.call", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
148318df723SChristoph Müllner     { "th.dcache.ciall", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
149318df723SChristoph Müllner     { "th.dcache.iall", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
150318df723SChristoph Müllner     { "th.dcache.cpa", rv_codec_r, rv_fmt_rs1, NULL, 0, 0, 0 },
151318df723SChristoph Müllner     { "th.dcache.cipa", rv_codec_r, rv_fmt_rs1, NULL, 0, 0, 0 },
152318df723SChristoph Müllner     { "th.dcache.ipa", rv_codec_r, rv_fmt_rs1, NULL, 0, 0, 0 },
153318df723SChristoph Müllner     { "th.dcache.cva", rv_codec_r, rv_fmt_rs1, NULL, 0, 0, 0 },
154318df723SChristoph Müllner     { "th.dcache.civa", rv_codec_r, rv_fmt_rs1, NULL, 0, 0, 0 },
155318df723SChristoph Müllner     { "th.dcache.iva", rv_codec_r, rv_fmt_rs1, NULL, 0, 0, 0 },
156318df723SChristoph Müllner     { "th.dcache.csw", rv_codec_r, rv_fmt_rs1, NULL, 0, 0, 0 },
157318df723SChristoph Müllner     { "th.dcache.cisw", rv_codec_r, rv_fmt_rs1, NULL, 0, 0, 0 },
158318df723SChristoph Müllner     { "th.dcache.isw", rv_codec_r, rv_fmt_rs1, NULL, 0, 0, 0 },
159318df723SChristoph Müllner     { "th.dcache.cpal1", rv_codec_r, rv_fmt_rs1, NULL, 0, 0, 0 },
160318df723SChristoph Müllner     { "th.dcache.cval1", rv_codec_r, rv_fmt_rs1, NULL, 0, 0, 0 },
161318df723SChristoph Müllner     { "th.icache.iall", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
162318df723SChristoph Müllner     { "th.icache.ialls", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
163318df723SChristoph Müllner     { "th.icache.ipa", rv_codec_r, rv_fmt_rs1, NULL, 0, 0, 0 },
164318df723SChristoph Müllner     { "th.icache.iva", rv_codec_r, rv_fmt_rs1, NULL, 0, 0, 0 },
165318df723SChristoph Müllner     { "th.l2cache.call", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
166318df723SChristoph Müllner     { "th.l2cache.ciall", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
167318df723SChristoph Müllner     { "th.l2cache.iall", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
168318df723SChristoph Müllner     /* XTheadCondMov */
169318df723SChristoph Müllner     { "th.mveqz", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
170318df723SChristoph Müllner     { "th.mvnez", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
171318df723SChristoph Müllner     /* XTheadFMemIdx */
172318df723SChristoph Müllner     { "th.flrd", rv_codec_r_imm2, rv_fmt_frd_rs1_rs2_imm, NULL, 0, 0, 0 },
173318df723SChristoph Müllner     { "th.flrw", rv_codec_r_imm2, rv_fmt_frd_rs1_rs2_imm, NULL, 0, 0, 0 },
174318df723SChristoph Müllner     { "th.flurd", rv_codec_r_imm2, rv_fmt_frd_rs1_rs2_imm, NULL, 0, 0, 0 },
175318df723SChristoph Müllner     { "th.flurw", rv_codec_r_imm2, rv_fmt_frd_rs1_rs2_imm, NULL, 0, 0, 0 },
176318df723SChristoph Müllner     { "th.fsrd", rv_codec_r_imm2, rv_fmt_frd_rs1_rs2_imm, NULL, 0, 0, 0 },
177318df723SChristoph Müllner     { "th.fsrw", rv_codec_r_imm2, rv_fmt_frd_rs1_rs2_imm, NULL, 0, 0, 0 },
178318df723SChristoph Müllner     { "th.fsurd", rv_codec_r_imm2, rv_fmt_frd_rs1_rs2_imm, NULL, 0, 0, 0 },
179318df723SChristoph Müllner     { "th.fsurw", rv_codec_r_imm2, rv_fmt_frd_rs1_rs2_imm, NULL, 0, 0, 0 },
180318df723SChristoph Müllner     /* XTheadFmv */
181318df723SChristoph Müllner     { "th.fmv.hw.x", rv_codec_r, rv_fmt_rd_frs1, NULL, 0, 0, 0 },
182318df723SChristoph Müllner     { "th.fmv.x.hw", rv_codec_r, rv_fmt_rd_frs1, NULL, 0, 0, 0 },
183318df723SChristoph Müllner     /* XTheadMac */
184318df723SChristoph Müllner     { "th.mula", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
185318df723SChristoph Müllner     { "th.mulaw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
186318df723SChristoph Müllner     { "th.mulah", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
187318df723SChristoph Müllner     { "th.muls", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
188318df723SChristoph Müllner     { "th.mulsw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
189318df723SChristoph Müllner     { "th.mulsh", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
190318df723SChristoph Müllner     /* XTheadMemIdx */
191318df723SChristoph Müllner     { "th.lbia", rv_codec_r2_imm2_imm5, rv_fmt_rd_rs1_immh_imml_addr, NULL, 0, 0, 0 },
192318df723SChristoph Müllner     { "th.lbib", rv_codec_r2_imm2_imm5, rv_fmt_rd_rs1_immh_imml, NULL, 0, 0, 0 },
193318df723SChristoph Müllner     { "th.lbuia", rv_codec_r2_imm2_imm5, rv_fmt_rd_rs1_immh_imml_addr, NULL, 0, 0, 0 },
194318df723SChristoph Müllner     { "th.lbuib", rv_codec_r2_imm2_imm5, rv_fmt_rd_rs1_immh_imml_addr, NULL, 0, 0, 0 },
195318df723SChristoph Müllner     { "th.lhia", rv_codec_r2_imm2_imm5, rv_fmt_rd_rs1_immh_imml_addr, NULL, 0, 0, 0 },
196318df723SChristoph Müllner     { "th.lhib", rv_codec_r2_imm2_imm5, rv_fmt_rd_rs1_immh_imml_addr, NULL, 0, 0, 0 },
197318df723SChristoph Müllner     { "th.lhuia", rv_codec_r2_imm2_imm5, rv_fmt_rd_rs1_immh_imml_addr, NULL, 0, 0, 0 },
198318df723SChristoph Müllner     { "th.lhuib", rv_codec_r2_imm2_imm5, rv_fmt_rd_rs1_immh_imml_addr, NULL, 0, 0, 0 },
199318df723SChristoph Müllner     { "th.lwia", rv_codec_r2_imm2_imm5, rv_fmt_rd_rs1_immh_imml_addr, NULL, 0, 0, 0 },
200318df723SChristoph Müllner     { "th.lwib", rv_codec_r2_imm2_imm5, rv_fmt_rd_rs1_immh_imml_addr, NULL, 0, 0, 0 },
201318df723SChristoph Müllner     { "th.lwuia", rv_codec_r2_imm2_imm5, rv_fmt_rd_rs1_immh_imml_addr, NULL, 0, 0, 0 },
202318df723SChristoph Müllner     { "th.lwuib", rv_codec_r2_imm2_imm5, rv_fmt_rd_rs1_immh_imml_addr, NULL, 0, 0, 0 },
203318df723SChristoph Müllner     { "th.ldia", rv_codec_r2_imm2_imm5, rv_fmt_rd_rs1_immh_imml_addr, NULL, 0, 0, 0 },
204318df723SChristoph Müllner     { "th.ldib", rv_codec_r2_imm2_imm5, rv_fmt_rd_rs1_immh_imml_addr, NULL, 0, 0, 0 },
205318df723SChristoph Müllner     { "th.sbia", rv_codec_r2_imm2_imm5, rv_fmt_rd_rs1_immh_imml_addr, NULL, 0, 0, 0 },
206318df723SChristoph Müllner     { "th.sbib", rv_codec_r2_imm2_imm5, rv_fmt_rd_rs1_immh_imml_addr, NULL, 0, 0, 0 },
207318df723SChristoph Müllner     { "th.shia", rv_codec_r2_imm2_imm5, rv_fmt_rd_rs1_immh_imml_addr, NULL, 0, 0, 0 },
208318df723SChristoph Müllner     { "th.shib", rv_codec_r2_imm2_imm5, rv_fmt_rd_rs1_immh_imml_addr, NULL, 0, 0, 0 },
209318df723SChristoph Müllner     { "th.swia", rv_codec_r2_imm2_imm5, rv_fmt_rd_rs1_immh_imml_addr, NULL, 0, 0, 0 },
210318df723SChristoph Müllner     { "th.swib", rv_codec_r2_imm2_imm5, rv_fmt_rd_rs1_immh_imml_addr, NULL, 0, 0, 0 },
211318df723SChristoph Müllner     { "th.sdia", rv_codec_r2_imm2_imm5, rv_fmt_rd_rs1_immh_imml_addr, NULL, 0, 0, 0 },
212318df723SChristoph Müllner     { "th.sdib", rv_codec_r2_imm2_imm5, rv_fmt_rd_rs1_immh_imml_addr, NULL, 0, 0, 0 },
213318df723SChristoph Müllner     { "th.lrb", rv_codec_r_imm2, rv_fmt_rd_rs1_rs2_imm, NULL, 0, 0, 0 },
214318df723SChristoph Müllner     { "th.lrbu", rv_codec_r_imm2, rv_fmt_rd_rs1_rs2_imm, NULL, 0, 0, 0 },
215318df723SChristoph Müllner     { "th.lrh", rv_codec_r_imm2, rv_fmt_rd_rs1_rs2_imm, NULL, 0, 0, 0 },
216318df723SChristoph Müllner     { "th.lrhu", rv_codec_r_imm2, rv_fmt_rd_rs1_rs2_imm, NULL, 0, 0, 0 },
217318df723SChristoph Müllner     { "th.lrw", rv_codec_r_imm2, rv_fmt_rd_rs1_rs2_imm, NULL, 0, 0, 0 },
218318df723SChristoph Müllner     { "th.lrwu", rv_codec_r_imm2, rv_fmt_rd_rs1_rs2_imm, NULL, 0, 0, 0 },
219318df723SChristoph Müllner     { "th.lrd", rv_codec_r_imm2, rv_fmt_rd_rs1_rs2_imm, NULL, 0, 0, 0 },
220318df723SChristoph Müllner     { "th.srb", rv_codec_r_imm2, rv_fmt_rd_rs1_rs2_imm, NULL, 0, 0, 0 },
221318df723SChristoph Müllner     { "th.srh", rv_codec_r_imm2, rv_fmt_rd_rs1_rs2_imm, NULL, 0, 0, 0 },
222318df723SChristoph Müllner     { "th.srw", rv_codec_r_imm2, rv_fmt_rd_rs1_rs2_imm, NULL, 0, 0, 0 },
223318df723SChristoph Müllner     { "th.srd", rv_codec_r_imm2, rv_fmt_rd_rs1_rs2_imm, NULL, 0, 0, 0 },
224318df723SChristoph Müllner     { "th.lurb", rv_codec_r_imm2, rv_fmt_rd_rs1_rs2_imm, NULL, 0, 0, 0 },
225318df723SChristoph Müllner     { "th.lurbu", rv_codec_r_imm2, rv_fmt_rd_rs1_rs2_imm, NULL, 0, 0, 0 },
226318df723SChristoph Müllner     { "th.lurh", rv_codec_r_imm2, rv_fmt_rd_rs1_rs2_imm, NULL, 0, 0, 0 },
227318df723SChristoph Müllner     { "th.lurhu", rv_codec_r_imm2, rv_fmt_rd_rs1_rs2_imm, NULL, 0, 0, 0 },
228318df723SChristoph Müllner     { "th.lurw", rv_codec_r_imm2, rv_fmt_rd_rs1_rs2_imm, NULL, 0, 0, 0 },
229318df723SChristoph Müllner     { "th.lurwu", rv_codec_r_imm2, rv_fmt_rd_rs1_rs2_imm, NULL, 0, 0, 0 },
230318df723SChristoph Müllner     { "th.lurd", rv_codec_r_imm2, rv_fmt_rd_rs1_rs2_imm, NULL, 0, 0, 0 },
231318df723SChristoph Müllner     { "th.surb", rv_codec_r_imm2, rv_fmt_rd_rs1_rs2_imm, NULL, 0, 0, 0 },
232318df723SChristoph Müllner     { "th.surh", rv_codec_r_imm2, rv_fmt_rd_rs1_rs2_imm, NULL, 0, 0, 0 },
233318df723SChristoph Müllner     { "th.surw", rv_codec_r_imm2, rv_fmt_rd_rs1_rs2_imm, NULL, 0, 0, 0 },
234318df723SChristoph Müllner     { "th.surd", rv_codec_r_imm2, rv_fmt_rd_rs1_rs2_imm, NULL, 0, 0, 0 },
235318df723SChristoph Müllner     /* XTheadMemPair */
236318df723SChristoph Müllner     { "th.ldd", rv_codec_r_imm2, rv_fmt_rd2_imm, NULL, 0, 0, 0 },
237318df723SChristoph Müllner     { "th.lwd", rv_codec_r_imm2, rv_fmt_rd2_imm, NULL, 0, 0, 0 },
238318df723SChristoph Müllner     { "th.lwud", rv_codec_r_imm2, rv_fmt_rd2_imm, NULL, 0, 0, 0 },
239318df723SChristoph Müllner     { "th.sdd", rv_codec_r_imm2, rv_fmt_rd2_imm, NULL, 0, 0, 0 },
240318df723SChristoph Müllner     { "th.swd", rv_codec_r_imm2, rv_fmt_rd2_imm, NULL, 0, 0, 0 },
241318df723SChristoph Müllner     /* XTheadSync */
242318df723SChristoph Müllner     { "th.sfence.vmas", rv_codec_r, rv_fmt_rs1_rs2, NULL, 0, 0, 0 },
243318df723SChristoph Müllner     { "th.sync", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
244318df723SChristoph Müllner     { "th.sync.i", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
245318df723SChristoph Müllner     { "th.sync.is", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
246318df723SChristoph Müllner     { "th.sync.s", rv_codec_none, rv_fmt_none, NULL, 0, 0, 0 },
247318df723SChristoph Müllner };
248318df723SChristoph Müllner 
decode_xtheadba(rv_decode * dec,rv_isa isa)249318df723SChristoph Müllner void decode_xtheadba(rv_decode *dec, rv_isa isa)
250318df723SChristoph Müllner {
251318df723SChristoph Müllner     rv_inst inst = dec->inst;
252318df723SChristoph Müllner     rv_opcode op = rv_op_illegal;
253318df723SChristoph Müllner 
254318df723SChristoph Müllner     switch (((inst >> 0) & 0b11)) {
255318df723SChristoph Müllner     case 3:
256318df723SChristoph Müllner         switch (((inst >> 2) & 0b11111)) {
257318df723SChristoph Müllner         case 2:
258318df723SChristoph Müllner             /* custom-0 */
259318df723SChristoph Müllner             switch ((inst >> 12) & 0b111) {
260318df723SChristoph Müllner             case 1:
261318df723SChristoph Müllner                 switch ((inst >> 25) & 0b1111111) {
262318df723SChristoph Müllner                 case 0b0000000:
263318df723SChristoph Müllner                 case 0b0000001:
264318df723SChristoph Müllner                 case 0b0000010:
265318df723SChristoph Müllner                 case 0b0000011: op = rv_op_th_addsl; break;
266318df723SChristoph Müllner                 }
267318df723SChristoph Müllner                 break;
268318df723SChristoph Müllner             }
269318df723SChristoph Müllner             break;
270318df723SChristoph Müllner             /* custom-0 */
271318df723SChristoph Müllner         }
272318df723SChristoph Müllner         break;
273318df723SChristoph Müllner     }
274318df723SChristoph Müllner 
275318df723SChristoph Müllner     dec->op = op;
276318df723SChristoph Müllner }
277318df723SChristoph Müllner 
decode_xtheadbb(rv_decode * dec,rv_isa isa)278318df723SChristoph Müllner void decode_xtheadbb(rv_decode *dec, rv_isa isa)
279318df723SChristoph Müllner {
280318df723SChristoph Müllner     rv_inst inst = dec->inst;
281318df723SChristoph Müllner     rv_opcode op = rv_op_illegal;
282318df723SChristoph Müllner 
283318df723SChristoph Müllner     switch (((inst >> 0) & 0b11)) {
284318df723SChristoph Müllner     case 3:
285318df723SChristoph Müllner         switch (((inst >> 2) & 0b11111)) {
286318df723SChristoph Müllner         case 2:
287318df723SChristoph Müllner             /* custom-0 */
288318df723SChristoph Müllner             switch ((inst >> 12) & 0b111) {
289318df723SChristoph Müllner             case 1:
290318df723SChristoph Müllner                 switch ((inst >> 25) & 0b1111111) {
291318df723SChristoph Müllner                 case 0b0001010: op = rv_op_th_srriw; break;
292318df723SChristoph Müllner                 case 0b1000000:
293318df723SChristoph Müllner                     if (((inst >> 20) & 0b11111) == 0) {
294318df723SChristoph Müllner                         op = rv_op_th_tstnbz;
295318df723SChristoph Müllner                     }
296318df723SChristoph Müllner                     break;
297318df723SChristoph Müllner                 case 0b1000001:
298318df723SChristoph Müllner                     if (((inst >> 20) & 0b11111) == 0) {
299318df723SChristoph Müllner                         op = rv_op_th_rev;
300318df723SChristoph Müllner                     }
301318df723SChristoph Müllner                     break;
302318df723SChristoph Müllner                 case 0b1000010:
303318df723SChristoph Müllner                     if (((inst >> 20) & 0b11111) == 0) {
304318df723SChristoph Müllner                         op = rv_op_th_ff0;
305318df723SChristoph Müllner                     }
306318df723SChristoph Müllner                     break;
307318df723SChristoph Müllner                 case 0b1000011:
308318df723SChristoph Müllner                     if (((inst >> 20) & 0b11111) == 0) {
309318df723SChristoph Müllner                         op = rv_op_th_ff1;
310318df723SChristoph Müllner                     }
311318df723SChristoph Müllner                     break;
312318df723SChristoph Müllner                 case 0b1000100:
313318df723SChristoph Müllner                 case 0b1001000:
314318df723SChristoph Müllner                     if (((inst >> 20) & 0b11111) == 0) {
315318df723SChristoph Müllner                         op = rv_op_th_revw;
316318df723SChristoph Müllner                     }
317318df723SChristoph Müllner                     break;
318318df723SChristoph Müllner                 case 0b0000100:
319318df723SChristoph Müllner                 case 0b0000101: op = rv_op_th_srri; break;
320318df723SChristoph Müllner                 }
321318df723SChristoph Müllner                 break;
322318df723SChristoph Müllner             case 2: op = rv_op_th_ext; break;
323318df723SChristoph Müllner             case 3: op = rv_op_th_extu; break;
324318df723SChristoph Müllner             }
325318df723SChristoph Müllner             break;
326318df723SChristoph Müllner             /* custom-0 */
327318df723SChristoph Müllner         }
328318df723SChristoph Müllner         break;
329318df723SChristoph Müllner     }
330318df723SChristoph Müllner 
331318df723SChristoph Müllner     dec->op = op;
332318df723SChristoph Müllner }
333318df723SChristoph Müllner 
decode_xtheadbs(rv_decode * dec,rv_isa isa)334318df723SChristoph Müllner void decode_xtheadbs(rv_decode *dec, rv_isa isa)
335318df723SChristoph Müllner {
336318df723SChristoph Müllner     rv_inst inst = dec->inst;
337318df723SChristoph Müllner     rv_opcode op = rv_op_illegal;
338318df723SChristoph Müllner 
339318df723SChristoph Müllner     switch (((inst >> 0) & 0b11)) {
340318df723SChristoph Müllner     case 3:
341318df723SChristoph Müllner         switch (((inst >> 2) & 0b11111)) {
342318df723SChristoph Müllner         case 2:
343318df723SChristoph Müllner             /* custom-0 */
344318df723SChristoph Müllner             switch ((inst >> 12) & 0b111) {
345318df723SChristoph Müllner             case 1:
346318df723SChristoph Müllner                 switch ((inst >> 26) & 0b111111) {
347318df723SChristoph Müllner                 case 0b100010: op = rv_op_th_tst; break;
348318df723SChristoph Müllner                 }
349318df723SChristoph Müllner                 break;
350318df723SChristoph Müllner             }
351318df723SChristoph Müllner             break;
352318df723SChristoph Müllner             /* custom-0 */
353318df723SChristoph Müllner         }
354318df723SChristoph Müllner         break;
355318df723SChristoph Müllner     }
356318df723SChristoph Müllner 
357318df723SChristoph Müllner     dec->op = op;
358318df723SChristoph Müllner }
359318df723SChristoph Müllner 
decode_xtheadcmo(rv_decode * dec,rv_isa isa)360318df723SChristoph Müllner void decode_xtheadcmo(rv_decode *dec, rv_isa isa)
361318df723SChristoph Müllner {
362318df723SChristoph Müllner     rv_inst inst = dec->inst;
363318df723SChristoph Müllner     rv_opcode op = rv_op_illegal;
364318df723SChristoph Müllner 
365318df723SChristoph Müllner     switch (((inst >> 0) & 0b11)) {
366318df723SChristoph Müllner     case 3:
367318df723SChristoph Müllner         switch (((inst >> 2) & 0b11111)) {
368318df723SChristoph Müllner         case 2:
369318df723SChristoph Müllner             /* custom-0 */
370318df723SChristoph Müllner             switch ((inst >> 12) & 0b111) {
371318df723SChristoph Müllner             case 0:
372318df723SChristoph Müllner                 switch ((inst >> 20 & 0b111111111111)) {
373318df723SChristoph Müllner                 case 0b000000000001:
374318df723SChristoph Müllner                     if (((inst >> 20) & 0b11111) == 0) {
375318df723SChristoph Müllner                         op = rv_op_th_dcache_call;
376318df723SChristoph Müllner                     }
377318df723SChristoph Müllner                     break;
378318df723SChristoph Müllner                 case 0b000000000011:
379318df723SChristoph Müllner                     if (((inst >> 20) & 0b11111) == 0) {
380318df723SChristoph Müllner                         op = rv_op_th_dcache_ciall;
381318df723SChristoph Müllner                     }
382318df723SChristoph Müllner                     break;
383318df723SChristoph Müllner                 case 0b000000000010:
384318df723SChristoph Müllner                     if (((inst >> 20) & 0b11111) == 0) {
385318df723SChristoph Müllner                         op = rv_op_th_dcache_iall;
386318df723SChristoph Müllner                     }
387318df723SChristoph Müllner                     break;
388318df723SChristoph Müllner                 case 0b000000101001: op = rv_op_th_dcache_cpa; break;
389318df723SChristoph Müllner                 case 0b000000101011: op = rv_op_th_dcache_cipa; break;
390318df723SChristoph Müllner                 case 0b000000101010: op = rv_op_th_dcache_ipa; break;
391318df723SChristoph Müllner                 case 0b000000100101: op = rv_op_th_dcache_cva; break;
392318df723SChristoph Müllner                 case 0b000000100111: op = rv_op_th_dcache_civa; break;
393318df723SChristoph Müllner                 case 0b000000100110: op = rv_op_th_dcache_iva; break;
394318df723SChristoph Müllner                 case 0b000000100001: op = rv_op_th_dcache_csw; break;
395318df723SChristoph Müllner                 case 0b000000100011: op = rv_op_th_dcache_cisw; break;
396318df723SChristoph Müllner                 case 0b000000100010: op = rv_op_th_dcache_isw; break;
397318df723SChristoph Müllner                 case 0b000000101000: op = rv_op_th_dcache_cpal1; break;
398318df723SChristoph Müllner                 case 0b000000100100: op = rv_op_th_dcache_cval1; break;
399318df723SChristoph Müllner                 case 0b000000010000:
400318df723SChristoph Müllner                     if (((inst >> 20) & 0b11111) == 0) {
401318df723SChristoph Müllner                         op = rv_op_th_icache_iall;
402318df723SChristoph Müllner                     }
403318df723SChristoph Müllner                     break;
404318df723SChristoph Müllner                 case 0b000000010001:
405318df723SChristoph Müllner                     if (((inst >> 20) & 0b11111) == 0) {
406318df723SChristoph Müllner                         op = rv_op_th_icache_ialls;
407318df723SChristoph Müllner                     }
408318df723SChristoph Müllner                     break;
409318df723SChristoph Müllner                 case 0b000000111000: op = rv_op_th_icache_ipa; break;
410318df723SChristoph Müllner                 case 0b000000110000: op = rv_op_th_icache_iva; break;
411318df723SChristoph Müllner                 case 0b000000010101:
412318df723SChristoph Müllner                     if (((inst >> 20) & 0b11111) == 0) {
413318df723SChristoph Müllner                         op = rv_op_th_l2cache_call;
414318df723SChristoph Müllner                     }
415318df723SChristoph Müllner                     break;
416318df723SChristoph Müllner                 case 0b000000010111:
417318df723SChristoph Müllner                     if (((inst >> 20) & 0b11111) == 0) {
418318df723SChristoph Müllner                         op = rv_op_th_l2cache_ciall;
419318df723SChristoph Müllner                     }
420318df723SChristoph Müllner                     break;
421318df723SChristoph Müllner                 case 0b000000010110:
422318df723SChristoph Müllner                     if (((inst >> 20) & 0b11111) == 0) {
423318df723SChristoph Müllner                         op = rv_op_th_l2cache_iall;
424318df723SChristoph Müllner                     }
425318df723SChristoph Müllner                     break;
426318df723SChristoph Müllner                 }
427318df723SChristoph Müllner                 break;
428318df723SChristoph Müllner             }
429318df723SChristoph Müllner             break;
430318df723SChristoph Müllner             /* custom-0 */
431318df723SChristoph Müllner         }
432318df723SChristoph Müllner         break;
433318df723SChristoph Müllner     }
434318df723SChristoph Müllner 
435318df723SChristoph Müllner     dec->op = op;
436318df723SChristoph Müllner }
437318df723SChristoph Müllner 
decode_xtheadcondmov(rv_decode * dec,rv_isa isa)438318df723SChristoph Müllner void decode_xtheadcondmov(rv_decode *dec, rv_isa isa)
439318df723SChristoph Müllner {
440318df723SChristoph Müllner     rv_inst inst = dec->inst;
441318df723SChristoph Müllner     rv_opcode op = rv_op_illegal;
442318df723SChristoph Müllner 
443318df723SChristoph Müllner     switch (((inst >> 0) & 0b11)) {
444318df723SChristoph Müllner     case 3:
445318df723SChristoph Müllner         switch (((inst >> 2) & 0b11111)) {
446318df723SChristoph Müllner         case 2:
447318df723SChristoph Müllner             /* custom-0 */
448318df723SChristoph Müllner             switch ((inst >> 12) & 0b111) {
449318df723SChristoph Müllner             case 1:
450318df723SChristoph Müllner                 switch ((inst >> 25) & 0b1111111) {
451318df723SChristoph Müllner                 case 0b0100000: op = rv_op_th_mveqz; break;
452318df723SChristoph Müllner                 case 0b0100001: op = rv_op_th_mvnez; break;
453318df723SChristoph Müllner                 }
454318df723SChristoph Müllner                 break;
455318df723SChristoph Müllner             }
456318df723SChristoph Müllner             break;
457318df723SChristoph Müllner             /* custom-0 */
458318df723SChristoph Müllner         }
459318df723SChristoph Müllner         break;
460318df723SChristoph Müllner     }
461318df723SChristoph Müllner 
462318df723SChristoph Müllner     dec->op = op;
463318df723SChristoph Müllner }
464318df723SChristoph Müllner 
decode_xtheadfmemidx(rv_decode * dec,rv_isa isa)465318df723SChristoph Müllner void decode_xtheadfmemidx(rv_decode *dec, rv_isa isa)
466318df723SChristoph Müllner {
467318df723SChristoph Müllner     rv_inst inst = dec->inst;
468318df723SChristoph Müllner     rv_opcode op = rv_op_illegal;
469318df723SChristoph Müllner 
470318df723SChristoph Müllner     switch (((inst >> 0) & 0b11)) {
471318df723SChristoph Müllner     case 3:
472318df723SChristoph Müllner         switch (((inst >> 2) & 0b11111)) {
473318df723SChristoph Müllner         case 2:
474318df723SChristoph Müllner             /* custom-0 */
475318df723SChristoph Müllner             switch ((inst >> 12) & 0b111) {
476318df723SChristoph Müllner             case 6:
477318df723SChristoph Müllner                 switch ((inst >> 27) & 0b11111) {
478318df723SChristoph Müllner                 case 8: op = rv_op_th_flrw; break;
479318df723SChristoph Müllner                 case 10: op = rv_op_th_flurw; break;
480318df723SChristoph Müllner                 case 12: op = rv_op_th_flrd; break;
481318df723SChristoph Müllner                 case 14: op = rv_op_th_flurd; break;
482318df723SChristoph Müllner                 }
483318df723SChristoph Müllner                 break;
484318df723SChristoph Müllner             case 7:
485318df723SChristoph Müllner                 switch ((inst >> 27) & 0b11111) {
486318df723SChristoph Müllner                 case 8: op = rv_op_th_fsrw; break;
487318df723SChristoph Müllner                 case 10: op = rv_op_th_fsurw; break;
488318df723SChristoph Müllner                 case 12: op = rv_op_th_fsrd; break;
489318df723SChristoph Müllner                 case 14: op = rv_op_th_fsurd; break;
490318df723SChristoph Müllner                 }
491318df723SChristoph Müllner                 break;
492318df723SChristoph Müllner             }
493318df723SChristoph Müllner             break;
494318df723SChristoph Müllner             /* custom-0 */
495318df723SChristoph Müllner         }
496318df723SChristoph Müllner         break;
497318df723SChristoph Müllner     }
498318df723SChristoph Müllner 
499318df723SChristoph Müllner     dec->op = op;
500318df723SChristoph Müllner }
501318df723SChristoph Müllner 
decode_xtheadfmv(rv_decode * dec,rv_isa isa)502318df723SChristoph Müllner void decode_xtheadfmv(rv_decode *dec, rv_isa isa)
503318df723SChristoph Müllner {
504318df723SChristoph Müllner     rv_inst inst = dec->inst;
505318df723SChristoph Müllner     rv_opcode op = rv_op_illegal;
506318df723SChristoph Müllner 
507318df723SChristoph Müllner     switch (((inst >> 0) & 0b11)) {
508318df723SChristoph Müllner     case 3:
509318df723SChristoph Müllner         switch (((inst >> 2) & 0b11111)) {
510318df723SChristoph Müllner         case 2:
511318df723SChristoph Müllner             /* custom-0 */
512318df723SChristoph Müllner             switch ((inst >> 12) & 0b111) {
513318df723SChristoph Müllner             case 1:
514318df723SChristoph Müllner                 switch ((inst >> 25) & 0b1111111) {
515318df723SChristoph Müllner                 case 0b1010000:
516318df723SChristoph Müllner                     if (((inst >> 20) & 0b11111) == 0) {
517318df723SChristoph Müllner                         op = rv_op_th_fmv_hw_x;
518318df723SChristoph Müllner                     }
519318df723SChristoph Müllner                     break;
520318df723SChristoph Müllner                 case 0b1100000:
521318df723SChristoph Müllner                     if (((inst >> 20) & 0b11111) == 0) {
522318df723SChristoph Müllner                         op = rv_op_th_fmv_x_hw;
523318df723SChristoph Müllner                     }
524318df723SChristoph Müllner                     break;
525318df723SChristoph Müllner                 }
526318df723SChristoph Müllner                 break;
527318df723SChristoph Müllner             }
528318df723SChristoph Müllner             break;
529318df723SChristoph Müllner             /* custom-0 */
530318df723SChristoph Müllner         }
531318df723SChristoph Müllner         break;
532318df723SChristoph Müllner     }
533318df723SChristoph Müllner 
534318df723SChristoph Müllner     dec->op = op;
535318df723SChristoph Müllner }
536318df723SChristoph Müllner 
decode_xtheadmac(rv_decode * dec,rv_isa isa)537318df723SChristoph Müllner void decode_xtheadmac(rv_decode *dec, rv_isa isa)
538318df723SChristoph Müllner {
539318df723SChristoph Müllner     rv_inst inst = dec->inst;
540318df723SChristoph Müllner     rv_opcode op = rv_op_illegal;
541318df723SChristoph Müllner 
542318df723SChristoph Müllner     switch (((inst >> 0) & 0b11)) {
543318df723SChristoph Müllner     case 3:
544318df723SChristoph Müllner         switch (((inst >> 2) & 0b11111)) {
545318df723SChristoph Müllner         case 2:
546318df723SChristoph Müllner             /* custom-0 */
547318df723SChristoph Müllner             switch ((inst >> 12) & 0b111) {
548318df723SChristoph Müllner             case 1:
549318df723SChristoph Müllner                 switch ((inst >> 25) & 0b1111111) {
550318df723SChristoph Müllner                 case 0b0010000: op = rv_op_th_mula; break;
551318df723SChristoph Müllner                 case 0b0010001: op = rv_op_th_muls; break;
552318df723SChristoph Müllner                 case 0b0010010: op = rv_op_th_mulaw; break;
553318df723SChristoph Müllner                 case 0b0010011: op = rv_op_th_mulsw; break;
554318df723SChristoph Müllner                 case 0b0010100: op = rv_op_th_mulah; break;
555318df723SChristoph Müllner                 case 0b0010101: op = rv_op_th_mulsh; break;
556318df723SChristoph Müllner                 }
557318df723SChristoph Müllner                 break;
558318df723SChristoph Müllner             }
559318df723SChristoph Müllner             break;
560318df723SChristoph Müllner             /* custom-0 */
561318df723SChristoph Müllner         }
562318df723SChristoph Müllner         break;
563318df723SChristoph Müllner     }
564318df723SChristoph Müllner 
565318df723SChristoph Müllner     dec->op = op;
566318df723SChristoph Müllner }
567318df723SChristoph Müllner 
decode_xtheadmemidx(rv_decode * dec,rv_isa isa)568318df723SChristoph Müllner void decode_xtheadmemidx(rv_decode *dec, rv_isa isa)
569318df723SChristoph Müllner {
570318df723SChristoph Müllner     rv_inst inst = dec->inst;
571318df723SChristoph Müllner     rv_opcode op = rv_op_illegal;
572318df723SChristoph Müllner 
573318df723SChristoph Müllner     switch (((inst >> 0) & 0b11)) {
574318df723SChristoph Müllner     case 3:
575318df723SChristoph Müllner         switch (((inst >> 2) & 0b11111)) {
576318df723SChristoph Müllner         case 2:
577318df723SChristoph Müllner             /* custom-0 */
578318df723SChristoph Müllner             switch ((inst >> 12) & 0b111) {
579318df723SChristoph Müllner             case 4:
580318df723SChristoph Müllner                 switch ((inst >> 27) & 0b11111) {
581318df723SChristoph Müllner                 case 0: op = rv_op_th_lrb; break;
582318df723SChristoph Müllner                 case 1: op = rv_op_th_lbib; break;
583318df723SChristoph Müllner                 case 2: op = rv_op_th_lurb; break;
584318df723SChristoph Müllner                 case 3: op = rv_op_th_lbia; break;
585318df723SChristoph Müllner                 case 4: op = rv_op_th_lrh; break;
586318df723SChristoph Müllner                 case 5: op = rv_op_th_lhib; break;
587318df723SChristoph Müllner                 case 6: op = rv_op_th_lurh; break;
588318df723SChristoph Müllner                 case 7: op = rv_op_th_lhia; break;
589318df723SChristoph Müllner                 case 8: op = rv_op_th_lrw; break;
590318df723SChristoph Müllner                 case 9: op = rv_op_th_lwib; break;
591318df723SChristoph Müllner                 case 10: op = rv_op_th_lurw; break;
592318df723SChristoph Müllner                 case 11: op = rv_op_th_lwia; break;
593318df723SChristoph Müllner                 case 12: op = rv_op_th_lrd; break;
594318df723SChristoph Müllner                 case 13: op = rv_op_th_ldib; break;
595318df723SChristoph Müllner                 case 14: op = rv_op_th_lurd; break;
596318df723SChristoph Müllner                 case 15: op = rv_op_th_ldia; break;
597318df723SChristoph Müllner                 case 16: op = rv_op_th_lrbu; break;
598318df723SChristoph Müllner                 case 17: op = rv_op_th_lbuib; break;
599318df723SChristoph Müllner                 case 18: op = rv_op_th_lurbu; break;
600318df723SChristoph Müllner                 case 19: op = rv_op_th_lbuia; break;
601318df723SChristoph Müllner                 case 20: op = rv_op_th_lrhu; break;
602318df723SChristoph Müllner                 case 21: op = rv_op_th_lhuib; break;
603318df723SChristoph Müllner                 case 22: op = rv_op_th_lurhu; break;
604318df723SChristoph Müllner                 case 23: op = rv_op_th_lhuia; break;
605318df723SChristoph Müllner                 case 24: op = rv_op_th_lrwu; break;
606318df723SChristoph Müllner                 case 25: op = rv_op_th_lwuib; break;
607318df723SChristoph Müllner                 case 26: op = rv_op_th_lurwu; break;
608318df723SChristoph Müllner                 case 27: op = rv_op_th_lwuia; break;
609318df723SChristoph Müllner                 }
610318df723SChristoph Müllner                 break;
611318df723SChristoph Müllner             case 5:
612318df723SChristoph Müllner                 switch ((inst >> 27) & 0b11111) {
613318df723SChristoph Müllner                 case 0: op = rv_op_th_srb; break;
614318df723SChristoph Müllner                 case 1: op = rv_op_th_sbib; break;
615318df723SChristoph Müllner                 case 2: op = rv_op_th_surb; break;
616318df723SChristoph Müllner                 case 3: op = rv_op_th_sbia; break;
617318df723SChristoph Müllner                 case 4: op = rv_op_th_srh; break;
618318df723SChristoph Müllner                 case 5: op = rv_op_th_shib; break;
619318df723SChristoph Müllner                 case 6: op = rv_op_th_surh; break;
620318df723SChristoph Müllner                 case 7: op = rv_op_th_shia; break;
621318df723SChristoph Müllner                 case 8: op = rv_op_th_srw; break;
622318df723SChristoph Müllner                 case 9: op = rv_op_th_swib; break;
623318df723SChristoph Müllner                 case 10: op = rv_op_th_surw; break;
624318df723SChristoph Müllner                 case 11: op = rv_op_th_swia; break;
625318df723SChristoph Müllner                 case 12: op = rv_op_th_srd; break;
626318df723SChristoph Müllner                 case 13: op = rv_op_th_sdib; break;
627318df723SChristoph Müllner                 case 14: op = rv_op_th_surd; break;
628318df723SChristoph Müllner                 case 15: op = rv_op_th_sdia; break;
629318df723SChristoph Müllner                 }
630318df723SChristoph Müllner                 break;
631318df723SChristoph Müllner                 break;
632318df723SChristoph Müllner             }
633318df723SChristoph Müllner             break;
634318df723SChristoph Müllner             /* custom-0 */
635318df723SChristoph Müllner         }
636318df723SChristoph Müllner         break;
637318df723SChristoph Müllner     }
638318df723SChristoph Müllner 
639318df723SChristoph Müllner     dec->op = op;
640318df723SChristoph Müllner }
641318df723SChristoph Müllner 
decode_xtheadmempair(rv_decode * dec,rv_isa isa)642318df723SChristoph Müllner void decode_xtheadmempair(rv_decode *dec, rv_isa isa)
643318df723SChristoph Müllner {
644318df723SChristoph Müllner     rv_inst inst = dec->inst;
645318df723SChristoph Müllner     rv_opcode op = rv_op_illegal;
646318df723SChristoph Müllner 
647318df723SChristoph Müllner     switch (((inst >> 0) & 0b11)) {
648318df723SChristoph Müllner     case 3:
649318df723SChristoph Müllner         switch (((inst >> 2) & 0b11111)) {
650318df723SChristoph Müllner         case 2:
651318df723SChristoph Müllner             /* custom-0 */
652318df723SChristoph Müllner             switch ((inst >> 12) & 0b111) {
653318df723SChristoph Müllner             case 4:
654318df723SChristoph Müllner                 switch ((inst >> 27) & 0b11111) {
655318df723SChristoph Müllner                 case 28: op = rv_op_th_lwd; break;
656318df723SChristoph Müllner                 case 30: op = rv_op_th_lwud; break;
657318df723SChristoph Müllner                 case 31: op = rv_op_th_ldd; break;
658318df723SChristoph Müllner                 }
659318df723SChristoph Müllner                 break;
660318df723SChristoph Müllner             case 5:
661318df723SChristoph Müllner                 switch ((inst >> 27) & 0b11111) {
662318df723SChristoph Müllner                 case 28: op = rv_op_th_swd; break;
663318df723SChristoph Müllner                 case 31: op = rv_op_th_sdd; break;
664318df723SChristoph Müllner                 }
665318df723SChristoph Müllner                 break;
666318df723SChristoph Müllner             }
667318df723SChristoph Müllner             break;
668318df723SChristoph Müllner             /* custom-0 */
669318df723SChristoph Müllner         }
670318df723SChristoph Müllner         break;
671318df723SChristoph Müllner     }
672318df723SChristoph Müllner 
673318df723SChristoph Müllner     dec->op = op;
674318df723SChristoph Müllner }
675318df723SChristoph Müllner 
decode_xtheadsync(rv_decode * dec,rv_isa isa)676318df723SChristoph Müllner void decode_xtheadsync(rv_decode *dec, rv_isa isa)
677318df723SChristoph Müllner {
678318df723SChristoph Müllner     rv_inst inst = dec->inst;
679318df723SChristoph Müllner     rv_opcode op = rv_op_illegal;
680318df723SChristoph Müllner 
681318df723SChristoph Müllner     switch (((inst >> 0) & 0b11)) {
682318df723SChristoph Müllner     case 3:
683318df723SChristoph Müllner         switch (((inst >> 2) & 0b11111)) {
684318df723SChristoph Müllner         case 2:
685318df723SChristoph Müllner             /* custom-0 */
686318df723SChristoph Müllner             switch ((inst >> 12) & 0b111) {
687318df723SChristoph Müllner             case 0:
688318df723SChristoph Müllner                 switch ((inst >> 25) & 0b1111111) {
689318df723SChristoph Müllner                 case 0b0000010: op = rv_op_th_sfence_vmas; break;
690318df723SChristoph Müllner                 case 0b0000000:
691318df723SChristoph Müllner                     switch ((inst >> 20) & 0b11111) {
692318df723SChristoph Müllner                     case 0b11000: op = rv_op_th_sync; break;
693318df723SChristoph Müllner                     case 0b11010: op = rv_op_th_sync_i; break;
694318df723SChristoph Müllner                     case 0b11011: op = rv_op_th_sync_is; break;
695318df723SChristoph Müllner                     case 0b11001: op = rv_op_th_sync_s; break;
696318df723SChristoph Müllner                     }
697318df723SChristoph Müllner                     break;
698318df723SChristoph Müllner                 }
699318df723SChristoph Müllner                 break;
700318df723SChristoph Müllner             }
701318df723SChristoph Müllner             break;
702318df723SChristoph Müllner             /* custom-0 */
703318df723SChristoph Müllner         }
704318df723SChristoph Müllner         break;
705318df723SChristoph Müllner     }
706318df723SChristoph Müllner 
707318df723SChristoph Müllner     dec->op = op;
708318df723SChristoph Müllner }
709