]> git.proxmox.com Git - mirror_qemu.git/blame - target/loongarch/disas.c
target/loongarch: Implement vreplve vpack vpick
[mirror_qemu.git] / target / loongarch / disas.c
CommitLineData
aae1746c
SG
1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/*
3 * QEMU LoongArch Disassembler
4 *
5 * Copyright (c) 2021 Loongson Technology Corporation Limited.
6 */
7
8#include "qemu/osdep.h"
9#include "disas/dis-asm.h"
10#include "qemu/bitops.h"
5b1dedfe 11#include "cpu-csr.h"
aae1746c
SG
12
13typedef struct {
14 disassemble_info *info;
15 uint64_t pc;
16 uint32_t insn;
17} DisasContext;
18
19static inline int plus_1(DisasContext *ctx, int x)
20{
21 return x + 1;
22}
23
24static inline int shl_2(DisasContext *ctx, int x)
25{
26 return x << 2;
27}
28
5b1dedfe
XY
29#define CSR_NAME(REG) \
30 [LOONGARCH_CSR_##REG] = (#REG)
31
32static const char * const csr_names[] = {
33 CSR_NAME(CRMD),
34 CSR_NAME(PRMD),
35 CSR_NAME(EUEN),
36 CSR_NAME(MISC),
37 CSR_NAME(ECFG),
38 CSR_NAME(ESTAT),
39 CSR_NAME(ERA),
40 CSR_NAME(BADV),
41 CSR_NAME(BADI),
42 CSR_NAME(EENTRY),
43 CSR_NAME(TLBIDX),
44 CSR_NAME(TLBEHI),
45 CSR_NAME(TLBELO0),
46 CSR_NAME(TLBELO1),
47 CSR_NAME(ASID),
48 CSR_NAME(PGDL),
49 CSR_NAME(PGDH),
50 CSR_NAME(PGD),
51 CSR_NAME(PWCL),
52 CSR_NAME(PWCH),
53 CSR_NAME(STLBPS),
54 CSR_NAME(RVACFG),
55 CSR_NAME(CPUID),
56 CSR_NAME(PRCFG1),
57 CSR_NAME(PRCFG2),
58 CSR_NAME(PRCFG3),
59 CSR_NAME(SAVE(0)),
60 CSR_NAME(SAVE(1)),
61 CSR_NAME(SAVE(2)),
62 CSR_NAME(SAVE(3)),
63 CSR_NAME(SAVE(4)),
64 CSR_NAME(SAVE(5)),
65 CSR_NAME(SAVE(6)),
66 CSR_NAME(SAVE(7)),
67 CSR_NAME(SAVE(8)),
68 CSR_NAME(SAVE(9)),
69 CSR_NAME(SAVE(10)),
70 CSR_NAME(SAVE(11)),
71 CSR_NAME(SAVE(12)),
72 CSR_NAME(SAVE(13)),
73 CSR_NAME(SAVE(14)),
74 CSR_NAME(SAVE(15)),
75 CSR_NAME(TID),
76 CSR_NAME(TCFG),
77 CSR_NAME(TVAL),
78 CSR_NAME(CNTC),
79 CSR_NAME(TICLR),
80 CSR_NAME(LLBCTL),
81 CSR_NAME(IMPCTL1),
82 CSR_NAME(IMPCTL2),
83 CSR_NAME(TLBRENTRY),
84 CSR_NAME(TLBRBADV),
85 CSR_NAME(TLBRERA),
86 CSR_NAME(TLBRSAVE),
87 CSR_NAME(TLBRELO0),
88 CSR_NAME(TLBRELO1),
89 CSR_NAME(TLBREHI),
90 CSR_NAME(TLBRPRMD),
91 CSR_NAME(MERRCTL),
92 CSR_NAME(MERRINFO1),
93 CSR_NAME(MERRINFO2),
94 CSR_NAME(MERRENTRY),
95 CSR_NAME(MERRERA),
96 CSR_NAME(MERRSAVE),
97 CSR_NAME(CTAG),
98 CSR_NAME(DMW(0)),
99 CSR_NAME(DMW(1)),
100 CSR_NAME(DMW(2)),
101 CSR_NAME(DMW(3)),
102 CSR_NAME(DBG),
103 CSR_NAME(DERA),
104 CSR_NAME(DSAVE),
105};
106
107static const char *get_csr_name(unsigned num)
108{
109 return ((num < ARRAY_SIZE(csr_names)) && (csr_names[num] != NULL)) ?
110 csr_names[num] : "Undefined CSR";
111}
112
aae1746c
SG
113#define output(C, INSN, FMT, ...) \
114{ \
115 (C)->info->fprintf_func((C)->info->stream, "%08x %-9s\t" FMT, \
116 (C)->insn, INSN, ##__VA_ARGS__); \
117}
118
119#include "decode-insns.c.inc"
120
121int print_insn_loongarch(bfd_vma memaddr, struct disassemble_info *info)
122{
123 bfd_byte buffer[4];
124 uint32_t insn;
125 int status;
126
127 status = (*info->read_memory_func)(memaddr, buffer, 4, info);
128 if (status != 0) {
129 (*info->memory_error_func)(status, memaddr, info);
130 return -1;
131 }
132 insn = bfd_getl32(buffer);
133 DisasContext ctx = {
134 .info = info,
135 .pc = memaddr,
136 .insn = insn
137 };
138
139 if (!decode(&ctx, insn)) {
140 output(&ctx, "illegal", "");
141 }
142 return 4;
143}
144
145static void output_r_i(DisasContext *ctx, arg_r_i *a, const char *mnemonic)
146{
147 output(ctx, mnemonic, "r%d, %d", a->rd, a->imm);
148}
149
150static void output_rrr(DisasContext *ctx, arg_rrr *a, const char *mnemonic)
151{
152 output(ctx, mnemonic, "r%d, r%d, r%d", a->rd, a->rj, a->rk);
153}
154
155static void output_rr_i(DisasContext *ctx, arg_rr_i *a, const char *mnemonic)
156{
157 output(ctx, mnemonic, "r%d, r%d, %d", a->rd, a->rj, a->imm);
158}
159
160static void output_rrr_sa(DisasContext *ctx, arg_rrr_sa *a,
161 const char *mnemonic)
162{
163 output(ctx, mnemonic, "r%d, r%d, r%d, %d", a->rd, a->rj, a->rk, a->sa);
164}
165
166static void output_rr(DisasContext *ctx, arg_rr *a, const char *mnemonic)
167{
168 output(ctx, mnemonic, "r%d, r%d", a->rd, a->rj);
169}
170
171static void output_rr_ms_ls(DisasContext *ctx, arg_rr_ms_ls *a,
172 const char *mnemonic)
173{
174 output(ctx, mnemonic, "r%d, r%d, %d, %d", a->rd, a->rj, a->ms, a->ls);
175}
176
177static void output_hint_r_i(DisasContext *ctx, arg_hint_r_i *a,
178 const char *mnemonic)
179{
180 output(ctx, mnemonic, "%d, r%d, %d", a->hint, a->rj, a->imm);
181}
182
183static void output_i(DisasContext *ctx, arg_i *a, const char *mnemonic)
184{
185 output(ctx, mnemonic, "%d", a->imm);
186}
187
188static void output_rr_jk(DisasContext *ctx, arg_rr_jk *a,
189 const char *mnemonic)
190{
191 output(ctx, mnemonic, "r%d, r%d", a->rj, a->rk);
192}
193
194static void output_ff(DisasContext *ctx, arg_ff *a, const char *mnemonic)
195{
196 output(ctx, mnemonic, "f%d, f%d", a->fd, a->fj);
197}
198
199static void output_fff(DisasContext *ctx, arg_fff *a, const char *mnemonic)
200{
201 output(ctx, mnemonic, "f%d, f%d, f%d", a->fd, a->fj, a->fk);
202}
203
204static void output_ffff(DisasContext *ctx, arg_ffff *a, const char *mnemonic)
205{
206 output(ctx, mnemonic, "f%d, f%d, f%d, f%d", a->fd, a->fj, a->fk, a->fa);
207}
208
209static void output_fffc(DisasContext *ctx, arg_fffc *a, const char *mnemonic)
210{
211 output(ctx, mnemonic, "f%d, f%d, f%d, %d", a->fd, a->fj, a->fk, a->ca);
212}
213
214static void output_fr(DisasContext *ctx, arg_fr *a, const char *mnemonic)
215{
216 output(ctx, mnemonic, "f%d, r%d", a->fd, a->rj);
217}
218
219static void output_rf(DisasContext *ctx, arg_rf *a, const char *mnemonic)
220{
221 output(ctx, mnemonic, "r%d, f%d", a->rd, a->fj);
222}
223
224static void output_fcsrd_r(DisasContext *ctx, arg_fcsrd_r *a,
225 const char *mnemonic)
226{
227 output(ctx, mnemonic, "fcsr%d, r%d", a->fcsrd, a->rj);
228}
229
230static void output_r_fcsrs(DisasContext *ctx, arg_r_fcsrs *a,
231 const char *mnemonic)
232{
233 output(ctx, mnemonic, "r%d, fcsr%d", a->rd, a->fcsrs);
234}
235
236static void output_cf(DisasContext *ctx, arg_cf *a, const char *mnemonic)
237{
238 output(ctx, mnemonic, "fcc%d, f%d", a->cd, a->fj);
239}
240
241static void output_fc(DisasContext *ctx, arg_fc *a, const char *mnemonic)
242{
243 output(ctx, mnemonic, "f%d, fcc%d", a->fd, a->cj);
244}
245
246static void output_cr(DisasContext *ctx, arg_cr *a, const char *mnemonic)
247{
248 output(ctx, mnemonic, "fcc%d, r%d", a->cd, a->rj);
249}
250
251static void output_rc(DisasContext *ctx, arg_rc *a, const char *mnemonic)
252{
253 output(ctx, mnemonic, "r%d, fcc%d", a->rd, a->cj);
254}
255
256static void output_frr(DisasContext *ctx, arg_frr *a, const char *mnemonic)
257{
258 output(ctx, mnemonic, "f%d, r%d, r%d", a->fd, a->rj, a->rk);
259}
260
261static void output_fr_i(DisasContext *ctx, arg_fr_i *a, const char *mnemonic)
262{
263 output(ctx, mnemonic, "f%d, r%d, %d", a->fd, a->rj, a->imm);
264}
265
266static void output_r_offs(DisasContext *ctx, arg_r_offs *a,
267 const char *mnemonic)
268{
269 output(ctx, mnemonic, "r%d, %d # 0x%" PRIx64, a->rj, a->offs,
270 ctx->pc + a->offs);
271}
272
273static void output_c_offs(DisasContext *ctx, arg_c_offs *a,
274 const char *mnemonic)
275{
276 output(ctx, mnemonic, "fcc%d, %d # 0x%" PRIx64, a->cj, a->offs,
277 ctx->pc + a->offs);
278}
279
280static void output_offs(DisasContext *ctx, arg_offs *a,
281 const char *mnemonic)
282{
283 output(ctx, mnemonic, "%d # 0x%" PRIx64, a->offs, ctx->pc + a->offs);
284}
285
286static void output_rr_offs(DisasContext *ctx, arg_rr_offs *a,
287 const char *mnemonic)
288{
289 output(ctx, mnemonic, "r%d, r%d, %d # 0x%" PRIx64, a->rj,
290 a->rd, a->offs, ctx->pc + a->offs);
291}
292
5b1dedfe
XY
293static void output_r_csr(DisasContext *ctx, arg_r_csr *a,
294 const char *mnemonic)
295{
296 output(ctx, mnemonic, "r%d, %d # %s", a->rd, a->csr, get_csr_name(a->csr));
297}
298
299static void output_rr_csr(DisasContext *ctx, arg_rr_csr *a,
300 const char *mnemonic)
301{
302 output(ctx, mnemonic, "r%d, r%d, %d # %s",
303 a->rd, a->rj, a->csr, get_csr_name(a->csr));
304}
305
fcbbeb8e
XY
306static void output_empty(DisasContext *ctx, arg_empty *a,
307 const char *mnemonic)
308{
309 output(ctx, mnemonic, "");
310}
311
312static void output_i_rr(DisasContext *ctx, arg_i_rr *a, const char *mnemonic)
313{
314 output(ctx, mnemonic, "%d, r%d, r%d", a->imm, a->rj, a->rk);
315}
316
d2cba6f7
XY
317static void output_cop_r_i(DisasContext *ctx, arg_cop_r_i *a,
318 const char *mnemonic)
319{
320 output(ctx, mnemonic, "%d, r%d, %d", a->cop, a->rj, a->imm);
321}
322
323static void output_j_i(DisasContext *ctx, arg_j_i *a, const char *mnemonic)
324{
325 output(ctx, mnemonic, "r%d, %d", a->rj, a->imm);
326}
327
aae1746c
SG
328#define INSN(insn, type) \
329static bool trans_##insn(DisasContext *ctx, arg_##type * a) \
330{ \
331 output_##type(ctx, a, #insn); \
332 return true; \
333}
334
335INSN(clo_w, rr)
336INSN(clz_w, rr)
337INSN(cto_w, rr)
338INSN(ctz_w, rr)
339INSN(clo_d, rr)
340INSN(clz_d, rr)
341INSN(cto_d, rr)
342INSN(ctz_d, rr)
343INSN(revb_2h, rr)
344INSN(revb_4h, rr)
345INSN(revb_2w, rr)
346INSN(revb_d, rr)
347INSN(revh_2w, rr)
348INSN(revh_d, rr)
349INSN(bitrev_4b, rr)
350INSN(bitrev_8b, rr)
351INSN(bitrev_w, rr)
352INSN(bitrev_d, rr)
353INSN(ext_w_h, rr)
354INSN(ext_w_b, rr)
f9bf5074
XY
355INSN(rdtimel_w, rr)
356INSN(rdtimeh_w, rr)
357INSN(rdtime_d, rr)
aae1746c
SG
358INSN(cpucfg, rr)
359INSN(asrtle_d, rr_jk)
360INSN(asrtgt_d, rr_jk)
361INSN(alsl_w, rrr_sa)
362INSN(alsl_wu, rrr_sa)
363INSN(bytepick_w, rrr_sa)
364INSN(bytepick_d, rrr_sa)
365INSN(add_w, rrr)
366INSN(add_d, rrr)
367INSN(sub_w, rrr)
368INSN(sub_d, rrr)
369INSN(slt, rrr)
370INSN(sltu, rrr)
371INSN(maskeqz, rrr)
372INSN(masknez, rrr)
373INSN(nor, rrr)
374INSN(and, rrr)
375INSN(or, rrr)
376INSN(xor, rrr)
377INSN(orn, rrr)
378INSN(andn, rrr)
379INSN(sll_w, rrr)
380INSN(srl_w, rrr)
381INSN(sra_w, rrr)
382INSN(sll_d, rrr)
383INSN(srl_d, rrr)
384INSN(sra_d, rrr)
385INSN(rotr_w, rrr)
386INSN(rotr_d, rrr)
387INSN(mul_w, rrr)
388INSN(mulh_w, rrr)
389INSN(mulh_wu, rrr)
390INSN(mul_d, rrr)
391INSN(mulh_d, rrr)
392INSN(mulh_du, rrr)
393INSN(mulw_d_w, rrr)
394INSN(mulw_d_wu, rrr)
395INSN(div_w, rrr)
396INSN(mod_w, rrr)
397INSN(div_wu, rrr)
398INSN(mod_wu, rrr)
399INSN(div_d, rrr)
400INSN(mod_d, rrr)
401INSN(div_du, rrr)
402INSN(mod_du, rrr)
403INSN(crc_w_b_w, rrr)
404INSN(crc_w_h_w, rrr)
405INSN(crc_w_w_w, rrr)
406INSN(crc_w_d_w, rrr)
407INSN(crcc_w_b_w, rrr)
408INSN(crcc_w_h_w, rrr)
409INSN(crcc_w_w_w, rrr)
410INSN(crcc_w_d_w, rrr)
411INSN(break, i)
412INSN(syscall, i)
413INSN(alsl_d, rrr_sa)
414INSN(slli_w, rr_i)
415INSN(slli_d, rr_i)
416INSN(srli_w, rr_i)
417INSN(srli_d, rr_i)
418INSN(srai_w, rr_i)
419INSN(srai_d, rr_i)
420INSN(rotri_w, rr_i)
421INSN(rotri_d, rr_i)
422INSN(bstrins_w, rr_ms_ls)
423INSN(bstrpick_w, rr_ms_ls)
424INSN(bstrins_d, rr_ms_ls)
425INSN(bstrpick_d, rr_ms_ls)
426INSN(fadd_s, fff)
427INSN(fadd_d, fff)
428INSN(fsub_s, fff)
429INSN(fsub_d, fff)
430INSN(fmul_s, fff)
431INSN(fmul_d, fff)
432INSN(fdiv_s, fff)
433INSN(fdiv_d, fff)
434INSN(fmax_s, fff)
435INSN(fmax_d, fff)
436INSN(fmin_s, fff)
437INSN(fmin_d, fff)
438INSN(fmaxa_s, fff)
439INSN(fmaxa_d, fff)
440INSN(fmina_s, fff)
441INSN(fmina_d, fff)
442INSN(fscaleb_s, fff)
443INSN(fscaleb_d, fff)
444INSN(fcopysign_s, fff)
445INSN(fcopysign_d, fff)
446INSN(fabs_s, ff)
447INSN(fabs_d, ff)
448INSN(fneg_s, ff)
449INSN(fneg_d, ff)
450INSN(flogb_s, ff)
451INSN(flogb_d, ff)
452INSN(fclass_s, ff)
453INSN(fclass_d, ff)
454INSN(fsqrt_s, ff)
455INSN(fsqrt_d, ff)
456INSN(frecip_s, ff)
457INSN(frecip_d, ff)
458INSN(frsqrt_s, ff)
459INSN(frsqrt_d, ff)
460INSN(fmov_s, ff)
461INSN(fmov_d, ff)
462INSN(movgr2fr_w, fr)
463INSN(movgr2fr_d, fr)
464INSN(movgr2frh_w, fr)
465INSN(movfr2gr_s, rf)
466INSN(movfr2gr_d, rf)
467INSN(movfrh2gr_s, rf)
468INSN(movgr2fcsr, fcsrd_r)
469INSN(movfcsr2gr, r_fcsrs)
470INSN(movfr2cf, cf)
471INSN(movcf2fr, fc)
472INSN(movgr2cf, cr)
473INSN(movcf2gr, rc)
474INSN(fcvt_s_d, ff)
475INSN(fcvt_d_s, ff)
476INSN(ftintrm_w_s, ff)
477INSN(ftintrm_w_d, ff)
478INSN(ftintrm_l_s, ff)
479INSN(ftintrm_l_d, ff)
480INSN(ftintrp_w_s, ff)
481INSN(ftintrp_w_d, ff)
482INSN(ftintrp_l_s, ff)
483INSN(ftintrp_l_d, ff)
484INSN(ftintrz_w_s, ff)
485INSN(ftintrz_w_d, ff)
486INSN(ftintrz_l_s, ff)
487INSN(ftintrz_l_d, ff)
488INSN(ftintrne_w_s, ff)
489INSN(ftintrne_w_d, ff)
490INSN(ftintrne_l_s, ff)
491INSN(ftintrne_l_d, ff)
492INSN(ftint_w_s, ff)
493INSN(ftint_w_d, ff)
494INSN(ftint_l_s, ff)
495INSN(ftint_l_d, ff)
496INSN(ffint_s_w, ff)
497INSN(ffint_s_l, ff)
498INSN(ffint_d_w, ff)
499INSN(ffint_d_l, ff)
500INSN(frint_s, ff)
501INSN(frint_d, ff)
502INSN(slti, rr_i)
503INSN(sltui, rr_i)
504INSN(addi_w, rr_i)
505INSN(addi_d, rr_i)
506INSN(lu52i_d, rr_i)
507INSN(andi, rr_i)
508INSN(ori, rr_i)
509INSN(xori, rr_i)
510INSN(fmadd_s, ffff)
511INSN(fmadd_d, ffff)
512INSN(fmsub_s, ffff)
513INSN(fmsub_d, ffff)
514INSN(fnmadd_s, ffff)
515INSN(fnmadd_d, ffff)
516INSN(fnmsub_s, ffff)
517INSN(fnmsub_d, ffff)
518INSN(fsel, fffc)
519INSN(addu16i_d, rr_i)
520INSN(lu12i_w, r_i)
521INSN(lu32i_d, r_i)
aae1746c
SG
522INSN(ll_w, rr_i)
523INSN(sc_w, rr_i)
524INSN(ll_d, rr_i)
525INSN(sc_d, rr_i)
526INSN(ldptr_w, rr_i)
527INSN(stptr_w, rr_i)
528INSN(ldptr_d, rr_i)
529INSN(stptr_d, rr_i)
530INSN(ld_b, rr_i)
531INSN(ld_h, rr_i)
532INSN(ld_w, rr_i)
533INSN(ld_d, rr_i)
534INSN(st_b, rr_i)
535INSN(st_h, rr_i)
536INSN(st_w, rr_i)
537INSN(st_d, rr_i)
538INSN(ld_bu, rr_i)
539INSN(ld_hu, rr_i)
540INSN(ld_wu, rr_i)
541INSN(preld, hint_r_i)
542INSN(fld_s, fr_i)
543INSN(fst_s, fr_i)
544INSN(fld_d, fr_i)
545INSN(fst_d, fr_i)
546INSN(ldx_b, rrr)
547INSN(ldx_h, rrr)
548INSN(ldx_w, rrr)
549INSN(ldx_d, rrr)
550INSN(stx_b, rrr)
551INSN(stx_h, rrr)
552INSN(stx_w, rrr)
553INSN(stx_d, rrr)
554INSN(ldx_bu, rrr)
555INSN(ldx_hu, rrr)
556INSN(ldx_wu, rrr)
557INSN(fldx_s, frr)
558INSN(fldx_d, frr)
559INSN(fstx_s, frr)
560INSN(fstx_d, frr)
561INSN(amswap_w, rrr)
562INSN(amswap_d, rrr)
563INSN(amadd_w, rrr)
564INSN(amadd_d, rrr)
565INSN(amand_w, rrr)
566INSN(amand_d, rrr)
567INSN(amor_w, rrr)
568INSN(amor_d, rrr)
569INSN(amxor_w, rrr)
570INSN(amxor_d, rrr)
571INSN(ammax_w, rrr)
572INSN(ammax_d, rrr)
573INSN(ammin_w, rrr)
574INSN(ammin_d, rrr)
575INSN(ammax_wu, rrr)
576INSN(ammax_du, rrr)
577INSN(ammin_wu, rrr)
578INSN(ammin_du, rrr)
579INSN(amswap_db_w, rrr)
580INSN(amswap_db_d, rrr)
581INSN(amadd_db_w, rrr)
582INSN(amadd_db_d, rrr)
583INSN(amand_db_w, rrr)
584INSN(amand_db_d, rrr)
585INSN(amor_db_w, rrr)
586INSN(amor_db_d, rrr)
587INSN(amxor_db_w, rrr)
588INSN(amxor_db_d, rrr)
589INSN(ammax_db_w, rrr)
590INSN(ammax_db_d, rrr)
591INSN(ammin_db_w, rrr)
592INSN(ammin_db_d, rrr)
593INSN(ammax_db_wu, rrr)
594INSN(ammax_db_du, rrr)
595INSN(ammin_db_wu, rrr)
596INSN(ammin_db_du, rrr)
597INSN(dbar, i)
598INSN(ibar, i)
599INSN(fldgt_s, frr)
600INSN(fldgt_d, frr)
601INSN(fldle_s, frr)
602INSN(fldle_d, frr)
603INSN(fstgt_s, frr)
604INSN(fstgt_d, frr)
605INSN(fstle_s, frr)
606INSN(fstle_d, frr)
607INSN(ldgt_b, rrr)
608INSN(ldgt_h, rrr)
609INSN(ldgt_w, rrr)
610INSN(ldgt_d, rrr)
611INSN(ldle_b, rrr)
612INSN(ldle_h, rrr)
613INSN(ldle_w, rrr)
614INSN(ldle_d, rrr)
615INSN(stgt_b, rrr)
616INSN(stgt_h, rrr)
617INSN(stgt_w, rrr)
618INSN(stgt_d, rrr)
619INSN(stle_b, rrr)
620INSN(stle_h, rrr)
621INSN(stle_w, rrr)
622INSN(stle_d, rrr)
623INSN(beqz, r_offs)
624INSN(bnez, r_offs)
625INSN(bceqz, c_offs)
626INSN(bcnez, c_offs)
c2b618a8 627INSN(jirl, rr_i)
aae1746c
SG
628INSN(b, offs)
629INSN(bl, offs)
630INSN(beq, rr_offs)
631INSN(bne, rr_offs)
632INSN(blt, rr_offs)
633INSN(bge, rr_offs)
634INSN(bltu, rr_offs)
635INSN(bgeu, rr_offs)
5b1dedfe
XY
636INSN(csrrd, r_csr)
637INSN(csrwr, r_csr)
638INSN(csrxchg, rr_csr)
f84a2aac
XY
639INSN(iocsrrd_b, rr)
640INSN(iocsrrd_h, rr)
641INSN(iocsrrd_w, rr)
642INSN(iocsrrd_d, rr)
643INSN(iocsrwr_b, rr)
644INSN(iocsrwr_h, rr)
645INSN(iocsrwr_w, rr)
646INSN(iocsrwr_d, rr)
fcbbeb8e
XY
647INSN(tlbsrch, empty)
648INSN(tlbrd, empty)
649INSN(tlbwr, empty)
650INSN(tlbfill, empty)
651INSN(tlbclr, empty)
652INSN(tlbflush, empty)
653INSN(invtlb, i_rr)
d2cba6f7
XY
654INSN(cacop, cop_r_i)
655INSN(lddir, rr_i)
656INSN(ldpte, j_i)
657INSN(ertn, empty)
658INSN(idle, i)
659INSN(dbcl, i)
aae1746c
SG
660
661#define output_fcmp(C, PREFIX, SUFFIX) \
662{ \
663 (C)->info->fprintf_func((C)->info->stream, "%08x %s%s\tfcc%d, f%d, f%d", \
664 (C)->insn, PREFIX, SUFFIX, a->cd, \
665 a->fj, a->fk); \
666}
667
668static bool output_cff_fcond(DisasContext *ctx, arg_cff_fcond * a,
669 const char *suffix)
670{
671 bool ret = true;
672 switch (a->fcond) {
673 case 0x0:
674 output_fcmp(ctx, "fcmp_caf_", suffix);
675 break;
676 case 0x1:
677 output_fcmp(ctx, "fcmp_saf_", suffix);
678 break;
679 case 0x2:
680 output_fcmp(ctx, "fcmp_clt_", suffix);
681 break;
682 case 0x3:
683 output_fcmp(ctx, "fcmp_slt_", suffix);
684 break;
685 case 0x4:
686 output_fcmp(ctx, "fcmp_ceq_", suffix);
687 break;
688 case 0x5:
689 output_fcmp(ctx, "fcmp_seq_", suffix);
690 break;
691 case 0x6:
692 output_fcmp(ctx, "fcmp_cle_", suffix);
693 break;
694 case 0x7:
695 output_fcmp(ctx, "fcmp_sle_", suffix);
696 break;
697 case 0x8:
698 output_fcmp(ctx, "fcmp_cun_", suffix);
699 break;
700 case 0x9:
701 output_fcmp(ctx, "fcmp_sun_", suffix);
702 break;
703 case 0xA:
704 output_fcmp(ctx, "fcmp_cult_", suffix);
705 break;
706 case 0xB:
707 output_fcmp(ctx, "fcmp_sult_", suffix);
708 break;
709 case 0xC:
710 output_fcmp(ctx, "fcmp_cueq_", suffix);
711 break;
712 case 0xD:
713 output_fcmp(ctx, "fcmp_sueq_", suffix);
714 break;
715 case 0xE:
716 output_fcmp(ctx, "fcmp_cule_", suffix);
717 break;
718 case 0xF:
719 output_fcmp(ctx, "fcmp_sule_", suffix);
720 break;
721 case 0x10:
722 output_fcmp(ctx, "fcmp_cne_", suffix);
723 break;
724 case 0x11:
725 output_fcmp(ctx, "fcmp_sne_", suffix);
726 break;
727 case 0x14:
728 output_fcmp(ctx, "fcmp_cor_", suffix);
729 break;
730 case 0x15:
731 output_fcmp(ctx, "fcmp_sor_", suffix);
732 break;
733 case 0x18:
734 output_fcmp(ctx, "fcmp_cune_", suffix);
735 break;
736 case 0x19:
737 output_fcmp(ctx, "fcmp_sune_", suffix);
738 break;
739 default:
740 ret = false;
741 }
742 return ret;
743}
744
745#define FCMP_INSN(suffix) \
746static bool trans_fcmp_cond_##suffix(DisasContext *ctx, \
747 arg_cff_fcond * a) \
748{ \
749 return output_cff_fcond(ctx, a, #suffix); \
750}
751
752FCMP_INSN(s)
753FCMP_INSN(d)
69c9a5cf
RH
754
755#define PCADD_INSN(name) \
756static bool trans_##name(DisasContext *ctx, arg_##name *a) \
757{ \
758 output(ctx, #name, "r%d, %d # 0x%" PRIx64, \
759 a->rd, a->imm, gen_##name(ctx->pc, a->imm)); \
760 return true; \
761}
762
763static uint64_t gen_pcaddi(uint64_t pc, int imm)
764{
765 return pc + (imm << 2);
766}
767
768static uint64_t gen_pcalau12i(uint64_t pc, int imm)
769{
770 return (pc + (imm << 12)) & ~0xfff;
771}
772
773static uint64_t gen_pcaddu12i(uint64_t pc, int imm)
774{
775 return pc + (imm << 12);
776}
777
778static uint64_t gen_pcaddu18i(uint64_t pc, int imm)
779{
780 return pc + ((uint64_t)(imm) << 18);
781}
782
783PCADD_INSN(pcaddi)
784PCADD_INSN(pcalau12i)
785PCADD_INSN(pcaddu12i)
786PCADD_INSN(pcaddu18i)
57b4f1ac
SG
787
788#define INSN_LSX(insn, type) \
789static bool trans_##insn(DisasContext *ctx, arg_##type * a) \
790{ \
791 output_##type(ctx, a, #insn); \
792 return true; \
793}
794
d0dfa19a
SG
795static void output_cv(DisasContext *ctx, arg_cv *a,
796 const char *mnemonic)
797{
798 output(ctx, mnemonic, "fcc%d, v%d", a->cd, a->vj);
799}
800
57b4f1ac
SG
801static void output_vvv(DisasContext *ctx, arg_vvv *a, const char *mnemonic)
802{
803 output(ctx, mnemonic, "v%d, v%d, v%d", a->vd, a->vj, a->vk);
804}
805
d8be64c1
SG
806static void output_vv_i(DisasContext *ctx, arg_vv_i *a, const char *mnemonic)
807{
808 output(ctx, mnemonic, "v%d, v%d, 0x%x", a->vd, a->vj, a->imm);
809}
810
be9ec557
SG
811static void output_vv(DisasContext *ctx, arg_vv *a, const char *mnemonic)
812{
813 output(ctx, mnemonic, "v%d, v%d", a->vd, a->vj);
814}
815
aca67472
SG
816static void output_vvvv(DisasContext *ctx, arg_vvvv *a, const char *mnemonic)
817{
818 output(ctx, mnemonic, "v%d, v%d, v%d, v%d", a->vd, a->vj, a->vk, a->va);
819}
820
cdbdefbf
SG
821static void output_vr_i(DisasContext *ctx, arg_vr_i *a, const char *mnemonic)
822{
823 output(ctx, mnemonic, "v%d, r%d, 0x%x", a->vd, a->rj, a->imm);
824}
825
826static void output_rv_i(DisasContext *ctx, arg_rv_i *a, const char *mnemonic)
827{
828 output(ctx, mnemonic, "r%d, v%d, 0x%x", a->rd, a->vj, a->imm);
829}
830
831static void output_vr(DisasContext *ctx, arg_vr *a, const char *mnemonic)
832{
833 output(ctx, mnemonic, "v%d, r%d", a->vd, a->rj);
834}
835
d5e5563c
SG
836static void output_vvr(DisasContext *ctx, arg_vvr *a, const char *mnemonic)
837{
838 output(ctx, mnemonic, "v%d, v%d, r%d", a->vd, a->vj, a->rk);
839}
840
57b4f1ac
SG
841INSN_LSX(vadd_b, vvv)
842INSN_LSX(vadd_h, vvv)
843INSN_LSX(vadd_w, vvv)
844INSN_LSX(vadd_d, vvv)
845INSN_LSX(vadd_q, vvv)
846INSN_LSX(vsub_b, vvv)
847INSN_LSX(vsub_h, vvv)
848INSN_LSX(vsub_w, vvv)
849INSN_LSX(vsub_d, vvv)
850INSN_LSX(vsub_q, vvv)
d8be64c1
SG
851
852INSN_LSX(vaddi_bu, vv_i)
853INSN_LSX(vaddi_hu, vv_i)
854INSN_LSX(vaddi_wu, vv_i)
855INSN_LSX(vaddi_du, vv_i)
856INSN_LSX(vsubi_bu, vv_i)
857INSN_LSX(vsubi_hu, vv_i)
858INSN_LSX(vsubi_wu, vv_i)
859INSN_LSX(vsubi_du, vv_i)
be9ec557
SG
860
861INSN_LSX(vneg_b, vv)
862INSN_LSX(vneg_h, vv)
863INSN_LSX(vneg_w, vv)
864INSN_LSX(vneg_d, vv)
a94cb911
SG
865
866INSN_LSX(vsadd_b, vvv)
867INSN_LSX(vsadd_h, vvv)
868INSN_LSX(vsadd_w, vvv)
869INSN_LSX(vsadd_d, vvv)
870INSN_LSX(vsadd_bu, vvv)
871INSN_LSX(vsadd_hu, vvv)
872INSN_LSX(vsadd_wu, vvv)
873INSN_LSX(vsadd_du, vvv)
874INSN_LSX(vssub_b, vvv)
875INSN_LSX(vssub_h, vvv)
876INSN_LSX(vssub_w, vvv)
877INSN_LSX(vssub_d, vvv)
878INSN_LSX(vssub_bu, vvv)
879INSN_LSX(vssub_hu, vvv)
880INSN_LSX(vssub_wu, vvv)
881INSN_LSX(vssub_du, vvv)
c037fbc9
SG
882
883INSN_LSX(vhaddw_h_b, vvv)
884INSN_LSX(vhaddw_w_h, vvv)
885INSN_LSX(vhaddw_d_w, vvv)
886INSN_LSX(vhaddw_q_d, vvv)
887INSN_LSX(vhaddw_hu_bu, vvv)
888INSN_LSX(vhaddw_wu_hu, vvv)
889INSN_LSX(vhaddw_du_wu, vvv)
890INSN_LSX(vhaddw_qu_du, vvv)
891INSN_LSX(vhsubw_h_b, vvv)
892INSN_LSX(vhsubw_w_h, vvv)
893INSN_LSX(vhsubw_d_w, vvv)
894INSN_LSX(vhsubw_q_d, vvv)
895INSN_LSX(vhsubw_hu_bu, vvv)
896INSN_LSX(vhsubw_wu_hu, vvv)
897INSN_LSX(vhsubw_du_wu, vvv)
898INSN_LSX(vhsubw_qu_du, vvv)
2d5f950c
SG
899
900INSN_LSX(vaddwev_h_b, vvv)
901INSN_LSX(vaddwev_w_h, vvv)
902INSN_LSX(vaddwev_d_w, vvv)
903INSN_LSX(vaddwev_q_d, vvv)
904INSN_LSX(vaddwod_h_b, vvv)
905INSN_LSX(vaddwod_w_h, vvv)
906INSN_LSX(vaddwod_d_w, vvv)
907INSN_LSX(vaddwod_q_d, vvv)
908INSN_LSX(vsubwev_h_b, vvv)
909INSN_LSX(vsubwev_w_h, vvv)
910INSN_LSX(vsubwev_d_w, vvv)
911INSN_LSX(vsubwev_q_d, vvv)
912INSN_LSX(vsubwod_h_b, vvv)
913INSN_LSX(vsubwod_w_h, vvv)
914INSN_LSX(vsubwod_d_w, vvv)
915INSN_LSX(vsubwod_q_d, vvv)
916
917INSN_LSX(vaddwev_h_bu, vvv)
918INSN_LSX(vaddwev_w_hu, vvv)
919INSN_LSX(vaddwev_d_wu, vvv)
920INSN_LSX(vaddwev_q_du, vvv)
921INSN_LSX(vaddwod_h_bu, vvv)
922INSN_LSX(vaddwod_w_hu, vvv)
923INSN_LSX(vaddwod_d_wu, vvv)
924INSN_LSX(vaddwod_q_du, vvv)
925INSN_LSX(vsubwev_h_bu, vvv)
926INSN_LSX(vsubwev_w_hu, vvv)
927INSN_LSX(vsubwev_d_wu, vvv)
928INSN_LSX(vsubwev_q_du, vvv)
929INSN_LSX(vsubwod_h_bu, vvv)
930INSN_LSX(vsubwod_w_hu, vvv)
931INSN_LSX(vsubwod_d_wu, vvv)
932INSN_LSX(vsubwod_q_du, vvv)
933
934INSN_LSX(vaddwev_h_bu_b, vvv)
935INSN_LSX(vaddwev_w_hu_h, vvv)
936INSN_LSX(vaddwev_d_wu_w, vvv)
937INSN_LSX(vaddwev_q_du_d, vvv)
938INSN_LSX(vaddwod_h_bu_b, vvv)
939INSN_LSX(vaddwod_w_hu_h, vvv)
940INSN_LSX(vaddwod_d_wu_w, vvv)
941INSN_LSX(vaddwod_q_du_d, vvv)
39e9b0a7
SG
942
943INSN_LSX(vavg_b, vvv)
944INSN_LSX(vavg_h, vvv)
945INSN_LSX(vavg_w, vvv)
946INSN_LSX(vavg_d, vvv)
947INSN_LSX(vavg_bu, vvv)
948INSN_LSX(vavg_hu, vvv)
949INSN_LSX(vavg_wu, vvv)
950INSN_LSX(vavg_du, vvv)
951INSN_LSX(vavgr_b, vvv)
952INSN_LSX(vavgr_h, vvv)
953INSN_LSX(vavgr_w, vvv)
954INSN_LSX(vavgr_d, vvv)
955INSN_LSX(vavgr_bu, vvv)
956INSN_LSX(vavgr_hu, vvv)
957INSN_LSX(vavgr_wu, vvv)
958INSN_LSX(vavgr_du, vvv)
49725659
SG
959
960INSN_LSX(vabsd_b, vvv)
961INSN_LSX(vabsd_h, vvv)
962INSN_LSX(vabsd_w, vvv)
963INSN_LSX(vabsd_d, vvv)
964INSN_LSX(vabsd_bu, vvv)
965INSN_LSX(vabsd_hu, vvv)
966INSN_LSX(vabsd_wu, vvv)
967INSN_LSX(vabsd_du, vvv)
af448cb3
SG
968
969INSN_LSX(vadda_b, vvv)
970INSN_LSX(vadda_h, vvv)
971INSN_LSX(vadda_w, vvv)
972INSN_LSX(vadda_d, vvv)
9ab29520
SG
973
974INSN_LSX(vmax_b, vvv)
975INSN_LSX(vmax_h, vvv)
976INSN_LSX(vmax_w, vvv)
977INSN_LSX(vmax_d, vvv)
978INSN_LSX(vmin_b, vvv)
979INSN_LSX(vmin_h, vvv)
980INSN_LSX(vmin_w, vvv)
981INSN_LSX(vmin_d, vvv)
982INSN_LSX(vmax_bu, vvv)
983INSN_LSX(vmax_hu, vvv)
984INSN_LSX(vmax_wu, vvv)
985INSN_LSX(vmax_du, vvv)
986INSN_LSX(vmin_bu, vvv)
987INSN_LSX(vmin_hu, vvv)
988INSN_LSX(vmin_wu, vvv)
989INSN_LSX(vmin_du, vvv)
990INSN_LSX(vmaxi_b, vv_i)
991INSN_LSX(vmaxi_h, vv_i)
992INSN_LSX(vmaxi_w, vv_i)
993INSN_LSX(vmaxi_d, vv_i)
994INSN_LSX(vmini_b, vv_i)
995INSN_LSX(vmini_h, vv_i)
996INSN_LSX(vmini_w, vv_i)
997INSN_LSX(vmini_d, vv_i)
998INSN_LSX(vmaxi_bu, vv_i)
999INSN_LSX(vmaxi_hu, vv_i)
1000INSN_LSX(vmaxi_wu, vv_i)
1001INSN_LSX(vmaxi_du, vv_i)
1002INSN_LSX(vmini_bu, vv_i)
1003INSN_LSX(vmini_hu, vv_i)
1004INSN_LSX(vmini_wu, vv_i)
1005INSN_LSX(vmini_du, vv_i)
cd1c49ad
SG
1006
1007INSN_LSX(vmul_b, vvv)
1008INSN_LSX(vmul_h, vvv)
1009INSN_LSX(vmul_w, vvv)
1010INSN_LSX(vmul_d, vvv)
1011INSN_LSX(vmuh_b, vvv)
1012INSN_LSX(vmuh_h, vvv)
1013INSN_LSX(vmuh_w, vvv)
1014INSN_LSX(vmuh_d, vvv)
1015INSN_LSX(vmuh_bu, vvv)
1016INSN_LSX(vmuh_hu, vvv)
1017INSN_LSX(vmuh_wu, vvv)
1018INSN_LSX(vmuh_du, vvv)
1019
1020INSN_LSX(vmulwev_h_b, vvv)
1021INSN_LSX(vmulwev_w_h, vvv)
1022INSN_LSX(vmulwev_d_w, vvv)
1023INSN_LSX(vmulwev_q_d, vvv)
1024INSN_LSX(vmulwod_h_b, vvv)
1025INSN_LSX(vmulwod_w_h, vvv)
1026INSN_LSX(vmulwod_d_w, vvv)
1027INSN_LSX(vmulwod_q_d, vvv)
1028INSN_LSX(vmulwev_h_bu, vvv)
1029INSN_LSX(vmulwev_w_hu, vvv)
1030INSN_LSX(vmulwev_d_wu, vvv)
1031INSN_LSX(vmulwev_q_du, vvv)
1032INSN_LSX(vmulwod_h_bu, vvv)
1033INSN_LSX(vmulwod_w_hu, vvv)
1034INSN_LSX(vmulwod_d_wu, vvv)
1035INSN_LSX(vmulwod_q_du, vvv)
1036INSN_LSX(vmulwev_h_bu_b, vvv)
1037INSN_LSX(vmulwev_w_hu_h, vvv)
1038INSN_LSX(vmulwev_d_wu_w, vvv)
1039INSN_LSX(vmulwev_q_du_d, vvv)
1040INSN_LSX(vmulwod_h_bu_b, vvv)
1041INSN_LSX(vmulwod_w_hu_h, vvv)
1042INSN_LSX(vmulwod_d_wu_w, vvv)
1043INSN_LSX(vmulwod_q_du_d, vvv)
d3aec65b
SG
1044
1045INSN_LSX(vmadd_b, vvv)
1046INSN_LSX(vmadd_h, vvv)
1047INSN_LSX(vmadd_w, vvv)
1048INSN_LSX(vmadd_d, vvv)
1049INSN_LSX(vmsub_b, vvv)
1050INSN_LSX(vmsub_h, vvv)
1051INSN_LSX(vmsub_w, vvv)
1052INSN_LSX(vmsub_d, vvv)
1053
1054INSN_LSX(vmaddwev_h_b, vvv)
1055INSN_LSX(vmaddwev_w_h, vvv)
1056INSN_LSX(vmaddwev_d_w, vvv)
1057INSN_LSX(vmaddwev_q_d, vvv)
1058INSN_LSX(vmaddwod_h_b, vvv)
1059INSN_LSX(vmaddwod_w_h, vvv)
1060INSN_LSX(vmaddwod_d_w, vvv)
1061INSN_LSX(vmaddwod_q_d, vvv)
1062INSN_LSX(vmaddwev_h_bu, vvv)
1063INSN_LSX(vmaddwev_w_hu, vvv)
1064INSN_LSX(vmaddwev_d_wu, vvv)
1065INSN_LSX(vmaddwev_q_du, vvv)
1066INSN_LSX(vmaddwod_h_bu, vvv)
1067INSN_LSX(vmaddwod_w_hu, vvv)
1068INSN_LSX(vmaddwod_d_wu, vvv)
1069INSN_LSX(vmaddwod_q_du, vvv)
1070INSN_LSX(vmaddwev_h_bu_b, vvv)
1071INSN_LSX(vmaddwev_w_hu_h, vvv)
1072INSN_LSX(vmaddwev_d_wu_w, vvv)
1073INSN_LSX(vmaddwev_q_du_d, vvv)
1074INSN_LSX(vmaddwod_h_bu_b, vvv)
1075INSN_LSX(vmaddwod_w_hu_h, vvv)
1076INSN_LSX(vmaddwod_d_wu_w, vvv)
1077INSN_LSX(vmaddwod_q_du_d, vvv)
4cc4c0f7
SG
1078
1079INSN_LSX(vdiv_b, vvv)
1080INSN_LSX(vdiv_h, vvv)
1081INSN_LSX(vdiv_w, vvv)
1082INSN_LSX(vdiv_d, vvv)
1083INSN_LSX(vdiv_bu, vvv)
1084INSN_LSX(vdiv_hu, vvv)
1085INSN_LSX(vdiv_wu, vvv)
1086INSN_LSX(vdiv_du, vvv)
1087INSN_LSX(vmod_b, vvv)
1088INSN_LSX(vmod_h, vvv)
1089INSN_LSX(vmod_w, vvv)
1090INSN_LSX(vmod_d, vvv)
1091INSN_LSX(vmod_bu, vvv)
1092INSN_LSX(vmod_hu, vvv)
1093INSN_LSX(vmod_wu, vvv)
1094INSN_LSX(vmod_du, vvv)
cbe44190
SG
1095
1096INSN_LSX(vsat_b, vv_i)
1097INSN_LSX(vsat_h, vv_i)
1098INSN_LSX(vsat_w, vv_i)
1099INSN_LSX(vsat_d, vv_i)
1100INSN_LSX(vsat_bu, vv_i)
1101INSN_LSX(vsat_hu, vv_i)
1102INSN_LSX(vsat_wu, vv_i)
1103INSN_LSX(vsat_du, vv_i)
3734ad93
SG
1104
1105INSN_LSX(vexth_h_b, vv)
1106INSN_LSX(vexth_w_h, vv)
1107INSN_LSX(vexth_d_w, vv)
1108INSN_LSX(vexth_q_d, vv)
1109INSN_LSX(vexth_hu_bu, vv)
1110INSN_LSX(vexth_wu_hu, vv)
1111INSN_LSX(vexth_du_wu, vv)
1112INSN_LSX(vexth_qu_du, vv)
f0e395df
SG
1113
1114INSN_LSX(vsigncov_b, vvv)
1115INSN_LSX(vsigncov_h, vvv)
1116INSN_LSX(vsigncov_w, vvv)
1117INSN_LSX(vsigncov_d, vvv)
789f4a4c
SG
1118
1119INSN_LSX(vmskltz_b, vv)
1120INSN_LSX(vmskltz_h, vv)
1121INSN_LSX(vmskltz_w, vv)
1122INSN_LSX(vmskltz_d, vv)
1123INSN_LSX(vmskgez_b, vv)
1124INSN_LSX(vmsknz_b, vv)
f205a539
SG
1125
1126INSN_LSX(vand_v, vvv)
1127INSN_LSX(vor_v, vvv)
1128INSN_LSX(vxor_v, vvv)
1129INSN_LSX(vnor_v, vvv)
1130INSN_LSX(vandn_v, vvv)
1131INSN_LSX(vorn_v, vvv)
1132
1133INSN_LSX(vandi_b, vv_i)
1134INSN_LSX(vori_b, vv_i)
1135INSN_LSX(vxori_b, vv_i)
1136INSN_LSX(vnori_b, vv_i)
b281d696
SG
1137
1138INSN_LSX(vsll_b, vvv)
1139INSN_LSX(vsll_h, vvv)
1140INSN_LSX(vsll_w, vvv)
1141INSN_LSX(vsll_d, vvv)
1142INSN_LSX(vslli_b, vv_i)
1143INSN_LSX(vslli_h, vv_i)
1144INSN_LSX(vslli_w, vv_i)
1145INSN_LSX(vslli_d, vv_i)
1146
1147INSN_LSX(vsrl_b, vvv)
1148INSN_LSX(vsrl_h, vvv)
1149INSN_LSX(vsrl_w, vvv)
1150INSN_LSX(vsrl_d, vvv)
1151INSN_LSX(vsrli_b, vv_i)
1152INSN_LSX(vsrli_h, vv_i)
1153INSN_LSX(vsrli_w, vv_i)
1154INSN_LSX(vsrli_d, vv_i)
1155
1156INSN_LSX(vsra_b, vvv)
1157INSN_LSX(vsra_h, vvv)
1158INSN_LSX(vsra_w, vvv)
1159INSN_LSX(vsra_d, vvv)
1160INSN_LSX(vsrai_b, vv_i)
1161INSN_LSX(vsrai_h, vv_i)
1162INSN_LSX(vsrai_w, vv_i)
1163INSN_LSX(vsrai_d, vv_i)
1164
1165INSN_LSX(vrotr_b, vvv)
1166INSN_LSX(vrotr_h, vvv)
1167INSN_LSX(vrotr_w, vvv)
1168INSN_LSX(vrotr_d, vvv)
1169INSN_LSX(vrotri_b, vv_i)
1170INSN_LSX(vrotri_h, vv_i)
1171INSN_LSX(vrotri_w, vv_i)
1172INSN_LSX(vrotri_d, vv_i)
9b21a7a5
SG
1173
1174INSN_LSX(vsllwil_h_b, vv_i)
1175INSN_LSX(vsllwil_w_h, vv_i)
1176INSN_LSX(vsllwil_d_w, vv_i)
1177INSN_LSX(vextl_q_d, vv)
1178INSN_LSX(vsllwil_hu_bu, vv_i)
1179INSN_LSX(vsllwil_wu_hu, vv_i)
1180INSN_LSX(vsllwil_du_wu, vv_i)
1181INSN_LSX(vextl_qu_du, vv)
ecb93716
SG
1182
1183INSN_LSX(vsrlr_b, vvv)
1184INSN_LSX(vsrlr_h, vvv)
1185INSN_LSX(vsrlr_w, vvv)
1186INSN_LSX(vsrlr_d, vvv)
1187INSN_LSX(vsrlri_b, vv_i)
1188INSN_LSX(vsrlri_h, vv_i)
1189INSN_LSX(vsrlri_w, vv_i)
1190INSN_LSX(vsrlri_d, vv_i)
1191
1192INSN_LSX(vsrar_b, vvv)
1193INSN_LSX(vsrar_h, vvv)
1194INSN_LSX(vsrar_w, vvv)
1195INSN_LSX(vsrar_d, vvv)
1196INSN_LSX(vsrari_b, vv_i)
1197INSN_LSX(vsrari_h, vv_i)
1198INSN_LSX(vsrari_w, vv_i)
1199INSN_LSX(vsrari_d, vv_i)
d79fb8dd
SG
1200
1201INSN_LSX(vsrln_b_h, vvv)
1202INSN_LSX(vsrln_h_w, vvv)
1203INSN_LSX(vsrln_w_d, vvv)
1204INSN_LSX(vsran_b_h, vvv)
1205INSN_LSX(vsran_h_w, vvv)
1206INSN_LSX(vsran_w_d, vvv)
1207
1208INSN_LSX(vsrlni_b_h, vv_i)
1209INSN_LSX(vsrlni_h_w, vv_i)
1210INSN_LSX(vsrlni_w_d, vv_i)
1211INSN_LSX(vsrlni_d_q, vv_i)
1212INSN_LSX(vsrani_b_h, vv_i)
1213INSN_LSX(vsrani_h_w, vv_i)
1214INSN_LSX(vsrani_w_d, vv_i)
1215INSN_LSX(vsrani_d_q, vv_i)
a5200a17
SG
1216
1217INSN_LSX(vsrlrn_b_h, vvv)
1218INSN_LSX(vsrlrn_h_w, vvv)
1219INSN_LSX(vsrlrn_w_d, vvv)
1220INSN_LSX(vsrarn_b_h, vvv)
1221INSN_LSX(vsrarn_h_w, vvv)
1222INSN_LSX(vsrarn_w_d, vvv)
1223
1224INSN_LSX(vsrlrni_b_h, vv_i)
1225INSN_LSX(vsrlrni_h_w, vv_i)
1226INSN_LSX(vsrlrni_w_d, vv_i)
1227INSN_LSX(vsrlrni_d_q, vv_i)
1228INSN_LSX(vsrarni_b_h, vv_i)
1229INSN_LSX(vsrarni_h_w, vv_i)
1230INSN_LSX(vsrarni_w_d, vv_i)
1231INSN_LSX(vsrarni_d_q, vv_i)
83b3815d
SG
1232
1233INSN_LSX(vssrln_b_h, vvv)
1234INSN_LSX(vssrln_h_w, vvv)
1235INSN_LSX(vssrln_w_d, vvv)
1236INSN_LSX(vssran_b_h, vvv)
1237INSN_LSX(vssran_h_w, vvv)
1238INSN_LSX(vssran_w_d, vvv)
1239INSN_LSX(vssrln_bu_h, vvv)
1240INSN_LSX(vssrln_hu_w, vvv)
1241INSN_LSX(vssrln_wu_d, vvv)
1242INSN_LSX(vssran_bu_h, vvv)
1243INSN_LSX(vssran_hu_w, vvv)
1244INSN_LSX(vssran_wu_d, vvv)
1245
1246INSN_LSX(vssrlni_b_h, vv_i)
1247INSN_LSX(vssrlni_h_w, vv_i)
1248INSN_LSX(vssrlni_w_d, vv_i)
1249INSN_LSX(vssrlni_d_q, vv_i)
1250INSN_LSX(vssrani_b_h, vv_i)
1251INSN_LSX(vssrani_h_w, vv_i)
1252INSN_LSX(vssrani_w_d, vv_i)
1253INSN_LSX(vssrani_d_q, vv_i)
1254INSN_LSX(vssrlni_bu_h, vv_i)
1255INSN_LSX(vssrlni_hu_w, vv_i)
1256INSN_LSX(vssrlni_wu_d, vv_i)
1257INSN_LSX(vssrlni_du_q, vv_i)
1258INSN_LSX(vssrani_bu_h, vv_i)
1259INSN_LSX(vssrani_hu_w, vv_i)
1260INSN_LSX(vssrani_wu_d, vv_i)
1261INSN_LSX(vssrani_du_q, vv_i)
162cd32c
SG
1262
1263INSN_LSX(vssrlrn_b_h, vvv)
1264INSN_LSX(vssrlrn_h_w, vvv)
1265INSN_LSX(vssrlrn_w_d, vvv)
1266INSN_LSX(vssrarn_b_h, vvv)
1267INSN_LSX(vssrarn_h_w, vvv)
1268INSN_LSX(vssrarn_w_d, vvv)
1269INSN_LSX(vssrlrn_bu_h, vvv)
1270INSN_LSX(vssrlrn_hu_w, vvv)
1271INSN_LSX(vssrlrn_wu_d, vvv)
1272INSN_LSX(vssrarn_bu_h, vvv)
1273INSN_LSX(vssrarn_hu_w, vvv)
1274INSN_LSX(vssrarn_wu_d, vvv)
1275
1276INSN_LSX(vssrlrni_b_h, vv_i)
1277INSN_LSX(vssrlrni_h_w, vv_i)
1278INSN_LSX(vssrlrni_w_d, vv_i)
1279INSN_LSX(vssrlrni_d_q, vv_i)
1280INSN_LSX(vssrlrni_bu_h, vv_i)
1281INSN_LSX(vssrlrni_hu_w, vv_i)
1282INSN_LSX(vssrlrni_wu_d, vv_i)
1283INSN_LSX(vssrlrni_du_q, vv_i)
1284INSN_LSX(vssrarni_b_h, vv_i)
1285INSN_LSX(vssrarni_h_w, vv_i)
1286INSN_LSX(vssrarni_w_d, vv_i)
1287INSN_LSX(vssrarni_d_q, vv_i)
1288INSN_LSX(vssrarni_bu_h, vv_i)
1289INSN_LSX(vssrarni_hu_w, vv_i)
1290INSN_LSX(vssrarni_wu_d, vv_i)
1291INSN_LSX(vssrarni_du_q, vv_i)
2e105e12
SG
1292
1293INSN_LSX(vclo_b, vv)
1294INSN_LSX(vclo_h, vv)
1295INSN_LSX(vclo_w, vv)
1296INSN_LSX(vclo_d, vv)
1297INSN_LSX(vclz_b, vv)
1298INSN_LSX(vclz_h, vv)
1299INSN_LSX(vclz_w, vv)
1300INSN_LSX(vclz_d, vv)
bb22ee57
SG
1301
1302INSN_LSX(vpcnt_b, vv)
1303INSN_LSX(vpcnt_h, vv)
1304INSN_LSX(vpcnt_w, vv)
1305INSN_LSX(vpcnt_d, vv)
0b1e6705
SG
1306
1307INSN_LSX(vbitclr_b, vvv)
1308INSN_LSX(vbitclr_h, vvv)
1309INSN_LSX(vbitclr_w, vvv)
1310INSN_LSX(vbitclr_d, vvv)
1311INSN_LSX(vbitclri_b, vv_i)
1312INSN_LSX(vbitclri_h, vv_i)
1313INSN_LSX(vbitclri_w, vv_i)
1314INSN_LSX(vbitclri_d, vv_i)
1315INSN_LSX(vbitset_b, vvv)
1316INSN_LSX(vbitset_h, vvv)
1317INSN_LSX(vbitset_w, vvv)
1318INSN_LSX(vbitset_d, vvv)
1319INSN_LSX(vbitseti_b, vv_i)
1320INSN_LSX(vbitseti_h, vv_i)
1321INSN_LSX(vbitseti_w, vv_i)
1322INSN_LSX(vbitseti_d, vv_i)
1323INSN_LSX(vbitrev_b, vvv)
1324INSN_LSX(vbitrev_h, vvv)
1325INSN_LSX(vbitrev_w, vvv)
1326INSN_LSX(vbitrev_d, vvv)
1327INSN_LSX(vbitrevi_b, vv_i)
1328INSN_LSX(vbitrevi_h, vv_i)
1329INSN_LSX(vbitrevi_w, vv_i)
1330INSN_LSX(vbitrevi_d, vv_i)
ac95a0b9
SG
1331
1332INSN_LSX(vfrstp_b, vvv)
1333INSN_LSX(vfrstp_h, vvv)
1334INSN_LSX(vfrstpi_b, vv_i)
1335INSN_LSX(vfrstpi_h, vv_i)
aca67472
SG
1336
1337INSN_LSX(vfadd_s, vvv)
1338INSN_LSX(vfadd_d, vvv)
1339INSN_LSX(vfsub_s, vvv)
1340INSN_LSX(vfsub_d, vvv)
1341INSN_LSX(vfmul_s, vvv)
1342INSN_LSX(vfmul_d, vvv)
1343INSN_LSX(vfdiv_s, vvv)
1344INSN_LSX(vfdiv_d, vvv)
1345
1346INSN_LSX(vfmadd_s, vvvv)
1347INSN_LSX(vfmadd_d, vvvv)
1348INSN_LSX(vfmsub_s, vvvv)
1349INSN_LSX(vfmsub_d, vvvv)
1350INSN_LSX(vfnmadd_s, vvvv)
1351INSN_LSX(vfnmadd_d, vvvv)
1352INSN_LSX(vfnmsub_s, vvvv)
1353INSN_LSX(vfnmsub_d, vvvv)
1354
1355INSN_LSX(vfmax_s, vvv)
1356INSN_LSX(vfmax_d, vvv)
1357INSN_LSX(vfmin_s, vvv)
1358INSN_LSX(vfmin_d, vvv)
1359
1360INSN_LSX(vfmaxa_s, vvv)
1361INSN_LSX(vfmaxa_d, vvv)
1362INSN_LSX(vfmina_s, vvv)
1363INSN_LSX(vfmina_d, vvv)
1364
1365INSN_LSX(vflogb_s, vv)
1366INSN_LSX(vflogb_d, vv)
1367
1368INSN_LSX(vfclass_s, vv)
1369INSN_LSX(vfclass_d, vv)
1370
1371INSN_LSX(vfsqrt_s, vv)
1372INSN_LSX(vfsqrt_d, vv)
1373INSN_LSX(vfrecip_s, vv)
1374INSN_LSX(vfrecip_d, vv)
1375INSN_LSX(vfrsqrt_s, vv)
1376INSN_LSX(vfrsqrt_d, vv)
399665d2
SG
1377
1378INSN_LSX(vfcvtl_s_h, vv)
1379INSN_LSX(vfcvth_s_h, vv)
1380INSN_LSX(vfcvtl_d_s, vv)
1381INSN_LSX(vfcvth_d_s, vv)
1382INSN_LSX(vfcvt_h_s, vvv)
1383INSN_LSX(vfcvt_s_d, vvv)
1384
1385INSN_LSX(vfrint_s, vv)
1386INSN_LSX(vfrint_d, vv)
1387INSN_LSX(vfrintrm_s, vv)
1388INSN_LSX(vfrintrm_d, vv)
1389INSN_LSX(vfrintrp_s, vv)
1390INSN_LSX(vfrintrp_d, vv)
1391INSN_LSX(vfrintrz_s, vv)
1392INSN_LSX(vfrintrz_d, vv)
1393INSN_LSX(vfrintrne_s, vv)
1394INSN_LSX(vfrintrne_d, vv)
1395
1396INSN_LSX(vftint_w_s, vv)
1397INSN_LSX(vftint_l_d, vv)
1398INSN_LSX(vftintrm_w_s, vv)
1399INSN_LSX(vftintrm_l_d, vv)
1400INSN_LSX(vftintrp_w_s, vv)
1401INSN_LSX(vftintrp_l_d, vv)
1402INSN_LSX(vftintrz_w_s, vv)
1403INSN_LSX(vftintrz_l_d, vv)
1404INSN_LSX(vftintrne_w_s, vv)
1405INSN_LSX(vftintrne_l_d, vv)
1406INSN_LSX(vftint_wu_s, vv)
1407INSN_LSX(vftint_lu_d, vv)
1408INSN_LSX(vftintrz_wu_s, vv)
1409INSN_LSX(vftintrz_lu_d, vv)
1410INSN_LSX(vftint_w_d, vvv)
1411INSN_LSX(vftintrm_w_d, vvv)
1412INSN_LSX(vftintrp_w_d, vvv)
1413INSN_LSX(vftintrz_w_d, vvv)
1414INSN_LSX(vftintrne_w_d, vvv)
1415INSN_LSX(vftintl_l_s, vv)
1416INSN_LSX(vftinth_l_s, vv)
1417INSN_LSX(vftintrml_l_s, vv)
1418INSN_LSX(vftintrmh_l_s, vv)
1419INSN_LSX(vftintrpl_l_s, vv)
1420INSN_LSX(vftintrph_l_s, vv)
1421INSN_LSX(vftintrzl_l_s, vv)
1422INSN_LSX(vftintrzh_l_s, vv)
1423INSN_LSX(vftintrnel_l_s, vv)
1424INSN_LSX(vftintrneh_l_s, vv)
1425
1426INSN_LSX(vffint_s_w, vv)
1427INSN_LSX(vffint_s_wu, vv)
1428INSN_LSX(vffint_d_l, vv)
1429INSN_LSX(vffint_d_lu, vv)
1430INSN_LSX(vffintl_d_w, vv)
1431INSN_LSX(vffinth_d_w, vv)
1432INSN_LSX(vffint_s_l, vvv)
f435e1e5
SG
1433
1434INSN_LSX(vseq_b, vvv)
1435INSN_LSX(vseq_h, vvv)
1436INSN_LSX(vseq_w, vvv)
1437INSN_LSX(vseq_d, vvv)
1438INSN_LSX(vseqi_b, vv_i)
1439INSN_LSX(vseqi_h, vv_i)
1440INSN_LSX(vseqi_w, vv_i)
1441INSN_LSX(vseqi_d, vv_i)
1442
1443INSN_LSX(vsle_b, vvv)
1444INSN_LSX(vsle_h, vvv)
1445INSN_LSX(vsle_w, vvv)
1446INSN_LSX(vsle_d, vvv)
1447INSN_LSX(vslei_b, vv_i)
1448INSN_LSX(vslei_h, vv_i)
1449INSN_LSX(vslei_w, vv_i)
1450INSN_LSX(vslei_d, vv_i)
1451INSN_LSX(vsle_bu, vvv)
1452INSN_LSX(vsle_hu, vvv)
1453INSN_LSX(vsle_wu, vvv)
1454INSN_LSX(vsle_du, vvv)
1455INSN_LSX(vslei_bu, vv_i)
1456INSN_LSX(vslei_hu, vv_i)
1457INSN_LSX(vslei_wu, vv_i)
1458INSN_LSX(vslei_du, vv_i)
1459
1460INSN_LSX(vslt_b, vvv)
1461INSN_LSX(vslt_h, vvv)
1462INSN_LSX(vslt_w, vvv)
1463INSN_LSX(vslt_d, vvv)
1464INSN_LSX(vslti_b, vv_i)
1465INSN_LSX(vslti_h, vv_i)
1466INSN_LSX(vslti_w, vv_i)
1467INSN_LSX(vslti_d, vv_i)
1468INSN_LSX(vslt_bu, vvv)
1469INSN_LSX(vslt_hu, vvv)
1470INSN_LSX(vslt_wu, vvv)
1471INSN_LSX(vslt_du, vvv)
1472INSN_LSX(vslti_bu, vv_i)
1473INSN_LSX(vslti_hu, vv_i)
1474INSN_LSX(vslti_wu, vv_i)
1475INSN_LSX(vslti_du, vv_i)
386c4e86
SG
1476
1477#define output_vfcmp(C, PREFIX, SUFFIX) \
1478{ \
1479 (C)->info->fprintf_func((C)->info->stream, "%08x %s%s\t%d, f%d, f%d", \
1480 (C)->insn, PREFIX, SUFFIX, a->vd, \
1481 a->vj, a->vk); \
1482}
1483
1484static bool output_vvv_fcond(DisasContext *ctx, arg_vvv_fcond * a,
1485 const char *suffix)
1486{
1487 bool ret = true;
1488 switch (a->fcond) {
1489 case 0x0:
1490 output_vfcmp(ctx, "vfcmp_caf_", suffix);
1491 break;
1492 case 0x1:
1493 output_vfcmp(ctx, "vfcmp_saf_", suffix);
1494 break;
1495 case 0x2:
1496 output_vfcmp(ctx, "vfcmp_clt_", suffix);
1497 break;
1498 case 0x3:
1499 output_vfcmp(ctx, "vfcmp_slt_", suffix);
1500 break;
1501 case 0x4:
1502 output_vfcmp(ctx, "vfcmp_ceq_", suffix);
1503 break;
1504 case 0x5:
1505 output_vfcmp(ctx, "vfcmp_seq_", suffix);
1506 break;
1507 case 0x6:
1508 output_vfcmp(ctx, "vfcmp_cle_", suffix);
1509 break;
1510 case 0x7:
1511 output_vfcmp(ctx, "vfcmp_sle_", suffix);
1512 break;
1513 case 0x8:
1514 output_vfcmp(ctx, "vfcmp_cun_", suffix);
1515 break;
1516 case 0x9:
1517 output_vfcmp(ctx, "vfcmp_sun_", suffix);
1518 break;
1519 case 0xA:
1520 output_vfcmp(ctx, "vfcmp_cult_", suffix);
1521 break;
1522 case 0xB:
1523 output_vfcmp(ctx, "vfcmp_sult_", suffix);
1524 break;
1525 case 0xC:
1526 output_vfcmp(ctx, "vfcmp_cueq_", suffix);
1527 break;
1528 case 0xD:
1529 output_vfcmp(ctx, "vfcmp_sueq_", suffix);
1530 break;
1531 case 0xE:
1532 output_vfcmp(ctx, "vfcmp_cule_", suffix);
1533 break;
1534 case 0xF:
1535 output_vfcmp(ctx, "vfcmp_sule_", suffix);
1536 break;
1537 case 0x10:
1538 output_vfcmp(ctx, "vfcmp_cne_", suffix);
1539 break;
1540 case 0x11:
1541 output_vfcmp(ctx, "vfcmp_sne_", suffix);
1542 break;
1543 case 0x14:
1544 output_vfcmp(ctx, "vfcmp_cor_", suffix);
1545 break;
1546 case 0x15:
1547 output_vfcmp(ctx, "vfcmp_sor_", suffix);
1548 break;
1549 case 0x18:
1550 output_vfcmp(ctx, "vfcmp_cune_", suffix);
1551 break;
1552 case 0x19:
1553 output_vfcmp(ctx, "vfcmp_sune_", suffix);
1554 break;
1555 default:
1556 ret = false;
1557 }
1558 return ret;
1559}
1560
1561#define LSX_FCMP_INSN(suffix) \
1562static bool trans_vfcmp_cond_##suffix(DisasContext *ctx, \
1563 arg_vvv_fcond * a) \
1564{ \
1565 return output_vvv_fcond(ctx, a, #suffix); \
1566}
1567
1568LSX_FCMP_INSN(s)
1569LSX_FCMP_INSN(d)
d0dfa19a
SG
1570
1571INSN_LSX(vbitsel_v, vvvv)
1572INSN_LSX(vbitseli_b, vv_i)
1573
1574INSN_LSX(vseteqz_v, cv)
1575INSN_LSX(vsetnez_v, cv)
1576INSN_LSX(vsetanyeqz_b, cv)
1577INSN_LSX(vsetanyeqz_h, cv)
1578INSN_LSX(vsetanyeqz_w, cv)
1579INSN_LSX(vsetanyeqz_d, cv)
1580INSN_LSX(vsetallnez_b, cv)
1581INSN_LSX(vsetallnez_h, cv)
1582INSN_LSX(vsetallnez_w, cv)
1583INSN_LSX(vsetallnez_d, cv)
cdbdefbf
SG
1584
1585INSN_LSX(vinsgr2vr_b, vr_i)
1586INSN_LSX(vinsgr2vr_h, vr_i)
1587INSN_LSX(vinsgr2vr_w, vr_i)
1588INSN_LSX(vinsgr2vr_d, vr_i)
1589INSN_LSX(vpickve2gr_b, rv_i)
1590INSN_LSX(vpickve2gr_h, rv_i)
1591INSN_LSX(vpickve2gr_w, rv_i)
1592INSN_LSX(vpickve2gr_d, rv_i)
1593INSN_LSX(vpickve2gr_bu, rv_i)
1594INSN_LSX(vpickve2gr_hu, rv_i)
1595INSN_LSX(vpickve2gr_wu, rv_i)
1596INSN_LSX(vpickve2gr_du, rv_i)
1597
1598INSN_LSX(vreplgr2vr_b, vr)
1599INSN_LSX(vreplgr2vr_h, vr)
1600INSN_LSX(vreplgr2vr_w, vr)
1601INSN_LSX(vreplgr2vr_d, vr)
d5e5563c
SG
1602
1603INSN_LSX(vreplve_b, vvr)
1604INSN_LSX(vreplve_h, vvr)
1605INSN_LSX(vreplve_w, vvr)
1606INSN_LSX(vreplve_d, vvr)
1607INSN_LSX(vreplvei_b, vv_i)
1608INSN_LSX(vreplvei_h, vv_i)
1609INSN_LSX(vreplvei_w, vv_i)
1610INSN_LSX(vreplvei_d, vv_i)
1611
1612INSN_LSX(vbsll_v, vv_i)
1613INSN_LSX(vbsrl_v, vv_i)
1614
1615INSN_LSX(vpackev_b, vvv)
1616INSN_LSX(vpackev_h, vvv)
1617INSN_LSX(vpackev_w, vvv)
1618INSN_LSX(vpackev_d, vvv)
1619INSN_LSX(vpackod_b, vvv)
1620INSN_LSX(vpackod_h, vvv)
1621INSN_LSX(vpackod_w, vvv)
1622INSN_LSX(vpackod_d, vvv)
1623
1624INSN_LSX(vpickev_b, vvv)
1625INSN_LSX(vpickev_h, vvv)
1626INSN_LSX(vpickev_w, vvv)
1627INSN_LSX(vpickev_d, vvv)
1628INSN_LSX(vpickod_b, vvv)
1629INSN_LSX(vpickod_h, vvv)
1630INSN_LSX(vpickod_w, vvv)
1631INSN_LSX(vpickod_d, vvv)