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